A game about forced loneliness, made by TACStudios
at master 177 lines 5.4 kB view raw
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}