// Callback from convex hull creater with a newly created hull. // Just add it to our collection of hulls for this shape. private void HullReturn(ConvexResult result) { m_hulls.Add(result); return; }
public HacdConvexHull[] DecomposeToConvexHulls(ulong meshHash, bool useCache, List <float3> convVertices, List <int> convIndices) { if (convIndices.Count % 3 != 0) { throw new InvalidOperationException("Number of indicies must be divisble by 3"); } if (IsCacheCandidate(useCache, convVertices.Count)) { //try cache try { HacdConvexHull[] cachedHulls; if (MeshingStage.HullCache.TryGetHulls(meshHash, out cachedHulls)) { return(cachedHulls); } } catch (Exception e) { m_log.ErrorFormat("[InWorldz.PhysX.RatcliffACD] Failure retrieving HACD hulls from cache: {0}: {1}", e, e.Message); } } ConvexBuilder builder = new ConvexBuilder(HullReturn); m_hulls = new List <ConvexResult>(); DecompDesc dcomp = new DecompDesc(); dcomp.mIndices = convIndices; dcomp.mVertices = convVertices; builder.process(dcomp); var retHulls = new HacdConvexHull[m_hulls.Count]; for (int i = 0; i < m_hulls.Count; i++) { ConvexResult hull = m_hulls[i]; float[] rawVerts = null; if (IsCacheCandidate(useCache, convVertices.Count)) { rawVerts = new float[hull.HullVertices.Count * 3]; } PhysX.Math.Vector3[] hullVerts = new PhysX.Math.Vector3[hull.HullVertices.Count]; for (int j = 0; j < hull.HullVertices.Count; j++) { hullVerts[j] = new PhysX.Math.Vector3(hull.HullVertices[j].x, hull.HullVertices[j].y, hull.HullVertices[j].z); if (rawVerts != null) { rawVerts[j * 3 + 0] = hull.HullVertices[j].x; rawVerts[j * 3 + 1] = hull.HullVertices[j].y; rawVerts[j * 3 + 2] = hull.HullVertices[j].z; } } retHulls[i] = new HacdConvexHull { Indicies = hull.HullIndices.ToArray(), Vertices = hullVerts, _rawVerts = rawVerts, }; } //store in cache for later if (IsCacheCandidate(useCache, convVertices.Count)) { try { MeshingStage.HullCache.CacheHulls(meshHash, retHulls); } catch (Exception e) { m_log.ErrorFormat("[InWorldz.PhysX.RatcliffACD] Failure storing HACD results in cache: {0}: {1}", e, e.Message); } } return(retHulls); }