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);
 }
Exemple #4
0
        // 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);
        }