diff --git a/SandboxProject/Runtime/Bindings.mcruntime b/SandboxProject/Runtime/Bindings.mcruntime new file mode 100644 index 0000000..92a18ba Binary files /dev/null and b/SandboxProject/Runtime/Bindings.mcruntime differ diff --git a/SandboxProject/Runtime/DataSources.mcruntime b/SandboxProject/Runtime/DataSources.mcruntime new file mode 100644 index 0000000..25dc485 Binary files /dev/null and b/SandboxProject/Runtime/DataSources.mcruntime differ diff --git a/SandboxProject/Runtime/ProjectRuntime.mcruntimecfg b/SandboxProject/Runtime/ProjectRuntime.mcruntimecfg new file mode 100644 index 0000000..8d590d8 Binary files /dev/null and b/SandboxProject/Runtime/ProjectRuntime.mcruntimecfg differ diff --git a/SandboxProject/Runtime/RuntimeReplay.mcstream b/SandboxProject/Runtime/RuntimeReplay.mcstream new file mode 100644 index 0000000..8b52118 --- /dev/null +++ b/SandboxProject/Runtime/RuntimeReplay.mcstream @@ -0,0 +1,17 @@ +# emit_after_seconds data_point_id value_type payload +0.00 cube.position vec3 0.0 0.5 0.0 +0.00 cube.visible bool true +0.00 cube.base_color vec3 0.4 0.6 0.9 +0.00 valve.visible bool true +0.00 tank.base_color vec3 0.35 0.65 0.90 +0.00 alarm.intensity double 0.0 +0.50 cube.position vec3 1.5 0.5 0.0 +0.50 cube.base_color vec3 0.8 0.6 0.5 +0.50 tank.base_color vec3 0.20 0.80 0.25 +0.50 alarm.intensity double 2.0 +1.00 cube.visible bool false +1.00 valve.visible bool false +1.50 cube.position vec3 -1.5 0.5 0.0 +1.50 cube.visible bool true +1.50 valve.visible bool true +1.50 alarm.intensity double 0.0 diff --git a/SandboxProject/Scenes/Main.mcscene b/SandboxProject/Scenes/Main.mcscene index 9a6ed48..3360cce 100644 Binary files a/SandboxProject/Scenes/Main.mcscene and b/SandboxProject/Scenes/Main.mcscene differ diff --git a/SandboxProject/Scenes/Untitled.mcscene b/SandboxProject/Scenes/Untitled.mcscene index fc3e9de..3b6b412 100644 --- a/SandboxProject/Scenes/Untitled.mcscene +++ b/SandboxProject/Scenes/Untitled.mcscene @@ -57,575 +57,14 @@ 1.0 ] } - }, - { - "Id": 3, - "MeshRenderer": { - "AlphaCutoff": 0.5, - "AlphaMode": 0, - "AoTextureGuid": "", - "AoTexturePath": "", - "BaseColor": [ - 0.75, - 0.7799999713897705, - 0.8399999737739563 - ], - "BaseColorTextureGuid": "", - "BaseColorTexturePath": "", - "BuiltinMesh": 0, - "DoubleSided": true, - "EmissiveColor": [ - 0.0, - 0.0, - 0.0 - ], - "EmissiveTextureGuid": "", - "EmissiveTexturePath": "", - "MaterialAssetGuids": [], - "MeshAssetGuid": "", - "MeshSource": 1, - "Metallic": 0.0, - "MetallicRoughnessTextureGuid": "", - "MetallicRoughnessTexturePath": "", - "ModelNodeIndex": -1, - "NormalTextureGuid": "", - "NormalTexturePath": "", - "Roughness": 1.0, - "SourceModelAssetGuid": "", - "SourceModelPath": "Assets/Models/box1.glb", - "SourceNodePath": "", - "SubMeshIndex": -1, - "Visible": true - }, - "Name": "box1.glb", - "ParentId": 0, - "Transform": { - "Position": [ - 0.0, - 0.5, - 0.0 - ], - "RotationEulerDegrees": [ - 0.0, - 0.0, - 0.0 - ], - "Scale": [ - 1.0, - 1.0, - 1.0 - ] - } - }, - { - "Id": 4, - "Light": { - "Color": [ - 1.0, - 0.15000000596046448, - 0.10000000149011612 - ], - "Intensity": 0.0 - }, - "Name": "Alarm Beacon", - "ParentId": 0, - "Transform": { - "Position": [ - 0.0, - 2.5, - 0.0 - ], - "RotationEulerDegrees": [ - 0.0, - 0.0, - 0.0 - ], - "Scale": [ - 1.0, - 1.0, - 1.0 - ] - } - }, - { - "Id": 5, - "MeshRenderer": { - "AlphaCutoff": 0.5, - "AlphaMode": 0, - "AoTextureGuid": "", - "AoTexturePath": "", - "BaseColor": [ - 0.75, - 0.7799999713897705, - 0.8399999737739563 - ], - "BaseColorTextureGuid": "", - "BaseColorTexturePath": "", - "BuiltinMesh": 0, - "DoubleSided": true, - "EmissiveColor": [ - 0.0, - 0.0, - 0.0 - ], - "EmissiveTextureGuid": "", - "EmissiveTexturePath": "", - "MaterialAssetGuids": [], - "MeshAssetGuid": "", - "MeshSource": 1, - "Metallic": 0.0, - "MetallicRoughnessTextureGuid": "", - "MetallicRoughnessTexturePath": "", - "ModelNodeIndex": 0, - "NormalTextureGuid": "", - "NormalTexturePath": "", - "Roughness": 1.0, - "SourceModelAssetGuid": "", - "SourceModelPath": "", - "SourceNodePath": "", - "SubMeshIndex": -1, - "Visible": true - }, - "Name": "立方体", - "ParentId": 3, - "Transform": { - "Position": [ - -1.6927926540374756, - -4.459673881530762, - 1.949385364241607e-07 - ], - "RotationEulerDegrees": [ - 0.0, - -0.0, - 0.0 - ], - "Scale": [ - 0.9999998807907104, - 1.0, - 1.0 - ] - } - }, - { - "Id": 6, - "MeshRenderer": { - "AlphaCutoff": 0.5, - "AlphaMode": 0, - "AoTextureGuid": "", - "AoTexturePath": "", - "BaseColor": [ - 0.75, - 0.7799999713897705, - 0.8399999737739563 - ], - "BaseColorTextureGuid": "", - "BaseColorTexturePath": "", - "BuiltinMesh": 0, - "DoubleSided": true, - "EmissiveColor": [ - 0.0, - 0.0, - 0.0 - ], - "EmissiveTextureGuid": "", - "EmissiveTexturePath": "", - "MaterialAssetGuids": [], - "MeshAssetGuid": "", - "MeshSource": 1, - "Metallic": 0.0, - "MetallicRoughnessTextureGuid": "", - "MetallicRoughnessTexturePath": "", - "ModelNodeIndex": 1, - "NormalTextureGuid": "", - "NormalTexturePath": "", - "Roughness": 1.0, - "SourceModelAssetGuid": "", - "SourceModelPath": "", - "SourceNodePath": "", - "SubMeshIndex": -1, - "Visible": true - }, - "Name": "立方体.001", - "ParentId": 5, - "Transform": { - "Position": [ - 0.0, - -3.55507755279541, - 1.553973731915903e-07 - ], - "RotationEulerDegrees": [ - 0.0, - -0.0, - 0.0 - ], - "Scale": [ - 0.9999998807907104, - 1.0, - 1.0 - ] - } - }, - { - "Id": 7, - "MeshRenderer": { - "AlphaCutoff": 0.5, - "AlphaMode": 0, - "AoTextureGuid": "", - "AoTexturePath": "", - "BaseColor": [ - 0.75, - 0.7799999713897705, - 0.8399999737739563 - ], - "BaseColorTextureGuid": "", - "BaseColorTexturePath": "", - "BuiltinMesh": 0, - "DoubleSided": true, - "EmissiveColor": [ - 0.0, - 0.0, - 0.0 - ], - "EmissiveTextureGuid": "", - "EmissiveTexturePath": "", - "MaterialAssetGuids": [], - "MeshAssetGuid": "", - "MeshSource": 1, - "Metallic": 0.0, - "MetallicRoughnessTextureGuid": "", - "MetallicRoughnessTexturePath": "", - "ModelNodeIndex": 2, - "NormalTextureGuid": "", - "NormalTexturePath": "", - "Roughness": 1.0, - "SourceModelAssetGuid": "", - "SourceModelPath": "", - "SourceNodePath": "", - "SubMeshIndex": -1, - "Visible": true - }, - "Name": "立方体.007", - "ParentId": 6, - "Transform": { - "Position": [ - 4.175572872161865, - 0.0, - 0.0 - ], - "RotationEulerDegrees": [ - 0.0, - -0.0, - 0.0 - ], - "Scale": [ - 0.9999998807907104, - 1.0, - 1.0 - ] - } - }, - { - "Id": 8, - "MeshRenderer": { - "AlphaCutoff": 0.5, - "AlphaMode": 0, - "AoTextureGuid": "", - "AoTexturePath": "", - "BaseColor": [ - 0.75, - 0.7799999713897705, - 0.8399999737739563 - ], - "BaseColorTextureGuid": "", - "BaseColorTexturePath": "", - "BuiltinMesh": 0, - "DoubleSided": true, - "EmissiveColor": [ - 0.0, - 0.0, - 0.0 - ], - "EmissiveTextureGuid": "", - "EmissiveTexturePath": "", - "MaterialAssetGuids": [], - "MeshAssetGuid": "", - "MeshSource": 1, - "Metallic": 0.0, - "MetallicRoughnessTextureGuid": "", - "MetallicRoughnessTexturePath": "", - "ModelNodeIndex": 3, - "NormalTextureGuid": "", - "NormalTexturePath": "", - "Roughness": 1.0, - "SourceModelAssetGuid": "", - "SourceModelPath": "", - "SourceNodePath": "", - "SubMeshIndex": -1, - "Visible": true - }, - "Name": "立方体.003", - "ParentId": 3, - "Transform": { - "Position": [ - 0.0, - 0.0, - 0.0 - ], - "RotationEulerDegrees": [ - 0.0, - -0.0, - 0.0 - ], - "Scale": [ - 0.9999998807907104, - 1.0, - 1.0 - ] - } - }, - { - "Id": 9, - "MeshRenderer": { - "AlphaCutoff": 0.5, - "AlphaMode": 0, - "AoTextureGuid": "", - "AoTexturePath": "", - "BaseColor": [ - 0.75, - 0.7799999713897705, - 0.8399999737739563 - ], - "BaseColorTextureGuid": "", - "BaseColorTexturePath": "", - "BuiltinMesh": 0, - "DoubleSided": true, - "EmissiveColor": [ - 0.0, - 0.0, - 0.0 - ], - "EmissiveTextureGuid": "", - "EmissiveTexturePath": "", - "MaterialAssetGuids": [], - "MeshAssetGuid": "", - "MeshSource": 1, - "Metallic": 0.0, - "MetallicRoughnessTextureGuid": "", - "MetallicRoughnessTexturePath": "", - "ModelNodeIndex": 4, - "NormalTextureGuid": "", - "NormalTexturePath": "", - "Roughness": 1.0, - "SourceModelAssetGuid": "", - "SourceModelPath": "", - "SourceNodePath": "", - "SubMeshIndex": -1, - "Visible": true - }, - "Name": "立方体.002", - "ParentId": 8, - "Transform": { - "Position": [ - 0.0, - -1.4481612709005276e-07, - -3.31300687789917 - ], - "RotationEulerDegrees": [ - 0.0, - -0.0, - 0.0 - ], - "Scale": [ - 0.9999998807907104, - 1.0, - 1.0 - ] - } - }, - { - "Id": 10, - "MeshRenderer": { - "AlphaCutoff": 0.5, - "AlphaMode": 0, - "AoTextureGuid": "", - "AoTexturePath": "", - "BaseColor": [ - 0.75, - 0.7799999713897705, - 0.8399999737739563 - ], - "BaseColorTextureGuid": "", - "BaseColorTexturePath": "", - "BuiltinMesh": 0, - "DoubleSided": true, - "EmissiveColor": [ - 0.0, - 0.0, - 0.0 - ], - "EmissiveTextureGuid": "", - "EmissiveTexturePath": "", - "MaterialAssetGuids": [], - "MeshAssetGuid": "", - "MeshSource": 1, - "Metallic": 0.0, - "MetallicRoughnessTextureGuid": "", - "MetallicRoughnessTexturePath": "", - "ModelNodeIndex": 5, - "NormalTextureGuid": "", - "NormalTexturePath": "", - "Roughness": 1.0, - "SourceModelAssetGuid": "", - "SourceModelPath": "", - "SourceNodePath": "", - "SubMeshIndex": -1, - "Visible": true - }, - "Name": "立方体.004", - "ParentId": 8, - "Transform": { - "Position": [ - 3.776623010635376, - 0.0, - 0.0 - ], - "RotationEulerDegrees": [ - 0.0, - -0.0, - 0.0 - ], - "Scale": [ - 0.9999998807907104, - 1.0, - 1.0 - ] - } - }, - { - "Id": 11, - "MeshRenderer": { - "AlphaCutoff": 0.5, - "AlphaMode": 0, - "AoTextureGuid": "", - "AoTexturePath": "", - "BaseColor": [ - 0.75, - 0.7799999713897705, - 0.8399999737739563 - ], - "BaseColorTextureGuid": "", - "BaseColorTexturePath": "", - "BuiltinMesh": 0, - "DoubleSided": true, - "EmissiveColor": [ - 0.0, - 0.0, - 0.0 - ], - "EmissiveTextureGuid": "", - "EmissiveTexturePath": "", - "MaterialAssetGuids": [], - "MeshAssetGuid": "", - "MeshSource": 1, - "Metallic": 0.0, - "MetallicRoughnessTextureGuid": "", - "MetallicRoughnessTexturePath": "", - "ModelNodeIndex": 6, - "NormalTextureGuid": "", - "NormalTexturePath": "", - "Roughness": 1.0, - "SourceModelAssetGuid": "", - "SourceModelPath": "", - "SourceNodePath": "", - "SubMeshIndex": -1, - "Visible": true - }, - "Name": "立方体.005", - "ParentId": 8, - "Transform": { - "Position": [ - 0.0, - 4.31797981262207, - -1.8874489171594178e-07 - ], - "RotationEulerDegrees": [ - 0.0, - -0.0, - 0.0 - ], - "Scale": [ - 0.9999998807907104, - 1.0, - 1.0 - ] - } - }, - { - "Id": 12, - "MeshRenderer": { - "AlphaCutoff": 0.5, - "AlphaMode": 0, - "AoTextureGuid": "", - "AoTexturePath": "", - "BaseColor": [ - 0.75, - 0.7799999713897705, - 0.8399999737739563 - ], - "BaseColorTextureGuid": "", - "BaseColorTexturePath": "", - "BuiltinMesh": 0, - "DoubleSided": true, - "EmissiveColor": [ - 0.0, - 0.0, - 0.0 - ], - "EmissiveTextureGuid": "", - "EmissiveTexturePath": "", - "MaterialAssetGuids": [], - "MeshAssetGuid": "", - "MeshSource": 1, - "Metallic": 0.0, - "MetallicRoughnessTextureGuid": "", - "MetallicRoughnessTexturePath": "", - "ModelNodeIndex": 7, - "NormalTextureGuid": "", - "NormalTexturePath": "", - "Roughness": 1.0, - "SourceModelAssetGuid": "", - "SourceModelPath": "", - "SourceNodePath": "", - "SubMeshIndex": -1, - "Visible": true - }, - "Name": "立方体.006", - "ParentId": 8, - "Transform": { - "Position": [ - -12.448348045349121, - 0.0, - 0.0 - ], - "RotationEulerDegrees": [ - 0.0, - 0.0, - -0.0 - ], - "Scale": [ - 0.9999998807907104, - 1.0, - 1.0 - ] - } } ], "SceneName": "Untitled", "Selection": { - "ActiveObjectId": 12, + "ActiveObjectId": 1, "SelectedObjectIds": [ - 12 + 1 ], - "SelectionAnchorId": 12 + "SelectionAnchorId": 1 } } \ No newline at end of file diff --git a/Source/MetaCoreScene/Private/MetaCoreScene.cpp b/Source/MetaCoreScene/Private/MetaCoreScene.cpp index 054a340..b22176f 100644 --- a/Source/MetaCoreScene/Private/MetaCoreScene.cpp +++ b/Source/MetaCoreScene/Private/MetaCoreScene.cpp @@ -457,20 +457,6 @@ MetaCoreScene MetaCoreCreateDefaultScene() { directionalLight.AddComponent(); directionalLight.GetComponent().RotationEulerDegrees = glm::vec3(-45.0F, 30.0F, 0.0F); - MetaCoreGameObject cube = scene.CreateGameObject("box1.glb"); - auto& meshRenderer = cube.AddComponent(); - meshRenderer.MeshSource = MetaCoreMeshSourceKind::Asset; - meshRenderer.SourceModelPath = "Assets/Models/box1.glb"; - meshRenderer.SourceModelAssetGuid = MetaCoreAssetRegistry::Get().ResolvePathToGuid("Assets/Models/box1.glb"); - cube.AddComponent(MetaCoreModelRootTag{ "Assets/Models/box1.glb" }); - cube.GetComponent().Position = glm::vec3(0.0F, 0.5F, 0.0F); - - MetaCoreGameObject alarmBeacon = scene.CreateGameObject("Alarm Beacon"); - auto& beaconLight = alarmBeacon.AddComponent(); - beaconLight.Intensity = 0.0F; - beaconLight.Color = glm::vec3(1.0F, 0.15F, 0.1F); - alarmBeacon.GetComponent().Position = glm::vec3(0.0F, 2.5F, 0.0F); - return scene; } diff --git a/tests/MetaCoreSmokeTests.cpp b/tests/MetaCoreSmokeTests.cpp index 2cd76fa..07d9b47 100644 --- a/tests/MetaCoreSmokeTests.cpp +++ b/tests/MetaCoreSmokeTests.cpp @@ -6,6 +6,7 @@ #include "MetaCoreFoundation/MetaCoreGeneratedReflection.h" #include "MetaCoreFoundation/MetaCoreLogService.h" #include "MetaCoreFoundation/MetaCoreProject.h" +#include "MetaCoreFoundation/MetaCoreAssetRegistry.h" #include "MetaCorePlatform/MetaCoreWindow.h" #include "MetaCoreRender/MetaCoreEditorViewportRenderer.h" #include "MetaCoreRender/MetaCoreRenderDevice.h" @@ -593,16 +594,16 @@ void MetaCoreTestJsonSceneSaveCurrentSceneUsesMcsceneJson() { const auto scenePersistenceService = moduleRegistry.ResolveService(); MetaCoreExpect(scenePersistenceService != nullptr, "应解析到 ScenePersistenceService"); - MetaCore::MetaCoreId cubeId = 0; + MetaCore::MetaCoreId lightId = 0; for (const MetaCore::MetaCoreGameObject& object : scene.GetGameObjects()) { - if (object.GetName() == "box1.glb") { - cubeId = object.GetId(); + if (object.GetName() == "Directional Light") { + lightId = object.GetId(); break; } } - MetaCoreExpect(cubeId != 0, "默认场景应包含 box1.glb"); + MetaCoreExpect(lightId != 0, "默认场景应包含 Directional Light"); - editorContext.SelectOnly(cubeId); + editorContext.SelectOnly(lightId); const std::filesystem::path scenePath = std::filesystem::path("Scenes") / "Main.mcscene.json"; MetaCoreExpect(scenePersistenceService->SaveSceneAs(editorContext, scenePath), "应能保存 JSON 场景"); MetaCoreExpect(scenePersistenceService->GetCurrentScenePath() == scenePath, "当前场景路径应使用 .mcscene.json"); @@ -611,7 +612,7 @@ void MetaCoreTestJsonSceneSaveCurrentSceneUsesMcsceneJson() { MetaCoreExpect(!scenePersistenceService->IsSceneDirty(), "保存后场景不应为 dirty"); const bool renamed = editorContext.ExecuteSnapshotCommand("重命名对象", [&]() { - return scene.RenameGameObject(cubeId, "RoundTripCube"); + return scene.RenameGameObject(lightId, "RoundTripLight"); }); MetaCoreExpect(renamed, "应能修改场景对象"); MetaCoreExpect(scenePersistenceService->IsSceneDirty(), "修改后场景应变为 dirty"); @@ -624,17 +625,17 @@ void MetaCoreTestJsonSceneSaveCurrentSceneUsesMcsceneJson() { MetaCoreExpect(scene.GetGameObjects().empty(), "清空快照后场景应为空"); MetaCoreExpect(scenePersistenceService->LoadScene(editorContext, scenePath), "应能重新加载 JSON 场景"); - MetaCoreExpect(scene.GetGameObjects().size() == 4, "重新加载后对象数量应恢复"); + MetaCoreExpect(scene.GetGameObjects().size() == 2, "重新加载后对象数量应恢复"); MetaCoreExpect(editorContext.GetSelectedObjectId() != 0, "重新加载后应恢复选中对象"); - bool foundRenamedCube = false; + bool foundRenamedLight = false; for (const MetaCore::MetaCoreGameObject& object : scene.GetGameObjects()) { - if (object.GetName() == "RoundTripCube") { - foundRenamedCube = true; + if (object.GetName() == "RoundTripLight") { + foundRenamedLight = true; break; } } - MetaCoreExpect(foundRenamedCube, "重新加载后应保留保存过的对象名称"); + MetaCoreExpect(foundRenamedLight, "重新加载后应保留保存过的对象名称"); coreServicesModule->Shutdown(moduleRegistry); moduleRegistry.ShutdownServices(); @@ -1261,7 +1262,7 @@ void MetaCoreTestBootstrapStartupSceneCreation() { MetaCoreExpect(std::filesystem::exists(tempProjectRoot / bootstrapScenePath), "应生成 Main.mcscene.json"); MetaCoreExpect(scenePersistenceService->LoadStartupScene(editorContext), "设置后应能加载 startup scene"); MetaCoreExpect(scenePersistenceService->GetCurrentScenePath() == bootstrapScenePath, "startup scene 路径应正确"); - MetaCoreExpect(scene.GetGameObjects().size() == 4, "bootstrap scene 应保存默认场景内容"); + MetaCoreExpect(scene.GetGameObjects().size() == 2, "bootstrap scene 应保存默认场景内容"); coreServicesModule->Shutdown(moduleRegistry); moduleRegistry.ShutdownServices(); @@ -2427,6 +2428,16 @@ void MetaCoreTestUiDocumentSerialization() { void MetaCoreTestDecoupledSnapshotSync() { // 1. 创建默认场景并收集核心对象 ID MetaCore::MetaCoreScene scene = MetaCore::MetaCoreCreateDefaultScene(); + + // 动态添加一个 box1.glb,测试需要它作为网格对象进行解耦同步验证 + MetaCore::MetaCoreGameObject cubeObj = scene.CreateGameObject("box1.glb"); + auto& meshRenderer = cubeObj.AddComponent(); + meshRenderer.MeshSource = MetaCore::MetaCoreMeshSourceKind::Asset; + meshRenderer.SourceModelPath = "Assets/Models/box1.glb"; + meshRenderer.SourceModelAssetGuid = MetaCore::MetaCoreAssetRegistry::Get().ResolvePathToGuid("Assets/Models/box1.glb"); + cubeObj.AddComponent(MetaCore::MetaCoreModelRootTag{ "Assets/Models/box1.glb" }); + cubeObj.GetComponent().Position = glm::vec3(0.0F, 0.5F, 0.0F); + MetaCore::MetaCoreId cubeId = 0; MetaCore::MetaCoreId lightId = 0; MetaCore::MetaCoreId cameraId = 0; @@ -2533,20 +2544,17 @@ int main() { std::cout << "[RUN] MetaCoreCreateDefaultScene..." << std::endl; MetaCore::MetaCoreScene scene = MetaCore::MetaCoreCreateDefaultScene(); std::cout << "[RUN] MetaCoreExpect default objects count..." << std::endl; - MetaCoreExpect(scene.GetGameObjects().size() == 4, "默认场景应包含四个对象"); + MetaCoreExpect(scene.GetGameObjects().size() == 2, "默认场景应包含两个对象"); bool hasCamera = false; bool hasLight = false; - bool hasCube = false; for (const MetaCore::MetaCoreGameObject& object : scene.GetGameObjects()) { hasCamera = hasCamera || object.HasComponent(); hasLight = hasLight || object.HasComponent(); - hasCube = hasCube || object.HasComponent(); } MetaCoreExpect(hasCamera, "默认场景应包含摄像机"); MetaCoreExpect(hasLight, "默认场景应包含光源"); - MetaCoreExpect(hasCube, "默认场景应包含立方体"); std::cout << "[RUN] MetaCoreDummyPanelProvider test..." << std::endl; MetaCore::MetaCoreEditorModuleRegistry moduleRegistry;