diff --git a/Source/Editor/Content/Import/ModelImportEntry.cs b/Source/Editor/Content/Import/ModelImportEntry.cs index 71a070333..b17c8314d 100644 --- a/Source/Editor/Content/Import/ModelImportEntry.cs +++ b/Source/Editor/Content/Import/ModelImportEntry.cs @@ -260,6 +260,13 @@ namespace FlaxEditor.Content.Import [EditorOrder(1050), DefaultValue(true)] public bool OptimizeKeyframes { get; set; } = true; + /// + /// If checked, the importer will import scale animation tracks (otherwise scale animation will be ignored). + /// + [EditorDisplay("Animation"), VisibleIf(nameof(ShowAnimation))] + [EditorOrder(1055), DefaultValue(false)] + public bool ImportScaleTracks { get; set; } = false; + /// /// Enables root motion extraction support from this animation. /// @@ -387,6 +394,7 @@ namespace FlaxEditor.Content.Import public float SamplingRate; public byte SkipEmptyCurves; public byte OptimizeKeyframes; + public byte ImportScaleTracks; public byte EnableRootMotion; public string RootNodeName; @@ -438,6 +446,7 @@ namespace FlaxEditor.Content.Import SamplingRate = SamplingRate, SkipEmptyCurves = (byte)(SkipEmptyCurves ? 1 : 0), OptimizeKeyframes = (byte)(OptimizeKeyframes ? 1 : 0), + ImportScaleTracks = (byte)(ImportScaleTracks ? 1 : 0), EnableRootMotion = (byte)(EnableRootMotion ? 1 : 0), RootNodeName = RootNodeName, GenerateLODs = (byte)(GenerateLODs ? 1 : 0), @@ -479,6 +488,7 @@ namespace FlaxEditor.Content.Import SamplingRate = options.SamplingRate; SkipEmptyCurves = options.SkipEmptyCurves != 0; OptimizeKeyframes = options.OptimizeKeyframes != 0; + ImportScaleTracks = options.ImportScaleTracks != 0; EnableRootMotion = options.EnableRootMotion != 0; RootNodeName = options.RootNodeName; GenerateLODs = options.GenerateLODs != 0; diff --git a/Source/Editor/Managed/ManagedEditor.Internal.cpp b/Source/Editor/Managed/ManagedEditor.Internal.cpp index 00a0257a2..dcaa25e6c 100644 --- a/Source/Editor/Managed/ManagedEditor.Internal.cpp +++ b/Source/Editor/Managed/ManagedEditor.Internal.cpp @@ -183,6 +183,7 @@ struct InternalModelOptions float SamplingRate; byte SkipEmptyCurves; byte OptimizeKeyframes; + byte ImportScaleTracks; byte EnableRootMotion; MonoString* RootNodeName; @@ -231,6 +232,7 @@ struct InternalModelOptions to->SamplingRate = from->SamplingRate; to->SkipEmptyCurves = from->SkipEmptyCurves; to->OptimizeKeyframes = from->OptimizeKeyframes; + to->ImportScaleTracks = from->ImportScaleTracks; to->EnableRootMotion = from->EnableRootMotion; to->RootNodeName = MUtils::ToString(from->RootNodeName); to->GenerateLODs = from->GenerateLODs; @@ -272,6 +274,7 @@ struct InternalModelOptions to->SamplingRate = from->SamplingRate; to->SkipEmptyCurves = from->SkipEmptyCurves; to->OptimizeKeyframes = from->OptimizeKeyframes; + to->ImportScaleTracks = from->ImportScaleTracks; to->EnableRootMotion = from->EnableRootMotion; to->RootNodeName = MUtils::ToString(from->RootNodeName); to->GenerateLODs = from->GenerateLODs; diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp index beaa60b87..daecf8c45 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp @@ -819,7 +819,8 @@ bool ModelTool::ImportDataAssimp(const char* path, ImportedModelData& data, Opti ImportCurve(aAnim->mPositionKeys, aAnim->mNumPositionKeys, anim.Position); ImportCurve(aAnim->mRotationKeys, aAnim->mNumRotationKeys, anim.Rotation); - ImportCurve(aAnim->mScalingKeys, aAnim->mNumScalingKeys, anim.Scale); + if (options.ImportScaleTracks) + ImportCurve(aAnim->mScalingKeys, aAnim->mNumScalingKeys, anim.Scale); } } } diff --git a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp index 002c84b09..1eb9e1f27 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp @@ -1051,9 +1051,9 @@ bool ImportAnimation(int32 index, ImportedModelData& data, OpenFbxImporterData& const ofbx::AnimationCurveNode* translationNode = layer->getCurveNode(*aNode.FbxObj, "Lcl Translation"); const ofbx::AnimationCurveNode* rotationNode = layer->getCurveNode(*aNode.FbxObj, "Lcl Rotation"); - const ofbx::AnimationCurveNode* scalingNode = nullptr; //layer->getCurveNode(*aNode.FbxObj, "Lcl Scaling"); + const ofbx::AnimationCurveNode* scalingNode = layer->getCurveNode(*aNode.FbxObj, "Lcl Scaling"); - if (translationNode || rotationNode || scalingNode) + if (translationNode || rotationNode || (scalingNode && importerData.Options.ImportScaleTracks)) animatedNodes.Add(nodeIndex); } if (animatedNodes.IsEmpty()) @@ -1069,13 +1069,14 @@ bool ImportAnimation(int32 index, ImportedModelData& data, OpenFbxImporterData& const ofbx::AnimationCurveNode* translationNode = layer->getCurveNode(*aNode.FbxObj, "Lcl Translation"); const ofbx::AnimationCurveNode* rotationNode = layer->getCurveNode(*aNode.FbxObj, "Lcl Rotation"); - //const ofbx::AnimationCurveNode* scalingNode = layer->getCurveNode(*aNode.FbxObj, "Lcl Scaling"); + const ofbx::AnimationCurveNode* scalingNode = layer->getCurveNode(*aNode.FbxObj, "Lcl Scaling"); anim.NodeName = aNode.Name; ImportCurve(translationNode, anim.Position, info, ExtractKeyframePosition); ImportCurve(rotationNode, anim.Rotation, info, ExtractKeyframeRotation); - //ImportCurve(scalingNode, anim.Scale, info, ExtractKeyframeScale); + if (importerData.Options.ImportScaleTracks) + ImportCurve(scalingNode, anim.Scale, info, ExtractKeyframeScale); } if (importerData.ConvertRH) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp index 3825709ca..b7fb04855 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp @@ -53,6 +53,7 @@ void ModelTool::Options::Serialize(SerializeStream& stream, const void* otherObj SERIALIZE(SamplingRate); SERIALIZE(SkipEmptyCurves); SERIALIZE(OptimizeKeyframes); + SERIALIZE(ImportScaleTracks); SERIALIZE(EnableRootMotion); SERIALIZE(RootNodeName); SERIALIZE(GenerateLODs); @@ -93,6 +94,7 @@ void ModelTool::Options::Deserialize(DeserializeStream& stream, ISerializeModifi DESERIALIZE(SamplingRate); DESERIALIZE(SkipEmptyCurves); DESERIALIZE(OptimizeKeyframes); + DESERIALIZE(ImportScaleTracks); DESERIALIZE(EnableRootMotion); DESERIALIZE(RootNodeName); DESERIALIZE(GenerateLODs); diff --git a/Source/Engine/Tools/ModelTool/ModelTool.h b/Source/Engine/Tools/ModelTool/ModelTool.h index 7d767bc77..b29bed71f 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.h +++ b/Source/Engine/Tools/ModelTool/ModelTool.h @@ -235,6 +235,7 @@ public: float SamplingRate = 0.0f; bool SkipEmptyCurves = true; bool OptimizeKeyframes = true; + bool ImportScaleTracks = false; bool EnableRootMotion = false; String RootNodeName;