From ca5e629dac74090c7ac4e1f7405b95a7cd10f9f4 Mon Sep 17 00:00:00 2001
From: Hasareej <82398396+Hasareej@users.noreply.github.com>
Date: Wed, 26 May 2021 17:12:30 +0100
Subject: [PATCH] Hasareej lyn 2301 cluster space 2 (#843)
Initial Implementation of the ViewportUi Space Cluster
---
.../Components/img/UI20/toolbar/Local.svg | 8 ++
.../Components/img/UI20/toolbar/Parent.svg | 8 ++
.../Components/img/UI20/toolbar/World.svg | 8 ++
.../AzQtComponents/Components/resources.qrc | 3 +
.../EditorTransformComponentSelection.cpp | 111 ++++++++++++++++--
.../EditorTransformComponentSelection.h | 15 +++
6 files changed, 141 insertions(+), 12 deletions(-)
create mode 100644 Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Local.svg
create mode 100644 Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Parent.svg
create mode 100644 Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/World.svg
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Local.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Local.svg
new file mode 100644
index 0000000000..2017cabe21
--- /dev/null
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Local.svg
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Parent.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Parent.svg
new file mode 100644
index 0000000000..c0b9580985
--- /dev/null
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Parent.svg
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/World.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/World.svg
new file mode 100644
index 0000000000..4d77775e3d
--- /dev/null
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/World.svg
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
index 8ea4755a24..00fa95d094 100644
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
@@ -354,6 +354,7 @@
img/UI20/toolbar/Grid.svg
img/UI20/toolbar/Lighting.svg
img/UI20/toolbar/Load.svg
+ img/UI20/toolbar/Local.svg
img/UI20/toolbar/Locked.svg
img/UI20/toolbar/LUA.svg
img/UI20/toolbar/Material.svg
@@ -362,6 +363,7 @@
img/UI20/toolbar/Object_follow_terrain.svg
img/UI20/toolbar/Object_height.svg
img/UI20/toolbar/Object_list.svg
+ img/UI20/toolbar/Parent.svg
img/UI20/toolbar/particle.svg
img/UI20/toolbar/Play.svg
img/UI20/toolbar/Redo.svg
@@ -380,6 +382,7 @@
img/UI20/toolbar/undo.svg
img/UI20/toolbar/Unlocked.svg
img/UI20/toolbar/Vertex_snapping.svg
+ img/UI20/toolbar/World.svg
img/UI20/toolbar/X_axis.svg
img/UI20/toolbar/Y_axis.svg
img/UI20/toolbar/Z_axis.svg
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp
index a1949dd44a..0edbc4f8b5 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp
@@ -435,7 +435,7 @@ namespace AzToolsFramework
}
}
- static void DestroyTransformModeSelectionCluster(const ViewportUi::ClusterId clusterId)
+ static void DestroyCluster(const ViewportUi::ClusterId clusterId)
{
ViewportUi::ViewportUiRequestBus::Event(
ViewportUi::DefaultViewportId,
@@ -483,6 +483,26 @@ namespace AzToolsFramework
return worldFromLocal.TransformPoint(CalculateCenterOffset(entityId, pivot));
}
+ void EditorTransformComponentSelection::UpdateSpaceCluster(const ReferenceFrame referenceFrame)
+ {
+ auto buttonIdFromFrameFn = [this](const ReferenceFrame referenceFrame) {
+ switch (referenceFrame)
+ {
+ case ReferenceFrame::Local:
+ return m_spaceCluster.m_localButtonId;
+ case ReferenceFrame::Parent:
+ return m_spaceCluster.m_parentButtonId;
+ case ReferenceFrame::World:
+ return m_spaceCluster.m_worldButtonId;
+ }
+ return m_spaceCluster.m_parentButtonId;
+ };
+
+ ViewportUi::ViewportUiRequestBus::Event(
+ ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::SetClusterActiveButton, m_spaceCluster.m_spaceClusterId,
+ buttonIdFromFrameFn(referenceFrame));
+ }
+
namespace ETCS
{
PivotOrientationResult CalculatePivotOrientation(
@@ -789,13 +809,13 @@ namespace AzToolsFramework
EntityIdManipulators& entityIdManipulators,
OptionalFrame& pivotOverrideFrame,
ViewportInteraction::KeyboardModifiers& prevModifiers,
- bool& transformChangedInternally)
+ bool& transformChangedInternally, SpaceCluster spaceCluster)
{
AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework);
entityIdManipulators.m_manipulators->SetLocalPosition(action.LocalPosition());
- const ReferenceFrame referenceFrame = ReferenceFrameFromModifiers(action.m_modifiers);
+ const ReferenceFrame referenceFrame = spaceCluster.m_spaceLock ? spaceCluster.m_currentSpace : ReferenceFrameFromModifiers(action.m_modifiers);
if (action.m_modifiers.Ctrl())
{
@@ -1027,6 +1047,7 @@ namespace AzToolsFramework
EditorManipulatorCommandUndoRedoRequestBus::Handler::BusConnect(entityContextId);
CreateTransformModeSelectionCluster();
+ CreateSpaceSelectionCluster();
RegisterActions();
SetupBoxSelect();
RefreshSelectedEntityIdsAndRegenerateManipulators();
@@ -1037,7 +1058,9 @@ namespace AzToolsFramework
m_selectedEntityIds.clear();
DestroyManipulators(m_entityIdManipulators);
- DestroyTransformModeSelectionCluster(m_transformModeClusterId);
+ DestroyCluster(m_transformModeClusterId);
+ DestroyCluster(m_spaceCluster.m_spaceClusterId);
+
UnregisterActions();
m_pivotOverrideFrame.Reset();
@@ -1274,8 +1297,8 @@ namespace AzToolsFramework
[this, prevModifiers, manipulatorEntityIds](const LinearManipulator::Action& action) mutable -> void
{
UpdateTranslationManipulator(
- action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators,
- m_pivotOverrideFrame, prevModifiers, m_transformChangedInternally);
+ action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators, m_pivotOverrideFrame, prevModifiers,
+ m_transformChangedInternally, m_spaceCluster);
});
translationManipulators->InstallLinearManipulatorMouseUpCallback(
@@ -1305,8 +1328,8 @@ namespace AzToolsFramework
[this, prevModifiers, manipulatorEntityIds](const PlanarManipulator::Action& action) mutable -> void
{
UpdateTranslationManipulator(
- action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators,
- m_pivotOverrideFrame, prevModifiers, m_transformChangedInternally);
+ action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators, m_pivotOverrideFrame, prevModifiers,
+ m_transformChangedInternally, m_spaceCluster);
});
translationManipulators->InstallPlanarManipulatorMouseUpCallback(
@@ -1335,8 +1358,8 @@ namespace AzToolsFramework
[this, prevModifiers, manipulatorEntityIds](const SurfaceManipulator::Action& action) mutable -> void
{
UpdateTranslationManipulator(
- action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators,
- m_pivotOverrideFrame, prevModifiers, m_transformChangedInternally);
+ action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators, m_pivotOverrideFrame, prevModifiers,
+ m_transformChangedInternally, m_spaceCluster);
});
translationManipulators->InstallSurfaceManipulatorMouseUpCallback(
@@ -1414,7 +1437,7 @@ namespace AzToolsFramework
[this, prevModifiers, sharedRotationState]
(const AngularManipulator::Action& action) mutable -> void
{
- const ReferenceFrame referenceFrame = ReferenceFrameFromModifiers(action.m_modifiers);
+ const ReferenceFrame referenceFrame = m_spaceCluster.m_spaceLock ? m_spaceCluster.m_currentSpace : ReferenceFrameFromModifiers(action.m_modifiers);
const AZ::Quaternion manipulatorOrientation = action.m_start.m_rotation * action.m_current.m_delta;
// store the pivot override frame when positioning the manipulator manually (ctrl)
@@ -2566,6 +2589,67 @@ namespace AzToolsFramework
m_transformModeSelectionHandler);
}
+ void EditorTransformComponentSelection::CreateSpaceSelectionCluster()
+ {
+ // create the cluster for switching spaces/reference frames
+ ViewportUi::ViewportUiRequestBus::EventResult(
+ m_spaceCluster.m_spaceClusterId, ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::CreateCluster,
+ ViewportUi::Alignment::TopRight);
+
+ // create and register the buttons (strings correspond to icons even if the values appear different)
+ m_spaceCluster.m_worldButtonId = RegisterClusterButton(m_spaceCluster.m_spaceClusterId, "World");
+ m_spaceCluster.m_parentButtonId = RegisterClusterButton(m_spaceCluster.m_spaceClusterId, "Parent");
+ m_spaceCluster.m_localButtonId = RegisterClusterButton(m_spaceCluster.m_spaceClusterId, "Local");
+
+ auto onButtonClicked = [this](ViewportUi::ButtonId buttonId) {
+ if (buttonId == m_spaceCluster.m_localButtonId)
+ {
+ // Unlock
+ if (m_spaceCluster.m_spaceLock && m_spaceCluster.m_currentSpace == ReferenceFrame::Local)
+ {
+ m_spaceCluster.m_spaceLock = false;
+ }
+ else
+ {
+ m_spaceCluster.m_spaceLock = true;
+ m_spaceCluster.m_currentSpace = ReferenceFrame::Local;
+ }
+ }
+ else if (buttonId == m_spaceCluster.m_parentButtonId)
+ {
+ // Unlock
+ if (m_spaceCluster.m_spaceLock && m_spaceCluster.m_currentSpace == ReferenceFrame::Parent)
+ {
+ m_spaceCluster.m_spaceLock = false;
+ }
+ else
+ {
+ m_spaceCluster.m_spaceLock = true;
+ m_spaceCluster.m_currentSpace = ReferenceFrame::Parent;
+ }
+ }
+ else if (buttonId == m_spaceCluster.m_worldButtonId)
+ {
+ // Unlock
+ if (m_spaceCluster.m_spaceLock && m_spaceCluster.m_currentSpace == ReferenceFrame::World)
+ {
+ m_spaceCluster.m_spaceLock = false;
+ }
+ else
+ {
+ m_spaceCluster.m_spaceLock = true;
+ m_spaceCluster.m_currentSpace = ReferenceFrame::World;
+ }
+ }
+ };
+
+ m_spaceCluster.m_spaceSelectionHandler = AZ::Event::Handler(onButtonClicked);
+
+ ViewportUi::ViewportUiRequestBus::Event(
+ ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::RegisterClusterEventHandler,
+ m_spaceCluster.m_spaceClusterId, m_spaceCluster.m_spaceSelectionHandler);
+ }
+
EditorTransformComponentSelectionRequests::Mode EditorTransformComponentSelection::GetTransformMode()
{
return m_mode;
@@ -3277,7 +3361,10 @@ namespace AzToolsFramework
ViewportInteraction::BuildMouseButtons(
QGuiApplication::mouseButtons()), m_boxSelect.Active());
- const ReferenceFrame referenceFrame = ReferenceFrameFromModifiers(modifiers);
+ const ReferenceFrame referenceFrame =
+ m_spaceCluster.m_spaceLock ? m_spaceCluster.m_currentSpace : ReferenceFrameFromModifiers(modifiers);
+
+ UpdateSpaceCluster(referenceFrame);
bool refresh = false;
if (referenceFrame != m_referenceFrame)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h
index 500ae484f8..4be84df26e 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h
@@ -106,6 +106,17 @@ namespace AzToolsFramework
World, //!< World space (space aligned to world axes - identity).
};
+ struct SpaceCluster
+ {
+ ViewportUi::ClusterId m_spaceClusterId;
+ ViewportUi::ButtonId m_localButtonId;
+ ViewportUi::ButtonId m_parentButtonId;
+ ViewportUi::ButtonId m_worldButtonId;
+ AZ::Event::Handler m_spaceSelectionHandler;
+ ReferenceFrame m_currentSpace = ReferenceFrame::Parent;
+ bool m_spaceLock = false;
+ };
+
//! Entity selection/interaction handling.
//! Provide a suite of functionality for manipulating entities, primarily through their TransformComponent.
class EditorTransformComponentSelection
@@ -160,6 +171,7 @@ namespace AzToolsFramework
void RegenerateManipulators();
void CreateTransformModeSelectionCluster();
+ void CreateSpaceSelectionCluster();
void ClearManipulatorTranslationOverride();
void ClearManipulatorOrientationOverride();
@@ -285,6 +297,9 @@ namespace AzToolsFramework
AZ::Event::Handler m_transformModeSelectionHandler; //!< Event handler for the Viewport UI cluster.
AzFramework::ClickDetector m_clickDetector; //!< Detect different types of mouse click.
AzFramework::CursorState m_cursorState; //!< Track the mouse position and delta movement each frame.
+
+ SpaceCluster m_spaceCluster;
+ void UpdateSpaceCluster(ReferenceFrame referenceFrame);
};
//! The ETCS (EntityTransformComponentSelection) namespace contains functions and data used exclusively by