Fix major issue with transformation.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user