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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using UnityEngine;
  2. namespace UnityEditor.U2D.Animation
  3. {
  4. internal class MeshTool : BaseTool
  5. {
  6. MeshCache m_Mesh;
  7. ISelection<int> m_SelectionOverride;
  8. SpriteMeshController m_SpriteMeshController;
  9. SpriteMeshView m_SpriteMeshView;
  10. RectSelectionTool<int> m_RectSelectionTool = new RectSelectionTool<int>();
  11. RectVertexSelector m_RectVertexSelector = new RectVertexSelector();
  12. UnselectTool<int> m_UnselectTool = new UnselectTool<int>();
  13. ITriangulator m_Triangulator;
  14. public MeshCache mesh => m_Mesh;
  15. public SpriteMeshViewMode mode
  16. {
  17. set => m_SpriteMeshView.mode = value;
  18. }
  19. public bool disable
  20. {
  21. set => m_SpriteMeshController.disable = value;
  22. }
  23. public ISelection<int> selectionOverride
  24. {
  25. get => m_SelectionOverride;
  26. set => m_SelectionOverride = value;
  27. }
  28. public override int defaultControlID
  29. {
  30. get
  31. {
  32. if (m_Mesh == null)
  33. return 0;
  34. return m_RectSelectionTool.controlID;
  35. }
  36. }
  37. ISelection<int> selection
  38. {
  39. get
  40. {
  41. if (selectionOverride != null)
  42. return selectionOverride;
  43. return skinningCache.vertexSelection;
  44. }
  45. }
  46. internal override void OnCreate()
  47. {
  48. m_SpriteMeshController = new SpriteMeshController();
  49. m_SpriteMeshView = new SpriteMeshView(new GUIWrapper());
  50. m_Triangulator = new Triangulator();
  51. }
  52. protected override void OnActivate()
  53. {
  54. m_SpriteMeshController.disable = false;
  55. m_SelectionOverride = null;
  56. SetupSprite(skinningCache.selectedSprite);
  57. skinningCache.events.selectedSpriteChanged.AddListener(OnSelectedSpriteChanged);
  58. }
  59. protected override void OnDeactivate()
  60. {
  61. skinningCache.events.selectedSpriteChanged.RemoveListener(OnSelectedSpriteChanged);
  62. }
  63. void OnSelectedSpriteChanged(SpriteCache sprite)
  64. {
  65. SetupSprite(sprite);
  66. }
  67. internal void SetupSprite(SpriteCache sprite)
  68. {
  69. var mesh = sprite.GetMesh();
  70. if (m_Mesh != null
  71. && m_Mesh != mesh
  72. && selection.Count > 0)
  73. selection.Clear();
  74. m_Mesh = mesh;
  75. m_SpriteMeshController.spriteMeshData = m_Mesh;
  76. }
  77. void SetupGUI()
  78. {
  79. m_SpriteMeshController.spriteMeshView = m_SpriteMeshView;
  80. m_SpriteMeshController.triangulator = m_Triangulator;
  81. m_SpriteMeshController.cacheUndo = skinningCache;
  82. m_RectSelectionTool.cacheUndo = skinningCache;
  83. m_RectSelectionTool.rectSelector = m_RectVertexSelector;
  84. m_RectVertexSelector.selection = selection;
  85. m_UnselectTool.cacheUndo = skinningCache;
  86. m_UnselectTool.selection = selection;
  87. m_SpriteMeshController.frame = new Rect(Vector2.zero, m_Mesh.sprite.textureRect.size);
  88. m_SpriteMeshController.selection = selection;
  89. m_SpriteMeshView.defaultControlID = defaultControlID;
  90. m_RectVertexSelector.spriteMeshData = m_Mesh;
  91. }
  92. protected override void OnGUI()
  93. {
  94. if (m_Mesh == null)
  95. return;
  96. SetupGUI();
  97. var handlesMatrix = Handles.matrix;
  98. Handles.matrix *= m_Mesh.sprite.GetLocalToWorldMatrixFromMode();
  99. BeginPositionOverride();
  100. EditorGUI.BeginChangeCheck();
  101. var guiEnabled = GUI.enabled;
  102. var moveAction = m_SpriteMeshController.spriteMeshView.IsActionHot(MeshEditorAction.MoveEdge) || m_SpriteMeshController.spriteMeshView.IsActionHot(MeshEditorAction.MoveVertex);
  103. GUI.enabled = (!skinningCache.IsOnVisualElement() && guiEnabled) || moveAction;
  104. m_SpriteMeshController.OnGUI();
  105. GUI.enabled = guiEnabled;
  106. if (EditorGUI.EndChangeCheck())
  107. UpdateMesh();
  108. m_RectSelectionTool.OnGUI();
  109. m_UnselectTool.OnGUI();
  110. Handles.matrix = handlesMatrix;
  111. EndPositionOverride();
  112. }
  113. public void BeginPositionOverride()
  114. {
  115. if (m_Mesh != null)
  116. {
  117. var skeleton = skinningCache.GetEffectiveSkeleton(m_Mesh.sprite);
  118. Debug.Assert(skeleton != null);
  119. if (skeleton.isPosePreview)
  120. {
  121. var overrideVertices = m_Mesh.sprite.GetMeshPreview().vertices;
  122. var convertedVerts = new Vector2[overrideVertices.Count];
  123. for (var i = 0; i < convertedVerts.Length; ++i)
  124. convertedVerts[i] = new Vector2(overrideVertices[i].x, overrideVertices[i].y);
  125. m_Mesh.SetVertexPositionsOverride(convertedVerts);
  126. }
  127. }
  128. }
  129. public void EndPositionOverride()
  130. {
  131. if(m_Mesh != null)
  132. m_Mesh.ClearVertexPositionOverride();
  133. }
  134. public void UpdateWeights()
  135. {
  136. InvokeMeshChanged();
  137. }
  138. public void UpdateMesh()
  139. {
  140. InvokeMeshChanged();
  141. }
  142. void InvokeMeshChanged()
  143. {
  144. if(m_Mesh != null)
  145. skinningCache.events.meshChanged.Invoke(m_Mesh);
  146. }
  147. }
  148. }