暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

CpuDeformationSystem.cs 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using Unity.Jobs;
  2. using UnityEngine.Assertions;
  3. using UnityEngine.U2D.Common;
  4. namespace UnityEngine.U2D.Animation
  5. {
  6. internal class CpuDeformationSystem : BaseDeformationSystem
  7. {
  8. const string k_GpuSkinningShaderKeyword = "SKINNED_SPRITE";
  9. JobHandle m_BoundJobHandle;
  10. JobHandle m_CopyJobHandle;
  11. public override DeformationMethods deformationMethod => DeformationMethods.Cpu;
  12. internal override void Cleanup()
  13. {
  14. base.Cleanup();
  15. m_BoundJobHandle.Complete();
  16. m_CopyJobHandle.Complete();
  17. }
  18. internal override void UpdateMaterial(SpriteSkin spriteSkin)
  19. {
  20. var sharedMaterial = spriteSkin.spriteRenderer.sharedMaterial;
  21. if (sharedMaterial.IsKeywordEnabled(k_GpuSkinningShaderKeyword))
  22. sharedMaterial.DisableKeyword(k_GpuSkinningShaderKeyword);
  23. }
  24. internal override void Update()
  25. {
  26. BatchRemoveSpriteSkins();
  27. BatchAddSpriteSkins();
  28. var count = m_SpriteSkins.Count;
  29. if (count == 0)
  30. return;
  31. Assert.AreEqual(m_IsSpriteSkinActiveForDeform.Length, count);
  32. Assert.AreEqual(m_PerSkinJobData.Length, count);
  33. Assert.AreEqual(m_SpriteSkinData.Length, count);
  34. Assert.AreEqual(m_BoundsData.Length, count);
  35. Assert.AreEqual(m_SpriteRenderers.Length, count);
  36. Assert.AreEqual(m_Buffers.Length, count);
  37. Assert.AreEqual(m_BufferSizes.Length, count);
  38. PrepareDataForDeformation(out var localToWorldJobHandle, out var worldToLocalJobHandle);
  39. if (!GotVerticesToDeform(out var vertexBufferSize))
  40. {
  41. localToWorldJobHandle.Complete();
  42. worldToLocalJobHandle.Complete();
  43. DeactivateDeformableBuffers();
  44. return;
  45. }
  46. var skinBatch = m_SkinBatchArray[0];
  47. ResizeBuffers(vertexBufferSize, in skinBatch);
  48. var batchCount = m_SpriteSkinData.Length;
  49. var jobHandle = SchedulePrepareJob(batchCount);
  50. Profiling.scheduleJobs.Begin();
  51. jobHandle = JobHandle.CombineDependencies(localToWorldJobHandle, worldToLocalJobHandle, jobHandle);
  52. jobHandle = ScheduleBoneJobBatched(jobHandle, skinBatch);
  53. m_DeformJobHandle = ScheduleSkinDeformBatchedJob(jobHandle, skinBatch);
  54. m_CopyJobHandle = ScheduleCopySpriteRendererBuffersJob(jobHandle, batchCount);
  55. m_BoundJobHandle = ScheduleCalculateSpriteSkinAABBJob(m_DeformJobHandle, batchCount);
  56. Profiling.scheduleJobs.End();
  57. JobHandle.ScheduleBatchedJobs();
  58. jobHandle = JobHandle.CombineDependencies(m_BoundJobHandle, m_CopyJobHandle);
  59. jobHandle.Complete();
  60. using (Profiling.setBatchDeformableBufferAndLocalAABB.Auto())
  61. {
  62. InternalEngineBridge.SetBatchDeformableBufferAndLocalAABBArray(m_SpriteRenderers, m_Buffers, m_BufferSizes, m_BoundsData);
  63. }
  64. foreach (var spriteSkin in m_SpriteSkins)
  65. {
  66. var didDeform = m_IsSpriteSkinActiveForDeform[spriteSkin.dataIndex];
  67. spriteSkin.PostDeform(didDeform);
  68. }
  69. DeactivateDeformableBuffers();
  70. }
  71. void ResizeBuffers(int vertexBufferSize, in PerSkinJobData skinBatch)
  72. {
  73. m_DeformedVerticesBuffer = BufferManager.instance.GetBuffer(m_ObjectId, vertexBufferSize);
  74. NativeArrayHelpers.ResizeIfNeeded(ref m_FinalBoneTransforms, skinBatch.bindPosesIndex.y);
  75. NativeArrayHelpers.ResizeIfNeeded(ref m_BoneLookupData, skinBatch.bindPosesIndex.y);
  76. NativeArrayHelpers.ResizeIfNeeded(ref m_VertexLookupData, skinBatch.verticesIndex.y);
  77. }
  78. }
  79. }