SpriteShapeGeometryCache.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using System;
  2. using Unity.Jobs;
  3. using UnityEngine;
  4. using UnityEngine.U2D;
  5. using Unity.Collections;
  6. [Serializable]
  7. internal struct SpriteShapeGeometryInfo
  8. {
  9. [SerializeField]
  10. internal int geomIndex;
  11. [SerializeField]
  12. internal int indexCount;
  13. [SerializeField]
  14. internal int vertexCount;
  15. [SerializeField]
  16. internal int spriteIndex;
  17. }
  18. // Simple Cache for SpriteShape Geometry Data.
  19. [AddComponentMenu("")]
  20. internal class SpriteShapeGeometryCache : MonoBehaviour
  21. {
  22. // Serialized Data.
  23. [SerializeField]
  24. [HideInInspector]
  25. int m_MaxArrayCount;
  26. [SerializeField]
  27. [HideInInspector]
  28. Vector3[] m_PosArray = null;
  29. [SerializeField]
  30. [HideInInspector]
  31. Vector2[] m_Uv0Array = null;
  32. [SerializeField]
  33. [HideInInspector]
  34. Vector4[] m_TanArray = null;
  35. [SerializeField]
  36. [HideInInspector]
  37. ushort[] m_IndexArray = null;
  38. [SerializeField]
  39. [HideInInspector]
  40. SpriteShapeGeometryInfo[] m_GeomArray = null;
  41. // Update set.
  42. bool m_RequiresUpdate = false;
  43. bool m_RequiresUpload = false;
  44. NativeSlice<Vector3> m_PosArrayCache;
  45. NativeSlice<Vector2> m_Uv0ArrayCache;
  46. NativeSlice<Vector4> m_TanArrayCache;
  47. NativeArray<ushort> m_IndexArrayCache;
  48. NativeArray<UnityEngine.U2D.SpriteShapeSegment> m_GeomArrayCache;
  49. internal ushort[] indexArray
  50. {
  51. get { return m_IndexArray; }
  52. }
  53. internal int maxArrayCount
  54. {
  55. get { return m_MaxArrayCount; }
  56. }
  57. void OnEnable()
  58. {
  59. m_RequiresUpload = true;
  60. m_RequiresUpdate = false;
  61. }
  62. // Set Geometry Cache.
  63. internal void SetGeometryCache(int _maxArrayCount, NativeSlice<Vector3> _posArray, NativeSlice<Vector2> _uv0Array, NativeSlice<Vector4> _tanArray, NativeArray<ushort> _indexArray, NativeArray<UnityEngine.U2D.SpriteShapeSegment> _geomArray)
  64. {
  65. m_RequiresUpdate = true;
  66. m_PosArrayCache = _posArray;
  67. m_Uv0ArrayCache = _uv0Array;
  68. m_TanArrayCache = _tanArray;
  69. m_GeomArrayCache = _geomArray;
  70. m_IndexArrayCache = _indexArray;
  71. m_MaxArrayCount = _maxArrayCount;
  72. }
  73. // Update GeometryCache.
  74. internal void UpdateGeometryCache()
  75. {
  76. bool updateCache = m_RequiresUpdate && m_GeomArrayCache.IsCreated;
  77. updateCache = updateCache && m_IndexArrayCache.IsCreated;
  78. if (updateCache)
  79. {
  80. int geomCount = 0;
  81. int indexCount = 0;
  82. int vertexCount = 0;
  83. for (int i = 0; (i < m_GeomArrayCache.Length); ++i)
  84. {
  85. var geom = m_GeomArrayCache[i];
  86. indexCount += geom.indexCount;
  87. vertexCount += geom.vertexCount;
  88. if (geom.vertexCount > 0)
  89. geomCount = i + 1;
  90. }
  91. m_GeomArray = new SpriteShapeGeometryInfo[geomCount];
  92. NativeArray<SpriteShapeGeometryInfo> geomInfoArray = m_GeomArrayCache.Reinterpret<SpriteShapeGeometryInfo>();
  93. SpriteShapeCopyUtility<SpriteShapeGeometryInfo>.Copy(m_GeomArray, geomInfoArray, geomCount);
  94. m_PosArray = new Vector3[vertexCount];
  95. m_Uv0Array = new Vector2[vertexCount];
  96. m_TanArray = new Vector4[vertexCount];
  97. m_IndexArray = new ushort[indexCount];
  98. SpriteShapeCopyUtility<ushort>.Copy(m_IndexArray, m_IndexArrayCache, indexCount);
  99. SpriteShapeCopyUtility<Vector3>.Copy(m_PosArray, m_PosArrayCache, vertexCount);
  100. SpriteShapeCopyUtility<Vector2>.Copy(m_Uv0Array, m_Uv0ArrayCache, vertexCount);
  101. if (m_TanArrayCache.Length >= vertexCount)
  102. SpriteShapeCopyUtility<Vector4>.Copy(m_TanArray, m_TanArrayCache, vertexCount);
  103. m_MaxArrayCount = (vertexCount > indexCount) ? vertexCount : indexCount;
  104. m_RequiresUpdate = false;
  105. }
  106. }
  107. internal JobHandle Upload(SpriteShapeRenderer sr, SpriteShapeController sc)
  108. {
  109. JobHandle jobHandle = (default);
  110. if (m_RequiresUpload)
  111. {
  112. // Update Geometries.
  113. NativeArray<SpriteShapeSegment> geomArray = sr.GetSegments(m_GeomArray.Length);
  114. NativeArray<SpriteShapeGeometryInfo> geomInfoArray = geomArray.Reinterpret<SpriteShapeGeometryInfo>();
  115. geomInfoArray.CopyFrom(m_GeomArray);
  116. // Update Mesh Data.
  117. NativeSlice<Vector3> posArray;
  118. NativeSlice<Vector2> uv0Array;
  119. NativeArray<ushort> indexArray;
  120. if (sc.enableTangents)
  121. {
  122. NativeSlice<Vector4> tanArray;
  123. sr.GetChannels(m_MaxArrayCount, out indexArray, out posArray, out uv0Array, out tanArray);
  124. SpriteShapeCopyUtility<Vector4>.Copy(tanArray, m_TanArray, m_TanArray.Length);
  125. }
  126. else
  127. {
  128. sr.GetChannels(m_MaxArrayCount, out indexArray, out posArray, out uv0Array);
  129. }
  130. SpriteShapeCopyUtility<Vector3>.Copy(posArray, m_PosArray, m_PosArray.Length);
  131. SpriteShapeCopyUtility<Vector2>.Copy(uv0Array, m_Uv0Array, m_Uv0Array.Length);
  132. SpriteShapeCopyUtility<ushort>.Copy(indexArray, m_IndexArray, m_IndexArray.Length);
  133. sr.Prepare(jobHandle, sc.spriteShapeParameters, sc.spriteArray);
  134. m_RequiresUpload = false;
  135. }
  136. return jobHandle;
  137. }
  138. }