A game about forced loneliness, made by TACStudios
1using System; 2using System.Collections.Generic; 3using UnityEngine; 4 5namespace UnityEditor.U2D.Common.Path 6{ 7 [Serializable] 8 internal class EditablePath : IEditablePath 9 { 10 [SerializeField] 11 private ShapeType m_ShapeType; 12 [SerializeField] 13 private IndexedSelection m_Selection = new IndexedSelection(); 14 [SerializeField] 15 private List<ControlPoint> m_ControlPoints = new List<ControlPoint>(); 16 [SerializeField] 17 private bool m_IsOpenEnded; 18 private Matrix4x4 m_LocalToWorldMatrix = Matrix4x4.identity; 19 private Matrix4x4 m_WorldToLocalMatrix = Matrix4x4.identity; 20 private Vector3 m_Forward = Vector3.forward; 21 private Vector3 m_Up = Vector3.up; 22 private Vector3 m_Right = Vector3.right; 23 24 public ShapeType shapeType 25 { 26 get { return m_ShapeType; } 27 set { m_ShapeType = value; } 28 } 29 30 public IUndoObject undoObject { get; set; } 31 32 public Matrix4x4 localToWorldMatrix 33 { 34 get { return m_LocalToWorldMatrix; } 35 set 36 { 37 m_LocalToWorldMatrix = value; 38 m_WorldToLocalMatrix = value.inverse; 39 } 40 } 41 42 public Vector3 forward 43 { 44 get { return m_Forward; } 45 set { m_Forward = value; } 46 } 47 48 public Vector3 up 49 { 50 get { return m_Up; } 51 set { m_Up = value; } 52 } 53 54 public Vector3 right 55 { 56 get { return m_Right; } 57 set { m_Right = value; } 58 } 59 60 public Matrix4x4 worldToLocalMatrix 61 { 62 get { return m_WorldToLocalMatrix; } 63 } 64 65 public bool isOpenEnded 66 { 67 get 68 { 69 if (pointCount < 3) 70 return true; 71 72 return m_IsOpenEnded; 73 } 74 set { m_IsOpenEnded = value; } 75 } 76 77 public ISelection<int> selection 78 { 79 get { return m_Selection; } 80 } 81 82 public int pointCount 83 { 84 get { return m_ControlPoints.Count; } 85 } 86 87 public ControlPoint GetPointLocal(int index) 88 { 89 return m_ControlPoints[index]; 90 } 91 92 public ControlPoint GetPoint(int index) 93 { 94 return TransformPoint(localToWorldMatrix, m_ControlPoints[index]); 95 } 96 97 public void SetPoint(int index, ControlPoint controlPoint) 98 { 99 m_ControlPoints[index] = TransformPoint(worldToLocalMatrix, controlPoint); 100 } 101 102 public void AddPoint(ControlPoint controlPoint) 103 { 104 m_ControlPoints.Insert(pointCount, TransformPoint(worldToLocalMatrix, controlPoint)); 105 } 106 107 public void InsertPoint(int index, ControlPoint controlPoint) 108 { 109 m_ControlPoints.Insert(index, TransformPoint(worldToLocalMatrix, controlPoint)); 110 } 111 112 public void RemovePoint(int index) 113 { 114 m_ControlPoints.RemoveAt(index); 115 } 116 117 public void Clear() 118 { 119 m_ControlPoints.Clear(); 120 } 121 122 private ControlPoint TransformPoint(Matrix4x4 transformMatrix, ControlPoint controlPoint) 123 { 124 if (transformMatrix == Matrix4x4.identity) 125 return controlPoint; 126 127 var newControlPoint = new ControlPoint() 128 { 129 position = transformMatrix.MultiplyPoint3x4(controlPoint.position), 130 tangentMode = controlPoint.tangentMode, 131 continuousCache = controlPoint.continuousCache, 132 brokenCache = controlPoint.brokenCache, 133 mirrorLeft = controlPoint.mirrorLeft 134 }; 135 136 newControlPoint.rightTangent = transformMatrix.MultiplyPoint3x4(controlPoint.rightTangent); 137 newControlPoint.leftTangent = transformMatrix.MultiplyPoint3x4(controlPoint.leftTangent); 138 139 return newControlPoint; 140 } 141 142 public bool Select(ISelector<Vector3> selector) 143 { 144 var changed = false; 145 146 for (var i = 0; i < pointCount; ++i) 147 changed |= selection.Select(i, selector.Select(GetPoint(i).position)); 148 149 return changed; 150 } 151 } 152}