From 827365679376134569561c2bfd83a20827f72059 Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Mon, 1 Jan 2024 20:24:13 -0500 Subject: [PATCH] Fix major issue with transformation. --- .../Engine/ContentImporters/ImportModel.cpp | 5 +++- Source/Engine/Tools/ModelTool/ModelTool.cpp | 30 +++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Source/Engine/ContentImporters/ImportModel.cpp b/Source/Engine/ContentImporters/ImportModel.cpp index b6fd483d3..ac2bacd25 100644 --- a/Source/Engine/ContentImporters/ImportModel.cpp +++ b/Source/Engine/ContentImporters/ImportModel.cpp @@ -666,8 +666,11 @@ CreateAssetResult ImportModel::CreatePrefab(CreateAssetContext& context, ModelDa nodeToActor.Add(nodeIndex, nodeActor); nodeActor->SetName(node.Name); + Transform positionOffset = Transform::Identity; + positionOffset.Translation = node.LocalTransform.Translation; + LOG(Warning, "node name: {0}, offset transform: {1}", node.Name, positionOffset); // Only set translation, since scale and rotation is applied earlier. - nodeActor->SetLocalTransform(Transform(node.LocalTransform.Translation)); + nodeActor->SetLocalTransform(positionOffset); if (nodeIndex == 0) { // Special case for root actor to link any unlinked nodes diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index ac9cda8b6..899f67a1f 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -1292,7 +1292,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& data, Options& option ! #endif } - if (EnumHasAnyFlags(options.ImportTypes, ImportDataTypes::Geometry)) + if (EnumHasAnyFlags(options.ImportTypes, ImportDataTypes::Geometry) && !(options.Type == ModelType::Prefab)) { // Perform simple nodes mapping to single node (will transform meshes to model local space) SkeletonMapping skeletonMapping(data.Nodes, nullptr); @@ -1313,11 +1313,6 @@ bool ModelTool::ImportModel(const String& path, ModelData& data, Options& option { // Transform vertices auto transformationMatrix = hierarchyUpdater.CombineMatricesFromNodeIndices(skeletonMapping.SourceToSource[mesh.NodeIndex], mesh.NodeIndex); - if (options.Type == ModelType::Prefab) - { - // Cancel out translation during mesh transformation, to set translation during prefab generation time. - transformationMatrix = transformationMatrix * transformationMatrix.Translation(transformationMatrix.GetTranslation() * -1.0f); - } if (!transformationMatrix.IsIdentity()) mesh.TransformBuffer(transformationMatrix); @@ -1328,6 +1323,29 @@ bool ModelTool::ImportModel(const String& path, ModelData& data, Options& option } } } + if (EnumHasAnyFlags(options.ImportTypes, ImportDataTypes::Geometry) && options.Type == ModelType::Prefab) + { + // Apply just the scale and rotations. + for (int32 lodIndex = 0; lodIndex < data.LODs.Count(); lodIndex++) + { + for (int32 meshIndex = 0; meshIndex < data.LODs[lodIndex].Meshes.Count(); meshIndex++) + { + auto& mesh = *data.LODs[lodIndex].Meshes[meshIndex]; + auto& node = data.Nodes[mesh.NodeIndex]; + + // Transform vertices + auto transformationMatrix = Matrix::Identity; + transformationMatrix.SetScaleVector(node.LocalTransform.Scale); + + Matrix rotation; + node.LocalTransform.GetRotation(rotation); + transformationMatrix = transformationMatrix * rotation; + + if (!transformationMatrix.IsIdentity()) + mesh.TransformBuffer(transformationMatrix); + } + } + } if (EnumHasAnyFlags(options.ImportTypes, ImportDataTypes::Animations)) { for (auto& animation : data.Animations)