暫無描述
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.

GenerateWeightsTool.cs 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using System;
  2. using UnityEditor.U2D.Common;
  3. using UnityEditor.U2D.Layout;
  4. using UnityEngine;
  5. namespace UnityEditor.U2D.Animation
  6. {
  7. internal class GenerateWeightsTool : MeshToolWrapper
  8. {
  9. private const float kWeightTolerance = 0.01f;
  10. private SpriteMeshDataController m_SpriteMeshDataController = new SpriteMeshDataController();
  11. private IWeightsGenerator m_WeightGenerator;
  12. private GenerateWeightsPanel m_GenerateWeightsPanel;
  13. internal override void OnCreate()
  14. {
  15. m_WeightGenerator = new BoundedBiharmonicWeightsGenerator();
  16. }
  17. public override void Initialize(LayoutOverlay layout)
  18. {
  19. base.Initialize(layout);
  20. m_GenerateWeightsPanel = GenerateWeightsPanel.GenerateFromUXML();
  21. layout.rightOverlay.Add(m_GenerateWeightsPanel);
  22. BindElements();
  23. m_GenerateWeightsPanel.SetHiddenFromLayout(true);
  24. }
  25. private void BindElements()
  26. {
  27. Debug.Assert(m_GenerateWeightsPanel != null);
  28. m_GenerateWeightsPanel.onGenerateWeights += () =>
  29. {
  30. HandleWeights(GenerateWeights, TextContent.generateWeights);
  31. };
  32. m_GenerateWeightsPanel.onNormalizeWeights += () =>
  33. {
  34. HandleWeights(NormalizeWeights, TextContent.normalizeWeights);
  35. };
  36. m_GenerateWeightsPanel.onClearWeights += () =>
  37. {
  38. HandleWeights(ClearWeights, TextContent.clearWeights);
  39. };
  40. }
  41. protected override void OnActivate()
  42. {
  43. base.OnActivate();
  44. m_GenerateWeightsPanel.SetHiddenFromLayout(false);
  45. skinningCache.events.skinningModeChanged.AddListener(OnModeChanged);
  46. skinningCache.events.selectedSpriteChanged.AddListener(OnSpriteSelectionChanged);
  47. m_GenerateWeightsPanel.Update(skinningCache.mode == SkinningMode.Character);
  48. OnSpriteSelectionChanged(skinningCache.selectedSprite);
  49. }
  50. protected override void OnDeactivate()
  51. {
  52. base.OnDeactivate();
  53. skinningCache.events.skinningModeChanged.RemoveListener(OnModeChanged);
  54. skinningCache.events.selectedSpriteChanged.RemoveListener(OnSpriteSelectionChanged);
  55. m_GenerateWeightsPanel.SetHiddenFromLayout(true);
  56. }
  57. void OnModeChanged(SkinningMode mode)
  58. {
  59. m_GenerateWeightsPanel.Update(mode == SkinningMode.Character);
  60. }
  61. void OnSpriteSelectionChanged(SpriteCache sprite)
  62. {
  63. m_GenerateWeightsPanel.generateButtonText = sprite != null ? TextContent.generate : TextContent.generateAll;
  64. }
  65. private void HandleWeights(Action<SpriteCache> action, string undoName)
  66. {
  67. using (skinningCache.UndoScope(undoName))
  68. {
  69. var selectedSprite = skinningCache.selectedSprite;
  70. if (selectedSprite != null)
  71. HandleWeightsForSprite(selectedSprite, action);
  72. else
  73. {
  74. var sprites = skinningCache.GetSprites();
  75. foreach (var sprite in sprites)
  76. {
  77. if (sprite.IsVisible())
  78. HandleWeightsForSprite(sprite, action);
  79. }
  80. }
  81. }
  82. }
  83. private void HandleWeightsForSprite(SpriteCache sprite, Action<SpriteCache> action)
  84. {
  85. Debug.Assert(sprite != null);
  86. using (new DefaultPoseScope(skinningCache.GetEffectiveSkeleton(sprite)))
  87. {
  88. action(sprite);
  89. }
  90. skinningCache.events.meshChanged.Invoke(sprite.GetMesh());
  91. }
  92. private void GenerateWeights(SpriteCache sprite)
  93. {
  94. using (m_GenerateWeightsPanel.associateBones ? new AssociateBonesScope(sprite) : null)
  95. {
  96. m_SpriteMeshDataController.spriteMeshData = sprite.GetMesh();
  97. m_SpriteMeshDataController.CalculateWeights(m_WeightGenerator, skinningCache.vertexSelection, kWeightTolerance);
  98. m_SpriteMeshDataController.SortTrianglesByDepth();
  99. }
  100. }
  101. private void NormalizeWeights(SpriteCache sprite)
  102. {
  103. m_SpriteMeshDataController.spriteMeshData = sprite.GetMesh();
  104. m_SpriteMeshDataController.NormalizeWeights(skinningCache.vertexSelection);
  105. m_SpriteMeshDataController.SortTrianglesByDepth();
  106. }
  107. private void ClearWeights(SpriteCache sprite)
  108. {
  109. m_SpriteMeshDataController.spriteMeshData = sprite.GetMesh();
  110. m_SpriteMeshDataController.ClearWeights(skinningCache.vertexSelection);
  111. }
  112. protected override void OnGUI()
  113. {
  114. m_MeshPreviewBehaviour.showWeightMap = true;
  115. m_MeshPreviewBehaviour.overlaySelected = true;
  116. skeletonMode = SkeletonMode.EditPose;
  117. meshMode = SpriteMeshViewMode.EditGeometry;
  118. disableMeshEditor = true;
  119. skeletonTool.skeletonStyle = SkeletonStyles.WeightMap;
  120. DoSkeletonGUI();
  121. DoMeshGUI();
  122. }
  123. }
  124. }