コード例 #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
        public Polygon2D ToOffset(Vector2 pos)
        {
            Polygon2D newPolygon = new Polygon2D(pointsList);

            foreach (Vector2D p in newPolygon.pointsList)
            {
                p.Inc(pos.x, pos.y);
            }

            foreach (Polygon2D p in holesList)
            {
                newPolygon.AddHole(p.ToOffset(pos));
            }

            return(newPolygon);
        }
コード例 #3
0
        public Polygon2D ToWorldSpace(Transform transform)
        {
            Polygon2D newPolygon = new Polygon2D();

            for (int i = 0; i < pointsList.Count; i++)
            {
                newPolygon.AddPoint(transform.TransformPoint(pointsList[i].ToVector2()));
            }

            for (int i = 0; i < holesList.Count; i++)
            {
                newPolygon.AddHole(holesList[i].ToWorldSpace(transform));
            }

            return(newPolygon);
        }
コード例 #4
0
        public Polygon2D ToLocalSpace(Transform transform)
        {
            Polygon2D newPolygon = new Polygon2D();

            foreach (Vector2D id in pointsList)
            {
                newPolygon.AddPoint(transform.InverseTransformPoint(id.ToVector2()));
            }

            foreach (Polygon2D p in holesList)
            {
                newPolygon.AddHole(p.ToLocalSpace(transform));
            }

            return(newPolygon);
        }
コード例 #5
0
        static public List <Polygon2D> CreateFromPolygonColliderToLocalSpace(PolygonCollider2D collider)
        {
            List <Polygon2D> result = new List <Polygon2D>();

            if (collider != null && collider.pathCount > 0)
            {
                Polygon2D newPolygon = new Polygon2D();

                Vector2[] pointList = collider.GetPath(0);

                for (int x = 0; x < pointList.Length; x++)
                {
                    newPolygon.AddPoint(pointList[x] + collider.offset);
                }

                result.Add(newPolygon);

                for (int i = 1; i < collider.pathCount; i++)
                {
                    Polygon2D hole = new Polygon2D();

                    pointList = collider.GetPath(i);

                    for (int x = 0; x < pointList.Length; x++)
                    {
                        hole.AddPoint(pointList[x] + collider.offset);
                    }

                    if (newPolygon.PolyInPoly(hole) == true)
                    {
                        newPolygon.AddHole(hole);
                    }
                    else
                    {
                        result.Add(hole);
                    }
                }
            }
            return(result);
        }
コード例 #6
0
        // Get List Of Polygons from Collider (Usually Used Before Creating Slicer2D Object)
        static public List <Polygon2D> CreateFromPolygonColliderToWorldSpace(PolygonCollider2D collider)
        {
            List <Polygon2D> result = new List <Polygon2D> ();

            if (collider != null && collider.pathCount > 0)
            {
                Polygon2D newPolygon = new Polygon2D();

                foreach (Vector2 p in collider.GetPath(0))
                {
                    newPolygon.AddPoint(p + collider.offset);
                }

                newPolygon = newPolygon.ToWorldSpace(collider.transform);

                result.Add(newPolygon);

                for (int i = 1; i < collider.pathCount; i++)
                {
                    Polygon2D hole = new Polygon2D();
                    foreach (Vector2 p in collider.GetPath(i))
                    {
                        hole.AddPoint(p + collider.offset);
                    }

                    hole = hole.ToWorldSpace(collider.transform);

                    if (newPolygon.PolyInPoly(hole) == true)
                    {
                        newPolygon.AddHole(hole);
                    }
                    else
                    {
                        result.Add(hole);
                    }
                }
            }
            return(result);
        }