3
0

EditorWhiteBoxDefaultMode.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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 "EditorWhiteBoxComponentModeTypes.h"
  10. #include "SubComponentModes/EditorWhiteBoxDefaultModeBus.h"
  11. #include <EditorWhiteBoxEdgeModifierBus.h>
  12. #include <EditorWhiteBoxPolygonModifierBus.h>
  13. #include <QScopedPointer>
  14. namespace AZ
  15. {
  16. class EntityComponentIdPair;
  17. }
  18. namespace AzFramework
  19. {
  20. struct ViewportInfo;
  21. }
  22. namespace AzToolsFramework
  23. {
  24. namespace ViewportInteraction
  25. {
  26. struct MouseInteractionEvent;
  27. }
  28. struct ActionOverride;
  29. } // namespace AzToolsFramework
  30. namespace WhiteBox
  31. {
  32. class EdgeTranslationModifier;
  33. class PolygonTranslationModifier;
  34. class PolygonScaleModifier;
  35. class EdgeScaleModifier;
  36. class VertexTranslationModifier;
  37. //! The default mode of the EditorWhiteBoxComponentMode - this state allows immediate
  38. //! interaction of polygons and edges.
  39. class DefaultMode
  40. : private EditorWhiteBoxDefaultModeRequestBus::Handler
  41. , private EditorWhiteBoxPolygonModifierNotificationBus::Handler
  42. , private EditorWhiteBoxEdgeModifierNotificationBus::Handler
  43. {
  44. public:
  45. AZ_CLASS_ALLOCATOR_DECL
  46. //! A variant to hold either a selected polygon translation, edge translation,
  47. //! or a vertex selection modifier - default is empty (monostate).
  48. using SelectedTranslationModifier = AZStd::variant<
  49. AZStd::monostate, AZStd::unique_ptr<PolygonTranslationModifier>, AZStd::unique_ptr<EdgeTranslationModifier>,
  50. AZStd::unique_ptr<VertexTranslationModifier>>;
  51. explicit DefaultMode(const AZ::EntityComponentIdPair& entityComponentIdPair);
  52. DefaultMode(DefaultMode&&) = default;
  53. DefaultMode& operator=(DefaultMode&&) = default;
  54. ~DefaultMode();
  55. static void RegisterActionUpdaters();
  56. static void RegisterActions();
  57. static void BindActionsToModes(const AZStd::string& modeIdentifier);
  58. static void BindActionsToMenus();
  59. // Interface
  60. void Refresh();
  61. AZStd::vector<AzToolsFramework::ActionOverride> PopulateActions(
  62. const AZ::EntityComponentIdPair& entityComponentIdPair);
  63. void Display(
  64. const AZ::EntityComponentIdPair& entityComponentIdPair, const AZ::Transform& worldFromLocal,
  65. const IntersectionAndRenderData& renderData, const AzFramework::ViewportInfo& viewportInfo,
  66. AzFramework::DebugDisplayRequests& debugDisplay);
  67. bool HandleMouseInteraction(
  68. const AzToolsFramework::ViewportInteraction::MouseInteractionEvent& mouseInteraction,
  69. const AZ::EntityComponentIdPair& entityComponentIdPair,
  70. const AZStd::optional<EdgeIntersection>& edgeIntersection,
  71. const AZStd::optional<PolygonIntersection>& polygonIntersection,
  72. const AZStd::optional<VertexIntersection>& vertexIntersection);
  73. private:
  74. // EditorWhiteBoxDefaultModeRequestBus ...
  75. void CreatePolygonScaleModifier(const Api::PolygonHandle& polygonHandle) override;
  76. void CreateEdgeScaleModifier(Api::EdgeHandle edgeHandle) override;
  77. void AssignSelectedPolygonTranslationModifier() override;
  78. void AssignSelectedEdgeTranslationModifier() override;
  79. void AssignSelectedVertexSelectionModifier() override;
  80. void RefreshPolygonScaleModifier() override;
  81. void RefreshEdgeScaleModifier() override;
  82. void RefreshPolygonTranslationModifier() override;
  83. void RefreshEdgeTranslationModifier() override;
  84. void RefreshVertexSelectionModifier() override;
  85. Api::VertexHandles SelectedVertexHandles() const override;
  86. Api::EdgeHandles SelectedEdgeHandles() const override;
  87. Api::PolygonHandles SelectedPolygonHandles() const override;
  88. Api::VertexHandle HoveredVertexHandle() const override;
  89. Api::EdgeHandle HoveredEdgeHandle() const override;
  90. Api::PolygonHandle HoveredPolygonHandle() const override;
  91. void HideSelectedEdge() override;
  92. void HideSelectedVertex() override;
  93. // EditorWhiteBoxPolygonModifierNotificationBus ...
  94. void OnPolygonModifierUpdatedPolygonHandle(
  95. const Api::PolygonHandle& previousPolygonHandle, const Api::PolygonHandle& nextPolygonHandle) override;
  96. // EditorWhiteBoxEdgeModifierNotificationBus ...
  97. void OnEdgeModifierUpdatedEdgeHandle(
  98. Api::EdgeHandle previousEdgeHandle, Api::EdgeHandle nextEdgeHandle) override;
  99. //! Find all potentially interactive edge handles the user can select and manipulate.
  100. Api::EdgeHandles FindInteractiveEdgeHandles(const WhiteBoxMesh& whiteBox);
  101. //! The entity component id of the component mode this sub-mode is associated with.
  102. AZ::EntityComponentIdPair m_entityComponentIdPair;
  103. AZStd::unique_ptr<PolygonTranslationModifier>
  104. m_polygonTranslationModifier; //!< The hovered polygon translation modifier.
  105. AZStd::unique_ptr<EdgeTranslationModifier>
  106. m_edgeTranslationModifier; //!< The currently instantiated edge translation modifier.
  107. AZStd::unique_ptr<PolygonScaleModifier>
  108. m_polygonScaleModifier; //!< The currently instantiated polygon scale modifier.
  109. AZStd::unique_ptr<EdgeScaleModifier> m_edgeScaleModifier; //!< The currently instantiated edge scale modifier.
  110. AZStd::unique_ptr<VertexTranslationModifier>
  111. m_vertexTranslationModifier; //!< The currently instantiated vertex selection modifier.
  112. SelectedTranslationModifier m_selectedModifier; //!< The type of selected translation modifier.
  113. };
  114. } // namespace WhiteBox