No Description
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.

SpriteShapeGeometryCache.cs 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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<SpriteShapeSegment> m_GeomArrayCache;
  49. internal ushort[] indexArray
  50. {
  51. get => m_IndexArray;
  52. }
  53. internal Vector3[] posArray
  54. {
  55. get => m_PosArray;
  56. }
  57. public Vector4[] tanArray
  58. {
  59. get => m_TanArray;
  60. }
  61. internal int maxArrayCount
  62. {
  63. get { return m_MaxArrayCount; }
  64. }
  65. internal bool requiresUpdate
  66. {
  67. get { return m_RequiresUpdate; }
  68. }
  69. internal bool requiresUpload
  70. {
  71. get { return m_RequiresUpload; }
  72. }
  73. void OnEnable()
  74. {
  75. m_RequiresUpload = true;
  76. m_RequiresUpdate = false;
  77. }
  78. // Set Geometry Cache. Fix Tangent Cache.
  79. internal void SetGeometryCache(int _maxArrayCount, NativeSlice<Vector3> _posArray, NativeSlice<Vector2> _uv0Array, NativeSlice<Vector4> _tanArray, NativeArray<ushort> _indexArray, NativeArray<UnityEngine.U2D.SpriteShapeSegment> _geomArray)
  80. {
  81. m_RequiresUpdate = true;
  82. m_PosArrayCache = _posArray;
  83. m_Uv0ArrayCache = _uv0Array;
  84. m_TanArrayCache = _tanArray;
  85. m_GeomArrayCache = _geomArray;
  86. m_IndexArrayCache = _indexArray;
  87. m_MaxArrayCount = _maxArrayCount;
  88. }
  89. // Update GeometryCache.
  90. internal void UpdateGeometryCache()
  91. {
  92. bool updateCache = m_RequiresUpdate && m_GeomArrayCache.IsCreated;
  93. updateCache = updateCache && m_IndexArrayCache.IsCreated;
  94. if (updateCache)
  95. {
  96. int geomCount = 0;
  97. int indexCount = 0;
  98. int vertexCount = 0;
  99. for (int i = 0; (i < m_GeomArrayCache.Length); ++i)
  100. {
  101. var geom = m_GeomArrayCache[i];
  102. indexCount += geom.indexCount;
  103. vertexCount += geom.vertexCount;
  104. if (geom.vertexCount > 0)
  105. geomCount = i + 1;
  106. }
  107. m_GeomArray = new SpriteShapeGeometryInfo[geomCount];
  108. NativeArray<SpriteShapeGeometryInfo> geomInfoArray = m_GeomArrayCache.Reinterpret<SpriteShapeGeometryInfo>();
  109. SpriteShapeCopyUtility<SpriteShapeGeometryInfo>.Copy(m_GeomArray, geomInfoArray, geomCount);
  110. m_PosArray = new Vector3[vertexCount];
  111. m_Uv0Array = new Vector2[vertexCount];
  112. m_IndexArray = new ushort[indexCount];
  113. SpriteShapeCopyUtility<ushort>.Copy(m_IndexArray, m_IndexArrayCache, indexCount);
  114. SpriteShapeCopyUtility<Vector3>.Copy(m_PosArray, m_PosArrayCache, vertexCount);
  115. SpriteShapeCopyUtility<Vector2>.Copy(m_Uv0Array, m_Uv0ArrayCache, vertexCount);
  116. // Do not store Tangent data if not enabled. Just store a stub.
  117. m_TanArray = new Vector4[(m_TanArrayCache.Length >= vertexCount) ? vertexCount : 1];
  118. if (m_TanArrayCache.Length >= vertexCount)
  119. SpriteShapeCopyUtility<Vector4>.Copy(m_TanArray, m_TanArrayCache, vertexCount);
  120. m_MaxArrayCount = (vertexCount > indexCount) ? vertexCount : indexCount;
  121. m_RequiresUpdate = false;
  122. }
  123. }
  124. internal JobHandle Upload(SpriteShapeRenderer sr, SpriteShapeController sc)
  125. {
  126. JobHandle jobHandle = (default);
  127. if (m_RequiresUpload)
  128. {
  129. // Update Geometries.
  130. NativeArray<SpriteShapeSegment> geomArray = sr.GetSegments(m_GeomArray.Length);
  131. NativeArray<SpriteShapeGeometryInfo> geomInfoArray = geomArray.Reinterpret<SpriteShapeGeometryInfo>();
  132. geomInfoArray.CopyFrom(m_GeomArray);
  133. // Update Mesh Data.
  134. NativeSlice<Vector3> posArray;
  135. NativeSlice<Vector2> uv0Array;
  136. NativeArray<ushort> indexArray;
  137. if (sc.enableTangents && m_TanArray.Length > 1)
  138. {
  139. NativeSlice<Vector4> tanArray;
  140. sr.GetChannels(m_MaxArrayCount, out indexArray, out posArray, out uv0Array, out tanArray);
  141. SpriteShapeCopyUtility<Vector4>.Copy(tanArray, m_TanArray, m_TanArray.Length);
  142. }
  143. else
  144. {
  145. sr.GetChannels(m_MaxArrayCount, out indexArray, out posArray, out uv0Array);
  146. }
  147. SpriteShapeCopyUtility<Vector3>.Copy(posArray, m_PosArray, m_PosArray.Length);
  148. SpriteShapeCopyUtility<Vector2>.Copy(uv0Array, m_Uv0Array, m_Uv0Array.Length);
  149. SpriteShapeCopyUtility<ushort>.Copy(indexArray, m_IndexArray, m_IndexArray.Length);
  150. sr.Prepare(jobHandle, sc.spriteShapeParameters, sc.spriteArray);
  151. m_RequiresUpload = false;
  152. }
  153. return jobHandle;
  154. }
  155. }