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); }
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); }
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); }
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); }
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); }
// 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); }