3
0

EditorWhiteBoxComponentMode.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/Component/TransformBus.h>
  10. #include <AzCore/std/containers/variant.h>
  11. #include <AzToolsFramework/ComponentMode/EditorBaseComponentMode.h>
  12. #include <AzToolsFramework/ViewportUi/ViewportUiRequestBus.h>
  13. #include <EditorWhiteBoxComponentModeBus.h>
  14. #include <EditorWhiteBoxComponentModeTypes.h>
  15. #include <WhiteBox/EditorWhiteBoxComponentBus.h>
  16. namespace WhiteBox
  17. {
  18. class DefaultMode;
  19. class EdgeRestoreMode;
  20. class TransformMode;
  21. //! The type of edge selection the component mode is in (either normal selection of
  22. //! 'user' edges or selection of all edges ('mesh') in restoration mode).
  23. enum class EdgeSelectionType
  24. {
  25. Polygon,
  26. All
  27. };
  28. //! The Component Mode responsible for handling all interactions with the White Box Tool.
  29. class EditorWhiteBoxComponentMode
  30. : public AzToolsFramework::ComponentModeFramework::EditorBaseComponentMode
  31. , private AzFramework::EntityDebugDisplayEventBus::Handler
  32. , private AZ::TransformNotificationBus::Handler
  33. , private EditorWhiteBoxComponentNotificationBus::Handler
  34. , public EditorWhiteBoxComponentModeRequestBus::Handler
  35. {
  36. public:
  37. AZ_CLASS_ALLOCATOR_DECL
  38. AZ_RTTI(EditorWhiteBoxComponentMode, "{F05B83A8-6F3A-43C6-A742-11BAB2D8A7C1}", EditorBaseComponentMode)
  39. constexpr static const char* const WhiteboxModeClusterEdgeRestoreTooltip = "Switch to Edge Restore mode";
  40. constexpr static const char* const WhiteboxModeClusterDefaultTooltip = "Switch to Sketch mode";
  41. constexpr static const char* const WhiteboxModeClusterManipulatorTooltip = "Switch to Manipulator mode";
  42. EditorWhiteBoxComponentMode(const AZ::EntityComponentIdPair& entityComponentIdPair, AZ::Uuid componentType);
  43. EditorWhiteBoxComponentMode(EditorWhiteBoxComponentMode&&) = delete;
  44. EditorWhiteBoxComponentMode& operator=(EditorWhiteBoxComponentMode&&) = delete;
  45. ~EditorWhiteBoxComponentMode() override;
  46. static void Reflect(AZ::ReflectContext* context);
  47. static void RegisterActionContextModes();
  48. static void RegisterActionUpdaters();
  49. static void RegisterActions();
  50. static void BindActionsToModes();
  51. static void BindActionsToMenus();
  52. // EditorBaseComponentMode ...
  53. void Refresh() override;
  54. bool HandleMouseInteraction(
  55. const AzToolsFramework::ViewportInteraction::MouseInteractionEvent& mouseInteraction) override;
  56. AZStd::vector<AzToolsFramework::ActionOverride> PopulateActionsImpl() override;
  57. AZStd::string GetComponentModeName() const override;
  58. AZ::Uuid GetComponentModeType() const override;
  59. // EditorWhiteBoxComponentModeRequestBus ...
  60. void MarkWhiteBoxIntersectionDataDirty() override;
  61. SubMode GetCurrentSubMode() const override;
  62. void OverrideKeyboardModifierQuery(const KeyboardModifierQueryFn& keyboardModifierQueryFn) override;
  63. private:
  64. // AzFramework::EntityDebugDisplayEventBus ...
  65. void DisplayEntityViewport(
  66. const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) override;
  67. // TransformNotificationBus ...
  68. void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override;
  69. // EditorWhiteBoxComponentNotificationBus ...
  70. void OnDefaultShapeTypeChanged(DefaultShapeType defaultShape) override;
  71. //! Rebuild the intermediate intersection data from the source white box data.
  72. //! @param edgeSelectionMode Determines whether to include all edges ('mesh' + 'user') or
  73. //! just 'user' edges when generating the intersection data.
  74. void RecalculateWhiteBoxIntersectionData(EdgeSelectionType edgeSelectionMode);
  75. //! Enter the sub-mode for default mode.
  76. void EnterDefaultMode();
  77. //! Enter the sub-mode for edge restore.
  78. void EnterEdgeRestoreMode();
  79. //! Enter the sub-mode for transforming
  80. void EnterTransformMode();
  81. //! Create the Viewport UI cluster for sub mode selection.
  82. void CreateSubModeSelectionCluster();
  83. //! Remove the Viewport UI cluster for sub mode selection.
  84. void RemoveSubModeSelectionCluster();
  85. //! The current set of 'sub' modes the white box component mode can be in.
  86. AZStd::variant<AZStd::unique_ptr<DefaultMode>, AZStd::unique_ptr<EdgeRestoreMode>, AZStd::unique_ptr<TransformMode>> m_modes;
  87. //! The most up to date intersection and render data for the white box (edge and polygon bounds).
  88. AZStd::optional<IntersectionAndRenderData> m_intersectionAndRenderData;
  89. //! The world transform of the entity this ComponentMode is on.
  90. AZ::Transform m_worldFromLocal;
  91. //! The function to use for querying modifier keys (while drawing).
  92. KeyboardModifierQueryFn m_keyboardModifierQueryFn;
  93. SubMode m_currentSubMode = SubMode::Default;
  94. bool m_restoreModifierHeld = false;
  95. AzToolsFramework::ViewportUi::ClusterId
  96. m_transformClusterId;
  97. AzToolsFramework::ViewportUi::ButtonId
  98. m_transformTranslateButtonId;
  99. AzToolsFramework::ViewportUi::ButtonId
  100. m_transformRotateButtonId;
  101. AzToolsFramework::ViewportUi::ButtonId
  102. m_transformScaleButtonId;
  103. //! Viewport UI cluster for changing sub mode.
  104. AzToolsFramework::ViewportUi::ClusterId
  105. m_modeSelectionClusterId;
  106. //! Id of the Viewport UI button for default mode.
  107. AzToolsFramework::ViewportUi::ButtonId
  108. m_defaultModeButtonId;
  109. //! Id of the Viewport UI button for edge restore mode.
  110. AzToolsFramework::ViewportUi::ButtonId
  111. m_edgeRestoreModeButtonId;
  112. //! Id of the Viewport UI button for transform mode.
  113. AzToolsFramework::ViewportUi::ButtonId
  114. m_transformModeButtonId;
  115. //! Event handler for sub mode changes.
  116. AZ::Event<AzToolsFramework::ViewportUi::ButtonId>::Handler
  117. m_modeSelectionHandler;
  118. };
  119. inline SubMode EditorWhiteBoxComponentMode::GetCurrentSubMode() const
  120. {
  121. return m_currentSubMode;
  122. }
  123. } // namespace WhiteBox