From 4984ba1bb3c79ecacb13c5dbe0797daaf2587aba Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 13 Aug 2021 09:58:57 +0200 Subject: [PATCH] Add `CookCollision` to collision data with triangles as `int32` --- Source/Engine/Physics/CollisionData.cpp | 15 +++++++++++++++ Source/Engine/Physics/CollisionData.h | 13 +++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Source/Engine/Physics/CollisionData.cpp b/Source/Engine/Physics/CollisionData.cpp index 14396bf6a..10dc38e6b 100644 --- a/Source/Engine/Physics/CollisionData.cpp +++ b/Source/Engine/Physics/CollisionData.cpp @@ -78,6 +78,21 @@ bool CollisionData::CookCollision(CollisionDataType type, const Span& v return CookCollision(type, &modelData, convexFlags, convexVertexLimit); } +bool CollisionData::CookCollision(CollisionDataType type, const Span& vertices, const Span& triangles, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) +{ + CHECK_RETURN(vertices.Length() != 0, true); + CHECK_RETURN(triangles.Length() != 0 && triangles.Length() % 3 == 0, true); + ModelData modelData; + modelData.LODs.Resize(1); + auto meshData = New(); + modelData.LODs[0].Meshes.Add(meshData); + meshData->Positions.Set(vertices.Get(), vertices.Length()); + meshData->Indices.Resize(triangles.Length()); + for (int32 i = 0; i < triangles.Length(); i++) + meshData->Indices.Get()[i] = triangles.Get()[i]; + return CookCollision(type, &modelData, convexFlags, convexVertexLimit); +} + bool CollisionData::CookCollision(CollisionDataType type, ModelData* modelData, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) { // Validate state diff --git a/Source/Engine/Physics/CollisionData.h b/Source/Engine/Physics/CollisionData.h index 9436ac80d..19c1efa03 100644 --- a/Source/Engine/Physics/CollisionData.h +++ b/Source/Engine/Physics/CollisionData.h @@ -223,6 +223,19 @@ public: /// The convex mesh vertex limit. Use values in range [8;255] API_FUNCTION() bool CookCollision(CollisionDataType type, const Span& vertices, const Span& triangles, 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. + /// + /// + /// Can be used only for virtual assets (see and ). + /// + /// The collision data type. + /// The source geometry vertex buffer with vertices positions. Cannot be empty. + /// The source data index buffer (triangles list). Uses 32-bit stride buffer. Cannot be empty. Length must be multiple of 3 (as 3 vertices build a triangle). + /// The convex mesh generation flags. + /// The convex mesh vertex limit. Use values in range [8;255] + API_FUNCTION() bool CookCollision(CollisionDataType type, const Span& vertices, const Span& triangles, 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. ///