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}