A game about forced loneliness, made by TACStudios
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}