From 969f94ffb5f675cf4ed047b05e8e3675035b8a74 Mon Sep 17 00:00:00 2001 From: hasareej Date: Fri, 16 Apr 2021 10:27:13 +0100 Subject: [PATCH 01/52] Initial pass of ViewportUiSwitcher. --- .../EditorTransformComponentSelection.cpp | 67 ++++++++++ .../EditorTransformComponentSelection.h | 9 ++ .../AzToolsFramework/ViewportUi/Button.cpp | 7 + .../AzToolsFramework/ViewportUi/Button.h | 2 + .../AzToolsFramework/ViewportUi/Cluster.cpp | 14 +- .../AzToolsFramework/ViewportUi/Cluster.h | 2 +- .../ViewportUi/ViewportUiDisplay.cpp | 46 +++++++ .../ViewportUi/ViewportUiDisplay.h | 6 + .../ViewportUi/ViewportUiManager.cpp | 38 ++++++ .../ViewportUi/ViewportUiManager.h | 5 + .../ViewportUi/ViewportUiRequestBus.h | 7 + .../ViewportUi/ViewportUiSwitcher.cpp | 125 ++++++++++++++++++ .../ViewportUi/ViewportUiSwitcher.h | 41 ++++++ .../aztoolsframework_files.cmake | 2 + Editor/Icons/Switcher/BoxShape.svg | 15 +++ Editor/Icons/Switcher/PhysXCollider.svg | 15 +++ Editor/Icons/Switcher/Transform.svg | 15 +++ 17 files changed, 413 insertions(+), 3 deletions(-) create mode 100644 Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiSwitcher.cpp create mode 100644 Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiSwitcher.h create mode 100644 Editor/Icons/Switcher/BoxShape.svg create mode 100644 Editor/Icons/Switcher/PhysXCollider.svg create mode 100644 Editor/Icons/Switcher/Transform.svg diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index 27222e9aac..3d4ed6ee0b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -440,6 +440,13 @@ namespace AzToolsFramework &ViewportUi::ViewportUiRequestBus::Events::RemoveCluster, clusterId); } + + static void RemoveTestSwitcher(const ViewportUi::ClusterId clusterId) + { + ViewportUi::ViewportUiRequestBus::Event( + ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::RemoveCluster, + clusterId); + } static void SetViewportUiClusterVisible(ViewportUi::ClusterId clusterId, bool visible) { @@ -468,6 +475,18 @@ namespace AzToolsFramework return buttonId; } + static ViewportUi::ButtonId RegisterSwitcherButton( + ViewportUi::ClusterId clusterId, const char* iconName, const char* buttonName) + { + ViewportUi::ButtonId buttonId; + ViewportUi::ViewportUiRequestBus::EventResult( + buttonId, ViewportUi::DefaultViewportId, + &ViewportUi::ViewportUiRequestBus::Events::CreateSwitcherButton, clusterId, + AZStd::string::format("Editor/Icons/Switcher/%s.svg", iconName), buttonName); + + return buttonId; + } + // return either center or entity pivot static AZ::Vector3 CalculatePivotTranslation( const AZ::EntityId entityId, const EditorTransformComponentSelectionRequests::Pivot pivot) @@ -1028,6 +1047,8 @@ namespace AzToolsFramework RegisterActions(); SetupBoxSelect(); RefreshSelectedEntityIdsAndRegenerateManipulators(); + + CreateTestSwitcher(); } EditorTransformComponentSelection::~EditorTransformComponentSelection() @@ -1038,6 +1059,8 @@ namespace AzToolsFramework DestroyTransformModeSelectionCluster(m_transformModeClusterId); UnregisterActions(); + RemoveTestSwitcher(m_testSwitcherId); + m_pivotOverrideFrame.Reset(); EditorManipulatorCommandUndoRedoRequestBus::Handler::BusDisconnect(); @@ -2561,6 +2584,50 @@ namespace AzToolsFramework m_transformModeSelectionHandler); } + void EditorTransformComponentSelection::CreateTestSwitcher() + { + // Create test switcher + // & Set Current Active Mode + ViewportUi::ViewportUiRequestBus::EventResult( + m_testSwitcherId, ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::CreateSwitcher, + ViewportUi::ButtonId(1)); + + // create and register the buttons + m_boxShapeButtonId = RegisterSwitcherButton(m_testSwitcherId, "BoxShape", "Box Shape"); + m_physxColliderButtonId = RegisterSwitcherButton(m_testSwitcherId, "PhysXCollider", "PhysX Collider"); + m_transformButtonId = RegisterSwitcherButton(m_testSwitcherId, "Transform", "Transform"); + + // Change current active button for now + const auto onButtonClicked = [this](ViewportUi::ButtonId buttonId) { + if (buttonId == m_boxShapeButtonId) + { + ViewportUi::ViewportUiRequestBus::Event( + ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::SetSwitcherActiveButton, m_testSwitcherId, + m_boxShapeButtonId); + AZ_Printf("ViewportUi", "Box Shape"); + } + else if (buttonId == m_physxColliderButtonId) + { + ViewportUi::ViewportUiRequestBus::Event( + ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::SetSwitcherActiveButton, m_testSwitcherId, + m_physxColliderButtonId); + AZ_Printf("ViewportUi", "PhysXCollider"); + } + else if (buttonId == m_transformButtonId) + { + ViewportUi::ViewportUiRequestBus::Event( + ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::SetSwitcherActiveButton, m_testSwitcherId, + m_transformButtonId); + AZ_Printf("ViewportUi", "Transform"); + } + }; + + m_testSwitcherHandler = AZ::Event::Handler(onButtonClicked); + ViewportUi::ViewportUiRequestBus::Event( + ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::RegisterClusterEventHandler, m_testSwitcherId, + m_testSwitcherHandler); + } + EditorTransformComponentSelectionRequests::Mode EditorTransformComponentSelection::GetTransformMode() { return m_mode; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h index 99265313fe..9a66ad042f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h @@ -281,6 +281,15 @@ namespace AzToolsFramework ViewportUi::ButtonId m_rotateButtonId; ///< Id of the Viewport UI button for rotate mode. ViewportUi::ButtonId m_scaleButtonId; ///< Id of the Viewport UI button for scale mode. AZ::Event::Handler m_transformModeSelectionHandler; ///< Event handler for the Viewport UI cluster. + + //! Create the Viewport UI Switcher. TEST + void CreateTestSwitcher(); + + ViewportUi::ClusterId m_testSwitcherId; + ViewportUi::ButtonId m_boxShapeButtonId; + ViewportUi::ButtonId m_physxColliderButtonId; + ViewportUi::ButtonId m_transformButtonId; + AZ::Event::Handler m_testSwitcherHandler; }; /// The ETCS (EntityTransformComponentSelection) namespace contains functions and data used exclusively by diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Button.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Button.cpp index 701344db18..6218826f35 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Button.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Button.cpp @@ -22,4 +22,11 @@ namespace AzToolsFramework::ViewportUi::Internal , m_buttonId(buttonId) { } + + Button::Button(AZStd::string icon, AZStd::string name, ButtonId buttonId) + : m_icon(AZStd::move(icon)) + , m_name(AZStd::move(name)) + , m_buttonId(buttonId) + { + } } // namespace AzToolsFramework::ViewportUi::Internal diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Button.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Button.h index 8ff98abc5d..3b77f6bd4a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Button.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Button.h @@ -28,9 +28,11 @@ namespace AzToolsFramework::ViewportUi::Internal }; explicit Button(AZStd::string icon, ButtonId buttonId); + Button(AZStd::string icon, AZStd::string name, ButtonId buttonId); ~Button() = default; AZStd::string m_icon; //!< The icon for this button, string path to an image. + AZStd::string m_name; //!< The icon for this button, string path to an image. State m_state = State::Deselected; ButtonId m_buttonId; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Cluster.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Cluster.cpp index 2de6836aa5..baefeac986 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Cluster.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/Cluster.cpp @@ -13,6 +13,9 @@ #include #include +#pragma optimize("", off) +#pragma inline_depth(0) + namespace AzToolsFramework::ViewportUi::Internal { Cluster::Cluster() @@ -53,11 +56,18 @@ namespace AzToolsFramework::ViewportUi::Internal } } - ButtonId Cluster::AddButton(const AZStd::string& icon) + ButtonId Cluster::AddButton(const AZStd::string& icon, const AZStd::string& name) { auto buttonId = ButtonId(m_buttons.size() + 1); - m_buttons.insert({buttonId, AZStd::make_unique