From 052ff90c9db1f0df57cb5d940ea637ce36a4baac Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Wed, 8 Sep 2021 09:36:04 +0100 Subject: [PATCH] Preparatory work to allow for more viewport integration tests (#3961) * preparatory work to allow for more viewport integration tests Signed-off-by: hultonha * minor grammatical fix Signed-off-by: hultonha * fix for missed bus call update Signed-off-by: hultonha --- Code/Editor/EditorViewportWidget.cpp | 2 ++ Code/Editor/EditorViewportWidget.h | 28 +++++++++------ Code/Editor/Viewport.cpp | 5 ++- .../AzFramework/Visibility/BoundsBus.h | 1 + .../AzManipulatorTestFramework.h | 3 ++ .../AzManipulatorTestFrameworkTestHelpers.h | 14 ++++---- .../IndirectManipulatorViewportInteraction.h | 7 ++-- .../ViewportInteraction.h | 7 ++++ .../AzManipulatorTestFrameworkUtils.cpp | 6 ++-- ...IndirectManipulatorViewportInteraction.cpp | 8 ++--- .../Source/ViewportInteraction.cpp | 12 +++++++ .../API/ComponentEntitySelectionBus.h | 2 +- .../Viewport/ViewportMessages.cpp | 19 ++++++++++ .../Viewport/ViewportMessages.h | 36 +++++++++---------- .../ViewportSelection/EditorSelectionUtil.cpp | 26 +++++++++----- .../ViewportSelection/EditorSelectionUtil.h | 4 +++ .../EditorVisibleEntityDataCache.cpp | 4 +-- .../Tests/ComponentModeTestFixture.cpp | 16 ++++----- .../ModularViewportCameraController.cpp | 2 ++ 19 files changed, 129 insertions(+), 73 deletions(-) diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index b33469affb..736bbe5feb 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -1087,6 +1087,7 @@ void EditorViewportWidget::ConnectViewportInteractionRequestBus() { AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler::BusConnect(GetViewportId()); AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler::BusConnect(GetViewportId()); + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusConnect(GetViewportId()); m_viewportUi.ConnectViewportUiBus(GetViewportId()); AzFramework::InputSystemCursorConstraintRequestBus::Handler::BusConnect(); @@ -1097,6 +1098,7 @@ void EditorViewportWidget::DisconnectViewportInteractionRequestBus() AzFramework::InputSystemCursorConstraintRequestBus::Handler::BusDisconnect(); m_viewportUi.DisconnectViewportUiBus(); + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler::BusDisconnect(); } diff --git a/Code/Editor/EditorViewportWidget.h b/Code/Editor/EditorViewportWidget.h index 5d332ae3f0..dff0adb55a 100644 --- a/Code/Editor/EditorViewportWidget.h +++ b/Code/Editor/EditorViewportWidget.h @@ -91,6 +91,7 @@ class SANDBOX_API EditorViewportWidget final , private AzFramework::InputSystemCursorConstraintRequestBus::Handler , private AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler , private AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler + , private AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler , private AzFramework::AssetCatalogEventBus::Handler , private AZ::RPI::SceneNotificationBus::Handler { @@ -128,10 +129,12 @@ private: CameraComponent, ViewSourceTypesCount, }; + enum class PlayInEditorState { Editor, Starting, Started }; + enum class KeyPressedState { AllUp, @@ -142,7 +145,7 @@ private: //////////////////////////////////////////////////////////////////////// // Method overrides ... - // QWidget + // QWidget overrides ... void focusOutEvent(QFocusEvent* event) override; void keyPressEvent(QKeyEvent* event) override; bool event(QEvent* event) override; @@ -150,7 +153,7 @@ private: void paintEvent(QPaintEvent* event) override; void mousePressEvent(QMouseEvent* event) override; - // QtViewport/IDisplayViewport/CViewport + // QtViewport/IDisplayViewport/CViewport overrides ... EViewportType GetType() const override { return ET_ViewportCamera; } void SetType([[maybe_unused]] EViewportType type) override { assert(type == ET_ViewportCamera); }; AzToolsFramework::ViewportInteraction::MouseInteraction BuildMouseInteraction( @@ -176,16 +179,17 @@ private: void Update() override; void UpdateContent(int flags) override; - // SceneNotificationBus + // SceneNotificationBus overrides ... void OnBeginPrepareRender() override; - // Camera::CameraNotificationBus + // Camera::CameraNotificationBus overrides ... void OnActiveViewChanged(const AZ::EntityId&) override; - // IEditorEventListener + // IEditorEventListener overrides ... void OnEditorNotifyEvent(EEditorNotifyEvent event) override; - // AzToolsFramework::EditorEntityContextNotificationBus (handler moved to cpp to resolve link issues in unity builds) + // AzToolsFramework::EditorEntityContextNotificationBus overrides ... + // note: handler moved to cpp to resolve link issues in unity builds void OnStartPlayInEditor(); void OnStopPlayInEditor(); void OnStartPlayInEditorBegin(); @@ -194,10 +198,10 @@ private: void BeginUndoTransaction() override; void EndUndoTransaction() override; - // AzFramework::InputSystemCursorConstraintRequestBus + // AzFramework::InputSystemCursorConstraintRequestBus overrides ... void* GetSystemCursorConstraintWindow() const override; - // AzToolsFramework::ViewportFreezeRequestBus + // AzToolsFramework::ViewportFreezeRequestBus overrides ... bool IsViewportInputFrozen() override; void FreezeViewportInput(bool freeze) override; @@ -205,13 +209,15 @@ private: AZ::EntityId PickEntity(const AzFramework::ScreenPoint& point) override; AZ::Vector3 PickTerrain(const AzFramework::ScreenPoint& point) override; float TerrainHeight(const AZ::Vector2& position) override; - void FindVisibleEntities(AZStd::vector& visibleEntitiesOut) override; bool ShowingWorldSpace() override; QWidget* GetWidgetForViewportContextMenu() override; void BeginWidgetContext() override; void EndWidgetContext() override; - // Camera::EditorCameraRequestBus + // EditorEntityViewportInteractionRequestBus overrides ... + void FindVisibleEntities(AZStd::vector& visibleEntities) override; + + // Camera::EditorCameraRequestBus overrides ... void SetViewFromEntityPerspective(const AZ::EntityId& entityId) override; void SetViewAndMovementLockFromEntityPerspective(const AZ::EntityId& entityId, bool lockCameraMovement) override; AZ::EntityId GetCurrentViewEntityId() override; @@ -327,7 +333,7 @@ private: // Determines also if the current camera for this viewport is default editor camera ViewSourceType m_viewSourceType = ViewSourceType::None; - // During play game in editor, holds the editor entity ID of the last + // During play game in editor, holds the editor entity ID of the last AZ::EntityId m_viewEntityIdCachedForEditMode; // The editor camera TM before switching to game mode diff --git a/Code/Editor/Viewport.cpp b/Code/Editor/Viewport.cpp index 92e193bddf..9c6088e340 100644 --- a/Code/Editor/Viewport.cpp +++ b/Code/Editor/Viewport.cpp @@ -1092,9 +1092,8 @@ bool QtViewport::HitTest(const QPoint& point, HitContext& hitInfo) const int viewportId = GetViewportId(); AzToolsFramework::EntityIdList visibleEntityIds; - AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Event( - viewportId, - &AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequests::FindVisibleEntities, + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Event( + viewportId, &AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Events::FindVisibleEntities, visibleEntityIds); // Look through all visible entities to find the closest one to the specified mouse point diff --git a/Code/Framework/AzFramework/AzFramework/Visibility/BoundsBus.h b/Code/Framework/AzFramework/AzFramework/Visibility/BoundsBus.h index ebd9484c55..7a60d5fdc5 100644 --- a/Code/Framework/AzFramework/AzFramework/Visibility/BoundsBus.h +++ b/Code/Framework/AzFramework/AzFramework/Visibility/BoundsBus.h @@ -45,6 +45,7 @@ namespace AzFramework protected: ~BoundsRequests() = default; }; + using BoundsRequestBus = AZ::EBus; //! Returns a union of all local Aabbs provided by components implementing the BoundsRequestBus. diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h index 5e907ae680..7f838b0073 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h @@ -45,6 +45,9 @@ namespace AzManipulatorTestFramework virtual void SetAngularStep(float step) = 0; //! Get the viewport id. virtual int GetViewportId() const = 0; + //! Updates the visibility state. + //! Updates which entities are currently visible given the current camera state. + virtual void UpdateVisibility() = 0; }; //! This interface is used to simulate the manipulator manager while the manipulators are under test. diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFrameworkTestHelpers.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFrameworkTestHelpers.h index 9b253c718b..f87f83c1b2 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFrameworkTestHelpers.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFrameworkTestHelpers.h @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include #include namespace UnitTest @@ -21,20 +21,18 @@ namespace UnitTest //! Fixture to provide the indirect call viewport interaction that is dependent on AzToolsFramework::ToolsApplication. //! \tparam ToolsApplicationFixtureT The fixture that provides the AzToolsFramework::ToolsApplication functionality. template - class IndirectCallManipulatorViewportInteractionFixtureMixin - : public ToolsApplicationFixtureT + class IndirectCallManipulatorViewportInteractionFixtureMixin : public ToolsApplicationFixtureT { - using IndirectCallManipulatorViewportInteraction = - AzManipulatorTestFramework::IndirectCallManipulatorViewportInteraction; + using IndirectCallManipulatorViewportInteraction = AzManipulatorTestFramework::IndirectCallManipulatorViewportInteraction; using ImmediateModeActionDispatcher = AzManipulatorTestFramework::ImmediateModeActionDispatcher; - + void SetUpEditorFixtureImpl() override { ToolsApplicationFixtureT::SetUpEditorFixtureImpl(); m_viewportManipulatorInteraction = AZStd::make_unique(); m_actionDispatcher = AZStd::make_unique(*m_viewportManipulatorInteraction); - m_cameraState = AzFramework::CreateIdentityDefaultCamera( - AZ::Vector3::CreateZero(), AzManipulatorTestFramework::DefaultViewportSize); + m_cameraState = + AzFramework::CreateIdentityDefaultCamera(AZ::Vector3::CreateZero(), AzManipulatorTestFramework::DefaultViewportSize); } void TearDownEditorFixtureImpl() override diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/IndirectManipulatorViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/IndirectManipulatorViewportInteraction.h index dabcf567db..a7b1be2c7d 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/IndirectManipulatorViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/IndirectManipulatorViewportInteraction.h @@ -9,8 +9,8 @@ #pragma once #include -#include #include +#include namespace AzManipulatorTestFramework { @@ -18,13 +18,12 @@ namespace AzManipulatorTestFramework class IndirectCallManipulatorManager; //! Implementation of manipulator viewport interaction that manipulates the manager indirectly via bus calls. - class IndirectCallManipulatorViewportInteraction - : public ManipulatorViewportInteraction + class IndirectCallManipulatorViewportInteraction : public ManipulatorViewportInteraction { public: IndirectCallManipulatorViewportInteraction(); ~IndirectCallManipulatorViewportInteraction(); - + // ManipulatorViewportInteractionInterface ... const ViewportInteractionInterface& GetViewportInteraction() const override; const ManipulatorManagerInterface& GetManipulatorManager() const override; diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h index b6944e0355..8b6ea5c59b 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h @@ -8,6 +8,7 @@ #pragma once +#include #include namespace AzManipulatorTestFramework @@ -19,6 +20,7 @@ namespace AzManipulatorTestFramework : public ViewportInteractionInterface , public AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler , public AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler + , private AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler { public: ViewportInteraction(); @@ -34,6 +36,7 @@ namespace AzManipulatorTestFramework void SetGridSize(float size) override; void SetAngularStep(float step) override; int GetViewportId() const override; + void UpdateVisibility() override; // ViewportInteractionRequestBus overrides ... AzFramework::CameraState GetCameraState() override; @@ -52,7 +55,11 @@ namespace AzManipulatorTestFramework float ManipulatorLineBoundWidth() const override; float ManipulatorCircleBoundWidth() const override; + // EditorEntityViewportInteractionRequestBus overrides ... + void FindVisibleEntities(AZStd::vector& visibleEntities) override; + private: + AzFramework::EntityVisibilityQuery m_entityVisibilityQuery; AZStd::unique_ptr m_nullDebugDisplayRequests; const int m_viewportId = 1234; // Arbitrary viewport id for manipulator tests AzFramework::CameraState m_cameraState; diff --git a/Code/Framework/AzManipulatorTestFramework/Source/AzManipulatorTestFrameworkUtils.cpp b/Code/Framework/AzManipulatorTestFramework/Source/AzManipulatorTestFrameworkUtils.cpp index 1b68a3d0cd..4f1e108a14 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/AzManipulatorTestFrameworkUtils.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/AzManipulatorTestFrameworkUtils.cpp @@ -91,12 +91,12 @@ namespace AzManipulatorTestFramework AzToolsFramework::ViewportInteraction::MousePick BuildMousePick( const AzFramework::ScreenPoint& screenPoint, const AzFramework::CameraState& cameraState) { - const auto screenToWorld = AzFramework::ScreenToWorld(screenPoint, cameraState); + const auto nearPlaneWorldPosition = AzFramework::ScreenToWorld(screenPoint, cameraState); AzToolsFramework::ViewportInteraction::MousePick mousePick; mousePick.m_screenCoordinates = screenPoint; - mousePick.m_rayOrigin = screenToWorld; - mousePick.m_rayDirection = (screenToWorld - cameraState.m_position).GetNormalized(); + mousePick.m_rayOrigin = cameraState.m_position; + mousePick.m_rayDirection = (nearPlaneWorldPosition - cameraState.m_position).GetNormalized(); return mousePick; } diff --git a/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp index ff5e3981ef..14723800ff 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp @@ -16,8 +16,7 @@ namespace AzManipulatorTestFramework using MouseInteractionEvent = AzToolsFramework::ViewportInteraction::MouseInteractionEvent; //! Implementation of the manipulator interface using bus calls to access to the manipulator manager. - class IndirectCallManipulatorManager - : public ManipulatorManagerInterface + class IndirectCallManipulatorManager : public ManipulatorManagerInterface { public: IndirectCallManipulatorManager(ViewportInteractionInterface& viewportInteraction); @@ -39,11 +38,12 @@ namespace AzManipulatorTestFramework void IndirectCallManipulatorManager::ConsumeMouseInteractionEvent(const MouseInteractionEvent& event) { + m_viewportInteraction.UpdateVisibility(); + DrawManipulators(); AzToolsFramework::EditorInteractionSystemViewportSelectionRequestBus::Event( AzToolsFramework::GetEntityContextId(), - &AzToolsFramework::ViewportInteraction::InternalMouseViewportRequests::InternalHandleAllMouseInteractions, - event); + &AzToolsFramework::ViewportInteraction::InternalMouseViewportRequests::InternalHandleAllMouseInteractions, event); DrawManipulators(); } diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp index 0817df3849..4dae4fc00d 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp @@ -26,10 +26,12 @@ namespace AzManipulatorTestFramework { AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler::BusConnect(m_viewportId); AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler::BusConnect(m_viewportId); + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusConnect(m_viewportId); } ViewportInteraction::~ViewportInteraction() { + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler::BusDisconnect(); } @@ -74,6 +76,16 @@ namespace AzManipulatorTestFramework return 0.1f; } + void ViewportInteraction::FindVisibleEntities(AZStd::vector& visibleEntitiesOut) + { + visibleEntitiesOut.assign(m_entityVisibilityQuery.Begin(), m_entityVisibilityQuery.End()); + } + + void ViewportInteraction::UpdateVisibility() + { + m_entityVisibilityQuery.UpdateVisibility(m_cameraState); + } + AzFramework::ScreenPoint ViewportInteraction::ViewportWorldToScreen(const AZ::Vector3& worldPosition) { return AzFramework::WorldToScreen(worldPosition, m_cameraState); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ComponentEntitySelectionBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ComponentEntitySelectionBus.h index 64cae9ca3d..dd5af35649 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ComponentEntitySelectionBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ComponentEntitySelectionBus.h @@ -96,7 +96,7 @@ namespace AzToolsFramework { AZ::EBusReduceResult aabbResult(AZ::Aabb::CreateNull()); EditorComponentSelectionRequestsBus::EventResult( - aabbResult, entityId, &EditorComponentSelectionRequests::GetEditorSelectionBoundsViewport, viewportInfo); + aabbResult, entityId, &EditorComponentSelectionRequestsBus::Events::GetEditorSelectionBoundsViewport, viewportInfo); return aabbResult.value; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp index 955ee61525..e3b45aca2b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp @@ -10,6 +10,25 @@ namespace AzToolsFramework { + AzFramework::ClickDetector::ClickEvent ClickDetectorEventFromViewportInteraction( + const ViewportInteraction::MouseInteractionEvent& mouseInteraction) + { + if (mouseInteraction.m_mouseInteraction.m_mouseButtons.Left()) + { + if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Down) + { + return AzFramework::ClickDetector::ClickEvent::Down; + } + + if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Up) + { + return AzFramework::ClickDetector::ClickEvent::Up; + } + } + + return AzFramework::ClickDetector::ClickEvent::Nil; + } + float ManipulatorLineBoundWidth(const AzFramework::ViewportId viewportId /*= AzFramework::InvalidViewportId*/) { float lineBoundWidth = 0.0f; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h index 147c71c8e8..942fee1a49 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h @@ -250,8 +250,6 @@ namespace AzToolsFramework virtual AZ::Vector3 PickTerrain(const AzFramework::ScreenPoint& point) = 0; //! Return the terrain height given a world position in 2d (xy plane). virtual float TerrainHeight(const AZ::Vector2& position) = 0; - //! Given the current view frustum (viewport) return all visible entities. - virtual void FindVisibleEntities(AZStd::vector& visibleEntities) = 0; //! Is the user holding a modifier key to move the manipulator space from local to world. virtual bool ShowingWorldSpace() = 0; //! Return the widget to use as the parent for the viewport context menu. @@ -269,7 +267,20 @@ namespace AzToolsFramework //! Type to inherit to implement MainEditorViewportInteractionRequests. using MainEditorViewportInteractionRequestBus = AZ::EBus; - //! Viewport requests for managing the viewport's cursor state. + //! Editor entity requests to be made about the viewport. + class EditorEntityViewportInteractionRequests + { + public: + //! Given the current view frustum (viewport) return all visible entities. + virtual void FindVisibleEntities(AZStd::vector& visibleEntities) = 0; + + protected: + ~EditorEntityViewportInteractionRequests() = default; + }; + + using EditorEntityViewportInteractionRequestBus = AZ::EBus; + + //! Viewport requests for managing the viewport cursor state. class ViewportMouseCursorRequests { public: @@ -321,23 +332,8 @@ namespace AzToolsFramework //! Maps a mouse interaction event to a ClickDetector event. //! @note Function only cares about up or down events, all other events are mapped to Nil (ignored). - inline AzFramework::ClickDetector::ClickEvent ClickDetectorEventFromViewportInteraction( - const ViewportInteraction::MouseInteractionEvent& mouseInteraction) - { - if (mouseInteraction.m_mouseInteraction.m_mouseButtons.Left()) - { - if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Down) - { - return AzFramework::ClickDetector::ClickEvent::Down; - } - - if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Up) - { - return AzFramework::ClickDetector::ClickEvent::Up; - } - } - return AzFramework::ClickDetector::ClickEvent::Nil; - } + AzFramework::ClickDetector::ClickEvent ClickDetectorEventFromViewportInteraction( + const ViewportInteraction::MouseInteractionEvent& mouseInteraction); //! Wrap EBus call to retrieve manipulator line bound width. //! @note It is possible to pass AzFramework::InvalidViewportId (the default) to perform a Broadcast as opposed to a targeted Event. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp index 7cb0e718a8..f4b68b5970 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp @@ -19,7 +19,7 @@ namespace AzToolsFramework { // default ray length for picking in the viewport - static const float s_pickRayLength = 1000.0f; + static const float EditorPickRayLength = 1000.0f; AZ::Vector3 CalculateCenterOffset(const AZ::EntityId entityId, const EditorTransformComponentSelectionRequests::Pivot pivot) { @@ -60,16 +60,27 @@ namespace AzToolsFramework return screenPosition; } - bool AabbIntersectMouseRay(const ViewportInteraction::MouseInteraction& mouseInteraction, const AZ::Aabb& aabb) + bool AabbIntersectRay(const AZ::Vector3& origin, const AZ::Vector3& direction, const AZ::Aabb& aabb, float& distance) { AZ_PROFILE_FUNCTION(AzToolsFramework); - const AZ::Vector3 rayScaledDir = mouseInteraction.m_mousePick.m_rayDirection * s_pickRayLength; + const AZ::Vector3 rayScaledDir = direction * EditorPickRayLength; - AZ::Vector3 startNormal; float t, end; - return AZ::Intersect::IntersectRayAABB( - mouseInteraction.m_mousePick.m_rayOrigin, rayScaledDir, rayScaledDir.GetReciprocal(), aabb, t, end, startNormal) > 0; + AZ::Vector3 startNormal; + if (AZ::Intersect::IntersectRayAABB(origin, rayScaledDir, rayScaledDir.GetReciprocal(), aabb, t, end, startNormal) > 0) + { + distance = t * EditorPickRayLength; + return true; + } + + return false; + } + + bool AabbIntersectMouseRay(const ViewportInteraction::MouseInteraction& mouseInteraction, const AZ::Aabb& aabb) + { + float unused; + return AabbIntersectRay(mouseInteraction.m_mousePick.m_rayOrigin, mouseInteraction.m_mousePick.m_rayDirection, aabb, unused); } bool PickEntity( @@ -117,8 +128,7 @@ namespace AzToolsFramework { float scaling = 1.0f; ViewportInteraction::ViewportInteractionRequestBus::EventResult( - scaling, viewportId, - &ViewportInteraction::ViewportInteractionRequestBus::Events::DeviceScalingFactor); + scaling, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::DeviceScalingFactor); return scaling; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h index aa1b3ae5ce..ec9bde9f9c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h @@ -46,6 +46,10 @@ namespace AzToolsFramework //! in screen space intersected an aabb in world space. bool AabbIntersectMouseRay(const ViewportInteraction::MouseInteraction& mouseInteraction, const AZ::Aabb& aabb); + //! Wrapper to perform an intersection between a ray and an aabb. + //! Note: direction should be normalized (it is scaled internally by the editor pick distance). + bool AabbIntersectRay(const AZ::Vector3& origin, const AZ::Vector3& direction, const AZ::Aabb& aabb, float& distance); + //! Return if a mouse interaction (pick ray) did intersect the tested EntityId. bool PickEntity( AZ::EntityId entityId, const ViewportInteraction::MouseInteraction& mouseInteraction, float& closestDistance, int viewportId); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp index c65f494b72..5da827244f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp @@ -161,8 +161,8 @@ namespace AzToolsFramework // request list of visible entities from authoritative system EntityIdList nextVisibleEntityIds; - ViewportInteraction::MainEditorViewportInteractionRequestBus::Event( - viewportInfo.m_viewportId, &ViewportInteraction::MainEditorViewportInteractionRequestBus::Events::FindVisibleEntities, + ViewportInteraction::EditorEntityViewportInteractionRequestBus::Event( + viewportInfo.m_viewportId, &ViewportInteraction::EditorEntityViewportInteractionRequestBus::Events::FindVisibleEntities, nextVisibleEntityIds); // only bother resorting if we know the lists have changed diff --git a/Code/Framework/AzToolsFramework/Tests/ComponentModeTestFixture.cpp b/Code/Framework/AzToolsFramework/Tests/ComponentModeTestFixture.cpp index cfdd2d082c..672a0d6705 100644 --- a/Code/Framework/AzToolsFramework/Tests/ComponentModeTestFixture.cpp +++ b/Code/Framework/AzToolsFramework/Tests/ComponentModeTestFixture.cpp @@ -6,8 +6,8 @@ * */ -#include "ComponentModeTestDoubles.h" #include "ComponentModeTestFixture.h" +#include "ComponentModeTestDoubles.h" #include @@ -15,17 +15,15 @@ namespace UnitTest { void ComponentModeTestFixture::SetUpEditorFixtureImpl() { - using namespace AzToolsFramework; - using namespace AzToolsFramework::ComponentModeFramework; + namespace AztfCmf = AzToolsFramework::ComponentModeFramework; auto* app = GetApplication(); - ASSERT_TRUE(app); - app->RegisterComponentDescriptor(PlaceholderEditorComponent::CreateDescriptor()); - app->RegisterComponentDescriptor(AnotherPlaceholderEditorComponent::CreateDescriptor()); - app->RegisterComponentDescriptor(DependentPlaceholderEditorComponent::CreateDescriptor()); + app->RegisterComponentDescriptor(AztfCmf::PlaceholderEditorComponent::CreateDescriptor()); + app->RegisterComponentDescriptor(AztfCmf::AnotherPlaceholderEditorComponent::CreateDescriptor()); + app->RegisterComponentDescriptor(AztfCmf::DependentPlaceholderEditorComponent::CreateDescriptor()); app->RegisterComponentDescriptor( - TestComponentModeComponent::CreateDescriptor()); - app->RegisterComponentDescriptor(IncompatiblePlaceholderEditorComponent::CreateDescriptor()); + AztfCmf::TestComponentModeComponent::CreateDescriptor()); + app->RegisterComponentDescriptor(AztfCmf::IncompatiblePlaceholderEditorComponent::CreateDescriptor()); } } // namespace UnitTest diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ModularViewportCameraController.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ModularViewportCameraController.cpp index 0fc55e2363..4419e0c49f 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ModularViewportCameraController.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ModularViewportCameraController.cpp @@ -73,6 +73,7 @@ namespace AtomToolsFramework return AZ::Transform::CreateIdentity(); } + void ModularCameraViewportContextImpl::SetCameraTransform(const AZ::Transform& transform) { if (auto viewportContext = RetrieveViewportContext(m_viewportId)) @@ -80,6 +81,7 @@ namespace AtomToolsFramework viewportContext->SetCameraTransform(transform); } } + void ModularCameraViewportContextImpl::ConnectViewMatrixChangedHandler(AZ::RPI::ViewportContext::MatrixChangedEvent::Handler& handler) { if (auto viewportContext = RetrieveViewportContext(m_viewportId))