Sin descripción
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.

DeformationJobs.cs 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. using System;
  2. using Unity.Mathematics;
  3. using Unity.Collections;
  4. using Unity.Jobs;
  5. using Unity.Collections.LowLevel.Unsafe;
  6. using Unity.Burst;
  7. namespace UnityEngine.U2D.Animation
  8. {
  9. internal struct PerSkinJobData
  10. {
  11. public int deformVerticesStartPos;
  12. public int2 bindPosesIndex;
  13. public int2 verticesIndex;
  14. }
  15. internal struct SpriteSkinData
  16. {
  17. public NativeCustomSlice<Vector3> vertices;
  18. public NativeCustomSlice<BoneWeight> boneWeights;
  19. public NativeCustomSlice<Matrix4x4> bindPoses;
  20. public NativeCustomSlice<Vector4> tangents;
  21. public bool hasTangents;
  22. public int spriteVertexStreamSize;
  23. public int spriteVertexCount;
  24. public int tangentVertexOffset;
  25. public int deformVerticesStartPos;
  26. public int transformId;
  27. public NativeCustomSlice<int> boneTransformId;
  28. }
  29. [BurstCompile]
  30. internal struct PrepareDeformJob :IJob
  31. {
  32. [ReadOnly]
  33. public NativeArray<PerSkinJobData> perSkinJobData;
  34. [ReadOnly]
  35. public int batchDataSize;
  36. [WriteOnly]
  37. public NativeArray<int2> boneLookupData;
  38. [WriteOnly]
  39. public NativeArray<int2> vertexLookupData;
  40. public void Execute()
  41. {
  42. for (var i = 0; i < batchDataSize; ++i)
  43. {
  44. var jobData = perSkinJobData[i];
  45. for (int k = 0, j = jobData.bindPosesIndex.x; j < jobData.bindPosesIndex.y; ++j, ++k)
  46. {
  47. boneLookupData[j] = new int2(i, k);
  48. }
  49. for (int k = 0, j = jobData.verticesIndex.x; j < jobData.verticesIndex.y; ++j, ++k)
  50. {
  51. vertexLookupData[j] = new int2(i, k);
  52. }
  53. }
  54. }
  55. }
  56. [BurstCompile]
  57. internal struct BoneDeformBatchedJob : IJobParallelFor
  58. {
  59. [ReadOnly]
  60. public NativeArray<float4x4> boneTransform;
  61. [ReadOnly]
  62. public NativeArray<float4x4> rootTransform;
  63. [ReadOnly]
  64. public NativeArray<int2> boneLookupData;
  65. [ReadOnly]
  66. public NativeArray<SpriteSkinData> spriteSkinData;
  67. [ReadOnly]
  68. public NativeHashMap<int, TransformAccessJob.TransformData> rootTransformIndex;
  69. [ReadOnly]
  70. public NativeHashMap<int, TransformAccessJob.TransformData> boneTransformIndex;
  71. [WriteOnly]
  72. public NativeArray<float4x4> finalBoneTransforms;
  73. public void Execute(int i)
  74. {
  75. var x = boneLookupData[i].x;
  76. var y = boneLookupData[i].y;
  77. var ssd = spriteSkinData[x];
  78. var v = ssd.boneTransformId[y];
  79. var index = boneTransformIndex[v].transformIndex;
  80. if (index < 0)
  81. return;
  82. var aa = boneTransform[index];
  83. var bb = ssd.bindPoses[y];
  84. var cc = rootTransformIndex[ssd.transformId].transformIndex;
  85. finalBoneTransforms[i] = math.mul(rootTransform[cc], math.mul(aa, bb));
  86. }
  87. }
  88. [BurstCompile]
  89. internal struct SkinDeformBatchedJob : IJobParallelFor
  90. {
  91. public NativeSlice<byte> vertices;
  92. [ReadOnly]
  93. public NativeArray<float4x4> finalBoneTransforms;
  94. [ReadOnly]
  95. public NativeArray<PerSkinJobData> perSkinJobData;
  96. [ReadOnly]
  97. public NativeArray<SpriteSkinData> spriteSkinData;
  98. [ReadOnly]
  99. public NativeArray<int2> vertexLookupData;
  100. public unsafe void Execute(int i)
  101. {
  102. var j = vertexLookupData[i].x;
  103. var k = vertexLookupData[i].y;
  104. var perSkinData = perSkinJobData[j];
  105. var spriteSkin = spriteSkinData[j];
  106. var srcVertex = (float3)spriteSkin.vertices[k];
  107. var tangents = (float4)spriteSkin.tangents[k];
  108. var influence = spriteSkin.boneWeights[k];
  109. var bone0 = influence.boneIndex0 + perSkinData.bindPosesIndex.x;
  110. var bone1 = influence.boneIndex1 + perSkinData.bindPosesIndex.x;
  111. var bone2 = influence.boneIndex2 + perSkinData.bindPosesIndex.x;
  112. var bone3 = influence.boneIndex3 + perSkinData.bindPosesIndex.x;
  113. var deformedPosOffset = (byte*)vertices.GetUnsafePtr();
  114. var deformedPosStart = deformedPosOffset + spriteSkin.deformVerticesStartPos;
  115. var deformableVerticesFloat3 = NativeSliceUnsafeUtility.ConvertExistingDataToNativeSlice<float3>(deformedPosStart, spriteSkin.spriteVertexStreamSize, spriteSkin.spriteVertexCount);
  116. #if ENABLE_UNITY_COLLECTIONS_CHECKS
  117. NativeSliceUnsafeUtility.SetAtomicSafetyHandle(ref deformableVerticesFloat3, NativeSliceUnsafeUtility.GetAtomicSafetyHandle(vertices));
  118. #endif
  119. if (spriteSkin.hasTangents)
  120. {
  121. var deformedTanOffset = deformedPosStart + spriteSkin.tangentVertexOffset;
  122. var deformableTangentsFloat4 = NativeSliceUnsafeUtility.ConvertExistingDataToNativeSlice<float4>(deformedTanOffset, spriteSkin.spriteVertexStreamSize, spriteSkin.spriteVertexCount);
  123. #if ENABLE_UNITY_COLLECTIONS_CHECKS
  124. NativeSliceUnsafeUtility.SetAtomicSafetyHandle(ref deformableTangentsFloat4, NativeSliceUnsafeUtility.GetAtomicSafetyHandle(vertices));
  125. #endif
  126. var tangent = new float4(tangents.xyz, 0.0f);
  127. tangent =
  128. math.mul(finalBoneTransforms[bone0], tangent) * influence.weight0 +
  129. math.mul(finalBoneTransforms[bone1], tangent) * influence.weight1 +
  130. math.mul(finalBoneTransforms[bone2], tangent) * influence.weight2 +
  131. math.mul(finalBoneTransforms[bone3], tangent) * influence.weight3;
  132. deformableTangentsFloat4[k] = new float4(math.normalize(tangent.xyz), tangents.w);
  133. }
  134. deformableVerticesFloat3[k] =
  135. math.transform(finalBoneTransforms[bone0], srcVertex) * influence.weight0 +
  136. math.transform(finalBoneTransforms[bone1], srcVertex) * influence.weight1 +
  137. math.transform(finalBoneTransforms[bone2], srcVertex) * influence.weight2 +
  138. math.transform(finalBoneTransforms[bone3], srcVertex) * influence.weight3;
  139. }
  140. }
  141. [BurstCompile]
  142. internal struct CalculateSpriteSkinAABBJob : IJobParallelFor
  143. {
  144. public NativeSlice<byte> vertices;
  145. [ReadOnly]
  146. public NativeArray<bool> isSpriteSkinValidForDeformArray;
  147. [ReadOnly]
  148. public NativeArray<SpriteSkinData> spriteSkinData;
  149. [WriteOnly]
  150. public NativeArray<Bounds> bounds;
  151. public unsafe void Execute(int i)
  152. {
  153. if (!isSpriteSkinValidForDeformArray[i])
  154. return;
  155. var spriteSkin = spriteSkinData[i];
  156. var deformedPosOffset = (byte*)vertices.GetUnsafePtr();
  157. var deformableVerticesFloat3 = NativeSliceUnsafeUtility.ConvertExistingDataToNativeSlice<float3>(deformedPosOffset + spriteSkin.deformVerticesStartPos, spriteSkin.spriteVertexStreamSize, spriteSkin.spriteVertexCount);
  158. #if ENABLE_UNITY_COLLECTIONS_CHECKS
  159. NativeSliceUnsafeUtility.SetAtomicSafetyHandle(ref deformableVerticesFloat3, NativeSliceUnsafeUtility.GetAtomicSafetyHandle(vertices));
  160. #endif
  161. bounds[i] = SpriteSkinUtility.CalculateSpriteSkinBounds(deformableVerticesFloat3);
  162. }
  163. }
  164. [BurstCompile]
  165. internal struct FillPerSkinJobSingleThread : IJob
  166. {
  167. public PerSkinJobData combinedSkinBatch;
  168. [ReadOnly]
  169. public NativeArray<bool> isSpriteSkinValidForDeformArray;
  170. public NativeArray<SpriteSkinData> spriteSkinDataArray;
  171. public NativeArray<PerSkinJobData> perSkinJobDataArray;
  172. public NativeArray<PerSkinJobData> combinedSkinBatchArray;
  173. public void Execute()
  174. {
  175. var startIndex = 0;
  176. var endIndex = spriteSkinDataArray.Length;
  177. for (var index = startIndex; index < endIndex; ++index)
  178. {
  179. var spriteSkinData = spriteSkinDataArray[index];
  180. spriteSkinData.deformVerticesStartPos = -1;
  181. var vertexBufferSize = 0;
  182. var vertexCount = 0;
  183. var bindPoseCount = 0;
  184. if (isSpriteSkinValidForDeformArray[index])
  185. {
  186. spriteSkinData.deformVerticesStartPos = combinedSkinBatch.deformVerticesStartPos;
  187. vertexBufferSize = spriteSkinData.spriteVertexCount * spriteSkinData.spriteVertexStreamSize;
  188. vertexCount = spriteSkinData.spriteVertexCount;
  189. bindPoseCount = spriteSkinData.bindPoses.Length;
  190. }
  191. combinedSkinBatch.verticesIndex.x = combinedSkinBatch.verticesIndex.y;
  192. combinedSkinBatch.verticesIndex.y = combinedSkinBatch.verticesIndex.x + vertexCount;
  193. combinedSkinBatch.bindPosesIndex.x = combinedSkinBatch.bindPosesIndex.y;
  194. combinedSkinBatch.bindPosesIndex.y = combinedSkinBatch.bindPosesIndex.x + bindPoseCount;
  195. spriteSkinDataArray[index] = spriteSkinData;
  196. perSkinJobDataArray[index] = combinedSkinBatch;
  197. combinedSkinBatch.deformVerticesStartPos += vertexBufferSize;
  198. }
  199. combinedSkinBatchArray[0] = combinedSkinBatch;
  200. }
  201. }
  202. [BurstCompile]
  203. internal struct CopySpriteRendererBuffersJob : IJobParallelFor
  204. {
  205. [ReadOnly]
  206. public NativeArray<bool> isSpriteSkinValidForDeformArray;
  207. [ReadOnly]
  208. public NativeArray<SpriteSkinData> spriteSkinData;
  209. [ReadOnly, NativeDisableUnsafePtrRestriction]
  210. public IntPtr ptrVertices;
  211. [WriteOnly]
  212. public NativeArray<IntPtr> buffers;
  213. [WriteOnly]
  214. public NativeArray<int> bufferSizes;
  215. public void Execute(int i)
  216. {
  217. var skinData = spriteSkinData[i];
  218. var startVertices = default(IntPtr);
  219. var vertexBufferLength = 0;
  220. if (isSpriteSkinValidForDeformArray[i])
  221. {
  222. startVertices = ptrVertices + skinData.deformVerticesStartPos;
  223. vertexBufferLength = skinData.spriteVertexCount * skinData.spriteVertexStreamSize;
  224. }
  225. buffers[i] = startVertices;
  226. bufferSizes[i] = vertexBufferLength;
  227. }
  228. }
  229. [BurstCompile]
  230. internal struct CopySpriteRendererBoneTransformBuffersJob : IJobParallelFor
  231. {
  232. [ReadOnly]
  233. public NativeArray<bool> isSpriteSkinValidForDeformArray;
  234. [ReadOnly]
  235. public NativeArray<SpriteSkinData> spriteSkinData;
  236. [ReadOnly]
  237. public NativeArray<PerSkinJobData> perSkinJobData;
  238. [ReadOnly, NativeDisableUnsafePtrRestriction]
  239. public IntPtr ptrBoneTransforms;
  240. [WriteOnly]
  241. public NativeArray<IntPtr> buffers;
  242. [WriteOnly]
  243. public NativeArray<int> bufferSizes;
  244. public void Execute(int i)
  245. {
  246. var skinData = spriteSkinData[i];
  247. var skinJobData = perSkinJobData[i];
  248. var startMatrix = default(IntPtr);
  249. var matrixLength = 0;
  250. if (isSpriteSkinValidForDeformArray[i])
  251. {
  252. startMatrix = ptrBoneTransforms + (skinJobData.bindPosesIndex.x * 64);
  253. matrixLength = skinData.boneTransformId.Length;
  254. }
  255. buffers[i] = startMatrix;
  256. bufferSizes[i] = matrixLength;
  257. }
  258. }
  259. }