From 73694cba6c4abe9444ca652c996a018ab6002f09 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 25 Oct 2023 09:57:51 -0500 Subject: [PATCH 1/4] Add being able to set origin of mesh to the local mesh origin. fix centering several meshes. --- Source/Engine/Graphics/Models/ModelData.h | 15 +++++ .../Tools/ModelTool/ModelTool.Assimp.cpp | 59 +++++++++++++++++++ .../Tools/ModelTool/ModelTool.OpenFBX.cpp | 15 +++++ Source/Engine/Tools/ModelTool/ModelTool.cpp | 9 ++- Source/Engine/Tools/ModelTool/ModelTool.h | 5 +- 5 files changed, 101 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Graphics/Models/ModelData.h b/Source/Engine/Graphics/Models/ModelData.h index 32caa2d01..b1080714b 100644 --- a/Source/Engine/Graphics/Models/ModelData.h +++ b/Source/Engine/Graphics/Models/ModelData.h @@ -90,6 +90,21 @@ public: /// Array BlendShapes; + /// + /// Global translation for this mesh to be at it's local origin. + /// + Vector3 OriginTranslation = Vector3::Zero; + + /// + /// Orientation for this mesh at it's local origin. + /// + Quaternion OriginOrientation = Quaternion::Identity; + + /// + /// Meshes scaling. + /// + Vector3 Scaling = Vector3(1); + public: /// /// Determines whether this instance has any mesh data. diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp index 01eb8d369..ab7c6c480 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#include "OpenFBX/ofbx.h" #if COMPILE_WITH_MODEL_TOOL && USE_ASSIMP #include "ModelTool.h" @@ -648,6 +649,64 @@ bool ImportMesh(int32 i, ImportedModelData& result, AssimpImporterData& data, St result.LODs.Resize(lodIndex + 1); result.LODs[lodIndex].Meshes.Add(meshData); } + + auto root = data.Scene->mRootNode; + Array points; + if (root->mNumChildren == 0) + { + //auto translation = ToMatrix(root->mTransformation).GetTranslation(); + //points.Add(Vector3(translation.X, translation.Y, translation.Z)); + aiQuaternion aiQuat; + aiVector3D aiPos; + aiVector3D aiScale; + root->mTransformation.Decompose(aiScale, aiQuat, aiPos); + auto quat = ToQuaternion(aiQuat); + auto pos = ToFloat3(aiPos); + auto scale = ToFloat3(aiScale); + Transform trans = Transform(pos, quat, scale); + points.Add(trans); + } + else + { + for (unsigned int j = 0; j < root->mNumChildren; j++) + { + //auto translation = ToMatrix(root->mChildren[j]->mTransformation).GetTranslation(); + //points.Add(Vector3(translation.X, translation.Y, -translation.Z)); + aiQuaternion aiQuat; + aiVector3D aiPos; + aiVector3D aiScale; + root->mChildren[j]->mTransformation.Decompose(aiScale, aiQuat, aiPos); + auto quat = ToQuaternion(aiQuat); + auto pos = ToFloat3(aiPos); + auto scale = ToFloat3(aiScale); + Transform trans = Transform(pos, quat, scale); + points.Add(trans); + } + } + + Float3 translation = Float3::Zero; + Float3 scale = Float3::Zero; + Quaternion orientation = Quaternion::Identity; + for (auto point : points) + { + translation += point.Translation; + scale += point.Scale; + orientation *= point.Orientation; + } + + if (points.Count() > 0) + { + meshData->OriginTranslation = translation / (float)points.Count(); + meshData->OriginOrientation = Quaternion::Invert(orientation); + meshData->Scaling = scale / (float)points.Count(); + } + else + { + meshData->OriginTranslation = translation; + meshData->OriginOrientation = Quaternion::Invert(orientation); + meshData->Scaling = Float3(1); + } + return false; } diff --git a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp index f1e89d6bc..3db9888ad 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp @@ -836,6 +836,21 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb mesh.TransformBuffer(geometryTransform); }*/ + // Get local transform for origin shifting translation + auto translation = ToMatrix(aMesh->getGlobalTransform()).GetTranslation(); + auto scale = data.GlobalSettings.UnitScaleFactor; + if (data.GlobalSettings.CoordAxis == ofbx::CoordSystem_RightHanded) + mesh.OriginTranslation = scale * Vector3(translation.X, translation.Y, -translation.Z); + else + mesh.OriginTranslation = scale * Vector3(translation.X, translation.Y, translation.Z); + + auto rot = aMesh->getLocalRotation(); + auto quat = Quaternion::Euler(-(float)rot.x, -(float)rot.y, -(float)rot.z); + mesh.OriginOrientation = quat; + + auto scaling = aMesh->getLocalScaling(); + auto scaleFactor = data.GlobalSettings.UnitScaleFactor; + mesh.Scaling = Vector3(scaleFactor * (float)scaling.x, scaleFactor * (float)scaling.y, scaleFactor * (float)scaling.z); return false; } diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index 116f63407..c9b55ec79 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -372,6 +372,7 @@ void ModelTool::Options::Serialize(SerializeStream& stream, const void* otherObj SERIALIZE(Scale); SERIALIZE(Rotation); SERIALIZE(Translation); + SERIALIZE(UseLocalOrigin); SERIALIZE(CenterGeometry); SERIALIZE(Duration); SERIALIZE(FramesRange); @@ -418,6 +419,7 @@ void ModelTool::Options::Deserialize(DeserializeStream& stream, ISerializeModifi DESERIALIZE(Scale); DESERIALIZE(Rotation); DESERIALIZE(Translation); + DESERIALIZE(UseLocalOrigin); DESERIALIZE(CenterGeometry); DESERIALIZE(Duration); DESERIALIZE(FramesRange); @@ -1089,11 +1091,16 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op // Prepare import transformation Transform importTransform(options.Translation, options.Rotation, Float3(options.Scale)); + if (options.UseLocalOrigin && data.LODs.HasItems() && data.LODs[0].Meshes.HasItems()) + { + importTransform.Translation -= importTransform.Orientation * data.LODs[0].Meshes[0]->OriginTranslation * importTransform.Scale; + } if (options.CenterGeometry && data.LODs.HasItems() && data.LODs[0].Meshes.HasItems()) { // Calculate the bounding box (use LOD0 as a reference) BoundingBox box = data.LODs[0].GetBox(); - importTransform.Translation -= box.GetCenter(); + auto center = data.LODs[0].Meshes[0]->OriginOrientation * importTransform.Orientation * box.GetCenter() * importTransform.Scale * data.LODs[0].Meshes[0]->Scaling; + importTransform.Translation -= center; } const bool applyImportTransform = !importTransform.IsIdentity(); diff --git a/Source/Engine/Tools/ModelTool/ModelTool.h b/Source/Engine/Tools/ModelTool/ModelTool.h index bad10b86e..98462ff9d 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.h +++ b/Source/Engine/Tools/ModelTool/ModelTool.h @@ -279,8 +279,11 @@ public: // Custom import geometry offset. API_FIELD(Attributes="EditorOrder(520), EditorDisplay(\"Transform\")") Float3 Translation = Float3::Zero; - // If checked, the imported geometry will be shifted to the center of mass. + // If checked, the imported geometry will be shifted to its local transform origin. API_FIELD(Attributes="EditorOrder(530), EditorDisplay(\"Transform\")") + bool UseLocalOrigin = false; + // If checked, the imported geometry will be shifted to the center of mass. + API_FIELD(Attributes="EditorOrder(540), EditorDisplay(\"Transform\")") bool CenterGeometry = false; public: // Animation From b8921fd9909922314a644eeab4db576e9b43dfa4 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 25 Oct 2023 09:58:02 -0500 Subject: [PATCH 2/4] clean up --- Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp index ab7c6c480..19a59d113 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp @@ -654,8 +654,6 @@ bool ImportMesh(int32 i, ImportedModelData& result, AssimpImporterData& data, St Array points; if (root->mNumChildren == 0) { - //auto translation = ToMatrix(root->mTransformation).GetTranslation(); - //points.Add(Vector3(translation.X, translation.Y, translation.Z)); aiQuaternion aiQuat; aiVector3D aiPos; aiVector3D aiScale; @@ -670,8 +668,6 @@ bool ImportMesh(int32 i, ImportedModelData& result, AssimpImporterData& data, St { for (unsigned int j = 0; j < root->mNumChildren; j++) { - //auto translation = ToMatrix(root->mChildren[j]->mTransformation).GetTranslation(); - //points.Add(Vector3(translation.X, translation.Y, -translation.Z)); aiQuaternion aiQuat; aiVector3D aiPos; aiVector3D aiScale; From bfaae46c7eaf34fc1b941fcf560d0c0a8500d81b Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 25 Oct 2023 10:35:12 -0500 Subject: [PATCH 3/4] remove not needed variable. --- Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp index 3db9888ad..c7ee11b42 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp @@ -849,8 +849,7 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb mesh.OriginOrientation = quat; auto scaling = aMesh->getLocalScaling(); - auto scaleFactor = data.GlobalSettings.UnitScaleFactor; - mesh.Scaling = Vector3(scaleFactor * (float)scaling.x, scaleFactor * (float)scaling.y, scaleFactor * (float)scaling.z); + mesh.Scaling = Vector3(scale * (float)scaling.x, scale * (float)scaling.y, scale * (float)scaling.z); return false; } From 66a709f09e511c9b6fdb5fc8aded8479af72249f Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 25 Oct 2023 10:46:04 -0500 Subject: [PATCH 4/4] small fixes --- Source/Engine/Graphics/Models/ModelData.h | 2 +- Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/Engine/Graphics/Models/ModelData.h b/Source/Engine/Graphics/Models/ModelData.h index b1080714b..d7359d905 100644 --- a/Source/Engine/Graphics/Models/ModelData.h +++ b/Source/Engine/Graphics/Models/ModelData.h @@ -103,7 +103,7 @@ public: /// /// Meshes scaling. /// - Vector3 Scaling = Vector3(1); + Vector3 Scaling = Vector3::One; public: /// diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp index 19a59d113..3d9be61d2 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp @@ -1,6 +1,5 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. -#include "OpenFBX/ofbx.h" #if COMPILE_WITH_MODEL_TOOL && USE_ASSIMP #include "ModelTool.h"