fix(render): 修复层级嵌套模型加载失败及拖动父节点时子级坐标同步Bug
This commit is contained in:
parent
05157022bd
commit
36e3155a8a
@ -57,547 +57,12 @@
|
|||||||
1.0
|
1.0
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"Id": 3,
|
|
||||||
"MeshRenderer": {
|
|
||||||
"AlphaCutoff": 0.5,
|
|
||||||
"AlphaMode": 0,
|
|
||||||
"AoTextureGuid": "",
|
|
||||||
"AoTexturePath": "",
|
|
||||||
"BaseColor": [
|
|
||||||
1.0,
|
|
||||||
1.0,
|
|
||||||
1.0
|
|
||||||
],
|
|
||||||
"BaseColorTextureGuid": "",
|
|
||||||
"BaseColorTexturePath": "",
|
|
||||||
"BuiltinMesh": 0,
|
|
||||||
"DoubleSided": false,
|
|
||||||
"EmissiveColor": [
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"EmissiveTextureGuid": "",
|
|
||||||
"EmissiveTexturePath": "",
|
|
||||||
"MaterialAssetGuids": [
|
|
||||||
"9833a707-d635-426e-5db2-4cb58fbb5d03"
|
|
||||||
],
|
|
||||||
"MeshAssetGuid": "34a6ed73-d4a5-83a3-5863-742c204c4869",
|
|
||||||
"MeshSource": 1,
|
|
||||||
"Metallic": 0.0,
|
|
||||||
"MetallicRoughnessTextureGuid": "",
|
|
||||||
"MetallicRoughnessTexturePath": "",
|
|
||||||
"ModelNodeIndex": 0,
|
|
||||||
"NormalTextureGuid": "",
|
|
||||||
"NormalTexturePath": "",
|
|
||||||
"Roughness": 1.0,
|
|
||||||
"SourceModelAssetGuid": "7033a4a0-8f64-4826-8fec-22ce0fccb514",
|
|
||||||
"SourceModelPath": "Assets/Models/box1.glb",
|
|
||||||
"SourceNodePath": "box1",
|
|
||||||
"SubMeshIndex": -1,
|
|
||||||
"Visible": true
|
|
||||||
},
|
|
||||||
"Name": "box1.glb",
|
|
||||||
"ParentId": 0,
|
|
||||||
"Transform": {
|
|
||||||
"Position": [
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"RotationEulerDegrees": [
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"Scale": [
|
|
||||||
1.0,
|
|
||||||
1.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Id": 4,
|
|
||||||
"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": 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": 1,
|
|
||||||
"NormalTextureGuid": "",
|
|
||||||
"NormalTexturePath": "",
|
|
||||||
"Roughness": 1.0,
|
|
||||||
"SourceModelAssetGuid": "",
|
|
||||||
"SourceModelPath": "",
|
|
||||||
"SourceNodePath": "",
|
|
||||||
"SubMeshIndex": -1,
|
|
||||||
"Visible": true
|
|
||||||
},
|
|
||||||
"Name": "立方体.001",
|
|
||||||
"ParentId": 4,
|
|
||||||
"Transform": {
|
|
||||||
"Position": [
|
|
||||||
0.0,
|
|
||||||
-3.55507755279541,
|
|
||||||
1.553973731915903e-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": 2,
|
|
||||||
"NormalTextureGuid": "",
|
|
||||||
"NormalTexturePath": "",
|
|
||||||
"Roughness": 1.0,
|
|
||||||
"SourceModelAssetGuid": "",
|
|
||||||
"SourceModelPath": "",
|
|
||||||
"SourceNodePath": "",
|
|
||||||
"SubMeshIndex": -1,
|
|
||||||
"Visible": true
|
|
||||||
},
|
|
||||||
"Name": "立方体.007",
|
|
||||||
"ParentId": 5,
|
|
||||||
"Transform": {
|
|
||||||
"Position": [
|
|
||||||
4.175572872161865,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"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": 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": 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": 4,
|
|
||||||
"NormalTextureGuid": "",
|
|
||||||
"NormalTexturePath": "",
|
|
||||||
"Roughness": 1.0,
|
|
||||||
"SourceModelAssetGuid": "",
|
|
||||||
"SourceModelPath": "",
|
|
||||||
"SourceNodePath": "",
|
|
||||||
"SubMeshIndex": -1,
|
|
||||||
"Visible": true
|
|
||||||
},
|
|
||||||
"Name": "立方体.002",
|
|
||||||
"ParentId": 7,
|
|
||||||
"Transform": {
|
|
||||||
"Position": [
|
|
||||||
0.0,
|
|
||||||
-1.4481612709005276e-07,
|
|
||||||
-3.31300687789917
|
|
||||||
],
|
|
||||||
"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": 5,
|
|
||||||
"NormalTextureGuid": "",
|
|
||||||
"NormalTexturePath": "",
|
|
||||||
"Roughness": 1.0,
|
|
||||||
"SourceModelAssetGuid": "",
|
|
||||||
"SourceModelPath": "",
|
|
||||||
"SourceNodePath": "",
|
|
||||||
"SubMeshIndex": -1,
|
|
||||||
"Visible": true
|
|
||||||
},
|
|
||||||
"Name": "立方体.004",
|
|
||||||
"ParentId": 7,
|
|
||||||
"Transform": {
|
|
||||||
"Position": [
|
|
||||||
3.776623010635376,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"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": 6,
|
|
||||||
"NormalTextureGuid": "",
|
|
||||||
"NormalTexturePath": "",
|
|
||||||
"Roughness": 1.0,
|
|
||||||
"SourceModelAssetGuid": "",
|
|
||||||
"SourceModelPath": "",
|
|
||||||
"SourceNodePath": "",
|
|
||||||
"SubMeshIndex": -1,
|
|
||||||
"Visible": true
|
|
||||||
},
|
|
||||||
"Name": "立方体.005",
|
|
||||||
"ParentId": 7,
|
|
||||||
"Transform": {
|
|
||||||
"Position": [
|
|
||||||
0.0,
|
|
||||||
4.31797981262207,
|
|
||||||
-1.8874489171594178e-07
|
|
||||||
],
|
|
||||||
"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": 7,
|
|
||||||
"NormalTextureGuid": "",
|
|
||||||
"NormalTexturePath": "",
|
|
||||||
"Roughness": 1.0,
|
|
||||||
"SourceModelAssetGuid": "",
|
|
||||||
"SourceModelPath": "",
|
|
||||||
"SourceNodePath": "",
|
|
||||||
"SubMeshIndex": -1,
|
|
||||||
"Visible": true
|
|
||||||
},
|
|
||||||
"Name": "立方体.006",
|
|
||||||
"ParentId": 7,
|
|
||||||
"Transform": {
|
|
||||||
"Position": [
|
|
||||||
-4.638434886932373,
|
|
||||||
0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"RotationEulerDegrees": [
|
|
||||||
0.0,
|
|
||||||
-0.0,
|
|
||||||
0.0
|
|
||||||
],
|
|
||||||
"Scale": [
|
|
||||||
0.9999998807907104,
|
|
||||||
1.0,
|
|
||||||
1.0
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"SceneName": "Main",
|
"SceneName": "Main",
|
||||||
"Selection": {
|
"Selection": {
|
||||||
"ActiveObjectId": 3,
|
"ActiveObjectId": 0,
|
||||||
"SelectedObjectIds": [
|
"SelectedObjectIds": [],
|
||||||
3
|
"SelectionAnchorId": 0
|
||||||
],
|
|
||||||
"SelectionAnchorId": 3
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5833,6 +5833,11 @@ std::optional<MetaCoreId> MetaCoreBuiltinSceneEditingService::InstantiateModelAs
|
|||||||
std::vector<MetaCoreId> nodeToIdMap(importedDocument->Nodes.size(), 0);
|
std::vector<MetaCoreId> nodeToIdMap(importedDocument->Nodes.size(), 0);
|
||||||
|
|
||||||
if (importedDocument->Nodes.size() == 1) {
|
if (importedDocument->Nodes.size() == 1) {
|
||||||
|
// 给顶级根节点打上 Tag,用以在渲染同步回溯时精确定位宿主根
|
||||||
|
if (!modelRootObject.HasComponent<MetaCoreModelRootTag>()) {
|
||||||
|
modelRootObject.AddComponent<MetaCoreModelRootTag>(MetaCoreModelRootTag{ resolvedModelPath.generic_string() });
|
||||||
|
}
|
||||||
|
|
||||||
// 【平坦化优化】:针对单网格模型(如 box11.glb),不创建多余子级,直接将渲染器挂在顶级节点上
|
// 【平坦化优化】:针对单网格模型(如 box11.glb),不创建多余子级,直接将渲染器挂在顶级节点上
|
||||||
const auto& nodeMeta = importedDocument->Nodes[0];
|
const auto& nodeMeta = importedDocument->Nodes[0];
|
||||||
nodeToIdMap[0] = instantiatedRootId;
|
nodeToIdMap[0] = instantiatedRootId;
|
||||||
|
|||||||
@ -653,7 +653,12 @@ public:
|
|||||||
if (itMat != snapshot.LocalMatrices.end()) {
|
if (itMat != snapshot.LocalMatrices.end()) {
|
||||||
initLocalMat = itMat->second;
|
initLocalMat = itMat->second;
|
||||||
}
|
}
|
||||||
UpdateTransform(renderable.ObjectId, initLocalMat);
|
glm::mat4 initWorldMat = initLocalMat;
|
||||||
|
auto itWorldMat = snapshot.WorldMatrices.find(renderable.ObjectId);
|
||||||
|
if (itWorldMat != snapshot.WorldMatrices.end()) {
|
||||||
|
initWorldMat = itWorldMat->second;
|
||||||
|
}
|
||||||
|
UpdateTransform(renderable.ObjectId, initLocalMat, initWorldMat);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. 构建反向查找映射,方便反查 entity 对应的 objectId
|
// 1. 构建反向查找映射,方便反查 entity 对应的 objectId
|
||||||
@ -753,10 +758,11 @@ public:
|
|||||||
|
|
||||||
// 4. 同步所有存活实体的本地和全局变换矩阵
|
// 4. 同步所有存活实体的本地和全局变换矩阵
|
||||||
for (const auto& [objectId, assetEntity] : ObjectToFilamentEntity_) {
|
for (const auto& [objectId, assetEntity] : ObjectToFilamentEntity_) {
|
||||||
if (snapshot.WorldMatrices.contains(objectId)) {
|
auto itWorld = snapshot.WorldMatrices.find(objectId);
|
||||||
auto itMat = snapshot.LocalMatrices.find(objectId);
|
if (itWorld != snapshot.WorldMatrices.end()) {
|
||||||
if (itMat != snapshot.LocalMatrices.end()) {
|
auto itLocal = snapshot.LocalMatrices.find(objectId);
|
||||||
UpdateTransform(objectId, itMat->second);
|
if (itLocal != snapshot.LocalMatrices.end()) {
|
||||||
|
UpdateTransform(objectId, itLocal->second, itWorld->second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1036,7 +1042,7 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateTransform(MetaCoreId objectId, const glm::mat4& localMatrix) {
|
void UpdateTransform(MetaCoreId objectId, const glm::mat4& localMatrix, const glm::mat4& worldMatrix) {
|
||||||
auto it = ObjectToFilamentEntity_.find(objectId);
|
auto it = ObjectToFilamentEntity_.find(objectId);
|
||||||
if (it == ObjectToFilamentEntity_.end()) return;
|
if (it == ObjectToFilamentEntity_.end()) return;
|
||||||
|
|
||||||
@ -1045,7 +1051,8 @@ private:
|
|||||||
auto& tm = Engine_->getTransformManager();
|
auto& tm = Engine_->getTransformManager();
|
||||||
auto instance = tm.getInstance(entity);
|
auto instance = tm.getInstance(entity);
|
||||||
if (instance) {
|
if (instance) {
|
||||||
glm::mat4 matrix = localMatrix;
|
auto parent = tm.getParent(instance);
|
||||||
|
glm::mat4 matrix = parent ? localMatrix : worldMatrix;
|
||||||
|
|
||||||
// 【关键修复】:如果当前 entity 是子节点(即不是顶级映射的 pivotEntity)
|
// 【关键修复】:如果当前 entity 是子节点(即不是顶级映射的 pivotEntity)
|
||||||
// 由于它的父级(assetRoot)带有了 -90X 旋转,我们必须对子节点应用基变换来抵消这个旋转。
|
// 由于它的父级(assetRoot)带有了 -90X 旋转,我们必须对子节点应用基变换来抵消这个旋转。
|
||||||
|
|||||||
@ -89,18 +89,16 @@ MetaCoreSceneRenderSyncSnapshot MetaCoreSceneRenderSync::BuildSnapshot(const Met
|
|||||||
MetaCoreGameObject foundRoot = {};
|
MetaCoreGameObject foundRoot = {};
|
||||||
|
|
||||||
// 1. 优先通过运行时 MetaCoreModelRootTag 快速寻找顶级根
|
// 1. 优先通过运行时 MetaCoreModelRootTag 快速寻找顶级根
|
||||||
while (current.GetParentId() != 0) {
|
while (current) {
|
||||||
auto parentObj = scene.FindGameObject(current.GetParentId());
|
if (current.HasComponent<MetaCoreModelRootTag>()) {
|
||||||
if (!parentObj) break;
|
auto& tag = current.GetComponent<MetaCoreModelRootTag>();
|
||||||
|
|
||||||
if (parentObj.HasComponent<MetaCoreModelRootTag>()) {
|
|
||||||
auto& tag = parentObj.GetComponent<MetaCoreModelRootTag>();
|
|
||||||
if (MetaCoreNormalizeSyncPath(tag.SourceModelPath) == normCurrentPath) {
|
if (MetaCoreNormalizeSyncPath(tag.SourceModelPath) == normCurrentPath) {
|
||||||
foundRoot = parentObj;
|
foundRoot = current;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
current = parentObj;
|
if (current.GetParentId() == 0) break;
|
||||||
|
current = scene.FindGameObject(current.GetParentId());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (foundRoot) {
|
if (foundRoot) {
|
||||||
|
|||||||
@ -2830,6 +2830,82 @@ void MetaCoreTestDecoupledSnapshotSync() {
|
|||||||
window.Shutdown();
|
window.Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MetaCoreTestNestedModelHierarchyTransformSync() {
|
||||||
|
// 1. 创建测试场景,建立嵌套模型和父子变换结构
|
||||||
|
MetaCore::MetaCoreScene scene = MetaCore::MetaCoreCreateDefaultScene();
|
||||||
|
|
||||||
|
// 模拟根模型 (box1.glb)
|
||||||
|
MetaCore::MetaCoreGameObject parentModel = scene.CreateGameObject("ParentModel");
|
||||||
|
auto& parentMesh = parentModel.AddComponent<MetaCore::MetaCoreMeshRendererComponent>();
|
||||||
|
parentMesh.MeshSource = MetaCore::MetaCoreMeshSourceKind::Asset;
|
||||||
|
parentMesh.SourceModelPath = "Assets/Models/box1.glb";
|
||||||
|
parentMesh.SourceModelAssetGuid = MetaCore::MetaCoreAssetRegistry::Get().ResolvePathToGuid("Assets/Models/box1.glb");
|
||||||
|
parentModel.AddComponent<MetaCore::MetaCoreModelRootTag>(MetaCore::MetaCoreModelRootTag{ "Assets/Models/box1.glb" });
|
||||||
|
parentModel.GetComponent<MetaCore::MetaCoreTransformComponent>().Position = glm::vec3(0.0F, 1.0F, 0.0F);
|
||||||
|
|
||||||
|
// 模拟子模型 (嵌套相同的 box1.glb,其 parent 为 parentModel)
|
||||||
|
MetaCore::MetaCoreGameObject childModel = scene.CreateGameObject("ChildModel", parentModel.GetId());
|
||||||
|
auto& childMesh = childModel.AddComponent<MetaCore::MetaCoreMeshRendererComponent>();
|
||||||
|
childMesh.MeshSource = MetaCore::MetaCoreMeshSourceKind::Asset;
|
||||||
|
childMesh.SourceModelPath = "Assets/Models/box1.glb";
|
||||||
|
childMesh.SourceModelAssetGuid = MetaCore::MetaCoreAssetRegistry::Get().ResolvePathToGuid("Assets/Models/box1.glb");
|
||||||
|
childModel.AddComponent<MetaCore::MetaCoreModelRootTag>(MetaCore::MetaCoreModelRootTag{ "Assets/Models/box1.glb" });
|
||||||
|
childModel.GetComponent<MetaCore::MetaCoreTransformComponent>().Position = glm::vec3(2.0F, 0.0F, 0.0F); // 局部偏移 x + 2.0
|
||||||
|
|
||||||
|
MetaCore::MetaCoreSceneRenderSync renderSync;
|
||||||
|
MetaCore::MetaCoreSceneRenderSyncSnapshot snapshot = renderSync.BuildSnapshot(scene);
|
||||||
|
|
||||||
|
// 验证 Bug 2 修复:子模型的 HostRootId 应该为它自己,而不是父模型
|
||||||
|
bool foundChild = false;
|
||||||
|
for (const auto& renderable : snapshot.Renderables) {
|
||||||
|
if (renderable.ObjectId == childModel.GetId()) {
|
||||||
|
foundChild = true;
|
||||||
|
MetaCoreExpect(renderable.HostRootId == childModel.GetId(), "子模型的 HostRootId 必须等于其自身的 ID,不能被错判为父模型 ID");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MetaCoreExpect(foundChild, "快照的渲染实体列表中应包含 ChildModel");
|
||||||
|
|
||||||
|
// 2. 初始化桥接器
|
||||||
|
MetaCore::MetaCoreWindow window;
|
||||||
|
bool winOk = window.Initialize(800, 600, "NestedModelHierarchyTestWindow");
|
||||||
|
MetaCoreExpect(winOk, "测试窗口初始化成功");
|
||||||
|
|
||||||
|
MetaCore::MetaCoreFilamentSceneBridge bridge;
|
||||||
|
bridge.SetProjectRootPath("d:/MetaCore/SandboxProject");
|
||||||
|
bool bridgeOk = bridge.Initialize(window);
|
||||||
|
MetaCoreExpect(bridgeOk, "测试桥接器初始化成功");
|
||||||
|
|
||||||
|
// 同步快照
|
||||||
|
bridge.SyncScene(snapshot, nullptr, false, false);
|
||||||
|
|
||||||
|
// 验证 Bug 1 修复:在没有 Filament 层级关系下,子模型在 Filament 侧的变换矩阵应当正确跟随父模型的世界矩阵
|
||||||
|
// 子模型局部矩阵
|
||||||
|
glm::mat4 childLocalMat = glm::translate(glm::mat4(1.0F), glm::vec3(2.0F, 0.0F, 0.0F));
|
||||||
|
// 父模型世界矩阵
|
||||||
|
glm::mat4 parentWorldMat = glm::translate(glm::mat4(1.0F), glm::vec3(0.0F, 1.0F, 0.0F));
|
||||||
|
// 预期的子模型世界矩阵
|
||||||
|
glm::mat4 expectedChildWorldMat = parentWorldMat * childLocalMat;
|
||||||
|
|
||||||
|
bool transOk = bridge.VerifyTransformForTesting(childModel.GetId(), expectedChildWorldMat);
|
||||||
|
MetaCoreExpect(transOk, "子模型在 Filament 侧的最终变换矩阵应正确应用世界矩阵");
|
||||||
|
|
||||||
|
// 3. 拖拽父级:修改父模型位置,重新同步,并校验子模型是否跟着移动
|
||||||
|
parentModel.GetComponent<MetaCore::MetaCoreTransformComponent>().Position = glm::vec3(10.0F, 5.0F, 0.0F);
|
||||||
|
|
||||||
|
// 重新构建快照与同步
|
||||||
|
snapshot = renderSync.BuildSnapshot(scene);
|
||||||
|
bridge.SyncScene(snapshot, nullptr, false, false);
|
||||||
|
|
||||||
|
glm::mat4 newParentWorldMat = glm::translate(glm::mat4(1.0F), glm::vec3(10.0F, 5.0F, 0.0F));
|
||||||
|
glm::mat4 newExpectedChildWorldMat = newParentWorldMat * childLocalMat;
|
||||||
|
|
||||||
|
bool transOk2 = bridge.VerifyTransformForTesting(childModel.GetId(), newExpectedChildWorldMat);
|
||||||
|
MetaCoreExpect(transOk2, "拖拽父级后,子模型在 Filament 侧的最终变换矩阵应实时跟随父模型世界矩阵更新");
|
||||||
|
|
||||||
|
bridge.Shutdown();
|
||||||
|
window.Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
void MetaCoreTestP3ProductivityStage() {
|
void MetaCoreTestP3ProductivityStage() {
|
||||||
const std::filesystem::path tempProjectRoot =
|
const std::filesystem::path tempProjectRoot =
|
||||||
std::filesystem::temp_directory_path() / "MetaCoreTestP3Project";
|
std::filesystem::temp_directory_path() / "MetaCoreTestP3Project";
|
||||||
@ -3115,6 +3191,9 @@ int main() {
|
|||||||
std::cout << "[RUN] MetaCoreTestDecoupledSnapshotSync..." << std::endl;
|
std::cout << "[RUN] MetaCoreTestDecoupledSnapshotSync..." << std::endl;
|
||||||
MetaCoreTestDecoupledSnapshotSync();
|
MetaCoreTestDecoupledSnapshotSync();
|
||||||
|
|
||||||
|
std::cout << "[RUN] MetaCoreTestNestedModelHierarchyTransformSync..." << std::endl;
|
||||||
|
MetaCoreTestNestedModelHierarchyTransformSync();
|
||||||
|
|
||||||
std::cout << "[RUN] MetaCoreTestP3ProductivityStage..." << std::endl;
|
std::cout << "[RUN] MetaCoreTestP3ProductivityStage..." << std::endl;
|
||||||
MetaCoreTestP3ProductivityStage();
|
MetaCoreTestP3ProductivityStage();
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user