From 51926f517e1de62e0935bd47cad6381018c98a7b Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 31 Mar 2021 12:15:38 +0200 Subject: [PATCH] Add support for masking Material Slots when cooking Collision Data --- Source/Editor/Editor.cs | 7 +-- .../Editor/Managed/ManagedEditor.Internal.cpp | 7 +-- .../Windows/Assets/CollisionDataWindow.cs | 48 +++++++++++++------ Source/Engine/Graphics/Models/Mesh.cpp | 21 +++----- Source/Engine/Graphics/Models/Mesh.h | 17 +------ Source/Engine/Graphics/Models/MeshBase.h | 24 ++++++++++ Source/Engine/Graphics/Models/SkinnedMesh.cpp | 15 ++---- Source/Engine/Graphics/Models/SkinnedMesh.h | 21 +------- Source/Engine/Graphics/RenderTools.cpp | 11 +++++ Source/Engine/Physics/CollisionCooking.cpp | 13 +++-- Source/Engine/Physics/CollisionCooking.h | 1 + Source/Engine/Physics/CollisionData.cpp | 3 +- Source/Engine/Physics/CollisionData.h | 3 +- 13 files changed, 102 insertions(+), 89 deletions(-) diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index d3e71b474..8f90d203f 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -752,10 +752,11 @@ namespace FlaxEditor /// The collision data type. /// The source model. /// The source model LOD index. + /// The source model material slots mask. One bit per-slot. Can be sued to exclude particular material slots from collision cooking. /// The convex mesh generation flags. /// The convex mesh vertex limit. Use values in range [8;255] /// True if failed, otherwise false. - public static bool CookMeshCollision(string path, CollisionDataType type, ModelBase model, int modelLodIndex = 0, ConvexMeshGenerationFlags convexFlags = ConvexMeshGenerationFlags.None, int convexVertexLimit = 255) + public static bool CookMeshCollision(string path, CollisionDataType type, ModelBase model, int modelLodIndex = 0, uint materialSlotsMask = uint.MaxValue, ConvexMeshGenerationFlags convexFlags = ConvexMeshGenerationFlags.None, int convexVertexLimit = 255) { if (string.IsNullOrEmpty(path)) throw new ArgumentNullException(nameof(path)); @@ -764,7 +765,7 @@ namespace FlaxEditor if (type == CollisionDataType.None) throw new ArgumentException(nameof(type)); - return Internal_CookMeshCollision(path, type, FlaxEngine.Object.GetUnmanagedPtr(model), modelLodIndex, convexFlags, convexVertexLimit); + return Internal_CookMeshCollision(path, type, FlaxEngine.Object.GetUnmanagedPtr(model), modelLodIndex, materialSlotsMask, convexFlags, convexVertexLimit); } /// @@ -1344,7 +1345,7 @@ namespace FlaxEditor internal static extern string Internal_GetShaderAssetSourceCode(IntPtr obj); [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_CookMeshCollision(string path, CollisionDataType type, IntPtr model, int modelLodIndex, ConvexMeshGenerationFlags convexFlags, int convexVertexLimit); + internal static extern bool Internal_CookMeshCollision(string path, CollisionDataType type, IntPtr model, int modelLodIndex, uint materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int convexVertexLimit); [MethodImpl(MethodImplOptions.InternalCall)] internal static extern void Internal_GetCollisionWires(IntPtr collisionData, out Vector3[] triangles, out int[] indices); diff --git a/Source/Editor/Managed/ManagedEditor.Internal.cpp b/Source/Editor/Managed/ManagedEditor.Internal.cpp index f56d8f3e6..73a65f0f5 100644 --- a/Source/Editor/Managed/ManagedEditor.Internal.cpp +++ b/Source/Editor/Managed/ManagedEditor.Internal.cpp @@ -715,7 +715,7 @@ public: return str; } - static bool CookMeshCollision(MonoString* pathObj, CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) + static bool CookMeshCollision(MonoString* pathObj, CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, uint32 materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) { #if COMPILE_WITH_PHYSICS_COOKING CollisionCooking::Argument arg; @@ -725,6 +725,7 @@ public: arg.Type = type; arg.Model = modelObj; arg.ModelLodIndex = modelLodIndex; + arg.MaterialSlotsMask = materialSlotsMask; arg.ConvexFlags = convexFlags; arg.ConvexVertexLimit = convexVertexLimit; return CreateCollisionData::CookMeshCollision(path, arg); @@ -742,8 +743,8 @@ public: const auto& debugLines = collisionData->GetDebugLines(); const int32 linesCount = debugLines.Count() / 2; - *triangles = mono_array_new(mono_domain_get(), StdTypesContainer::Instance()->Vector3Class->GetNative(), debugLines.Count()); - *indices = mono_array_new(mono_domain_get(), mono_get_int32_class(), linesCount * 3); + mono_gc_wbarrier_generic_store(triangles, (MonoObject*)mono_array_new(mono_domain_get(), StdTypesContainer::Instance()->Vector3Class->GetNative(), debugLines.Count())); + mono_gc_wbarrier_generic_store(indices, (MonoObject*)mono_array_new(mono_domain_get(), mono_get_int32_class(), linesCount * 3)); // Use one triangle per debug line for (int32 i = 0; i < debugLines.Count(); i++) diff --git a/Source/Editor/Windows/Assets/CollisionDataWindow.cs b/Source/Editor/Windows/Assets/CollisionDataWindow.cs index 9191283dc..0ff3f86e7 100644 --- a/Source/Editor/Windows/Assets/CollisionDataWindow.cs +++ b/Source/Editor/Windows/Assets/CollisionDataWindow.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +using System; using System.Xml; using FlaxEditor.Content; using FlaxEditor.Content.Create; @@ -10,6 +11,7 @@ using FlaxEditor.Viewport.Cameras; using FlaxEditor.Viewport.Previews; using FlaxEngine; using FlaxEngine.GUI; +using Object = FlaxEngine.Object; namespace FlaxEditor.Windows.Assets { @@ -20,6 +22,15 @@ namespace FlaxEditor.Windows.Assets /// public sealed class CollisionDataWindow : AssetEditorWindowBase { + [Flags] + private enum MaterialSlotsMask : uint + { + // @formatter:off + Slot0=1u<<0,Slot1=1u<<1,Slot2=1u<<2,Slot3=1u<<3,Slot4=1u<<4,Slot5=1u<<5,Slot6=1u<<6,Slot7=1u<<7,Slot8=1u<<8,Slot9=1u<<9,Slot10=1u<<10,Slot11=1u<<11,Slot12=1u<<12,Slot13=1u<<13,Slot14=1u<<14,Slot15=1u<<15,Slot16=1u<<16,Slot17=1u<<17,Slot18=1u<<18,Slot19=1u<<19,Slot20=1u<<20,Slot21=1u<<21,Slot22=1u<<22,Slot23=1u<<23,Slot24=1u<<24,Slot25=1u<<25,Slot26=1u<<26,Slot27=1u<<27,Slot28=1u<<28,Slot29=1u<<29,Slot30=1u<<30,Slot31=1u<<31, + // @formatter:on + All = uint.MaxValue, + } + /// /// The asset properties proxy object. /// @@ -39,6 +50,9 @@ namespace FlaxEditor.Windows.Assets [EditorOrder(20), Limit(0, 5), EditorDisplay("General", "Model LOD Index"), Tooltip("Source model LOD index to use for collision data generation (will be clamped to the actual model LODs collection size)")] public int ModelLodIndex; + [EditorOrder(30), EditorDisplay("General"), Tooltip("The source model material slots mask. One bit per-slot. Can be sued to exclude particular material slots from collision cooking.")] + public MaterialSlotsMask MaterialSlotsMask = MaterialSlotsMask.All; + [EditorOrder(100), EditorDisplay("Convex Mesh", "Convex Flags"), Tooltip("Convex mesh generation flags")] public ConvexMeshGenerationFlags ConvexFlags; @@ -88,28 +102,23 @@ namespace FlaxEditor.Windows.Assets private class CookData : CreateFileEntry { - private PropertiesProxy Proxy; - private CollisionDataType Type; - private ModelBase Model; - private int ModelLodIndex; - private ConvexMeshGenerationFlags ConvexFlags; - private int ConvexVertexLimit; + public PropertiesProxy Proxy; + public CollisionDataType Type; + public ModelBase Model; + public int ModelLodIndex; + public uint MaterialSlotsMask; + public ConvexMeshGenerationFlags ConvexFlags; + public int ConvexVertexLimit; - public CookData(PropertiesProxy proxy, string resultUrl, CollisionDataType type, ModelBase model, int modelLodIndex, ConvexMeshGenerationFlags convexFlags, int convexVertexLimit) + public CookData(string resultUrl) : base("Collision Data", resultUrl) { - Proxy = proxy; - Type = type; - Model = model; - ModelLodIndex = modelLodIndex; - ConvexFlags = convexFlags; - ConvexVertexLimit = convexVertexLimit; } /// public override bool Create() { - bool failed = FlaxEditor.Editor.CookMeshCollision(ResultUrl, Type, Model, ModelLodIndex, ConvexFlags, ConvexVertexLimit); + bool failed = FlaxEditor.Editor.CookMeshCollision(ResultUrl, Type, Model, ModelLodIndex, MaterialSlotsMask, ConvexFlags, ConvexVertexLimit); Proxy._isCooking = false; Proxy.Window.UpdateWiresModel(); @@ -121,7 +130,16 @@ namespace FlaxEditor.Windows.Assets public void Cook() { _isCooking = true; - Window.Editor.ContentImporting.Create(new CookData(this, Asset.Path, Type, Model, ModelLodIndex, ConvexFlags, ConvexVertexLimit)); + Window.Editor.ContentImporting.Create(new CookData(Asset.Path) + { + Proxy = this, + Type = Type, + Model = Model, + ModelLodIndex = ModelLodIndex, + MaterialSlotsMask = (uint)MaterialSlotsMask, + ConvexFlags = ConvexFlags, + ConvexVertexLimit = ConvexVertexLimit, + }); } public void OnLoad(CollisionDataWindow window) diff --git a/Source/Engine/Graphics/Models/Mesh.cpp b/Source/Engine/Graphics/Models/Mesh.cpp index 9afe971c8..4454a44ce 100644 --- a/Source/Engine/Graphics/Models/Mesh.cpp +++ b/Source/Engine/Graphics/Models/Mesh.cpp @@ -133,20 +133,22 @@ namespace bool Mesh::UpdateMesh(uint32 vertexCount, uint32 triangleCount, VB0ElementType* vb0, VB1ElementType* vb1, VB2ElementType* vb2, void* ib, bool use16BitIndices) { + auto model = (Model*)_model; + Unload(); // Setup GPU resources - _model->LODs[_lodIndex]._verticesCount -= _vertices; + model->LODs[_lodIndex]._verticesCount -= _vertices; const bool failed = Load(vertexCount, triangleCount, vb0, vb1, vb2, ib, use16BitIndices); if (!failed) { - _model->LODs[_lodIndex]._verticesCount += _vertices; + model->LODs[_lodIndex]._verticesCount += _vertices; // Calculate mesh bounds SetBounds(BoundingBox::FromPoints((Vector3*)vb0, vertexCount)); // Send event (actors using this model can update bounds, etc.) - _model->onLoaded(); + model->onLoaded(); } return failed; @@ -214,17 +216,6 @@ Mesh::~Mesh() SAFE_DELETE_GPU_RESOURCE(_indexBuffer); } -void Mesh::SetMaterialSlotIndex(int32 value) -{ - if (value < 0 || value >= _model->MaterialSlots.Count()) - { - LOG(Warning, "Cannot set mesh material slot to {0} while model has {1} slots.", value, _model->MaterialSlots.Count()); - return; - } - - _materialSlotIndex = value; -} - bool Mesh::Load(uint32 vertices, uint32 triangles, void* vb0, void* vb1, void* vb2, void* ib, bool use16BitIndexBuffer) { // Cache data @@ -443,7 +434,7 @@ void Mesh::Draw(const RenderContext& renderContext, const DrawInfo& info, float // TODO: cache vertexOffset within the model LOD per-mesh uint32 vertexOffset = 0; for (int32 meshIndex = 0; meshIndex < _index; meshIndex++) - vertexOffset += _model->LODs[_lodIndex].Meshes[meshIndex].GetVertexCount(); + vertexOffset += ((Model*)_model)->LODs[_lodIndex].Meshes[meshIndex].GetVertexCount(); drawCall.Geometry.VertexBuffers[2] = info.VertexColors[_lodIndex]; drawCall.Geometry.VertexBuffersOffsets[2] = vertexOffset * sizeof(VB2ElementType); } diff --git a/Source/Engine/Graphics/Models/Mesh.h b/Source/Engine/Graphics/Models/Mesh.h index 6213a03a5..f378f9f8e 100644 --- a/Source/Engine/Graphics/Models/Mesh.h +++ b/Source/Engine/Graphics/Models/Mesh.h @@ -22,10 +22,8 @@ API_CLASS(NoSpawn) class FLAXENGINE_API Mesh : public MeshBase DECLARE_SCRIPTING_TYPE_WITH_CONSTRUCTOR_IMPL(Mesh, MeshBase); protected: - Model* _model; int32 _index; int32 _lodIndex; - int32 _materialSlotIndex; bool _hasLightmapUVs; GPUBuffer* _vertexBuffers[3]; GPUBuffer* _indexBuffer; @@ -55,7 +53,7 @@ public: /// FORCE_INLINE Model* GetModel() const { - return _model; + return (Model*)_model; } /// @@ -74,19 +72,6 @@ public: return _index; } - /// - /// Gets the index of the material slot to use during this mesh rendering. - /// - API_PROPERTY() FORCE_INLINE int32 GetMaterialSlotIndex() const - { - return _materialSlotIndex; - } - - /// - /// Sets the index of the material slot to use during this mesh rendering. - /// - API_PROPERTY() void SetMaterialSlotIndex(int32 value); - /// /// Gets the index buffer. /// diff --git a/Source/Engine/Graphics/Models/MeshBase.h b/Source/Engine/Graphics/Models/MeshBase.h index ffdc754bf..bedb57c90 100644 --- a/Source/Engine/Graphics/Models/MeshBase.h +++ b/Source/Engine/Graphics/Models/MeshBase.h @@ -9,6 +9,7 @@ #include "Engine/Scripting/ScriptingObject.h" class Task; +class ModelBase; /// /// Base class for model resources meshes. @@ -18,11 +19,13 @@ API_CLASS(Abstract, NoSpawn) class FLAXENGINE_API MeshBase : public PersistentSc DECLARE_SCRIPTING_TYPE_MINIMAL(MeshBase); protected: + ModelBase* _model; bool _use16BitIndexBuffer; BoundingBox _box; BoundingSphere _sphere; uint32 _vertices; uint32 _triangles; + int32 _materialSlotIndex; explicit MeshBase(const SpawnParams& params) : PersistentScriptingObject(params) @@ -31,6 +34,14 @@ protected: public: + /// + /// Gets the model owning this mesh. + /// + FORCE_INLINE ModelBase* GetModelBase() const + { + return _model; + } + /// /// Gets the triangle count. /// @@ -76,6 +87,19 @@ public: return _use16BitIndexBuffer; } + /// + /// Gets the index of the material slot to use during this mesh rendering. + /// + API_PROPERTY() FORCE_INLINE int32 GetMaterialSlotIndex() const + { + return _materialSlotIndex; + } + + /// + /// Sets the index of the material slot to use during this mesh rendering. + /// + API_PROPERTY() void SetMaterialSlotIndex(int32 value); + /// /// Sets the mesh bounds. /// diff --git a/Source/Engine/Graphics/Models/SkinnedMesh.cpp b/Source/Engine/Graphics/Models/SkinnedMesh.cpp index d30a85b77..41d7cfb5b 100644 --- a/Source/Engine/Graphics/Models/SkinnedMesh.cpp +++ b/Source/Engine/Graphics/Models/SkinnedMesh.cpp @@ -34,17 +34,6 @@ SkinnedMesh::~SkinnedMesh() SAFE_DELETE_GPU_RESOURCE(_indexBuffer); } -void SkinnedMesh::SetMaterialSlotIndex(int32 value) -{ - if (value < 0 || value >= _model->MaterialSlots.Count()) - { - LOG(Warning, "Cannot set mesh material slot to {0} while model has {1} slots.", value, _model->MaterialSlots.Count()); - return; - } - - _materialSlotIndex = value; -} - bool SkinnedMesh::Load(uint32 vertices, uint32 triangles, void* vb0, void* ib, bool use16BitIndexBuffer) { // Cache data @@ -101,6 +90,8 @@ void SkinnedMesh::Unload() bool SkinnedMesh::UpdateMesh(uint32 vertexCount, uint32 triangleCount, VB0SkinnedElementType* vb, void* ib, bool use16BitIndices) { + auto model = (SkinnedModel*)_model; + // Setup GPU resources const bool failed = Load(vertexCount, triangleCount, vb, ib, use16BitIndices); if (!failed) @@ -109,7 +100,7 @@ bool SkinnedMesh::UpdateMesh(uint32 vertexCount, uint32 triangleCount, VB0Skinne SetBounds(BoundingBox::FromPoints((Vector3*)vb, vertexCount)); // Send event (actors using this model can update bounds, etc.) - _model->onLoaded(); + model->onLoaded(); } return failed; diff --git a/Source/Engine/Graphics/Models/SkinnedMesh.h b/Source/Engine/Graphics/Models/SkinnedMesh.h index 4f30d9f01..c61b0a794 100644 --- a/Source/Engine/Graphics/Models/SkinnedMesh.h +++ b/Source/Engine/Graphics/Models/SkinnedMesh.h @@ -19,10 +19,8 @@ API_CLASS(NoSpawn) class FLAXENGINE_API SkinnedMesh : public MeshBase DECLARE_SCRIPTING_TYPE_WITH_CONSTRUCTOR_IMPL(SkinnedMesh, MeshBase); protected: - SkinnedModel* _model; int32 _index; int32 _lodIndex; - int32 _materialSlotIndex; GPUBuffer* _vertexBuffer; GPUBuffer* _indexBuffer; mutable Array _cachedIndexBuffer; @@ -33,7 +31,7 @@ public: SkinnedMesh(const SkinnedMesh& other) : SkinnedMesh() { -#if !!BUILD_RELEASE +#if !BUILD_RELEASE CRASH; // Not used #endif } @@ -51,7 +49,7 @@ public: /// The skinned model FORCE_INLINE SkinnedModel* GetSkinnedModel() const { - return _model; + return (SkinnedModel*)_model; } /// @@ -63,21 +61,6 @@ public: return _index; } - /// - /// Gets the material slot index. - /// - /// The material slot index - API_PROPERTY() FORCE_INLINE int32 GetMaterialSlotIndex() const - { - return _materialSlotIndex; - } - - /// - /// Sets the index of the material slot index. - /// - /// The value. - API_PROPERTY() void SetMaterialSlotIndex(int32 value); - /// /// Determines whether this mesh is initialized (has vertex and index buffers initialized). /// diff --git a/Source/Engine/Graphics/RenderTools.cpp b/Source/Engine/Graphics/RenderTools.cpp index 13b5e1978..c14a18c40 100644 --- a/Source/Engine/Graphics/RenderTools.cpp +++ b/Source/Engine/Graphics/RenderTools.cpp @@ -554,6 +554,17 @@ float ViewToCenterLessRadius(const RenderView& view, const Vector3& center, floa return viewToCenter - radius; } +void MeshBase::SetMaterialSlotIndex(int32 value) +{ + if (value < 0 || value >= _model->MaterialSlots.Count()) + { + LOG(Warning, "Cannot set mesh material slot to {0} while model has {1} slots.", value, _model->MaterialSlots.Count()); + return; + } + + _materialSlotIndex = value; +} + void MeshBase::SetBounds(const BoundingBox& box) { _box = box; diff --git a/Source/Engine/Physics/CollisionCooking.cpp b/Source/Engine/Physics/CollisionCooking.cpp index 0cb8fa7a9..5af787c5e 100644 --- a/Source/Engine/Physics/CollisionCooking.cpp +++ b/Source/Engine/Physics/CollisionCooking.cpp @@ -118,15 +118,14 @@ bool CollisionCooking::CookCollision(const Argument& arg, CollisionData::Seriali for (int32 i = 0; i < meshesCount; i++) { const auto mesh = lod->Meshes[i]; + if ((arg.MaterialSlotsMask & (1 << mesh->MaterialSlotIndex)) == 0) + continue; vCount += mesh->Positions.Count(); - if (needIndexBuffer) - { iCount += mesh->Indices.Count() * 3; - } } - if (meshesCount == 1) + if (meshesCount == 1 && vCount != 0) { // Link a single mesh const auto mesh = lod->Meshes[0]; @@ -145,6 +144,8 @@ bool CollisionCooking::CookCollision(const Argument& arg, CollisionData::Seriali for (int32 i = 0; i < meshesCount; i++) { const auto mesh = lod->Meshes[i]; + if ((arg.MaterialSlotsMask & (1 << mesh->MaterialSlotIndex)) == 0) + continue; const int32 firstVertexIndex = vertexCounter; const int32 vertexCount = mesh->Positions.Count(); @@ -208,6 +209,8 @@ bool CollisionCooking::CookCollision(const Argument& arg, CollisionData::Seriali for (int32 i = 0; i < meshesCount; i++) { const auto& mesh = *meshes[i]; + if ((arg.MaterialSlotsMask & (1 << mesh.GetMaterialSlotIndex())) == 0) + continue; auto task = mesh.DownloadDataGPUAsync(MeshBufferType::Vertex0, vertexBuffers[i]); if (task == nullptr) @@ -239,6 +242,8 @@ bool CollisionCooking::CookCollision(const Argument& arg, CollisionData::Seriali for (int32 i = 0; i < meshesCount; i++) { const auto& mesh = *meshes[i]; + if ((arg.MaterialSlotsMask & (1 << mesh.GetMaterialSlotIndex())) == 0) + continue; const auto& vData = vertexBuffers[i]; const int32 firstVertexIndex = vertexCounter; diff --git a/Source/Engine/Physics/CollisionCooking.h b/Source/Engine/Physics/CollisionCooking.h index 57ef98922..992038224 100644 --- a/Source/Engine/Physics/CollisionCooking.h +++ b/Source/Engine/Physics/CollisionCooking.h @@ -42,6 +42,7 @@ public: ModelData* OverrideModelData = nullptr; AssetReference Model; int32 ModelLodIndex = 0; + uint32 MaterialSlotsMask = MAX_uint32; ConvexMeshGenerationFlags ConvexFlags = ConvexMeshGenerationFlags::None; int32 ConvexVertexLimit = 255; }; diff --git a/Source/Engine/Physics/CollisionData.cpp b/Source/Engine/Physics/CollisionData.cpp index 8ab4049d4..63822539d 100644 --- a/Source/Engine/Physics/CollisionData.cpp +++ b/Source/Engine/Physics/CollisionData.cpp @@ -23,7 +23,7 @@ CollisionData::CollisionData(const SpawnParams& params, const AssetInfo* info) #if COMPILE_WITH_PHYSICS_COOKING -bool CollisionData::CookCollision(CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) +bool CollisionData::CookCollision(CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, uint32 materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) { // Validate state if (!IsVirtual()) @@ -37,6 +37,7 @@ bool CollisionData::CookCollision(CollisionDataType type, ModelBase* modelObj, i arg.Type = type; arg.Model = modelObj; arg.ModelLodIndex = modelLodIndex; + arg.MaterialSlotsMask = materialSlotsMask; arg.ConvexFlags = convexFlags; arg.ConvexVertexLimit = convexVertexLimit; diff --git a/Source/Engine/Physics/CollisionData.h b/Source/Engine/Physics/CollisionData.h index 9a8d67b0b..c2ff38815 100644 --- a/Source/Engine/Physics/CollisionData.h +++ b/Source/Engine/Physics/CollisionData.h @@ -205,9 +205,10 @@ public: /// The collision data type. /// The source model. /// The source model LOD index. + /// The source model material slots mask. One bit per-slot. Can be sued to exclude particular material slots from collision cooking. /// The convex mesh generation flags. /// The convex mesh vertex limit. Use values in range [8;255] - API_FUNCTION() bool CookCollision(CollisionDataType type, ModelBase* model, int32 modelLodIndex = 0, ConvexMeshGenerationFlags convexFlags = ConvexMeshGenerationFlags::None, int32 convexVertexLimit = 255); + API_FUNCTION() bool CookCollision(CollisionDataType type, ModelBase* model, int32 modelLodIndex = 0, uint32 materialSlotsMask = MAX_uint32, ConvexMeshGenerationFlags convexFlags = ConvexMeshGenerationFlags::None, int32 convexVertexLimit = 255); /// /// Cooks the mesh collision data and updates the virtual asset. action cannot be performed on a main thread.