A game about forced loneliness, made by TACStudios
at master 3.0 kB view raw
1using System; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6namespace UnityEditor.U2D.Common.Path 7{ 8 internal static class ShapeExtensions 9 { 10 public static Polygon ToPolygon(this Vector3[] points, bool isOpenEnded) 11 { 12 return new Polygon() 13 { 14 isOpenEnded = isOpenEnded, 15 points = points 16 }; 17 } 18 19 public static Spline ToSpline(this Vector3[] points, bool isOpenEnded) 20 { 21 if (!points.IsSpline(isOpenEnded) && points.IsSpline(!isOpenEnded)) 22 { 23 var pointList = new List<Vector3>(points); 24 25 if (isOpenEnded) 26 { 27 while (pointList.Count % 3 != 1) 28 pointList.RemoveAt(pointList.Count-1); 29 30 points = pointList.ToArray(); 31 } 32 else 33 { 34 var last = pointList[pointList.Count-1]; 35 var first = pointList[0]; 36 var v = first - last; 37 38 pointList.Add(last + v.normalized * (v.magnitude / 3f)); 39 pointList.Add(first - v.normalized * (v.magnitude / 3f)); 40 41 points = pointList.ToArray(); 42 } 43 } 44 45 if (!points.IsSpline(isOpenEnded)) 46 throw new Exception("The provided control point array can't conform a Spline."); 47 48 return new Spline() 49 { 50 isOpenEnded = isOpenEnded, 51 points = points 52 }; 53 } 54 55 public static bool IsSpline(this Vector3[] points, bool isOpenEnded) 56 { 57 if (points.Length < 4) 58 return false; 59 60 if (isOpenEnded && points.Length % 3 != 1) 61 return false; 62 63 if (!isOpenEnded && points.Length % 3 != 0) 64 return false; 65 66 return true; 67 } 68 69 public static Spline ToSpline(this Polygon polygon) 70 { 71 var newPointCount = polygon.points.Length * 3; 72 73 if (polygon.isOpenEnded) 74 newPointCount = (polygon.points.Length - 1) * 3 + 1; 75 76 var newPoints = new Vector3[newPointCount]; 77 var controlPoints = polygon.points; 78 var pointCount = controlPoints.Length; 79 80 for (var i = 0; i < pointCount; ++i) 81 { 82 var nextIndex = (i + 1) % pointCount; 83 var point = controlPoints[i]; 84 var v = controlPoints[nextIndex] - point; 85 86 newPoints[i * 3] = point; 87 88 if (i * 3 + 2 < newPointCount) 89 { 90 newPoints[i * 3 + 1] = point + v / 3f; 91 newPoints[i * 3 + 2] = point + v * 2f / 3f; 92 } 93 } 94 95 return new Spline() 96 { 97 isOpenEnded = polygon.isOpenEnded, 98 points = newPoints 99 }; 100 } 101 } 102}