Açıklama Yok
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.

MeshTool.cs 5.7KB

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