暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SpriteMeshData.cs 5.4KB

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