A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using Unity.Collections;
4using Unity.Mathematics;
5using UnityEngine;
6using UnityEngine.U2D.Animation;
7
8namespace UnityEditor.U2D.Animation
9{
10 [Serializable]
11 internal class SpriteBoneData
12 {
13 public int parentId = -1;
14 public Vector2 localPosition;
15 public Quaternion localRotation = Quaternion.identity;
16 public Vector2 position;
17 public Vector2 endPosition;
18 public float depth;
19 public float length;
20 }
21
22 [Serializable]
23 internal abstract class BaseSpriteMeshData
24 {
25 [SerializeField]
26 Vector2[] m_Vertices = new Vector2[0];
27 [SerializeField]
28 EditableBoneWeight[] m_VertexWeights = new EditableBoneWeight[0];
29 [SerializeField]
30 int[] m_Indices = new int[0];
31 [SerializeField]
32 int2[] m_Edges = new int2[0];
33 [SerializeField]
34 int2[] m_OutlineEdges = new int2[0];
35
36 Vector2[] m_VertexPositionsOverride = null;
37
38 public abstract Rect frame { get; }
39
40 public Vector2[] vertices => m_VertexPositionsOverride ?? m_Vertices;
41 public EditableBoneWeight[] vertexWeights => m_VertexWeights;
42
43 public int[] indices => m_Indices;
44
45 public int2[] edges => m_Edges;
46 public int2[] outlineEdges => m_OutlineEdges;
47
48 public int vertexCount => m_Vertices.Length;
49 public virtual int boneCount => 0;
50 public virtual string spriteName => "";
51
52 public void SetIndices(int[] newIndices)
53 {
54 m_Indices = newIndices;
55 UpdateOutlineEdges();
56 }
57
58 void UpdateOutlineEdges()
59 {
60 var indicesNativeArr = new NativeArray<ushort>(m_Indices.Length, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
61 for (var i = 0; i < indicesNativeArr.Length; ++i)
62 indicesNativeArr[i] = (ushort)m_Indices[i];
63
64 var outlineNativeArr = MeshUtilities.GetOutlineEdges(indicesNativeArr);
65 m_OutlineEdges = outlineNativeArr.Length > 0 ? outlineNativeArr.ToArray() : new int2[0];
66
67 outlineNativeArr.Dispose();
68 indicesNativeArr.Dispose();
69 }
70
71 public void SetEdges(int2[] newEdges)
72 {
73 m_Edges = newEdges;
74 }
75
76 public void SetVertices(Vector2[] newVertices, EditableBoneWeight[] newWeights)
77 {
78 ClearVertexPositionOverride();
79
80 m_Vertices = newVertices;
81 m_VertexWeights = newWeights;
82 }
83
84 /// <summary>
85 /// Sets the temporary vertex positions overrides.
86 /// Overrides are not serialized.
87 /// </summary>
88 /// <param name="vertexPositionsOverride">Array of new vertex positions.</param>
89 public void SetVertexPositionsOverride(Vector2[] vertexPositionsOverride)
90 {
91 if (vertexCount == vertexPositionsOverride.Length)
92 m_VertexPositionsOverride = vertexPositionsOverride;
93 }
94
95 /// <summary>
96 /// Clears the temporary vertex positions overrides.
97 /// </summary>
98 public void ClearVertexPositionOverride()
99 {
100 m_VertexPositionsOverride = null;
101 }
102
103 public void AddVertex(Vector2 position, BoneWeight weight)
104 {
105 ClearVertexPositionOverride();
106
107 var listOfVertices = new List<Vector2>(m_Vertices);
108 listOfVertices.Add(position);
109 m_Vertices = listOfVertices.ToArray();
110
111 var listOfWeights = new List<EditableBoneWeight>(m_VertexWeights);
112 listOfWeights.Add(EditableBoneWeightUtility.CreateFromBoneWeight(weight));
113 m_VertexWeights = listOfWeights.ToArray();
114 }
115
116 public void RemoveVertex(int index)
117 {
118 ClearVertexPositionOverride();
119
120 var listOfVertices = new List<Vector2>(m_Vertices);
121 listOfVertices.RemoveAt(index);
122 m_Vertices = listOfVertices.ToArray();
123
124 var listOfWeights = new List<EditableBoneWeight>(m_VertexWeights);
125 listOfWeights.RemoveAt(index);
126 m_VertexWeights = listOfWeights.ToArray();
127 }
128
129 public abstract SpriteBoneData GetBoneData(int index);
130
131 public abstract float GetBoneDepth(int index);
132
133 public void Clear()
134 {
135 m_Indices = new int[0];
136 m_Vertices = new Vector2[0];
137 m_VertexWeights = new EditableBoneWeight[0];
138 m_Edges = new int2[0];
139 m_OutlineEdges = new int2[0];
140 m_VertexPositionsOverride = null;
141 }
142 }
143
144 [Serializable]
145 internal class SpriteMeshData : BaseSpriteMeshData
146 {
147 [SerializeField]
148 List<SpriteBoneData> m_Bones = new List<SpriteBoneData>();
149
150 [SerializeField]
151 Rect m_Frame;
152
153 public override Rect frame => m_Frame;
154 public override int boneCount => m_Bones.Count;
155
156 public List<SpriteBoneData> bones
157 {
158 get => m_Bones;
159 set => m_Bones = value;
160 }
161
162 public override SpriteBoneData GetBoneData(int index)
163 {
164 return m_Bones[index];
165 }
166
167 public override float GetBoneDepth(int index)
168 {
169 return m_Bones[index].depth;
170 }
171
172 public void SetFrame(Rect newFrame)
173 {
174 m_Frame = newFrame;
175 }
176 }
177}