Fix major issue with transformation.

This commit is contained in:
Menotdan
2024-01-01 20:24:13 -05:00
parent 045943ef27
commit 8273656793
2 changed files with 28 additions and 7 deletions

View File

@@ -666,8 +666,11 @@ CreateAssetResult ImportModel::CreatePrefab(CreateAssetContext& context, ModelDa
nodeToActor.Add(nodeIndex, nodeActor); nodeToActor.Add(nodeIndex, nodeActor);
nodeActor->SetName(node.Name); 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. // Only set translation, since scale and rotation is applied earlier.
nodeActor->SetLocalTransform(Transform(node.LocalTransform.Translation)); nodeActor->SetLocalTransform(positionOffset);
if (nodeIndex == 0) if (nodeIndex == 0)
{ {
// Special case for root actor to link any unlinked nodes // Special case for root actor to link any unlinked nodes

View File

@@ -1292,7 +1292,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& data, Options& option
! !
#endif #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) // Perform simple nodes mapping to single node (will transform meshes to model local space)
SkeletonMapping<ModelDataNode> skeletonMapping(data.Nodes, nullptr); SkeletonMapping<ModelDataNode> skeletonMapping(data.Nodes, nullptr);
@@ -1313,11 +1313,6 @@ bool ModelTool::ImportModel(const String& path, ModelData& data, Options& option
{ {
// Transform vertices // Transform vertices
auto transformationMatrix = hierarchyUpdater.CombineMatricesFromNodeIndices(skeletonMapping.SourceToSource[mesh.NodeIndex], mesh.NodeIndex); 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()) if (!transformationMatrix.IsIdentity())
mesh.TransformBuffer(transformationMatrix); 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)) if (EnumHasAnyFlags(options.ImportTypes, ImportDataTypes::Animations))
{ {
for (auto& animation : data.Animations) for (auto& animation : data.Animations)