static void CopyGeometry(NativeArray <int> srcIndices, int srcIndexCount, ref NativeArray <int> dstIndices, ref int dstIndexCount, NativeArray <float2> srcVertices, int srcVertexCount, ref NativeArray <float2> dstVertices, ref int dstVertexCount) { dstIndexCount = srcIndexCount; dstVertexCount = srcVertexCount; UTess.Copy(srcIndices, dstIndices, srcIndexCount); UTess.Copy(srcVertices, dstVertices, srcVertexCount); }
static void CopyGraph(NativeArray <float2> srcPoints, int srcPointCount, ref NativeArray <float2> dstPoints, ref int dstPointCount, NativeArray <int2> srcEdges, int srcEdgeCount, ref NativeArray <int2> dstEdges, ref int dstEdgeCount) { dstEdgeCount = srcEdgeCount; dstPointCount = srcPointCount; UTess.Copy(srcEdges, dstEdges, srcEdgeCount); UTess.Copy(srcPoints, dstPoints, srcPointCount); }
static void TransferOutput(NativeArray <int2> srcEdges, int srcEdgeCount, ref NativeArray <int2> dstEdges, ref int dstEdgeCount, NativeArray <int> srcIndices, int srcIndexCount, ref NativeArray <int> dstIndices, ref int dstIndexCount, NativeArray <float2> srcVertices, int srcVertexCount, ref NativeArray <float2> dstVertices, ref int dstVertexCount) { dstEdgeCount = srcEdgeCount; dstIndexCount = srcIndexCount; dstVertexCount = srcVertexCount; UTess.Copy(srcEdges, dstEdges, srcEdgeCount); UTess.Copy(srcIndices, dstIndices, srcIndexCount); UTess.Copy(srcVertices, dstVertices, srcVertexCount); }
// Trim Edges static void RefineEdges(ref NativeArray <int4> refinedEdges, ref NativeArray <int4> delaEdges, ref int delaEdgeCount, ref NativeArray <int4> voronoiEdges) { int origEdgeCount = delaEdgeCount; delaEdgeCount = 0; // Check Neighbour Triangles. for (int i = 0; i < origEdgeCount - 1; ++i) { var edge = delaEdges[i]; var neighbor = delaEdges[i + 1]; if (edge.x == neighbor.x && edge.y == neighbor.y) { // Found the Opposite Edge. i.e Nearby Triangle. edge.w = neighbor.z; ++i; } // Update new list. refinedEdges[delaEdgeCount++] = edge; } // Generate Voronoi Edges. for (int i = 0; i < delaEdgeCount; ++i) { var ti1 = refinedEdges[i].z; var ti2 = refinedEdges[i].w; // We only really care about Bounded Edges. This is simplification. Hoping this garbage works. if (ti1 != -1 && ti2 != -1) { // Get Triangles int4 e = new int4(ti2, ti1, i, 0); voronoiEdges[i] = e; } } UTess.Copy(refinedEdges, delaEdges, delaEdgeCount); }
// Validate the Input Points ane Edges. internal static bool Validate(Allocator allocator, NativeArray <float2> inputPoints, int pointCount, NativeArray <int2> inputEdges, int edgeCount, ref NativeArray <float2> outputPoints, ref int outputPointCount, ref NativeArray <int2> outputEdges, ref int outputEdgeCount) { var protectLoop = edgeCount; var requiresFix = true; var validGraph = false; // Processing Arrays. NativeArray <int2> edges = new NativeArray <int2>(UTess.kMaxEdgeCount, allocator); NativeArray <double2> points = new NativeArray <double2>(UTess.kMaxVertexCount, allocator); NativeArray <int2> tJunctions = new NativeArray <int2>(UTess.kMaxEdgeCount, allocator); NativeArray <int2> edgeIntersections = new NativeArray <int2>(UTess.kMaxEdgeCount, allocator); NativeArray <int> duplicates = new NativeArray <int>(UTess.kMaxVertexCount, allocator); NativeArray <double2> intersects = new NativeArray <double2>(UTess.kMaxEdgeCount, allocator); // Initialize. for (int i = 0; i < pointCount; ++i) { points[i] = inputPoints[i]; } UTess.Copy(inputEdges, edges, edgeCount); // Pre-clear duplicates, otherwise the following will simply fail. RemoveDuplicateEdges(ref edges, ref edgeCount, duplicates, 0); // While PSG is clean. while (requiresFix && --protectLoop > 0) { // Edge Edge Intersection. int intersectionCount = 0; validGraph = CalculateEdgeIntersections(edges, edgeCount, points, pointCount, ref edgeIntersections, ref intersects, ref intersectionCount); if (!validGraph) { break; } // Edge Point Intersection. T-Junction. int tJunctionCount = 0; validGraph = CalculateTJunctions(edges, edgeCount, points, pointCount, tJunctions, ref tJunctionCount); if (!validGraph) { break; } // Cut Overlapping Edges. validGraph = CutEdges(ref points, ref pointCount, ref edges, ref edgeCount, ref tJunctions, ref tJunctionCount, edgeIntersections, intersects, intersectionCount); if (!validGraph) { break; } // Remove Duplicate Points. int duplicateCount = 0; RemoveDuplicatePoints(ref points, ref pointCount, ref duplicates, ref duplicateCount); RemoveDuplicateEdges(ref edges, ref edgeCount, duplicates, duplicateCount); requiresFix = intersectionCount != 0 || tJunctionCount != 0; } if (validGraph) { // Finalize Output. outputEdgeCount = edgeCount; outputPointCount = pointCount; UTess.Copy(edges, outputEdges, edgeCount); for (int i = 0; i < pointCount; ++i) { outputPoints[i] = new float2((float)points[i].x, (float)points[i].y); } } edges.Dispose(); points.Dispose(); intersects.Dispose(); duplicates.Dispose(); tJunctions.Dispose(); edgeIntersections.Dispose(); return(validGraph && protectLoop > 0); }