Nessuna descrizione
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 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. m_OutlineEdges = MeshUtilities.GetOutlineEdges(m_Indices);
  51. }
  52. public void SetEdges(int2[] newEdges)
  53. {
  54. m_Edges = newEdges;
  55. }
  56. public void SetVertices(Vector2[] newVertices, EditableBoneWeight[] newWeights)
  57. {
  58. ClearVertexPositionOverride();
  59. m_Vertices = newVertices;
  60. m_VertexWeights = newWeights;
  61. }
  62. /// <summary>
  63. /// Sets the temporary vertex positions overrides.
  64. /// Overrides are not serialized.
  65. /// </summary>
  66. /// <param name="vertexPositionsOverride">Array of new vertex positions.</param>
  67. public void SetVertexPositionsOverride(Vector2[] vertexPositionsOverride)
  68. {
  69. if(vertexCount == vertexPositionsOverride.Length)
  70. m_VertexPositionsOverride = vertexPositionsOverride;
  71. }
  72. /// <summary>
  73. /// Clears the temporary vertex positions overrides.
  74. /// </summary>
  75. public void ClearVertexPositionOverride()
  76. {
  77. m_VertexPositionsOverride = null;
  78. }
  79. public void AddVertex(Vector2 position, BoneWeight weight)
  80. {
  81. ClearVertexPositionOverride();
  82. var listOfVertices = new List<Vector2>(m_Vertices);
  83. listOfVertices.Add(position);
  84. m_Vertices = listOfVertices.ToArray();
  85. var listOfWeights = new List<EditableBoneWeight>(m_VertexWeights);
  86. listOfWeights.Add(EditableBoneWeightUtility.CreateFromBoneWeight(weight));
  87. m_VertexWeights = listOfWeights.ToArray();
  88. }
  89. public void RemoveVertex(int index)
  90. {
  91. ClearVertexPositionOverride();
  92. var listOfVertices = new List<Vector2>(m_Vertices);
  93. listOfVertices.RemoveAt(index);
  94. m_Vertices = listOfVertices.ToArray();
  95. var listOfWeights = new List<EditableBoneWeight>(m_VertexWeights);
  96. listOfWeights.RemoveAt(index);
  97. m_VertexWeights = listOfWeights.ToArray();
  98. }
  99. public abstract SpriteBoneData GetBoneData(int index);
  100. public abstract float GetBoneDepth(int index);
  101. public void Clear()
  102. {
  103. m_Indices = new int[0];
  104. m_Vertices = new Vector2[0];
  105. m_VertexWeights = new EditableBoneWeight[0];
  106. m_Edges = new int2[0];
  107. m_OutlineEdges = new int2[0];
  108. m_VertexPositionsOverride = null;
  109. }
  110. }
  111. [Serializable]
  112. internal class SpriteMeshData : BaseSpriteMeshData
  113. {
  114. [SerializeField]
  115. List<SpriteBoneData> m_Bones = new List<SpriteBoneData>();
  116. [SerializeField]
  117. Rect m_Frame;
  118. public override Rect frame => m_Frame;
  119. public override int boneCount => m_Bones.Count;
  120. public List<SpriteBoneData> bones
  121. {
  122. get => m_Bones;
  123. set => m_Bones = value;
  124. }
  125. public override SpriteBoneData GetBoneData(int index)
  126. {
  127. return m_Bones[index];
  128. }
  129. public override float GetBoneDepth(int index)
  130. {
  131. return m_Bones[index].depth;
  132. }
  133. public void SetFrame(Rect newFrame)
  134. {
  135. m_Frame = newFrame;
  136. }
  137. }
  138. }