From bc6b95441e4ae79e41157934eabaf671047188e9 Mon Sep 17 00:00:00 2001 From: Alexander Filippov Date: Sun, 8 Dec 2024 07:07:30 +0100 Subject: [PATCH] Implemented thread safe GenerateConvexMeshes function. --- Runtime/MeshSafe.cs | 19 +++++++++++++++ Runtime/MeshSafe.cs.meta | 2 ++ Runtime/VHACD.cs | 52 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 Runtime/MeshSafe.cs create mode 100644 Runtime/MeshSafe.cs.meta diff --git a/Runtime/MeshSafe.cs b/Runtime/MeshSafe.cs new file mode 100644 index 0000000..8c6ef61 --- /dev/null +++ b/Runtime/MeshSafe.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +namespace MeshProcess +{ + public struct MeshSafe + { + public Vector3[] Vertices; + public int[] Triangles; + + public Mesh ToMesh() + { + return new Mesh + { + vertices = Vertices, + triangles = Triangles + }; + } + } +} \ No newline at end of file diff --git a/Runtime/MeshSafe.cs.meta b/Runtime/MeshSafe.cs.meta new file mode 100644 index 0000000..3a5a636 --- /dev/null +++ b/Runtime/MeshSafe.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 182d52cf7acb8c2409432384bf11f643 \ No newline at end of file diff --git a/Runtime/VHACD.cs b/Runtime/VHACD.cs index 86a1ac8..e3e5c55 100644 --- a/Runtime/VHACD.cs +++ b/Runtime/VHACD.cs @@ -186,6 +186,58 @@ namespace MeshProcess hullMesh.SetTriangles(indices, 0); + convexMesh.Add(hullMesh); + } + return convexMesh; + } + + public unsafe List GenerateConvexMeshes(Vector3[] verts, int[] tris) + { + var vhacd = CreateVHACD(); + var parameters = m_parameters; + + fixed (Vector3* pVerts = verts) + fixed (int* pTris = tris) + { + ComputeFloat( + vhacd, + (float*)pVerts, (uint)verts.Length, + (uint*)pTris, (uint)tris.Length / 3, + ¶meters); + } + + var numHulls = GetNConvexHulls(vhacd); + List convexMesh = new List((int)numHulls); + foreach (var index in Enumerable.Range(0, (int)numHulls)) + { + ConvexHull hull; + GetConvexHull(vhacd, (uint)index, &hull); + + var hullMesh = new MeshSafe(); + var hullVerts = new Vector3[hull.m_nPoints]; + fixed (Vector3* pHullVerts = hullVerts) + { + var pComponents = hull.m_points; + var pVerts = pHullVerts; + + for (var pointCount = hull.m_nPoints; pointCount != 0; --pointCount) + { + pVerts->x = (float)pComponents[0]; + pVerts->y = (float)pComponents[1]; + pVerts->z = (float)pComponents[2]; + + pVerts += 1; + pComponents += 3; + } + } + + hullMesh.Vertices = hullVerts; + + var indices = new int[hull.m_nTriangles * 3]; + Marshal.Copy((System.IntPtr)hull.m_triangles, indices, 0, indices.Length); + hullMesh.Triangles = indices; + + convexMesh.Add(hullMesh); } return convexMesh;