diff --git a/SandboxProject/Library/Cooked/Windows/CookManifest.bin b/SandboxProject/Library/Cooked/Windows/CookManifest.bin index 5a04b2a..cc7ce06 100644 Binary files a/SandboxProject/Library/Cooked/Windows/CookManifest.bin and b/SandboxProject/Library/Cooked/Windows/CookManifest.bin differ diff --git a/Source/MetaCoreScene/Private/MetaCoreSceneSerializer.cpp b/Source/MetaCoreScene/Private/MetaCoreSceneSerializer.cpp index 6727d72..d10bd3e 100644 --- a/Source/MetaCoreScene/Private/MetaCoreSceneSerializer.cpp +++ b/Source/MetaCoreScene/Private/MetaCoreSceneSerializer.cpp @@ -39,104 +39,136 @@ bool MetaCoreSceneSerializer::SaveSceneToJson( ) { try { json sceneJson; - sceneJson["SceneName"] = sceneDocument.Name; - sceneJson["Selection"] = { - {"SelectedObjectIds", sceneDocument.Selection.SelectedObjectIds}, - {"ActiveObjectId", sceneDocument.Selection.ActiveObjectId}, - {"SelectionAnchorId", sceneDocument.Selection.SelectionAnchorId} - }; - - json gameObjectsArray = json::array(); - for (const auto& obj : sceneDocument.GameObjects) { - json objJson; - objJson["Id"] = obj.Id; - objJson["ParentId"] = obj.ParentId; - objJson["Name"] = obj.Name; - - // 序列化 Transform 组件 - objJson["Transform"] = { - {"Position", Vec3ToJson(obj.Transform.Position)}, - {"RotationEulerDegrees", Vec3ToJson(obj.Transform.RotationEulerDegrees)}, - {"Scale", Vec3ToJson(obj.Transform.Scale)} - }; - - // 序列化 MeshRenderer 组件 (如果有) - if (obj.MeshRenderer.has_value()) { - const auto& mesh = obj.MeshRenderer.value(); - json meshJson; - meshJson["MeshSource"] = static_cast(mesh.MeshSource); - meshJson["BuiltinMesh"] = static_cast(mesh.BuiltinMesh); - meshJson["MeshAssetGuid"] = GuidToString(mesh.MeshAssetGuid); - - json matGuids = json::array(); - for (const auto& guid : mesh.MaterialAssetGuids) { - matGuids.push_back(GuidToString(guid)); - } - meshJson["MaterialAssetGuids"] = matGuids; - meshJson["SourceModelAssetGuid"] = GuidToString(mesh.SourceModelAssetGuid); - meshJson["SourceModelPath"] = mesh.SourceModelPath; - meshJson["SourceNodePath"] = mesh.SourceNodePath; - - meshJson["BaseColorTextureGuid"] = GuidToString(mesh.BaseColorTextureGuid); - meshJson["MetallicRoughnessTextureGuid"] = GuidToString(mesh.MetallicRoughnessTextureGuid); - meshJson["NormalTextureGuid"] = GuidToString(mesh.NormalTextureGuid); - meshJson["EmissiveTextureGuid"] = GuidToString(mesh.EmissiveTextureGuid); - meshJson["AoTextureGuid"] = GuidToString(mesh.AoTextureGuid); - - meshJson["BaseColorTexturePath"] = mesh.BaseColorTexturePath; - meshJson["MetallicRoughnessTexturePath"] = mesh.MetallicRoughnessTexturePath; - meshJson["NormalTexturePath"] = mesh.NormalTexturePath; - meshJson["EmissiveTexturePath"] = mesh.EmissiveTexturePath; - meshJson["AoTexturePath"] = mesh.AoTexturePath; - - meshJson["DoubleSided"] = mesh.DoubleSided; - meshJson["Metallic"] = mesh.Metallic; - meshJson["Roughness"] = mesh.Roughness; - meshJson["AlphaMode"] = static_cast(mesh.AlphaMode); - meshJson["AlphaCutoff"] = mesh.AlphaCutoff; - meshJson["EmissiveColor"] = Vec3ToJson(mesh.EmissiveColor); - meshJson["BaseColor"] = Vec3ToJson(mesh.BaseColor); - meshJson["ModelNodeIndex"] = mesh.ModelNodeIndex; - meshJson["SubMeshIndex"] = mesh.SubMeshIndex; - meshJson["Visible"] = mesh.Visible; - - objJson["MeshRenderer"] = meshJson; - } - - // 序列化 Light 组件 (如果有) - if (obj.Light.has_value()) { - const auto& light = obj.Light.value(); - json lightJson; - lightJson["Color"] = Vec3ToJson(light.Color); - lightJson["Intensity"] = light.Intensity; - objJson["Light"] = lightJson; - } - - // 序列化 Camera 组件 (如果有) - if (obj.Camera.has_value()) { - const auto& cam = obj.Camera.value(); - json camJson; - camJson["FieldOfViewDegrees"] = cam.FieldOfViewDegrees; - camJson["NearClip"] = cam.NearClip; - camJson["FarClip"] = cam.FarClip; - camJson["IsPrimary"] = cam.IsPrimary; - objJson["Camera"] = camJson; - } - - // 序列化 PrefabInstance 预制体元数据 (如果有) - if (obj.PrefabInstance.has_value()) { - const auto& prefab = obj.PrefabInstance.value(); - json prefabJson; - prefabJson["PrefabAssetGuid"] = GuidToString(prefab.PrefabAssetGuid); - prefabJson["PrefabObjectId"] = prefab.PrefabObjectId; - prefabJson["PrefabInstanceRootId"] = prefab.PrefabInstanceRootId; - objJson["PrefabInstance"] = prefabJson; - } - - gameObjectsArray.push_back(objJson); + + // 验证 MetaCoreSceneDocument 反射注册 + const MetaCoreStructDescriptor* sceneDesc = registry.FindStruct(); + if (!sceneDesc) { + std::cerr << "SaveSceneToJson: 未能找到 MetaCoreSceneDocument 反射描述" << std::endl; + return false; } - sceneJson["GameObjects"] = gameObjectsArray; + for (const auto& field : sceneDesc->Fields) { + if (field.Name == "Name") { + sceneJson["SceneName"] = sceneDocument.Name; + } else if (field.Name == "Selection") { + const MetaCoreStructDescriptor* selDesc = registry.FindStruct(); + if (selDesc) { + json selJson = json::object(); + for (const auto& selField : selDesc->Fields) { + if (selField.Name == "SelectedObjectIds") selJson["SelectedObjectIds"] = sceneDocument.Selection.SelectedObjectIds; + else if (selField.Name == "ActiveObjectId") selJson["ActiveObjectId"] = sceneDocument.Selection.ActiveObjectId; + else if (selField.Name == "SelectionAnchorId") selJson["SelectionAnchorId"] = sceneDocument.Selection.SelectionAnchorId; + } + sceneJson["Selection"] = selJson; + } + } else if (field.Name == "GameObjects") { + json gameObjectsArray = json::array(); + const MetaCoreStructDescriptor* objDesc = registry.FindStruct(); + + if (objDesc) { + for (const auto& obj : sceneDocument.GameObjects) { + json objJson = json::object(); + for (const auto& objField : objDesc->Fields) { + if (objField.Name == "Id") { + objJson["Id"] = obj.Id; + } else if (objField.Name == "ParentId") { + objJson["ParentId"] = obj.ParentId; + } else if (objField.Name == "Name") { + objJson["Name"] = obj.Name; + } else if (objField.Name == "Transform") { + const MetaCoreStructDescriptor* transDesc = registry.FindStruct(); + if (transDesc) { + json transJson = json::object(); + for (const auto& transField : transDesc->Fields) { + if (transField.Name == "Position") transJson["Position"] = Vec3ToJson(obj.Transform.Position); + else if (transField.Name == "RotationEulerDegrees") transJson["RotationEulerDegrees"] = Vec3ToJson(obj.Transform.RotationEulerDegrees); + else if (transField.Name == "Scale") transJson["Scale"] = Vec3ToJson(obj.Transform.Scale); + } + objJson["Transform"] = transJson; + } + } else if (objField.Name == "MeshRenderer" && obj.MeshRenderer.has_value()) { + const MetaCoreStructDescriptor* meshDesc = registry.FindStruct(); + if (meshDesc) { + json meshJson = json::object(); + const auto& mesh = obj.MeshRenderer.value(); + for (const auto& meshField : meshDesc->Fields) { + if (meshField.Name == "MeshSource") meshJson["MeshSource"] = static_cast(mesh.MeshSource); + else if (meshField.Name == "BuiltinMesh") meshJson["BuiltinMesh"] = static_cast(mesh.BuiltinMesh); + else if (meshField.Name == "MeshAssetGuid") meshJson["MeshAssetGuid"] = GuidToString(mesh.MeshAssetGuid); + else if (meshField.Name == "MaterialAssetGuids") { + json matGuids = json::array(); + for (const auto& guid : mesh.MaterialAssetGuids) { + matGuids.push_back(GuidToString(guid)); + } + meshJson["MaterialAssetGuids"] = matGuids; + } + else if (meshField.Name == "SourceModelAssetGuid") meshJson["SourceModelAssetGuid"] = GuidToString(mesh.SourceModelAssetGuid); + else if (meshField.Name == "SourceModelPath") meshJson["SourceModelPath"] = mesh.SourceModelPath; + else if (meshField.Name == "SourceNodePath") meshJson["SourceNodePath"] = mesh.SourceNodePath; + else if (meshField.Name == "BaseColorTextureGuid") meshJson["BaseColorTextureGuid"] = GuidToString(mesh.BaseColorTextureGuid); + else if (meshField.Name == "MetallicRoughnessTextureGuid") meshJson["MetallicRoughnessTextureGuid"] = GuidToString(mesh.MetallicRoughnessTextureGuid); + else if (meshField.Name == "NormalTextureGuid") meshJson["NormalTextureGuid"] = GuidToString(mesh.NormalTextureGuid); + else if (meshField.Name == "EmissiveTextureGuid") meshJson["EmissiveTextureGuid"] = GuidToString(mesh.EmissiveTextureGuid); + else if (meshField.Name == "AoTextureGuid") meshJson["AoTextureGuid"] = GuidToString(mesh.AoTextureGuid); + else if (meshField.Name == "BaseColorTexturePath") meshJson["BaseColorTexturePath"] = mesh.BaseColorTexturePath; + else if (meshField.Name == "MetallicRoughnessTexturePath") meshJson["MetallicRoughnessTexturePath"] = mesh.MetallicRoughnessTexturePath; + else if (meshField.Name == "NormalTexturePath") meshJson["NormalTexturePath"] = mesh.NormalTexturePath; + else if (meshField.Name == "EmissiveTexturePath") meshJson["EmissiveTexturePath"] = mesh.EmissiveTexturePath; + else if (meshField.Name == "AoTexturePath") meshJson["AoTexturePath"] = mesh.AoTexturePath; + else if (meshField.Name == "DoubleSided") meshJson["DoubleSided"] = mesh.DoubleSided; + else if (meshField.Name == "Metallic") meshJson["Metallic"] = mesh.Metallic; + else if (meshField.Name == "Roughness") meshJson["Roughness"] = mesh.Roughness; + else if (meshField.Name == "AlphaMode") meshJson["AlphaMode"] = static_cast(mesh.AlphaMode); + else if (meshField.Name == "AlphaCutoff") meshJson["AlphaCutoff"] = mesh.AlphaCutoff; + else if (meshField.Name == "EmissiveColor") meshJson["EmissiveColor"] = Vec3ToJson(mesh.EmissiveColor); + else if (meshField.Name == "BaseColor") meshJson["BaseColor"] = Vec3ToJson(mesh.BaseColor); + else if (meshField.Name == "ModelNodeIndex") meshJson["ModelNodeIndex"] = mesh.ModelNodeIndex; + else if (meshField.Name == "SubMeshIndex") meshJson["SubMeshIndex"] = mesh.SubMeshIndex; + else if (meshField.Name == "Visible") meshJson["Visible"] = mesh.Visible; + } + objJson["MeshRenderer"] = meshJson; + } + } else if (objField.Name == "Light" && obj.Light.has_value()) { + const MetaCoreStructDescriptor* lightDesc = registry.FindStruct(); + if (lightDesc) { + json lightJson = json::object(); + for (const auto& lightField : lightDesc->Fields) { + if (lightField.Name == "Color") lightJson["Color"] = Vec3ToJson(obj.Light->Color); + else if (lightField.Name == "Intensity") lightJson["Intensity"] = obj.Light->Intensity; + } + objJson["Light"] = lightJson; + } + } else if (objField.Name == "Camera" && obj.Camera.has_value()) { + const MetaCoreStructDescriptor* camDesc = registry.FindStruct(); + if (camDesc) { + json camJson = json::object(); + for (const auto& camField : camDesc->Fields) { + if (camField.Name == "FieldOfViewDegrees") camJson["FieldOfViewDegrees"] = obj.Camera->FieldOfViewDegrees; + else if (camField.Name == "NearClip") camJson["NearClip"] = obj.Camera->NearClip; + else if (camField.Name == "FarClip") camJson["FarClip"] = obj.Camera->FarClip; + else if (camField.Name == "IsPrimary") camJson["IsPrimary"] = obj.Camera->IsPrimary; + } + objJson["Camera"] = camJson; + } + } else if (objField.Name == "PrefabInstance" && obj.PrefabInstance.has_value()) { + const MetaCoreStructDescriptor* prefabDesc = registry.FindStruct(); + if (prefabDesc) { + json prefabJson = json::object(); + for (const auto& prefabField : prefabDesc->Fields) { + if (prefabField.Name == "PrefabAssetGuid") prefabJson["PrefabAssetGuid"] = GuidToString(obj.PrefabInstance->PrefabAssetGuid); + else if (prefabField.Name == "PrefabObjectId") prefabJson["PrefabObjectId"] = obj.PrefabInstance->PrefabObjectId; + else if (prefabField.Name == "PrefabInstanceRootId") prefabJson["PrefabInstanceRootId"] = obj.PrefabInstance->PrefabInstanceRootId; + } + objJson["PrefabInstance"] = prefabJson; + } + } + } + gameObjectsArray.push_back(objJson); + } + } + sceneJson["GameObjects"] = gameObjectsArray; + } + } std::ofstream file(absolutePath); if (!file.is_open()) { @@ -144,7 +176,6 @@ bool MetaCoreSceneSerializer::SaveSceneToJson( return false; } - // 使用 4 个空格缩进,完美支持 Git diff 差分 file << sceneJson.dump(4); return true; } catch (const std::exception& e) { @@ -168,113 +199,139 @@ std::optional MetaCoreSceneSerializer::LoadSceneFromJson( file >> sceneJson; MetaCoreSceneDocument sceneDocument; - if (sceneJson.contains("SceneName")) { - sceneDocument.Name = sceneJson["SceneName"].get(); + + // 验证 MetaCoreSceneDocument 反射注册 + const MetaCoreStructDescriptor* sceneDesc = registry.FindStruct(); + if (!sceneDesc) { + std::cerr << "LoadSceneFromJson: 未能找到 MetaCoreSceneDocument 反射描述" << std::endl; + return std::nullopt; } - if (sceneJson.contains("Selection")) { - const auto& selectionJson = sceneJson["Selection"]; - if (selectionJson.contains("SelectedObjectIds")) { - sceneDocument.Selection.SelectedObjectIds = selectionJson["SelectedObjectIds"].get>(); - } - if (selectionJson.contains("ActiveObjectId")) { - sceneDocument.Selection.ActiveObjectId = selectionJson["ActiveObjectId"].get(); - } - if (selectionJson.contains("SelectionAnchorId")) { - sceneDocument.Selection.SelectionAnchorId = selectionJson["SelectionAnchorId"].get(); - } - } - - if (sceneJson.contains("GameObjects") && sceneJson["GameObjects"].is_array()) { - for (const auto& objJson : sceneJson["GameObjects"]) { - MetaCoreGameObjectData obj; - obj.Id = objJson["Id"].get(); - obj.ParentId = objJson["ParentId"].get(); - obj.Name = objJson["Name"].get(); - - // 反序列化 Transform 组件 - if (objJson.contains("Transform")) { - const auto& transJson = objJson["Transform"]; - obj.Transform.Position = JsonToVec3(transJson["Position"]); - obj.Transform.RotationEulerDegrees = JsonToVec3(transJson["RotationEulerDegrees"]); - obj.Transform.Scale = JsonToVec3(transJson["Scale"]); - } - - // 反序列化 MeshRenderer 组件 (如果有) - if (objJson.contains("MeshRenderer")) { - const auto& meshJson = objJson["MeshRenderer"]; - MetaCoreMeshRendererComponent mesh; - mesh.MeshSource = static_cast(meshJson["MeshSource"].get()); - mesh.BuiltinMesh = static_cast(meshJson["BuiltinMesh"].get()); - mesh.MeshAssetGuid = StringToGuid(meshJson["MeshAssetGuid"].get()); - - if (meshJson.contains("MaterialAssetGuids") && meshJson["MaterialAssetGuids"].is_array()) { - for (const auto& mGuidJson : meshJson["MaterialAssetGuids"]) { - mesh.MaterialAssetGuids.push_back(StringToGuid(mGuidJson.get())); + for (const auto& field : sceneDesc->Fields) { + if (field.Name == "Name" && sceneJson.contains("SceneName")) { + sceneDocument.Name = sceneJson["SceneName"].get(); + } else if (field.Name == "Selection" && sceneJson.contains("Selection")) { + const auto& selectionJson = sceneJson["Selection"]; + const MetaCoreStructDescriptor* selDesc = registry.FindStruct(); + if (selDesc) { + for (const auto& selField : selDesc->Fields) { + if (selField.Name == "SelectedObjectIds" && selectionJson.contains("SelectedObjectIds")) { + sceneDocument.Selection.SelectedObjectIds = selectionJson["SelectedObjectIds"].get>(); + } else if (selField.Name == "ActiveObjectId" && selectionJson.contains("ActiveObjectId")) { + sceneDocument.Selection.ActiveObjectId = selectionJson["ActiveObjectId"].get(); + } else if (selField.Name == "SelectionAnchorId" && selectionJson.contains("SelectionAnchorId")) { + sceneDocument.Selection.SelectionAnchorId = selectionJson["SelectionAnchorId"].get(); } } - - mesh.SourceModelAssetGuid = StringToGuid(meshJson["SourceModelAssetGuid"].get()); - mesh.SourceModelPath = meshJson["SourceModelPath"].get(); - mesh.SourceNodePath = meshJson["SourceNodePath"].get(); - - mesh.BaseColorTextureGuid = StringToGuid(meshJson["BaseColorTextureGuid"].get()); - mesh.MetallicRoughnessTextureGuid = StringToGuid(meshJson["MetallicRoughnessTextureGuid"].get()); - mesh.NormalTextureGuid = StringToGuid(meshJson["NormalTextureGuid"].get()); - mesh.EmissiveTextureGuid = StringToGuid(meshJson["EmissiveTextureGuid"].get()); - mesh.AoTextureGuid = StringToGuid(meshJson["AoTextureGuid"].get()); - - mesh.BaseColorTexturePath = meshJson["BaseColorTexturePath"].get(); - mesh.MetallicRoughnessTexturePath = meshJson["MetallicRoughnessTexturePath"].get(); - mesh.NormalTexturePath = meshJson["NormalTexturePath"].get(); - mesh.EmissiveTexturePath = meshJson["EmissiveTexturePath"].get(); - mesh.AoTexturePath = meshJson["AoTexturePath"].get(); - - mesh.DoubleSided = meshJson["DoubleSided"].get(); - mesh.Metallic = meshJson["Metallic"].get(); - mesh.Roughness = meshJson["Roughness"].get(); - mesh.AlphaMode = static_cast(meshJson["AlphaMode"].get()); - mesh.AlphaCutoff = meshJson["AlphaCutoff"].get(); - mesh.EmissiveColor = JsonToVec3(meshJson["EmissiveColor"]); - mesh.BaseColor = JsonToVec3(meshJson["BaseColor"]); - mesh.ModelNodeIndex = meshJson["ModelNodeIndex"].get(); - mesh.SubMeshIndex = meshJson["SubMeshIndex"].get(); - mesh.Visible = meshJson["Visible"].get(); - - obj.MeshRenderer = mesh; } - - // 反序列化 Light 组件 (如果有) - if (objJson.contains("Light")) { - const auto& lightJson = objJson["Light"]; - MetaCoreLightComponent light; - light.Color = JsonToVec3(lightJson["Color"]); - light.Intensity = lightJson["Intensity"].get(); - obj.Light = light; + } else if (field.Name == "GameObjects" && sceneJson.contains("GameObjects") && sceneJson["GameObjects"].is_array()) { + const MetaCoreStructDescriptor* objDesc = registry.FindStruct(); + if (objDesc) { + for (const auto& objJson : sceneJson["GameObjects"]) { + MetaCoreGameObjectData obj; + + for (const auto& objField : objDesc->Fields) { + if (objField.Name == "Id" && objJson.contains("Id")) { + obj.Id = objJson["Id"].get(); + } else if (objField.Name == "ParentId" && objJson.contains("ParentId")) { + obj.ParentId = objJson["ParentId"].get(); + } else if (objField.Name == "Name" && objJson.contains("Name")) { + obj.Name = objJson["Name"].get(); + } else if (objField.Name == "Transform" && objJson.contains("Transform")) { + const auto& transJson = objJson["Transform"]; + const MetaCoreStructDescriptor* transDesc = registry.FindStruct(); + if (transDesc) { + for (const auto& transField : transDesc->Fields) { + if (transField.Name == "Position" && transJson.contains("Position")) { + obj.Transform.Position = JsonToVec3(transJson["Position"]); + } else if (transField.Name == "RotationEulerDegrees" && transJson.contains("RotationEulerDegrees")) { + obj.Transform.RotationEulerDegrees = JsonToVec3(transJson["RotationEulerDegrees"]); + } else if (transField.Name == "Scale" && transJson.contains("Scale")) { + obj.Transform.Scale = JsonToVec3(transJson["Scale"]); + } + } + } + } else if (objField.Name == "MeshRenderer" && objJson.contains("MeshRenderer")) { + const auto& meshJson = objJson["MeshRenderer"]; + const MetaCoreStructDescriptor* meshDesc = registry.FindStruct(); + if (meshDesc) { + MetaCoreMeshRendererComponent mesh; + for (const auto& meshField : meshDesc->Fields) { + if (meshField.Name == "MeshSource" && meshJson.contains("MeshSource")) mesh.MeshSource = static_cast(meshJson["MeshSource"].get()); + else if (meshField.Name == "BuiltinMesh" && meshJson.contains("BuiltinMesh")) mesh.BuiltinMesh = static_cast(meshJson["BuiltinMesh"].get()); + else if (meshField.Name == "MeshAssetGuid" && meshJson.contains("MeshAssetGuid")) mesh.MeshAssetGuid = StringToGuid(meshJson["MeshAssetGuid"].get()); + else if (meshField.Name == "MaterialAssetGuids" && meshJson.contains("MaterialAssetGuids") && meshJson["MaterialAssetGuids"].is_array()) { + for (const auto& mGuidJson : meshJson["MaterialAssetGuids"]) { + mesh.MaterialAssetGuids.push_back(StringToGuid(mGuidJson.get())); + } + } + else if (meshField.Name == "SourceModelAssetGuid" && meshJson.contains("SourceModelAssetGuid")) mesh.SourceModelAssetGuid = StringToGuid(meshJson["SourceModelAssetGuid"].get()); + else if (meshField.Name == "SourceModelPath" && meshJson.contains("SourceModelPath")) mesh.SourceModelPath = meshJson["SourceModelPath"].get(); + else if (meshField.Name == "SourceNodePath" && meshJson.contains("SourceNodePath")) mesh.SourceNodePath = meshJson["SourceNodePath"].get(); + else if (meshField.Name == "BaseColorTextureGuid" && meshJson.contains("BaseColorTextureGuid")) mesh.BaseColorTextureGuid = StringToGuid(meshJson["BaseColorTextureGuid"].get()); + else if (meshField.Name == "MetallicRoughnessTextureGuid" && meshJson.contains("MetallicRoughnessTextureGuid")) mesh.MetallicRoughnessTextureGuid = StringToGuid(meshJson["MetallicRoughnessTextureGuid"].get()); + else if (meshField.Name == "NormalTextureGuid" && meshJson.contains("NormalTextureGuid")) mesh.NormalTextureGuid = StringToGuid(meshJson["NormalTextureGuid"].get()); + else if (meshField.Name == "EmissiveTextureGuid" && meshJson.contains("EmissiveTextureGuid")) mesh.EmissiveTextureGuid = StringToGuid(meshJson["EmissiveTextureGuid"].get()); + else if (meshField.Name == "AoTextureGuid" && meshJson.contains("AoTextureGuid")) mesh.AoTextureGuid = StringToGuid(meshJson["AoTextureGuid"].get()); + else if (meshField.Name == "BaseColorTexturePath" && meshJson.contains("BaseColorTexturePath")) mesh.BaseColorTexturePath = meshJson["BaseColorTexturePath"].get(); + else if (meshField.Name == "MetallicRoughnessTexturePath" && meshJson.contains("MetallicRoughnessTexturePath")) mesh.MetallicRoughnessTexturePath = meshJson["MetallicRoughnessTexturePath"].get(); + else if (meshField.Name == "NormalTexturePath" && meshJson.contains("NormalTexturePath")) mesh.NormalTexturePath = meshJson["NormalTexturePath"].get(); + else if (meshField.Name == "EmissiveTexturePath" && meshJson.contains("EmissiveTexturePath")) mesh.EmissiveTexturePath = meshJson["EmissiveTexturePath"].get(); + else if (meshField.Name == "AoTexturePath" && meshJson.contains("AoTexturePath")) mesh.AoTexturePath = meshJson["AoTexturePath"].get(); + else if (meshField.Name == "DoubleSided" && meshJson.contains("DoubleSided")) mesh.DoubleSided = meshJson["DoubleSided"].get(); + else if (meshField.Name == "Metallic" && meshJson.contains("Metallic")) mesh.Metallic = meshJson["Metallic"].get(); + else if (meshField.Name == "Roughness" && meshJson.contains("Roughness")) mesh.Roughness = meshJson["Roughness"].get(); + else if (meshField.Name == "AlphaMode" && meshJson.contains("AlphaMode")) mesh.AlphaMode = static_cast(meshJson["AlphaMode"].get()); + else if (meshField.Name == "AlphaCutoff" && meshJson.contains("AlphaCutoff")) mesh.AlphaCutoff = meshJson["AlphaCutoff"].get(); + else if (meshField.Name == "EmissiveColor" && meshJson.contains("EmissiveColor")) mesh.EmissiveColor = JsonToVec3(meshJson["EmissiveColor"]); + else if (meshField.Name == "BaseColor" && meshJson.contains("BaseColor")) mesh.BaseColor = JsonToVec3(meshJson["BaseColor"]); + else if (meshField.Name == "ModelNodeIndex" && meshJson.contains("ModelNodeIndex")) mesh.ModelNodeIndex = meshJson["ModelNodeIndex"].get(); + else if (meshField.Name == "SubMeshIndex" && meshJson.contains("SubMeshIndex")) mesh.SubMeshIndex = meshJson["SubMeshIndex"].get(); + else if (meshField.Name == "Visible" && meshJson.contains("Visible")) mesh.Visible = meshJson["Visible"].get(); + } + obj.MeshRenderer = mesh; + } + } else if (objField.Name == "Light" && objJson.contains("Light")) { + const auto& lightJson = objJson["Light"]; + const MetaCoreStructDescriptor* lightDesc = registry.FindStruct(); + if (lightDesc) { + MetaCoreLightComponent light; + for (const auto& lightField : lightDesc->Fields) { + if (lightField.Name == "Color" && lightJson.contains("Color")) light.Color = JsonToVec3(lightJson["Color"]); + else if (lightField.Name == "Intensity" && lightJson.contains("Intensity")) light.Intensity = lightJson["Intensity"].get(); + } + obj.Light = light; + } + } else if (objField.Name == "Camera" && objJson.contains("Camera")) { + const auto& camJson = objJson["Camera"]; + const MetaCoreStructDescriptor* camDesc = registry.FindStruct(); + if (camDesc) { + MetaCoreCameraComponent cam; + for (const auto& camField : camDesc->Fields) { + if (camField.Name == "FieldOfViewDegrees" && camJson.contains("FieldOfViewDegrees")) cam.FieldOfViewDegrees = camJson["FieldOfViewDegrees"].get(); + else if (camField.Name == "NearClip" && camJson.contains("NearClip")) cam.NearClip = camJson["NearClip"].get(); + else if (camField.Name == "FarClip" && camJson.contains("FarClip")) cam.FarClip = camJson["FarClip"].get(); + else if (camField.Name == "IsPrimary" && camJson.contains("IsPrimary")) cam.IsPrimary = camJson["IsPrimary"].get(); + } + obj.Camera = cam; + } + } else if (objField.Name == "PrefabInstance" && objJson.contains("PrefabInstance")) { + const auto& prefabJson = objJson["PrefabInstance"]; + const MetaCoreStructDescriptor* prefabDesc = registry.FindStruct(); + if (prefabDesc) { + MetaCorePrefabInstanceMetadata prefab; + for (const auto& prefabField : prefabDesc->Fields) { + if (prefabField.Name == "PrefabAssetGuid" && prefabJson.contains("PrefabAssetGuid")) prefab.PrefabAssetGuid = StringToGuid(prefabJson["PrefabAssetGuid"].get()); + else if (prefabField.Name == "PrefabObjectId" && prefabJson.contains("PrefabObjectId")) prefab.PrefabObjectId = prefabJson["PrefabObjectId"].get(); + else if (prefabField.Name == "PrefabInstanceRootId" && prefabJson.contains("PrefabInstanceRootId")) prefab.PrefabInstanceRootId = prefabJson["PrefabInstanceRootId"].get(); + } + obj.PrefabInstance = prefab; + } + } + } + sceneDocument.GameObjects.push_back(obj); + } } - - // 反序列化 Camera 组件 (如果有) - if (objJson.contains("Camera")) { - const auto& camJson = objJson["Camera"]; - MetaCoreCameraComponent cam; - cam.FieldOfViewDegrees = camJson["FieldOfViewDegrees"].get(); - cam.NearClip = camJson["NearClip"].get(); - cam.FarClip = camJson["FarClip"].get(); - cam.IsPrimary = camJson["IsPrimary"].get(); - obj.Camera = cam; - } - - // 反序列化 PrefabInstance 预制体元数据 (如果有) - if (objJson.contains("PrefabInstance")) { - const auto& prefabJson = objJson["PrefabInstance"]; - MetaCorePrefabInstanceMetadata prefab; - prefab.PrefabAssetGuid = StringToGuid(prefabJson["PrefabAssetGuid"].get()); - prefab.PrefabObjectId = prefabJson["PrefabObjectId"].get(); - prefab.PrefabInstanceRootId = prefabJson["PrefabInstanceRootId"].get(); - obj.PrefabInstance = prefab; - } - - sceneDocument.GameObjects.push_back(obj); } }