public ObiTriangleMeshHandle GetOrCreateTriangleMesh(Mesh source) { ObiTriangleMeshHandle handle = new ObiTriangleMeshHandle(null); if (source != null && !handles.TryGetValue(source, out handle)) { var sourceTris = source.triangles; var sourceVertices = source.vertices; // Build a bounding interval hierarchy from the triangles: IBounded[] t = new IBounded[sourceTris.Length / 3]; for (int i = 0; i < t.Length; ++i) { int t1 = sourceTris[i * 3]; int t2 = sourceTris[i * 3 + 1]; int t3 = sourceTris[i * 3 + 2]; t[i] = new Triangle(t1, t2, t3, sourceVertices[t1], sourceVertices[t2], sourceVertices[t3]); } var sourceBih = BIH.Build(ref t); Triangle[] tris = Array.ConvertAll(t, x => (Triangle)x); handle = new ObiTriangleMeshHandle(source, headers.count); handles.Add(source, handle); headers.Add(new TriangleMeshHeader(bihNodes.count, sourceBih.Length, triangles.count, tris.Length, vertices.count, sourceVertices.Length)); bihNodes.AddRange(sourceBih); triangles.AddRange(tris); vertices.AddRange(sourceVertices); } return(handle); }
public ObiEdgeMeshHandle GetOrCreateEdgeMesh(EdgeCollider2D source) { ObiEdgeMeshHandle handle; if (!handles.TryGetValue(source, out handle)) { Vector2[] sourceVertices = source.points; int[] sourceEdges = new int[source.edgeCount * 2]; for (int i = 0; i < source.edgeCount; ++i) { sourceEdges[i * 2] = i; sourceEdges[i * 2 + 1] = i + 1; } // Build a bounding interval hierarchy from the edges: IBounded[] t = new IBounded[source.edgeCount]; for (int i = 0; i < source.edgeCount; ++i) { t[i] = new Edge(i, i + 1, sourceVertices[i], sourceVertices[i + 1]); } var sourceBih = BIH.Build(ref t); Edge[] edgs = Array.ConvertAll(t, x => (Edge)x); handle = new ObiEdgeMeshHandle(source, headers.count); handles.Add(source, handle); headers.Add(new EdgeMeshHeader(bihNodes.count, sourceBih.Length, edges.count, edgs.Length, vertices.count, sourceVertices.Length)); bihNodes.AddRange(sourceBih); edges.AddRange(edgs); vertices.AddRange(sourceVertices); } return(handle); }