コード例 #1
0
        public static Mesh Triangulate2D(Polygon2D polygon, Vector2 UVScale, Vector2 UVOffset, Triangulation triangulation)
        {
            polygon.Normalize();

            Mesh result = null;

            switch (triangulation)
            {
            case Triangulation.Advanced:
                Slicer2D.Profiler.IncAdvancedTriangulation();

                float GC = Slicer2D.Settings.GetGarbageCollector();
                if (GC > 0 & polygon.GetArea() < GC)
                {
                    Debug.LogWarning("Smart Utility 2D: Slice was removed because it was too small");

                    return(null);
                }

                Polygon2D newPolygon = new Polygon2D(PreparePolygon.Get(polygon));

                if (newPolygon.pointsList.Count < 3)
                {
                    Debug.LogWarning("Smart Utility 2D: Mesh is too small for advanced triangulation, using simplified triangulations instead (size: " + polygon.GetArea() + ")");

                    result = PerformTriangulation(polygon, UVScale, UVOffset);

                    return(result);
                }

                foreach (Polygon2D hole in polygon.holesList)
                {
                    newPolygon.AddHole(new Polygon2D(PreparePolygon.Get(hole, -1)));
                }

                result = PerformTriangulation(newPolygon, UVScale, UVOffset);

                break;

            case Triangulation.Legacy:
                Slicer2D.Profiler.IncLegacyTriangulation();

                List <Vector2> list = new List <Vector2>();
                foreach (Vector2D p in polygon.pointsList)
                {
                    list.Add(p.ToVector2());
                }

                result = Triangulator.Create(list.ToArray(), UVScale, UVOffset);

                return(result);
            }

            return(result);
        }
コード例 #2
0
        static public List <Vector2D> Get(Polygon2D polygon, float multiplier = 1f)
        {
            Polygon2D newPolygon = new Polygon2D();

            polygon.Normalize();

            Vector2D result;

            double   rotA, rotC;
            Vector2D pB;

            for (int i = 0; i < polygon.pointsList.Count; i++)
            {
                pB = polygon.pointsList[i];

                int indexB = polygon.pointsList.IndexOf(pB);

                int indexA = (indexB - 1);
                if (indexA < 0)
                {
                    indexA += polygon.pointsList.Count;
                }

                int indexC = (indexB + 1);
                if (indexC >= polygon.pointsList.Count)
                {
                    indexC -= polygon.pointsList.Count;
                }

                pair.A = polygon.pointsList[indexA];
                pair.B = pB;
                pair.C = polygon.pointsList[indexC];

                rotA = Vector2D.Atan2(pair.B, pair.A);
                rotC = Vector2D.Atan2(pair.B, pair.C);

                pairA.x = pair.A.x;
                pairA.y = pair.A.y;
                pairA.Push(rotA - Mathf.PI / 2, precision * multiplier);

                pairC.x = pair.C.x;
                pairC.y = pair.C.y;
                pairC.Push(rotC + Mathf.PI / 2, precision * multiplier);

                vecA.x = pair.B.x;
                vecA.y = pair.B.y;
                vecA.Push(rotA - Mathf.PI / 2, precision * multiplier);
                vecA.Push(rotA, 100f);

                vecC.x = pair.B.x;
                vecC.y = pair.B.y;
                vecC.Push(rotC + Mathf.PI / 2, precision * multiplier);
                vecC.Push(rotC, 100f);

                pair0.A = pairA;
                pair0.B = vecA;

                pair1.A = pairC;
                pair1.B = vecC;

                result = Math2D.GetPointLineIntersectLine(pair0, pair1);

                if (result != null)
                {
                    newPolygon.AddPoint(result);
                }
            }

            return(newPolygon.pointsList);
        }
コード例 #3
0
        public static Mesh Triangulate3D(Polygon2D polygon, float z, Vector2 UVScale, Vector2 UVOffset, float UVRotation, Triangulation triangulation)
        {
            polygon.Normalize();

            Mesh result = null;

            switch (triangulation)
            {
            case Triangulation.Advanced:
                List <Vector2> uvs           = new List <Vector2>();
                List <Vector3> sideVertices  = new List <Vector3>();
                List <int>     sideTriangles = new List <int>();

                Vector3 pointA = new Vector3(0, 0, 0);
                Vector3 pointB = new Vector3(0, 0, 0);
                Vector3 pointC = new Vector3(0, 0, z);
                Vector3 pointD = new Vector3(0, 0, z);

                Vector2 uv0 = new Vector2();
                Vector2 uv1 = new Vector2();

                float a, b;

                int vCount = 0;

                Pair2D pair = new Pair2D(new Vector2D(polygon.pointsList.Last()), null);
                foreach (Vector2D p in polygon.pointsList)
                {
                    pair.B = p;

                    pointA.x = (float)pair.A.x;
                    pointA.y = (float)pair.A.y;
                    pointB.x = (float)pair.B.x;
                    pointB.y = (float)pair.B.y;
                    pointC.x = (float)pair.B.x;
                    pointC.y = (float)pair.B.y;
                    pointD.x = (float)pair.A.x;
                    pointD.y = (float)pair.A.y;

                    sideVertices.Add(pointA);
                    sideVertices.Add(pointB);
                    sideVertices.Add(pointC);
                    sideVertices.Add(pointD);

                    a = ((float)pair.A.x + 25f) / 50 + UVOffset.x / 2;
                    b = ((float)pair.B.x + 25f) / 50 + UVOffset.x / 2;

                    uv0.x = a;
                    uv0.y = a;
                    uv1.x = b;
                    uv1.y = b;

                    uvs.Add(new Vector2(0, 0));
                    uvs.Add(new Vector2(0, 1));
                    uvs.Add(new Vector2(1, 1));
                    uvs.Add(new Vector2(1, 0));

                    sideTriangles.Add(vCount + 2);
                    sideTriangles.Add(vCount + 1);
                    sideTriangles.Add(vCount + 0);

                    sideTriangles.Add(vCount + 0);
                    sideTriangles.Add(vCount + 3);
                    sideTriangles.Add(vCount + 2);

                    vCount += 4;

                    pair.A = pair.B;
                }

                Mesh mainMesh = new Mesh();
                mainMesh.subMeshCount = 2;

                Mesh surfaceMesh = PerformTriangulationAdvanced(polygon, UVScale, UVOffset, UVRotation);

                ///// UVS  /////
                foreach (Vector2 p in surfaceMesh.uv)
                {
                    uvs.Add(p);
                }
                foreach (Vector2 p in surfaceMesh.uv)
                {
                    uvs.Add(p);
                }

                surfaceMesh.triangles = surfaceMesh.triangles.Reverse().ToArray();

                ///// VERTICES ////

                List <Vector3> vertices = new List <Vector3>();
                foreach (Vector3 v in sideVertices)
                {
                    vertices.Add(v);
                }

                foreach (Vector3 v in surfaceMesh.vertices)
                {
                    Vector3 nV = v;
                    nV.z = z;
                    vertices.Add(nV);
                }

                foreach (Vector3 v in surfaceMesh.vertices)
                {
                    vertices.Add(v);
                }

                mainMesh.SetVertices(vertices);

                ///// TRIANGLES /////

                List <int> triangles = new List <int>();
                foreach (int p in sideTriangles)
                {
                    triangles.Add(p);
                }
                mainMesh.SetTriangles(triangles, 0);

                triangles.Clear();
                int count = sideVertices.Count();
                foreach (int p in surfaceMesh.triangles)
                {
                    triangles.Add(p + count);
                }

                int   trisCount = surfaceMesh.triangles.Count() / 3;
                int[] tris      = surfaceMesh.triangles;

                for (var i = 0; i < trisCount; i++)
                {
                    var tmp = tris[i * 3];
                    tris[i * 3]     = tris[i * 3 + 1];
                    tris[i * 3 + 1] = tmp;
                }

                count += surfaceMesh.vertices.Count();
                foreach (int p in tris)
                {
                    triangles.Add(p + count);
                }

                mainMesh.SetTriangles(triangles, 1);

                ///// LEFTOVERS /////

                mainMesh.uv = uvs.ToArray();
                mainMesh.RecalculateNormals();
                mainMesh.RecalculateBounds();

                result = mainMesh;

                break;
            }

            return(result);
        }