ToolManager.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /*
  2. Copyright (c) 2021 Omar Duarte
  3. Unauthorized copying of this file, via any medium is strictly prohibited.
  4. Writen by Omar Duarte, 2021.
  5. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  6. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  7. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  8. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  9. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  10. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  11. THE SOFTWARE.
  12. */
  13. using System;
  14. namespace PluginMaster
  15. {
  16. [UnityEditor.InitializeOnLoad]
  17. public static class ToolManager
  18. {
  19. public enum PaintTool
  20. {
  21. NONE,
  22. PIN,
  23. BRUSH,
  24. GRAVITY,
  25. LINE,
  26. SHAPE,
  27. TILING,
  28. REPLACER,
  29. ERASER,
  30. SELECTION,
  31. CIRCLE_SELECT,
  32. EXTRUDE,
  33. MIRROR,
  34. FLOOR,
  35. WALL
  36. }
  37. private static PaintTool _tool = ToolManager.PaintTool.NONE;
  38. public enum ToolState { NONE, PREVIEW, EDIT, PERSISTENT }
  39. private static bool _editMode = false;
  40. public static Action<PaintTool> OnToolChange;
  41. public static Action OnToolModeChanged;
  42. public static bool _triggerToolChangeEvent = true;
  43. static ToolManager()
  44. {
  45. UnityEditor.EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
  46. PaletteManager.OnBrushSelectionChanged += TilingManager.settings.UpdateCellSize;
  47. }
  48. public static bool editMode
  49. {
  50. get => _editMode;
  51. set
  52. {
  53. if (_editMode == value) return;
  54. _editMode = value;
  55. if (OnToolModeChanged != null) OnToolModeChanged();
  56. }
  57. }
  58. public static ToolManager.PaintTool tool
  59. {
  60. get => _tool;
  61. set
  62. {
  63. if (_tool == value) return;
  64. var prevTool = _tool;
  65. _tool = value;
  66. if (_tool != prevTool)
  67. {
  68. BoundsUtils.ClearBoundsDictionaries();
  69. if (_triggerToolChangeEvent && OnToolChange != null) OnToolChange(prevTool);
  70. _editMode = false;
  71. _triggerToolChangeEvent = true;
  72. if (_tool != PaintTool.NONE) PWBCore.UpdateTempColliders();
  73. PWBPreferences.SelectToolCategory(_tool);
  74. PWBItemsWindow.RepainWindow();
  75. }
  76. switch (_tool)
  77. {
  78. case PaintTool.PIN:
  79. PWBIO.ResetPinValues();
  80. break;
  81. case PaintTool.GRAVITY:
  82. PWBCore.DestroyTempColliders();
  83. PWBIO.InitializeGravityHeight();
  84. break;
  85. case PaintTool.REPLACER:
  86. PWBIO.ResetReplacer();
  87. break;
  88. case PaintTool.EXTRUDE:
  89. SelectionManager.UpdateSelection();
  90. PWBIO.ResetUnityCurrentTool();
  91. PWBIO.ResetExtrudeState(false);
  92. break;
  93. case PaintTool.LINE:
  94. LineManager.instance.DeselectAllItems();
  95. PWBIO.ResetLineState(false);
  96. PWBCore.staticData.VersionUpdate();
  97. break;
  98. case PaintTool.SHAPE:
  99. ShapeManager.instance.DeselectAllItems();
  100. PWBIO.ResetShapeState(false);
  101. break;
  102. case PaintTool.TILING:
  103. TilingManager.instance.DeselectAllItems();
  104. PWBIO.ResetTilingState(false);
  105. break;
  106. case PaintTool.SELECTION:
  107. PWBIO.SetSelectionOriginPosition();
  108. SelectionManager.UpdateSelection();
  109. PWBIO.ResetUnityCurrentTool();
  110. break;
  111. case PaintTool.MIRROR:
  112. SelectionManager.UpdateSelection();
  113. PWBIO.InitializeMirrorPose();
  114. break;
  115. case PaintTool.FLOOR:
  116. PWBIO.OnFloorEnabled();
  117. break;
  118. case PaintTool.WALL:
  119. PWBIO.OnWallEnabled();
  120. break;
  121. case PaintTool.NONE:
  122. PWBIO.ResetUnityCurrentTool();
  123. PWBIO.ResetReplacer();
  124. PWBCore.DestroyTempColliders();
  125. ApplicationEventHandler.hierarchyChangedWhileUsingTools = false;
  126. break;
  127. default: break;
  128. }
  129. if (_tool != PaintTool.NONE)
  130. {
  131. PWBIO.SaveUnityCurrentTool();
  132. if (PWBCore.staticData.openToolPropertiesWhenAToolIsSelected) ToolProperties.ShowWindow();
  133. PaletteManager.pickingBrushes = false;
  134. }
  135. if (_tool == PaintTool.BRUSH || _tool == PaintTool.PIN || _tool == PaintTool.GRAVITY
  136. || _tool == PaintTool.REPLACER || _tool == PaintTool.ERASER || _tool == PaintTool.LINE
  137. || _tool == PaintTool.SHAPE || _tool == PaintTool.TILING || _tool == PaintTool.FLOOR
  138. || _tool == PaintTool.WALL)
  139. {
  140. PrefabPalette.ShowWindow();
  141. SelectionManager.UpdateSelection();
  142. if (_tool == PaintTool.BRUSH || _tool == PaintTool.PIN || _tool == PaintTool.GRAVITY
  143. || _tool == PaintTool.REPLACER || _tool == PaintTool.FLOOR || _tool == PaintTool.WALL)
  144. BrushstrokeManager.UpdateBrushstroke();
  145. PWBIO.ResetAutoParent();
  146. }
  147. if (_tool == PaintTool.LINE || _tool == PaintTool.SHAPE
  148. || _tool == PaintTool.TILING || _tool == PaintTool.NONE)
  149. PWBItemsWindow.RepainWindow();
  150. ToolProperties.RepainWindow();
  151. if (BrushProperties.instance != null) BrushProperties.instance.Repaint();
  152. if (UnityEditor.SceneView.sceneViews.Count > 0) ((UnityEditor.SceneView)
  153. UnityEditor.SceneView.sceneViews[0]).Focus();
  154. }
  155. }
  156. public static void DeselectTool(bool triggerToolChangeEvent = true)
  157. {
  158. _triggerToolChangeEvent = triggerToolChangeEvent;
  159. if (tool == PaintTool.REPLACER) PWBIO.ResetReplacer();
  160. tool = PaintTool.NONE;
  161. PWBIO.ResetUnityCurrentTool();
  162. PWBToolbar.RepaintWindow();
  163. }
  164. private static void OnSceneClosing(UnityEngine.SceneManagement.Scene scene, bool removingScene)
  165. {
  166. PWBCore.staticData.SaveAndUpdateVersion();
  167. DeselectTool();
  168. }
  169. private static void OnPlayModeStateChanged(UnityEditor.PlayModeStateChange state)
  170. {
  171. DeselectTool();
  172. PWBCore.DestroyTempColliders();
  173. }
  174. public static void OnPaletteClosed()
  175. {
  176. if (tool != PaintTool.ERASER && tool != PaintTool.EXTRUDE)
  177. tool = PaintTool.NONE;
  178. }
  179. public static PaintTool GetToolFromSettings(IToolSettings settings)
  180. {
  181. if (settings is PinSettings) return PaintTool.PIN;
  182. if (settings is GravityToolSettings) return PaintTool.GRAVITY;
  183. if (settings is BrushToolSettings) return PaintTool.BRUSH;
  184. if (settings is ShapeSettings) return PaintTool.SHAPE;
  185. if (settings is LineSettings) return PaintTool.LINE;
  186. if (settings is TilingSettings) return PaintTool.TILING;
  187. if (settings is ReplacerSettings) return PaintTool.REPLACER;
  188. if (settings is EraserSettings) return PaintTool.ERASER;
  189. if (settings is SelectionToolSettings) return PaintTool.SELECTION;
  190. if (settings is CircleSelectSettings) return PaintTool.CIRCLE_SELECT;
  191. if (settings is ExtrudeSettings) return PaintTool.EXTRUDE;
  192. if (settings is MirrorSettings) return PaintTool.MIRROR;
  193. if (settings is FloorSettings) return PaintTool.FLOOR;
  194. if (settings is WallSettings) return PaintTool.WALL;
  195. return PaintTool.NONE;
  196. }
  197. public static PaintTool GetToolFromSettings(IPaintToolSettings settings)
  198. {
  199. if (settings is PinSettings) return PaintTool.PIN;
  200. if (settings is GravityToolSettings) return PaintTool.GRAVITY;
  201. if (settings is BrushToolSettings) return PaintTool.BRUSH;
  202. if (settings is ShapeSettings) return PaintTool.SHAPE;
  203. if (settings is LineSettings) return PaintTool.LINE;
  204. if (settings is TilingSettings) return PaintTool.TILING;
  205. if (settings is ReplacerSettings) return PaintTool.REPLACER;
  206. if (settings is EraserSettings) return PaintTool.ERASER;
  207. if (settings is SelectionToolSettings) return PaintTool.SELECTION;
  208. if (settings is CircleSelectSettings) return PaintTool.CIRCLE_SELECT;
  209. if (settings is ExtrudeSettings) return PaintTool.EXTRUDE;
  210. if (settings is MirrorSettings) return PaintTool.MIRROR;
  211. if (settings is FloorSettings) return PaintTool.FLOOR;
  212. if (settings is WallSettings) return PaintTool.WALL;
  213. return PaintTool.NONE;
  214. }
  215. public static IToolSettings GetSettingsFromTool(PaintTool tool)
  216. {
  217. switch (tool)
  218. {
  219. case PaintTool.PIN: return PinManager.settings;
  220. case PaintTool.BRUSH: return BrushManager.settings;
  221. case PaintTool.GRAVITY: return GravityToolManager.settings;
  222. case PaintTool.REPLACER: return ReplacerManager.settings;
  223. case PaintTool.ERASER: return EraserManager.settings;
  224. case PaintTool.EXTRUDE: return ExtrudeManager.settings;
  225. case PaintTool.LINE: return LineManager.settings;
  226. case PaintTool.SHAPE: return ShapeManager.settings;
  227. case PaintTool.TILING: return TilingManager.settings;
  228. case PaintTool.SELECTION: return SelectionToolManager.settings;
  229. case PaintTool.CIRCLE_SELECT: return CircleSelectManager.settings;
  230. case PaintTool.MIRROR: return MirrorManager.settings;
  231. case PaintTool.FLOOR: return FloorManager.settings;
  232. case PaintTool.WALL: return WallManager.settings;
  233. default: return null;
  234. }
  235. }
  236. public static IPersistentToolManager GetCurrentPersistentToolManager()
  237. {
  238. switch (tool)
  239. {
  240. case PaintTool.LINE: return LineManager.instance;
  241. case PaintTool.SHAPE: return ShapeManager.instance;
  242. case PaintTool.TILING: return TilingManager.instance;
  243. default: return null;
  244. }
  245. }
  246. public static IPersistentData[] GetCurrentPersistentToolData()
  247. {
  248. var manager = GetCurrentPersistentToolManager();
  249. if (manager == null) return null;
  250. return manager.GetItems();
  251. }
  252. }
  253. }