From 3a0af54f4841c4074b25036fcedb34cb2dd62ba8 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 3 Feb 2026 09:23:19 +0100 Subject: [PATCH] Add `Collision Meshes Postfix` to filter collision meshes inside imported model via ending #3792 --- Source/Engine/Tools/ModelTool/ModelTool.cpp | 7 +++++-- Source/Engine/Tools/ModelTool/ModelTool.h | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index 843822b98..57afeb7a5 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -567,6 +567,7 @@ void ModelTool::Options::Serialize(SerializeStream& stream, const void* otherObj SERIALIZE(CalculateBoneOffsetMatrices); SERIALIZE(LightmapUVsSource); SERIALIZE(CollisionMeshesPrefix); + SERIALIZE(CollisionMeshesPostfix); SERIALIZE(CollisionType); SERIALIZE(PositionFormat); SERIALIZE(TexCoordFormat); @@ -621,6 +622,7 @@ void ModelTool::Options::Deserialize(DeserializeStream& stream, ISerializeModifi DESERIALIZE(CalculateBoneOffsetMatrices); DESERIALIZE(LightmapUVsSource); DESERIALIZE(CollisionMeshesPrefix); + DESERIALIZE(CollisionMeshesPostfix); DESERIALIZE(CollisionType); DESERIALIZE(PositionFormat); DESERIALIZE(TexCoordFormat); @@ -1830,7 +1832,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& data, Options& option } // Collision mesh output - if (options.CollisionMeshesPrefix.HasChars()) + if (options.CollisionMeshesPrefix.HasChars() || options.CollisionMeshesPostfix.HasChars()) { // Extract collision meshes from the model ModelData collisionModel; @@ -1839,7 +1841,8 @@ bool ModelTool::ImportModel(const String& path, ModelData& data, Options& option for (int32 i = lod.Meshes.Count() - 1; i >= 0; i--) { auto mesh = lod.Meshes[i]; - if (mesh->Name.StartsWith(options.CollisionMeshesPrefix, StringSearchCase::IgnoreCase)) + if ((options.CollisionMeshesPrefix.HasChars() && mesh->Name.StartsWith(options.CollisionMeshesPrefix, StringSearchCase::IgnoreCase)) || + (options.CollisionMeshesPostfix.HasChars() && mesh->Name.EndsWith(options.CollisionMeshesPostfix, StringSearchCase::IgnoreCase))) { // Remove material slot used by this mesh (if no other mesh else uses it) int32 materialSlotUsageCount = 0; diff --git a/Source/Engine/Tools/ModelTool/ModelTool.h b/Source/Engine/Tools/ModelTool/ModelTool.h index d7545b92e..bc96e8308 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.h +++ b/Source/Engine/Tools/ModelTool/ModelTool.h @@ -221,6 +221,9 @@ public: // If specified, all meshes that name starts with this prefix in the name will be imported as a separate collision data asset (excluded used for rendering). API_FIELD(Attributes="EditorOrder(100), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") String CollisionMeshesPrefix = TEXT(""); + // If specified, all meshes that name ends with this postfix in the name will be imported as a separate collision data asset (excluded used for rendering). + API_FIELD(Attributes="EditorOrder(101), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") + String CollisionMeshesPostfix = TEXT(""); // The type of collision that should be generated if the mesh has a collision prefix specified. API_FIELD(Attributes="EditorOrder(105), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") CollisionDataType CollisionType = CollisionDataType::ConvexMesh;