public void Execute() { NativeList <MeshSource> sources = MeshSourceMap.GetSources(TileBounds.Coord); for (int i = 0; i < sources.Length; i++) { MeshSource source = sources[i]; if (!IncludeMask.HasLayer(source.Info.Layer)) { continue; } NativeArray <int> indices; NativeArray <float3> vertices; if (source.Info.Shared) { if (!SharedMeshSources.TryGetValue(source.Info.SharedMeshId, out BlobAssetReference <MeshSourceData> data)) { continue; } MeshSourceData.GetData(data, out indices, out vertices); MeshSourceData.TransformInPlace(source.Info.TRS, vertices); InputBuilder.Append(vertices, indices, source.Info.Area); } else { MeshSourceData.GetData(source.Value, out indices, out vertices); InputBuilder.Append(vertices, indices, source.Info.Area); } vertices.Dispose(); indices.Dispose(); } }
public unsafe void Collect() { ConvexHull hull = Collider->ConvexHull; int totalNumVertices = 0; for (int f = 0; f < hull.NumFaces; f++) { totalNumVertices += hull.Faces[f].NumVertices + 1; } NativeArray <float3> vertices = new NativeArray <float3>(totalNumVertices, Allocator.Temp); NativeArray <int> triangles = new NativeArray <int>((totalNumVertices - hull.NumFaces) * 3, Allocator.Temp); int startVertexIndex = 0; int curTri = 0; for (int f = 0; f < hull.NumFaces; f++) { float3 avgFace = float3.zero; for (int fv = 0; fv < hull.Faces[f].NumVertices; fv++) { int origV = hull.FaceVertexIndices[hull.Faces[f].FirstIndex + fv]; vertices[startVertexIndex + fv] = hull.Vertices[origV]; float3 v = hull.Vertices[origV]; avgFace += v; triangles[curTri * 3 + 0] = startVertexIndex + fv; triangles[curTri * 3 + 1] = startVertexIndex + (fv + 1) % hull.Faces[f].NumVertices; triangles[curTri * 3 + 2] = startVertexIndex + hull.Faces[f].NumVertices; curTri++; } avgFace *= 1.0f / hull.Faces[f].NumVertices; vertices[startVertexIndex + hull.Faces[f].NumVertices] = avgFace; startVertexIndex += hull.Faces[f].NumVertices + 1; } InputBuilder.Append(vertices, triangles); vertices.Dispose(); triangles.Dispose(); }