From cd0079c19958809ed2de9e6cfc6fc3cf739f7ff6 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Mon, 14 Feb 2022 03:29:14 -0600 Subject: [PATCH 1/2] Atom Tools: Extracted the viewport input controller from ME to ATF These viewport controls will be shared with material canvas and other tools that share a similar environment and viewport configurations. These classes are currently duplicated between the material editor and prototype projects. This change generalizes some things that are specific to the material editor and moves the system to a common location. Event buses were removed and replaced with a normal interface. Signed-off-by: Guthrie Adams --- .../DollyCameraBehavior.h | 13 +- .../MoveCameraBehavior.h | 12 +- .../OrbitCameraBehavior.h | 13 +- .../PanCameraBehavior.h | 14 +- .../RotateEnvironmentBehavior.h | 20 +- .../RotateModelBehavior.h | 12 +- .../ViewportInputBehavior.h} | 27 +-- .../ViewportInputBehaviorController.h} | 68 ++++--- ...iewportInputBehaviorControllerInterface.h} | 19 +- .../DollyCameraBehavior.cpp | 16 +- .../MoveCameraBehavior.cpp | 28 ++- .../OrbitCameraBehavior.cpp | 22 +- .../PanCameraBehavior.cpp | 30 ++- .../RotateEnvironmentBehavior.cpp | 53 +++++ .../RotateModelBehavior.cpp | 34 ++-- .../ViewportInputBehavior.cpp} | 80 +++----- .../ViewportInputBehaviorController.cpp} | 192 +++++++----------- .../Code/atomtoolsframework_files.cmake | 17 ++ .../Viewport/InputController/IdleBehavior.cpp | 13 -- .../Viewport/InputController/IdleBehavior.h | 22 -- .../RotateEnvironmentBehavior.cpp | 51 ----- .../Viewport/MaterialViewportComponent.cpp | 2 +- .../Viewport/MaterialViewportWidget.cpp | 186 +++++++++-------- .../Source/Viewport/MaterialViewportWidget.h | 10 +- .../Code/materialeditor_files.cmake | 19 -- 25 files changed, 454 insertions(+), 519 deletions(-) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController}/DollyCameraBehavior.h (67%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController}/MoveCameraBehavior.h (69%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController}/OrbitCameraBehavior.h (71%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController}/PanCameraBehavior.h (69%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController}/RotateEnvironmentBehavior.h (66%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController}/RotateModelBehavior.h (71%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController/Behavior.h => AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h} (76%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputController.h => AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.h} (68%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputControllerBus.h => AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h} (78%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController}/DollyCameraBehavior.cpp (63%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController}/MoveCameraBehavior.cpp (63%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController}/OrbitCameraBehavior.cpp (72%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController}/PanCameraBehavior.cpp (61%) create mode 100644 Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.cpp rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController => AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController}/RotateModelBehavior.cpp (63%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController/Behavior.cpp => AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.cpp} (54%) rename Gems/Atom/Tools/{MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputController.cpp => AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.cpp} (53%) delete mode 100644 Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/IdleBehavior.cpp delete mode 100644 Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/IdleBehavior.h delete mode 100644 Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateEnvironmentBehavior.cpp diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/DollyCameraBehavior.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.h similarity index 67% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/DollyCameraBehavior.h rename to Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.h index 5debfc4dd1..770c0e108a 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/DollyCameraBehavior.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.h @@ -5,19 +5,20 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #pragma once -#include +#include -namespace MaterialEditor +namespace AtomToolsFramework { //! Moves(zooms) camera back and forth towards the target - class DollyCameraBehavior final - : public Behavior + class DollyCameraBehavior final : public ViewportInputBehavior { public: - DollyCameraBehavior() = default; + DollyCameraBehavior(ViewportInputBehaviorControllerInterface* controller); virtual ~DollyCameraBehavior() = default; + protected: void TickInternal(float x, float y, float z) override; float GetSensitivityX() override; @@ -27,4 +28,4 @@ namespace MaterialEditor static constexpr float SensitivityX = 0; static constexpr float SensitivityY = 0.005f; }; -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MoveCameraBehavior.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.h similarity index 69% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MoveCameraBehavior.h rename to Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.h index ea0850ba16..011f12def2 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MoveCameraBehavior.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.h @@ -5,18 +5,18 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #pragma once -#include +#include -namespace MaterialEditor +namespace AtomToolsFramework { //! Moves camera along its vertical and horizontal axis - class MoveCameraBehavior final - : public Behavior + class MoveCameraBehavior final : public ViewportInputBehavior { public: - MoveCameraBehavior() = default; + MoveCameraBehavior(ViewportInputBehaviorControllerInterface* controller); virtual ~MoveCameraBehavior() = default; void End() override; @@ -29,4 +29,4 @@ namespace MaterialEditor static constexpr float SensitivityX = 0.01f; static constexpr float SensitivityY = 0.01f; }; -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/OrbitCameraBehavior.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.h similarity index 71% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/OrbitCameraBehavior.h rename to Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.h index a312d22e73..e7e20d665d 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/OrbitCameraBehavior.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.h @@ -5,19 +5,19 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #pragma once -#include +#include -namespace MaterialEditor +namespace AtomToolsFramework { //! Rotates the camera around target position, //! this can either be model center or any position in world - class OrbitCameraBehavior final - : public Behavior + class OrbitCameraBehavior final : public ViewportInputBehavior { public: - OrbitCameraBehavior() = default; + OrbitCameraBehavior(ViewportInputBehaviorControllerInterface* controller); virtual ~OrbitCameraBehavior() = default; protected: @@ -30,7 +30,6 @@ namespace MaterialEditor static constexpr float SensitivityX = 0.005f; static constexpr float SensitivityY = 0.005f; - bool m_aligned = false; }; -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/PanCameraBehavior.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/PanCameraBehavior.h similarity index 69% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/PanCameraBehavior.h rename to Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/PanCameraBehavior.h index 93233511f0..c4351f0854 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/PanCameraBehavior.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/PanCameraBehavior.h @@ -5,20 +5,20 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #pragma once -#include +#include -namespace MaterialEditor +namespace AtomToolsFramework { //! Rotates camera around its own axis, allowing to look up/down/left/right - class PanCameraBehavior final - : public Behavior + class PanCameraBehavior final : public ViewportInputBehavior { public: - PanCameraBehavior() = default; + PanCameraBehavior(ViewportInputBehaviorControllerInterface* controller); virtual ~PanCameraBehavior() = default; - + void End() override; protected: @@ -30,4 +30,4 @@ namespace MaterialEditor static constexpr float SensitivityX = 0.005f; static constexpr float SensitivityY = 0.005f; }; -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateEnvironmentBehavior.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.h similarity index 66% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateEnvironmentBehavior.h rename to Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.h index 56c7a5190a..ef90139750 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateEnvironmentBehavior.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.h @@ -5,9 +5,10 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #pragma once -#include +#include namespace AZ { @@ -15,16 +16,15 @@ namespace AZ { class SkyBoxFeatureProcessorInterface; } -} +} // namespace AZ -namespace MaterialEditor +namespace AtomToolsFramework { //! Rotates lighting and skybox around vertical axis - class RotateEnvironmentBehavior final - : public Behavior + class RotateEnvironmentBehavior final : public ViewportInputBehavior { public: - RotateEnvironmentBehavior() = default; + RotateEnvironmentBehavior(ViewportInputBehaviorControllerInterface* controller); virtual ~RotateEnvironmentBehavior() = default; void Start() override; @@ -38,8 +38,8 @@ namespace MaterialEditor static constexpr float SensitivityX = 0.01f; static constexpr float SensitivityY = 0; - AZ::EntityId m_iblEntityId; - AZ::Render::SkyBoxFeatureProcessorInterface* m_skyBoxFeatureProcessorInterface = nullptr; - float m_rotation = 0; + AZ::EntityId m_environmentEntityId; + AZ::Render::SkyBoxFeatureProcessorInterface* m_skyBoxFeatureProcessor = {}; + float m_rotation = {}; }; -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateModelBehavior.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateModelBehavior.h similarity index 71% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateModelBehavior.h rename to Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateModelBehavior.h index e2c20ab5fd..a77b840052 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateModelBehavior.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateModelBehavior.h @@ -5,18 +5,18 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #pragma once -#include +#include -namespace MaterialEditor +namespace AtomToolsFramework { //! Rotates target model in viewport - class RotateModelBehavior final - : public Behavior + class RotateModelBehavior final : public ViewportInputBehavior { public: - RotateModelBehavior() = default; + RotateModelBehavior(ViewportInputBehaviorControllerInterface* controller); virtual ~RotateModelBehavior() = default; void Start() override; @@ -33,4 +33,4 @@ namespace MaterialEditor AZ::EntityId m_targetEntityId; AZ::Vector3 m_cameraRight = AZ::Vector3::CreateAxisX(); }; -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/Behavior.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h similarity index 76% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/Behavior.h rename to Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h index 8b5ff1745e..007f72a7e2 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/Behavior.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h @@ -5,22 +5,24 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #pragma once #include -#include #include +#include -namespace MaterialEditor +namespace AtomToolsFramework { - //! Performs a single type of action for MaterialEditorViewportInputController based on input + class ViewportInputBehaviorControllerInterface; + + //! Performs a single type of action for ViewportInputBehaviorController based on input //! See derived behaviors for specific details - class Behavior - : public AZ::TickBus::Handler + class ViewportInputBehavior : public AZ::TickBus::Handler { public: - Behavior(); - virtual ~Behavior(); + ViewportInputBehavior(ViewportInputBehaviorControllerInterface* controller); + virtual ~ViewportInputBehavior(); virtual void Start(); virtual void End(); @@ -45,20 +47,21 @@ namespace MaterialEditor //! If delta transform less than this, snap instantly static constexpr float SnapInterval = 0.01f; //! delta x movement accumulated during current frame - float m_x = 0; + float m_x = {}; //! delta y movement accumulated during current frame - float m_y = 0; + float m_y = {}; //! delta scroll wheel accumulated during current frame - float m_z = 0; + float m_z = {}; //! Model radius float m_radius = 1.0f; AZ::EntityId m_cameraEntityId; AZ::Vector3 m_targetPosition = AZ::Vector3::CreateZero(); - float m_distanceToTarget = 0; + float m_distanceToTarget = {}; + ViewportInputBehaviorControllerInterface* m_controller = {}; private: // AZ::TickBus::Handler interface overrides... void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; }; -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputController.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.h similarity index 68% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputController.h rename to Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.h index a68666f06d..631a4465eb 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputController.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.h @@ -7,36 +7,51 @@ */ #pragma once +#include +#include #include #include -#include -#include -namespace MaterialEditor +namespace AtomToolsFramework { - class Behavior; + class ViewportInputBehavior; //! Provides controls for manipulating camera, model, and environment in Material Editor - class MaterialEditorViewportInputController + class ViewportInputBehaviorController : public AzFramework::SingleViewportController - , public MaterialEditorViewportInputControllerRequestBus::Handler + , public ViewportInputBehaviorControllerInterface { public: + AZ_TYPE_INFO(ViewportInputBehaviorController, "{569A0544-7654-4DCE-8156-00A71B408374}"); + AZ_CLASS_ALLOCATOR(ViewportInputBehaviorController, AZ::SystemAllocator, 0) + AZ_DISABLE_COPY_MOVE(ViewportInputBehaviorController); - AZ_TYPE_INFO(MaterialEditorViewportInputController, "{569A0544-7654-4DCE-8156-00A71B408374}"); - AZ_CLASS_ALLOCATOR(MaterialEditorViewportInputController, AZ::SystemAllocator, 0) + using KeyMask = uint32_t; - MaterialEditorViewportInputController(); - virtual ~MaterialEditorViewportInputController(); + enum Keys + { + None = 0, + Lmb = 1 << 0, + Mmb = 1 << 1, + Rmb = 1 << 2, + Alt = 1 << 3, + Ctrl = 1 << 4, + Shift = 1 << 5 + }; + + ViewportInputBehaviorController( + const AZ::EntityId& cameraEntityId, const AZ::EntityId& targetEntityId, const AZ::EntityId& environmentEntityId); + virtual ~ViewportInputBehaviorController(); - void Init(const AZ::EntityId& cameraEntityId, const AZ::EntityId& targetEntityId, const AZ::EntityId& iblEntityId); + void AddBehavior(KeyMask mask, AZStd::shared_ptr behavior); - // MaterialEditorViewportInputControllerRequestBus::Handler interface overrides... + // ViewportInputBehaviorControllerInterface overrides... const AZ::EntityId& GetCameraEntityId() const override; const AZ::EntityId& GetTargetEntityId() const override; - const AZ::EntityId& GetIblEntityId() const override; + const AZ::EntityId& GetEnvironmentEntityId() const override; const AZ::Vector3& GetTargetPosition() const override; void SetTargetPosition(const AZ::Vector3& targetPosition) override; + void SetTargetBounds(const AZ::Aabb& targetBounds) override; float GetDistanceToTarget() const override; void GetExtents(float& distanceMin, float& distanceMax) const override; float GetRadius() const override; @@ -44,31 +59,16 @@ namespace MaterialEditor void SetFieldOfView(float value) override; bool IsCameraCentered() const override; - // AzFramework::ViewportControllerInstance interface overrides... + // AzFramework::ViewportControllerInstance overrides... bool HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) override; void UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) override; private: - using KeyMask = uint32_t; - - enum Keys - { - None = 0, - Lmb = 1 << 0, - Mmb = 1 << 1, - Rmb = 1 << 2, - Alt = 1 << 3, - Ctrl = 1 << 4, - Shift = 1 << 5 - }; - //! Calculate min and max dist and center based on mesh size of target model void CalculateExtents(); //! Determine which behavior to set based on mouse/keyboard input void EvaluateControlBehavior(); - bool m_initialized = false; - //! Input keys currently pressed KeyMask m_keys = None; //! Input key sequence changed @@ -77,16 +77,18 @@ namespace MaterialEditor float m_timeToBehaviorSwitchMs = 0; //! Current behavior of the controller - AZStd::shared_ptr m_behavior; - AZStd::unordered_map> m_behaviorMap; + AZStd::shared_ptr m_behavior; + AZStd::unordered_map> m_behaviorMap; AZ::EntityId m_cameraEntityId; //! Target entity is looking at AZ::EntityId m_targetEntityId; //! IBL entity for rotating environment lighting - AZ::EntityId m_iblEntityId; + AZ::EntityId m_environmentEntityId; //! Target position camera is pointed towards AZ::Vector3 m_targetPosition; + //! Target bounds + AZ::Aabb m_targetBounds = AZ::Aabb::CreateFromPoint(AZ::Vector3::CreateZero()); //! Center of the model observed AZ::Vector3 m_modelCenter; //! Minimum distance from camera to target @@ -106,4 +108,4 @@ namespace MaterialEditor //! e.g. pressing RMB+LMB shouldn't switch into RMB behavior (or LMB behavior) first because it's virtually impossible to press both mouse buttons on the same frame static constexpr float BehaviorSwitchDelayMs = 0.1f; }; -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputControllerBus.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h similarity index 78% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputControllerBus.h rename to Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h index dbc33bf8d4..e6e5734469 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputControllerBus.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h @@ -8,16 +8,15 @@ #pragma once #include +#include #include -namespace MaterialEditor +namespace AtomToolsFramework { - class MaterialEditorViewportInputControllerRequests - : public AZ::EBusTraits + class ViewportInputBehaviorControllerInterface { public: - static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; - static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + virtual ~ViewportInputBehaviorControllerInterface() = default; //! Get entityId of viewport camera virtual const AZ::EntityId& GetCameraEntityId() const = 0; @@ -26,7 +25,7 @@ namespace MaterialEditor virtual const AZ::EntityId& GetTargetEntityId() const = 0; //! Get entityId of scene's IBL entity - virtual const AZ::EntityId& GetIblEntityId() const = 0; + virtual const AZ::EntityId& GetEnvironmentEntityId() const = 0; //! Get actual position where the camera is facing virtual const AZ::Vector3& GetTargetPosition() const = 0; @@ -35,6 +34,10 @@ namespace MaterialEditor //! @param targetPosition world space position to point camera at virtual void SetTargetPosition(const AZ::Vector3& targetPosition) = 0; + //! Set camera target bounds + //! @param targetBounds AABB of target + virtual void SetTargetBounds(const AZ::Aabb& targetBounds) = 0; + //! Get distance between camera and its target virtual float GetDistanceToTarget() const = 0; @@ -56,6 +59,4 @@ namespace MaterialEditor //! Check if camera is looking directly at a model virtual bool IsCameraCentered() const = 0; }; - - using MaterialEditorViewportInputControllerRequestBus = AZ::EBus; -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/DollyCameraBehavior.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.cpp similarity index 63% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/DollyCameraBehavior.cpp rename to Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.cpp index c69884c5c0..fa4f13fecb 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/DollyCameraBehavior.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.cpp @@ -6,21 +6,25 @@ * */ +#include +#include #include #include #include -#include -#include -namespace MaterialEditor +namespace AtomToolsFramework { + DollyCameraBehavior::DollyCameraBehavior(ViewportInputBehaviorControllerInterface* controller) + : ViewportInputBehavior(controller) + { + } + void DollyCameraBehavior::TickInternal([[maybe_unused]] float x, float y, [[maybe_unused]] float z) { m_distanceToTarget = m_distanceToTarget + y; AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, m_cameraEntityId, &AZ::TransformBus::Events::GetLocalTM); - AZ::Vector3 position = m_targetPosition - - transform.GetRotation().TransformVector(AZ::Vector3::CreateAxisY(m_distanceToTarget)); + AZ::Vector3 position = m_targetPosition - transform.GetRotation().TransformVector(AZ::Vector3::CreateAxisY(m_distanceToTarget)); AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetLocalTranslation, position); } @@ -33,4 +37,4 @@ namespace MaterialEditor { return SensitivityY; } -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MoveCameraBehavior.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.cpp similarity index 63% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MoveCameraBehavior.cpp rename to Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.cpp index 80b3409f57..ea70b72cb4 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MoveCameraBehavior.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.cpp @@ -6,27 +6,25 @@ * */ +#include +#include #include #include -#include -#include -namespace MaterialEditor +namespace AtomToolsFramework { + MoveCameraBehavior::MoveCameraBehavior(ViewportInputBehaviorControllerInterface* controller) + : ViewportInputBehavior(controller) + { + } + void MoveCameraBehavior::End() { - float distanceToTarget; - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - distanceToTarget, - &MaterialEditorViewportInputControllerRequestBus::Handler::GetDistanceToTarget); + float distanceToTarget = m_controller->GetDistanceToTarget(); AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, m_cameraEntityId, &AZ::TransformBus::Events::GetLocalTM); - AZ::Vector3 targetPosition = - transform.GetTranslation() + - transform.GetBasisY() * distanceToTarget; - MaterialEditorViewportInputControllerRequestBus::Broadcast( - &MaterialEditorViewportInputControllerRequestBus::Handler::SetTargetPosition, - targetPosition); + AZ::Vector3 targetPosition = transform.GetTranslation() + transform.GetBasisY() * distanceToTarget; + m_controller->SetTargetPosition(targetPosition); } void MoveCameraBehavior::TickInternal(float x, float y, float z) @@ -41,7 +39,7 @@ namespace MaterialEditor m_targetPosition += deltaPosition; AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetLocalTranslation, position); - Behavior::TickInternal(x, y, z); + ViewportInputBehavior::TickInternal(x, y, z); } float MoveCameraBehavior::GetSensitivityX() @@ -53,4 +51,4 @@ namespace MaterialEditor { return SensitivityY; } -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/OrbitCameraBehavior.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.cpp similarity index 72% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/OrbitCameraBehavior.cpp rename to Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.cpp index 1d93e4eafe..33d4fb0812 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/OrbitCameraBehavior.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.cpp @@ -6,15 +6,20 @@ * */ +#include +#include #include -#include -#include -namespace MaterialEditor +namespace AtomToolsFramework { + OrbitCameraBehavior::OrbitCameraBehavior(ViewportInputBehaviorControllerInterface* controller) + : ViewportInputBehavior(controller) + { + } + void OrbitCameraBehavior::TickInternal(float x, float y, float z) { - Behavior::TickInternal(x, y, z); + ViewportInputBehavior::TickInternal(x, y, z); // don't align camera until a movement has been made so that accidental right-click doesn't reset camera if (!m_aligned) @@ -27,12 +32,9 @@ namespace MaterialEditor AZ::Quaternion rotation = transform.GetRotation(); AZ::Vector3 right = transform.GetBasisX(); rotation = - AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisZ(), -x) * - AZ::Quaternion::CreateFromAxisAngle(right, -y) * - rotation; + AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisZ(), -x) * AZ::Quaternion::CreateFromAxisAngle(right, -y) * rotation; rotation.Normalize(); - AZ::Vector3 position = - rotation.TransformVector(AZ::Vector3(0, -m_distanceToTarget, 0)) + m_targetPosition; + AZ::Vector3 position = rotation.TransformVector(AZ::Vector3(0, -m_distanceToTarget, 0)) + m_targetPosition; transform = AZ::Transform::CreateFromQuaternionAndTranslation(rotation, position); AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetLocalTM, transform); } @@ -56,4 +58,4 @@ namespace MaterialEditor AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, targetRotation); m_aligned = true; } -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/PanCameraBehavior.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/PanCameraBehavior.cpp similarity index 61% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/PanCameraBehavior.cpp rename to Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/PanCameraBehavior.cpp index 2b036a1319..41d8586a7f 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/PanCameraBehavior.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/PanCameraBehavior.cpp @@ -6,28 +6,26 @@ * */ +#include +#include #include #include #include -#include -#include -namespace MaterialEditor +namespace AtomToolsFramework { + PanCameraBehavior::PanCameraBehavior(ViewportInputBehaviorControllerInterface* controller) + : ViewportInputBehavior(controller) + { + } + void PanCameraBehavior::End() { - float distanceToTarget; - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - distanceToTarget, - &MaterialEditorViewportInputControllerRequestBus::Handler::GetDistanceToTarget); + float distanceToTarget = m_controller->GetDistanceToTarget(); AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, m_cameraEntityId, &AZ::TransformBus::Events::GetLocalTM); - AZ::Vector3 targetPosition = - transform.GetTranslation() + - transform.GetBasisY() * distanceToTarget; - MaterialEditorViewportInputControllerRequestBus::Broadcast( - &MaterialEditorViewportInputControllerRequestBus::Handler::SetTargetPosition, - targetPosition); + AZ::Vector3 targetPosition = transform.GetTranslation() + transform.GetBasisY() * distanceToTarget; + m_controller->SetTargetPosition(targetPosition); } void PanCameraBehavior::TickInternal(float x, float y, [[maybe_unused]] float z) @@ -37,9 +35,7 @@ namespace MaterialEditor AZ::Quaternion rotation = transform.GetRotation(); const AZ::Vector3 right = transform.GetBasisX(); rotation = - AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisZ(), -x) * - AZ::Quaternion::CreateFromAxisAngle(right, -y) * - rotation; + AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisZ(), -x) * AZ::Quaternion::CreateFromAxisAngle(right, -y) * rotation; rotation.Normalize(); AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, rotation); } @@ -53,4 +49,4 @@ namespace MaterialEditor { return SensitivityY; } -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.cpp new file mode 100644 index 0000000000..7e8216fbda --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include +#include +#include +#include +#include + +namespace AtomToolsFramework +{ + RotateEnvironmentBehavior::RotateEnvironmentBehavior(ViewportInputBehaviorControllerInterface* controller) + : ViewportInputBehavior(controller) + { + } + + void RotateEnvironmentBehavior::Start() + { + ViewportInputBehavior::Start(); + + m_environmentEntityId = m_controller->GetEnvironmentEntityId(); + AZ_Assert(m_environmentEntityId.IsValid(), "Failed to find m_environmentEntityId"); + m_skyBoxFeatureProcessor = + AZ::RPI::Scene::GetFeatureProcessorForEntity(m_environmentEntityId); + } + + void RotateEnvironmentBehavior::TickInternal(float x, float y, float z) + { + ViewportInputBehavior::TickInternal(x, y, z); + + m_rotation += x; + AZ::Quaternion rotation = AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisZ(), m_rotation); + AZ::TransformBus::Event(m_environmentEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, rotation); + const AZ::Matrix4x4 rotationMatrix = AZ::Matrix4x4::CreateFromQuaternion(rotation); + m_skyBoxFeatureProcessor->SetCubemapRotationMatrix(rotationMatrix); + } + + float RotateEnvironmentBehavior::GetSensitivityX() + { + return SensitivityX; + } + + float RotateEnvironmentBehavior::GetSensitivityY() + { + return SensitivityY; + } +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateModelBehavior.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/RotateModelBehavior.cpp similarity index 63% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateModelBehavior.cpp rename to Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/RotateModelBehavior.cpp index ed09ae8fa3..2b01471789 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateModelBehavior.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/RotateModelBehavior.cpp @@ -6,25 +6,27 @@ * */ +#include +#include #include -#include -#include -namespace MaterialEditor +namespace AtomToolsFramework { + RotateModelBehavior::RotateModelBehavior(ViewportInputBehaviorControllerInterface* controller) + : ViewportInputBehavior(controller) + { + } + void RotateModelBehavior::Start() { - Behavior::Start(); + ViewportInputBehavior::Start(); - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - m_targetEntityId, - &MaterialEditorViewportInputControllerRequestBus::Handler::GetTargetEntityId); + m_targetEntityId = m_controller->GetTargetEntityId(); AZ_Assert(m_targetEntityId.IsValid(), "Failed to find m_targetEntityId"); - AZ::EntityId cameraEntityId; - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - cameraEntityId, - &MaterialEditorViewportInputControllerRequestBus::Handler::GetCameraEntityId); + + AZ::EntityId cameraEntityId = m_controller->GetCameraEntityId(); AZ_Assert(cameraEntityId.IsValid(), "Failed to find cameraEntityId"); + AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, cameraEntityId, &AZ::TransformBus::Events::GetLocalTM); m_cameraRight = transform.GetBasisX(); @@ -32,16 +34,14 @@ namespace MaterialEditor void RotateModelBehavior::TickInternal(float x, float y, float z) { - Behavior::TickInternal(x, y, z); + ViewportInputBehavior::TickInternal(x, y, z); AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, m_targetEntityId, &AZ::TransformBus::Events::GetLocalTM); AZ::Quaternion rotation = transform.GetRotation(); - rotation = - AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisZ(), x) * - AZ::Quaternion::CreateFromAxisAngle(m_cameraRight, y) * - rotation; + rotation = AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisZ(), x) * + AZ::Quaternion::CreateFromAxisAngle(m_cameraRight, y) * rotation; rotation.Normalize(); AZ::TransformBus::Event(m_targetEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, rotation); @@ -56,4 +56,4 @@ namespace MaterialEditor { return SensitivityY; } -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/Behavior.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.cpp similarity index 54% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/Behavior.cpp rename to Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.cpp index a843c4965c..653edcecb7 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/Behavior.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.cpp @@ -6,78 +6,67 @@ * */ +#include +#include #include #include -#include -#include -namespace MaterialEditor +namespace AtomToolsFramework { - Behavior::Behavior() + ViewportInputBehavior::ViewportInputBehavior(ViewportInputBehaviorControllerInterface* controller) + : m_controller(controller) { AZ::TickBus::Handler::BusConnect(); } - Behavior::~Behavior() + ViewportInputBehavior::~ViewportInputBehavior() { AZ::TickBus::Handler::BusDisconnect(); } - void Behavior::Start() + void ViewportInputBehavior::Start() { - m_x = 0; - m_y = 0; - m_z = 0; + m_x = {}; + m_y = {}; + m_z = {}; - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - m_cameraEntityId, - &MaterialEditorViewportInputControllerRequestBus::Handler::GetCameraEntityId); + m_cameraEntityId = m_controller->GetCameraEntityId(); AZ_Assert(m_cameraEntityId.IsValid(), "Failed to find m_cameraEntityId"); - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - m_distanceToTarget, - &MaterialEditorViewportInputControllerRequestBus::Handler::GetDistanceToTarget); - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - m_targetPosition, - &MaterialEditorViewportInputControllerRequestBus::Handler::GetTargetPosition); - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - m_radius, &MaterialEditorViewportInputControllerRequestBus::Handler::GetRadius); + m_distanceToTarget = m_controller->GetDistanceToTarget(); + m_targetPosition = m_controller->GetTargetPosition(); + m_radius = m_controller->GetRadius(); } - void Behavior::End() + void ViewportInputBehavior::End() { } - void Behavior::MoveX(float value) + void ViewportInputBehavior::MoveX(float value) { m_x += value * GetSensitivityX(); } - void Behavior::MoveY(float value) + void ViewportInputBehavior::MoveY(float value) { m_y += value * GetSensitivityY(); } - void Behavior::MoveZ(float value) + void ViewportInputBehavior::MoveZ(float value) { m_z += value * GetSensitivityZ(); } - bool Behavior::HasDelta() const + bool ViewportInputBehavior::HasDelta() const { - return - AZ::GetAbs(m_x) > std::numeric_limits::min() || - AZ::GetAbs(m_y) > std::numeric_limits::min() || + return AZ::GetAbs(m_x) > std::numeric_limits::min() || AZ::GetAbs(m_y) > std::numeric_limits::min() || AZ::GetAbs(m_z) > std::numeric_limits::min(); } - void Behavior::TickInternal([[maybe_unused]] float x, [[maybe_unused]] float y, float z) + void ViewportInputBehavior::TickInternal([[maybe_unused]] float x, [[maybe_unused]] float y, float z) { m_distanceToTarget = m_distanceToTarget - z; - bool isCameraCentered = false; - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - isCameraCentered, - &MaterialEditorViewportInputControllerRequestBus::Handler::IsCameraCentered); + bool isCameraCentered = m_controller->IsCameraCentered(); // if camera is looking at the model (locked to the model) we don't want to zoom past the model's center if (isCameraCentered) @@ -87,40 +76,35 @@ namespace MaterialEditor AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, m_cameraEntityId, &AZ::TransformBus::Events::GetLocalTM); - AZ::Vector3 position = m_targetPosition - - transform.GetRotation().TransformVector(AZ::Vector3::CreateAxisY(m_distanceToTarget)); + AZ::Vector3 position = m_targetPosition - transform.GetRotation().TransformVector(AZ::Vector3::CreateAxisY(m_distanceToTarget)); AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetLocalTranslation, position); // if camera is not locked to the model, move its focal point so we can free look if (!isCameraCentered) { m_targetPosition += transform.GetRotation().TransformVector(AZ::Vector3::CreateAxisY(z)); - MaterialEditorViewportInputControllerRequestBus::Broadcast( - &MaterialEditorViewportInputControllerRequestBus::Handler::SetTargetPosition, - m_targetPosition); - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - m_distanceToTarget, - &MaterialEditorViewportInputControllerRequestBus::Handler::GetDistanceToTarget); + m_controller->SetTargetPosition(m_targetPosition); + m_distanceToTarget = m_controller->GetDistanceToTarget(); } } - float Behavior::GetSensitivityX() + float ViewportInputBehavior::GetSensitivityX() { return 0; } - float Behavior::GetSensitivityY() + float ViewportInputBehavior::GetSensitivityY() { return 0; } - float Behavior::GetSensitivityZ() + float ViewportInputBehavior::GetSensitivityZ() { // adjust zooming sensitivity by model size, so that large models zoom at the same speed as smaller ones return 0.001f * AZ::GetMax(0.5f, m_radius); } - AZ::Quaternion Behavior::LookRotation(AZ::Vector3 forward) + AZ::Quaternion ViewportInputBehavior::LookRotation(AZ::Vector3 forward) { forward.Normalize(); AZ::Vector3 right = forward.CrossZAxis(); @@ -132,7 +116,7 @@ namespace MaterialEditor return rotation; } - float Behavior::TakeStep(float& value, float t) + float ViewportInputBehavior::TakeStep(float& value, float t) { const float absValue = AZ::GetAbs(value); float step; @@ -148,7 +132,7 @@ namespace MaterialEditor return step; } - void Behavior::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time) + void ViewportInputBehavior::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time) { // delta x and y values are accumulated in MoveX and MoveY functions (by dragging the mouse) // in the Tick function we then lerp them down to 0 over short time and apply delta transform to an entity @@ -163,4 +147,4 @@ namespace MaterialEditor TickInternal(x, y, z); } } -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputController.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.cpp similarity index 53% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputController.cpp rename to Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.cpp index ced59f1bf5..97972ad80e 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/MaterialEditorViewportInputController.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.cpp @@ -6,120 +6,94 @@ * */ -#include -#include - +#include +#include +#include +#include +#include #include #include #include - #include #include #include #include #include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace MaterialEditor +#include +#include + +namespace AtomToolsFramework { - MaterialEditorViewportInputController::MaterialEditorViewportInputController() + ViewportInputBehaviorController::ViewportInputBehaviorController( + const AZ::EntityId& cameraEntityId, const AZ::EntityId& targetEntityId, const AZ::EntityId& environmentEntityId) : AzFramework::SingleViewportController() + , m_cameraEntityId(cameraEntityId) + , m_targetEntityId(targetEntityId) + , m_environmentEntityId(environmentEntityId) , m_targetPosition(AZ::Vector3::CreateZero()) { - m_behaviorMap[None] = AZStd::make_shared(); - m_behaviorMap[Lmb] = AZStd::make_shared(); - m_behaviorMap[Mmb] = AZStd::make_shared(); - m_behaviorMap[Rmb] = AZStd::make_shared(); - m_behaviorMap[Alt ^ Lmb] = AZStd::make_shared(); - m_behaviorMap[Alt ^ Mmb] = AZStd::make_shared(); - m_behaviorMap[Alt ^ Rmb] = AZStd::make_shared(); - m_behaviorMap[Lmb ^ Rmb] = AZStd::make_shared(); - m_behaviorMap[Ctrl ^ Lmb] = AZStd::make_shared(); - m_behaviorMap[Shift ^ Lmb] = AZStd::make_shared(); } - MaterialEditorViewportInputController::~MaterialEditorViewportInputController() + ViewportInputBehaviorController::~ViewportInputBehaviorController() { - if (m_initialized) - { - MaterialEditorViewportInputControllerRequestBus::Handler::BusDisconnect(); - } } - void MaterialEditorViewportInputController::Init(const AZ::EntityId& cameraEntityId, const AZ::EntityId& targetEntityId, const AZ::EntityId& iblEntityId) + void ViewportInputBehaviorController::AddBehavior(KeyMask mask, AZStd::shared_ptr behavior) { - if (m_initialized) - { - AZ_Error("MaterialEditorViewportInputController", false, "Controller already initialized."); - return; - } - m_initialized = true; - m_cameraEntityId = cameraEntityId; - m_targetEntityId = targetEntityId; - m_iblEntityId = iblEntityId; - - MaterialEditorViewportInputControllerRequestBus::Handler::BusConnect(); + m_behaviorMap[mask] = behavior; } - const AZ::EntityId& MaterialEditorViewportInputController::GetCameraEntityId() const + const AZ::EntityId& ViewportInputBehaviorController::GetCameraEntityId() const { return m_cameraEntityId; } - const AZ::EntityId& MaterialEditorViewportInputController::GetTargetEntityId() const + const AZ::EntityId& ViewportInputBehaviorController::GetTargetEntityId() const { return m_targetEntityId; } - const AZ::EntityId& MaterialEditorViewportInputController::GetIblEntityId() const + const AZ::EntityId& ViewportInputBehaviorController::GetEnvironmentEntityId() const { - return m_iblEntityId; + return m_environmentEntityId; } - const AZ::Vector3& MaterialEditorViewportInputController::GetTargetPosition() const + const AZ::Vector3& ViewportInputBehaviorController::GetTargetPosition() const { return m_targetPosition; } - void MaterialEditorViewportInputController::SetTargetPosition(const AZ::Vector3& targetPosition) + void ViewportInputBehaviorController::SetTargetPosition(const AZ::Vector3& targetPosition) { m_targetPosition = targetPosition; m_isCameraCentered = false; } - float MaterialEditorViewportInputController::GetDistanceToTarget() const + void ViewportInputBehaviorController::SetTargetBounds(const AZ::Aabb& targetBounds) + { + m_targetBounds = targetBounds; + } + + float ViewportInputBehaviorController::GetDistanceToTarget() const { AZ::Vector3 cameraPosition; AZ::TransformBus::EventResult(cameraPosition, m_cameraEntityId, &AZ::TransformBus::Events::GetLocalTranslation); return cameraPosition.GetDistance(m_targetPosition); } - void MaterialEditorViewportInputController::GetExtents(float& distanceMin, float& distanceMax) const + void ViewportInputBehaviorController::GetExtents(float& distanceMin, float& distanceMax) const { distanceMin = m_distanceMin; distanceMax = m_distanceMax; } - float MaterialEditorViewportInputController::GetRadius() const + float ViewportInputBehaviorController::GetRadius() const { return m_radius; } - void MaterialEditorViewportInputController::UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) + void ViewportInputBehaviorController::UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) { if (m_keysChanged) { @@ -135,7 +109,7 @@ namespace MaterialEditor } } - bool MaterialEditorViewportInputController::HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) + bool ViewportInputBehaviorController::HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) { using namespace AzFramework; @@ -145,8 +119,7 @@ namespace MaterialEditor bool mouseOver = false; AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::EventResult( - mouseOver, GetViewportId(), - &AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Events::IsMouseOver); + mouseOver, GetViewportId(), &AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Events::IsMouseOver); if (!m_behavior) { @@ -180,20 +153,17 @@ namespace MaterialEditor { m_keys |= Shift; } - if (inputChannelId == InputDeviceMouse::Movement::X) + if (m_behavior && inputChannelId == InputDeviceMouse::Movement::X) { m_behavior->MoveX(event.m_inputChannel.GetValue()); } - else if (inputChannelId == InputDeviceMouse::Movement::Y) + else if (m_behavior && inputChannelId == InputDeviceMouse::Movement::Y) { m_behavior->MoveY(event.m_inputChannel.GetValue()); } - else if (inputChannelId == InputDeviceMouse::Movement::Z) + else if (m_behavior && inputChannelId == InputDeviceMouse::Movement::Z && mouseOver) { - if (mouseOver) - { - m_behavior->MoveZ(event.m_inputChannel.GetValue()); - } + m_behavior->MoveZ(event.m_inputChannel.GetValue()); } break; case InputChannel::State::Ended: @@ -232,20 +202,17 @@ namespace MaterialEditor } break; case InputChannel::State::Updated: - if (inputChannelId == InputDeviceMouse::Movement::X) + if (m_behavior && inputChannelId == InputDeviceMouse::Movement::X) { m_behavior->MoveX(event.m_inputChannel.GetValue()); } - else if (inputChannelId == InputDeviceMouse::Movement::Y) + else if (m_behavior && inputChannelId == InputDeviceMouse::Movement::Y) { m_behavior->MoveY(event.m_inputChannel.GetValue()); } - else if (inputChannelId == InputDeviceMouse::Movement::Z) + else if (m_behavior && inputChannelId == InputDeviceMouse::Movement::Z && mouseOver) { - if (mouseOver) - { - m_behavior->MoveZ(event.m_inputChannel.GetValue()); - } + m_behavior->MoveZ(event.m_inputChannel.GetValue()); } break; } @@ -258,7 +225,7 @@ namespace MaterialEditor return false; } - void MaterialEditorViewportInputController::Reset() + void ViewportInputBehaviorController::Reset() { CalculateExtents(); @@ -277,12 +244,13 @@ namespace MaterialEditor AZ::TransformBus::Event(m_targetEntityId, &AZ::TransformBus::Events::SetLocalTM, modelTransform); // reset environment - AZ::Transform iblTransform = AZ::Transform::CreateIdentity(); - AZ::TransformBus::Event(m_iblEntityId, &AZ::TransformBus::Events::SetLocalTM, iblTransform); + AZ::Transform environmentTransform = AZ::Transform::CreateIdentity(); + AZ::TransformBus::Event(m_environmentEntityId, &AZ::TransformBus::Events::SetLocalTM, environmentTransform); const AZ::Matrix4x4 rotationMatrix = AZ::Matrix4x4::CreateIdentity(); - auto skyBoxFeatureProcessorInterface = AZ::RPI::Scene::GetFeatureProcessorForEntity(m_iblEntityId); - skyBoxFeatureProcessorInterface->SetCubemapRotationMatrix(rotationMatrix); + auto skyBoxFeatureProcessor = + AZ::RPI::Scene::GetFeatureProcessorForEntity(m_environmentEntityId); + skyBoxFeatureProcessor->SetCubemapRotationMatrix(rotationMatrix); if (m_behavior) { @@ -291,62 +259,46 @@ namespace MaterialEditor } } - void MaterialEditorViewportInputController::SetFieldOfView(float value) + void ViewportInputBehaviorController::SetFieldOfView(float value) { Camera::CameraRequestBus::Event(m_cameraEntityId, &Camera::CameraRequestBus::Events::SetFovDegrees, value); } - bool MaterialEditorViewportInputController::IsCameraCentered() const + bool ViewportInputBehaviorController::IsCameraCentered() const { return m_isCameraCentered; } - void MaterialEditorViewportInputController::CalculateExtents() + void ViewportInputBehaviorController::CalculateExtents() { AZ::TransformBus::EventResult(m_modelCenter, m_targetEntityId, &AZ::TransformBus::Events::GetLocalTranslation); - - AZ::Data::AssetId modelAssetId; - AZ::Render::MeshComponentRequestBus::EventResult(modelAssetId, m_targetEntityId, - &AZ::Render::MeshComponentRequestBus::Events::GetModelAssetId); - - if (modelAssetId.IsValid()) - { - AZ::Data::Asset modelAsset = AZ::Data::AssetManager::Instance().GetAsset(modelAssetId, azrtti_typeid(), AZ::Data::AssetLoadBehavior::PreLoad); - modelAsset.BlockUntilLoadComplete(); - if (modelAsset.IsReady()) - { - const AZ::Aabb& aabb = modelAsset->GetAabb(); - aabb.GetAsSphere(m_modelCenter, m_radius); - - m_distanceMin = 0.5f * AZ::GetMin(AZ::GetMin(aabb.GetExtents().GetX(), aabb.GetExtents().GetY()), aabb.GetExtents().GetZ()) + DepthNear; - m_distanceMax = m_radius * MaxDistanceMultiplier; - } - } + m_targetBounds.GetAsSphere(m_modelCenter, m_radius); + m_distanceMin = DepthNear + 0.5f * AZ::GetMin( + AZ::GetMin( + m_targetBounds.GetExtents().GetX(), + m_targetBounds.GetExtents().GetY()), + m_targetBounds.GetExtents().GetZ()); + m_distanceMax = m_radius * MaxDistanceMultiplier; } - void MaterialEditorViewportInputController::EvaluateControlBehavior() + void ViewportInputBehaviorController::EvaluateControlBehavior() { - AZStd::shared_ptr nextBehavior; auto it = m_behaviorMap.find(m_keys); - if (it == m_behaviorMap.end()) + AZStd::shared_ptr nextBehavior = + it != m_behaviorMap.end() ? it->second : AZStd::shared_ptr(); + if (m_behavior != nextBehavior) { - nextBehavior = m_behaviorMap[None]; - } - else - { - nextBehavior = it->second; - } + if (m_behavior) + { + m_behavior->End(); + } - if (nextBehavior == m_behavior) - { - return; - } + m_behavior = nextBehavior; - if (m_behavior) - { - m_behavior->End(); + if (m_behavior) + { + m_behavior->Start(); + } } - m_behavior = nextBehavior; - m_behavior->Start(); } -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake index 19ee71dc66..008eb5fe96 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake @@ -88,4 +88,21 @@ set(FILES Source/PreviewRenderer/PreviewRendererCaptureState.h Source/PreviewRenderer/PreviewRendererSystemComponent.cpp Source/PreviewRenderer/PreviewRendererSystemComponent.h + Source/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.cpp + Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.h + Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h + Source/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.cpp + Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h + Source/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.cpp + Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.h + Source/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.cpp + Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.h + Source/Viewport/ViewportInputBehaviorController/PanCameraBehavior.cpp + Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/PanCameraBehavior.h + Source/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.cpp + Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.h + Source/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.cpp + Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.h + Source/Viewport/ViewportInputBehaviorController/RotateModelBehavior.cpp + Include/AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateModelBehavior.h ) \ No newline at end of file diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/IdleBehavior.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/IdleBehavior.cpp deleted file mode 100644 index 0cd062d86d..0000000000 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/IdleBehavior.cpp +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#include - -namespace MaterialEditor -{ -} // namespace MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/IdleBehavior.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/IdleBehavior.h deleted file mode 100644 index 16543a890d..0000000000 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/IdleBehavior.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -#pragma once - -#include - -namespace MaterialEditor -{ - //! No action taken - class IdleBehavior final - : public Behavior - { - public: - IdleBehavior() = default; - virtual ~IdleBehavior() = default; - }; -} // namespace MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateEnvironmentBehavior.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateEnvironmentBehavior.cpp deleted file mode 100644 index 894841becd..0000000000 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/InputController/RotateEnvironmentBehavior.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#include - -#include -#include -#include - -#include -#include - -namespace MaterialEditor -{ - void RotateEnvironmentBehavior::Start() - { - Behavior::Start(); - - MaterialEditorViewportInputControllerRequestBus::BroadcastResult( - m_iblEntityId, - &MaterialEditorViewportInputControllerRequestBus::Handler::GetIblEntityId); - AZ_Assert(m_iblEntityId.IsValid(), "Failed to find m_iblEntityId"); - m_skyBoxFeatureProcessorInterface = AZ::RPI::Scene::GetFeatureProcessorForEntity(m_iblEntityId); - } - - void RotateEnvironmentBehavior::TickInternal(float x, float y, float z) - { - Behavior::TickInternal(x, y, z); - - m_rotation += x; - AZ::Quaternion rotation = AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisZ(), m_rotation); - AZ::TransformBus::Event(m_iblEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, rotation); - const AZ::Matrix4x4 rotationMatrix = AZ::Matrix4x4::CreateFromQuaternion(rotation); - m_skyBoxFeatureProcessorInterface->SetCubemapRotationMatrix(rotationMatrix); - } - - float RotateEnvironmentBehavior::GetSensitivityX() - { - return SensitivityX; - } - - float RotateEnvironmentBehavior::GetSensitivityY() - { - return SensitivityY; - } -} // namespace MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportComponent.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportComponent.cpp index f25d83556d..613dace10c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportComponent.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportComponent.cpp @@ -394,7 +394,7 @@ namespace MaterialEditor return m_viewportSettings->m_displayMapperOperationType; } - inline void MaterialViewportComponent::OnAssetReady(AZ::Data::Asset asset) + void MaterialViewportComponent::OnAssetReady(AZ::Data::Asset asset) { if (AZ::Data::Asset anyAsset = asset) { diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp index 5d8dc1cdc5..89aecd67a2 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp @@ -40,6 +40,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include #include #include @@ -64,7 +70,6 @@ namespace MaterialEditor : AtomToolsFramework::RenderViewportWidget(parent) , m_ui(new Ui::MaterialViewportWidget) , m_toolId(toolId) - , m_viewportController(AZStd::make_shared()) { m_ui->setupUi(this); @@ -117,31 +122,24 @@ namespace MaterialEditor entityContextId, &AzFramework::GameEntityContextRequestBus::Events::GetGameEntityContextId); // Configure camera - AzFramework::EntityContextRequestBus::EventResult( - m_cameraEntity, entityContextId, &AzFramework::EntityContextRequestBus::Events::CreateEntity, "Cameraentity"); - AZ_Assert(m_cameraEntity != nullptr, "Failed to create camera entity."); + m_cameraEntity = + CreateEntity("Cameraentity", { azrtti_typeid(), azrtti_typeid() }); - // Add debug camera and controller components AZ::Debug::CameraComponentConfig cameraConfig(GetViewportContext()->GetWindowContext()); cameraConfig.m_fovY = AZ::Constants::HalfPi; cameraConfig.m_depthNear = DepthNear; - m_cameraComponent = m_cameraEntity->CreateComponent(azrtti_typeid()); - m_cameraComponent->SetConfiguration(cameraConfig); - m_cameraEntity->CreateComponent(azrtti_typeid()); + m_cameraEntity->Deactivate(); + m_cameraEntity->FindComponent(azrtti_typeid())->SetConfiguration(cameraConfig); m_cameraEntity->Activate(); // Connect camera to pipeline's default view after camera entity activated m_renderPipeline->SetDefaultViewFromEntity(m_cameraEntity->GetId()); // Configure tone mapper - AzFramework::EntityContextRequestBus::EventResult( - m_postProcessEntity, entityContextId, &AzFramework::EntityContextRequestBus::Events::CreateEntity, "postProcessEntity"); - AZ_Assert(m_postProcessEntity != nullptr, "Failed to create post process entity."); - - m_postProcessEntity->CreateComponent(AZ::Render::PostFxLayerComponentTypeId); - m_postProcessEntity->CreateComponent(AZ::Render::ExposureControlComponentTypeId); - m_postProcessEntity->CreateComponent(azrtti_typeid()); - m_postProcessEntity->Activate(); + m_postProcessEntity = CreateEntity( + "PostProcessEntity", + { AZ::Render::PostFxLayerComponentTypeId, AZ::Render::ExposureControlComponentTypeId, + azrtti_typeid() }); // Init directional light processor m_directionalLightFeatureProcessor = m_scene->GetFeatureProcessor(); @@ -155,33 +153,19 @@ namespace MaterialEditor m_skyboxFeatureProcessor->SetSkyboxMode(AZ::Render::SkyBoxMode::Cubemap); // Create IBL - AzFramework::EntityContextRequestBus::EventResult( - m_iblEntity, entityContextId, &AzFramework::EntityContextRequestBus::Events::CreateEntity, "IblEntity"); - AZ_Assert(m_iblEntity != nullptr, "Failed to create ibl entity."); - - m_iblEntity->CreateComponent(AZ::Render::ImageBasedLightComponentTypeId); - m_iblEntity->CreateComponent(azrtti_typeid()); - m_iblEntity->Activate(); + m_iblEntity = + CreateEntity("IblEntity", { AZ::Render::ImageBasedLightComponentTypeId, azrtti_typeid() }); // Create model - AzFramework::EntityContextRequestBus::EventResult( - m_modelEntity, entityContextId, &AzFramework::EntityContextRequestBus::Events::CreateEntity, "ViewportModel"); - AZ_Assert(m_modelEntity != nullptr, "Failed to create model entity."); - - m_modelEntity->CreateComponent(AZ::Render::MeshComponentTypeId); - m_modelEntity->CreateComponent(AZ::Render::MaterialComponentTypeId); - m_modelEntity->CreateComponent(azrtti_typeid()); - m_modelEntity->Activate(); + m_modelEntity = CreateEntity( + "ViewportModel", + { AZ::Render::MeshComponentTypeId, AZ::Render::MaterialComponentTypeId, azrtti_typeid() }); // Create shadow catcher - AzFramework::EntityContextRequestBus::EventResult( - m_shadowCatcherEntity, entityContextId, &AzFramework::EntityContextRequestBus::Events::CreateEntity, "ViewportShadowCatcher"); - AZ_Assert(m_shadowCatcherEntity != nullptr, "Failed to create shadow catcher entity."); - m_shadowCatcherEntity->CreateComponent(AZ::Render::MeshComponentTypeId); - m_shadowCatcherEntity->CreateComponent(AZ::Render::MaterialComponentTypeId); - m_shadowCatcherEntity->CreateComponent(azrtti_typeid()); - m_shadowCatcherEntity->CreateComponent(azrtti_typeid()); - m_shadowCatcherEntity->Activate(); + m_shadowCatcherEntity = CreateEntity( + "ViewportShadowCatcher", + { AZ::Render::MeshComponentTypeId, AZ::Render::MaterialComponentTypeId, azrtti_typeid(), + azrtti_typeid() }); AZ::NonUniformScaleRequestBus::Event( m_shadowCatcherEntity->GetId(), &AZ::NonUniformScaleRequests::SetScale, AZ::Vector3{ 100, 100, 1.0 }); @@ -214,21 +198,19 @@ namespace MaterialEditor } // Create grid - AzFramework::EntityContextRequestBus::EventResult( - m_gridEntity, entityContextId, &AzFramework::EntityContextRequestBus::Events::CreateEntity, "ViewportGrid"); - AZ_Assert(m_gridEntity != nullptr, "Failed to create grid entity."); + m_gridEntity = CreateEntity("ViewportGrid", { AZ::Render::GridComponentTypeId, azrtti_typeid() }); AZ::Render::GridComponentConfig gridConfig; gridConfig.m_gridSize = 4.0f; gridConfig.m_axisColor = AZ::Color(0.1f, 0.1f, 0.1f, 1.0f); gridConfig.m_primaryColor = AZ::Color(0.1f, 0.1f, 0.1f, 1.0f); gridConfig.m_secondaryColor = AZ::Color(0.1f, 0.1f, 0.1f, 1.0f); - auto gridComponent = m_gridEntity->CreateComponent(AZ::Render::GridComponentTypeId); - gridComponent->SetConfiguration(gridConfig); - - m_gridEntity->CreateComponent(azrtti_typeid()); + m_gridEntity->Deactivate(); + m_gridEntity->FindComponent(AZ::Render::GridComponentTypeId)->SetConfiguration(gridConfig); m_gridEntity->Activate(); + SetupInputController(); + OnDocumentOpened(AZ::Uuid::CreateNull()); // Attempt to apply the default lighting preset @@ -241,8 +223,6 @@ namespace MaterialEditor MaterialViewportRequestBus::BroadcastResult(modelPreset, &MaterialViewportRequestBus::Events::GetModelPresetSelection); OnModelPresetSelected(modelPreset); - m_viewportController->Init(m_cameraEntity->GetId(), m_modelEntity->GetId(), m_iblEntity->GetId()); - // Apply user settinngs restored since last run AZStd::intrusive_ptr viewportSettings = AZ::UserSettings::CreateFind(AZ::Crc32("MaterialViewportSettings"), AZ::UserSettings::CT_GLOBAL); @@ -257,8 +237,6 @@ namespace MaterialEditor MaterialViewportNotificationBus::Handler::BusConnect(); AZ::TickBus::Handler::BusConnect(); AZ::TransformNotificationBus::MultiHandler::BusConnect(m_cameraEntity->GetId()); - - GetControllerList()->Add(m_viewportController); } MaterialViewportWidget::~MaterialViewportWidget() @@ -269,33 +247,12 @@ namespace MaterialEditor MaterialViewportNotificationBus::Handler::BusDisconnect(); AZ::Data::AssetBus::Handler::BusDisconnect(); - AzFramework::EntityContextId entityContextId; - AzFramework::GameEntityContextRequestBus::BroadcastResult( - entityContextId, &AzFramework::GameEntityContextRequestBus::Events::GetGameEntityContextId); - - AzFramework::EntityContextRequestBus::Event( - entityContextId, &AzFramework::EntityContextRequestBus::Events::DestroyEntity, m_iblEntity); - m_iblEntity = nullptr; - - AzFramework::EntityContextRequestBus::Event( - entityContextId, &AzFramework::EntityContextRequestBus::Events::DestroyEntity, m_modelEntity); - m_modelEntity = nullptr; - - AzFramework::EntityContextRequestBus::Event( - entityContextId, &AzFramework::EntityContextRequestBus::Events::DestroyEntity, m_shadowCatcherEntity); - m_shadowCatcherEntity = nullptr; - - AzFramework::EntityContextRequestBus::Event( - entityContextId, &AzFramework::EntityContextRequestBus::Events::DestroyEntity, m_gridEntity); - m_gridEntity = nullptr; - - AzFramework::EntityContextRequestBus::Event( - entityContextId, &AzFramework::EntityContextRequestBus::Events::DestroyEntity, m_cameraEntity); - m_cameraEntity = nullptr; - - AzFramework::EntityContextRequestBus::Event( - entityContextId, &AzFramework::EntityContextRequestBus::Events::DestroyEntity, m_postProcessEntity); - m_postProcessEntity = nullptr; + DestroyEntity(m_iblEntity); + DestroyEntity(m_modelEntity); + DestroyEntity(m_shadowCatcherEntity); + DestroyEntity(m_gridEntity); + DestroyEntity(m_cameraEntity); + DestroyEntity(m_postProcessEntity); for (DirectionalLightHandle& handle : m_lightHandles) { @@ -315,6 +272,74 @@ namespace MaterialEditor m_scene = nullptr; } + AZ::Entity* MaterialViewportWidget::CreateEntity(const AZStd::string& name, const AZStd::vector& componentTypeIds) + { + AzFramework::EntityContextId entityContextId; + AzFramework::GameEntityContextRequestBus::BroadcastResult( + entityContextId, &AzFramework::GameEntityContextRequestBus::Events::GetGameEntityContextId); + + AZ::Entity* entity = {}; + AzFramework::EntityContextRequestBus::EventResult( + entity, entityContextId, &AzFramework::EntityContextRequestBus::Events::CreateEntity, name.c_str()); + AZ_Assert(entity != nullptr, "Failed to create post process entity: %s.", name.c_str()); + + if (entity) + { + for (const auto& componentTypeId : componentTypeIds) + { + entity->CreateComponent(componentTypeId); + } + entity->Activate(); + } + + return entity; + } + + void MaterialViewportWidget::DestroyEntity(AZ::Entity*& entity) + { + AzFramework::EntityContextId entityContextId; + AzFramework::GameEntityContextRequestBus::BroadcastResult( + entityContextId, &AzFramework::GameEntityContextRequestBus::Events::GetGameEntityContextId); + + AzFramework::EntityContextRequestBus::Event(entityContextId, &AzFramework::EntityContextRequestBus::Events::DestroyEntity, entity); + entity = nullptr; + } + + void MaterialViewportWidget::SetupInputController() + { + using namespace AtomToolsFramework; + + // Create viewport input controller and regioster its behaviors + m_viewportController.reset( + aznew ViewportInputBehaviorController(m_cameraEntity->GetId(), m_modelEntity->GetId(), m_iblEntity->GetId())); + m_viewportController->AddBehavior( + ViewportInputBehaviorController::Lmb, AZStd::make_shared(m_viewportController.get())); + m_viewportController->AddBehavior( + ViewportInputBehaviorController::Mmb, AZStd::make_shared(m_viewportController.get())); + m_viewportController->AddBehavior( + ViewportInputBehaviorController::Rmb, AZStd::make_shared(m_viewportController.get())); + m_viewportController->AddBehavior( + ViewportInputBehaviorController::Alt ^ ViewportInputBehaviorController::Lmb, + AZStd::make_shared(m_viewportController.get())); + m_viewportController->AddBehavior( + ViewportInputBehaviorController::Alt ^ ViewportInputBehaviorController::Mmb, + AZStd::make_shared(m_viewportController.get())); + m_viewportController->AddBehavior( + ViewportInputBehaviorController::Alt ^ ViewportInputBehaviorController::Rmb, + AZStd::make_shared(m_viewportController.get())); + m_viewportController->AddBehavior( + ViewportInputBehaviorController::Lmb ^ ViewportInputBehaviorController::Rmb, + AZStd::make_shared(m_viewportController.get())); + m_viewportController->AddBehavior( + ViewportInputBehaviorController::Ctrl ^ ViewportInputBehaviorController::Lmb, + AZStd::make_shared(m_viewportController.get())); + m_viewportController->AddBehavior( + ViewportInputBehaviorController::Shift ^ ViewportInputBehaviorController::Lmb, + AZStd::make_shared(m_viewportController.get())); + + GetControllerList()->Add(m_viewportController); + } + void MaterialViewportWidget::OnDocumentOpened(const AZ::Uuid& documentId) { AZ::Data::Instance materialInstance; @@ -436,8 +461,7 @@ namespace MaterialEditor void MaterialViewportWidget::OnFieldOfViewChanged(float fieldOfView) { - MaterialEditorViewportInputControllerRequestBus::Broadcast( - &MaterialEditorViewportInputControllerRequestBus::Handler::SetFieldOfView, fieldOfView); + m_viewportController->SetFieldOfView(fieldOfView); } void MaterialViewportWidget::OnDisplayMapperOperationTypeChanged(AZ::Render::DisplayMapperOperationType operationType) @@ -451,7 +475,9 @@ namespace MaterialEditor { if (m_modelAssetId == asset.GetId()) { - MaterialEditorViewportInputControllerRequestBus::Broadcast(&MaterialEditorViewportInputControllerRequestBus::Handler::Reset); + AZ::Data::Asset modelAsset = asset; + m_viewportController->SetTargetBounds(modelAsset->GetAabb()); + m_viewportController->Reset(); AZ::Data::AssetBus::Handler::BusDisconnect(asset.GetId()); } } diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.h index dcb80dc252..a6c7de243e 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.h @@ -15,9 +15,9 @@ #include #include #include +#include #include #include -#include #include AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT @@ -61,6 +61,10 @@ namespace MaterialEditor ~MaterialViewportWidget(); private: + AZ::Entity* CreateEntity(const AZStd::string& name, const AZStd::vector& componentTypeIds); + void DestroyEntity(AZ::Entity*& entity); + void SetupInputController(); + // AtomToolsFramework::AtomToolsDocumentNotificationBus::Handler interface overrides... void OnDocumentOpened(const AZ::Uuid& documentId) override; @@ -96,8 +100,6 @@ namespace MaterialEditor AZ::Render::DisplayMapperFeatureProcessorInterface* m_displayMapperFeatureProcessor = {}; AZ::Entity* m_cameraEntity = {}; - AZ::Component* m_cameraComponent = {}; - AZ::Entity* m_postProcessEntity = {}; AZ::Entity* m_modelEntity = {}; @@ -114,7 +116,7 @@ namespace MaterialEditor AZ::Entity* m_iblEntity = {}; AZ::Render::SkyBoxFeatureProcessorInterface* m_skyboxFeatureProcessor = {}; - AZStd::shared_ptr m_viewportController; + AZStd::shared_ptr m_viewportController; QScopedPointer m_ui; }; diff --git a/Gems/Atom/Tools/MaterialEditor/Code/materialeditor_files.cmake b/Gems/Atom/Tools/MaterialEditor/Code/materialeditor_files.cmake index d68e013c59..dc8595fe1e 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/materialeditor_files.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/materialeditor_files.cmake @@ -17,28 +17,9 @@ set(FILES Source/Viewport/MaterialViewportModule.h Source/Viewport/MaterialViewportModule.cpp - Source/Viewport/InputController/MaterialEditorViewportInputControllerBus.h Source/Viewport/MaterialViewportSettings.h Source/Viewport/MaterialViewportRequestBus.h Source/Viewport/MaterialViewportNotificationBus.h - Source/Viewport/InputController/MaterialEditorViewportInputController.cpp - Source/Viewport/InputController/MaterialEditorViewportInputController.h - Source/Viewport/InputController/Behavior.cpp - Source/Viewport/InputController/Behavior.h - Source/Viewport/InputController/DollyCameraBehavior.cpp - Source/Viewport/InputController/DollyCameraBehavior.h - Source/Viewport/InputController/IdleBehavior.cpp - Source/Viewport/InputController/IdleBehavior.h - Source/Viewport/InputController/MoveCameraBehavior.cpp - Source/Viewport/InputController/MoveCameraBehavior.h - Source/Viewport/InputController/PanCameraBehavior.cpp - Source/Viewport/InputController/PanCameraBehavior.h - Source/Viewport/InputController/OrbitCameraBehavior.cpp - Source/Viewport/InputController/OrbitCameraBehavior.h - Source/Viewport/InputController/RotateEnvironmentBehavior.cpp - Source/Viewport/InputController/RotateEnvironmentBehavior.h - Source/Viewport/InputController/RotateModelBehavior.cpp - Source/Viewport/InputController/RotateModelBehavior.h Source/Viewport/MaterialViewportSettings.cpp Source/Viewport/MaterialViewportComponent.cpp Source/Viewport/MaterialViewportComponent.h From 8b54e020412f5d72ee0cd10f9fdfd03442980126 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Mon, 14 Feb 2022 08:00:41 -0600 Subject: [PATCH 2/2] updating after PR feedback to use existing minimum element vector function Signed-off-by: Guthrie Adams --- .../ViewportInputBehaviorController.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.cpp index 97972ad80e..fd06427622 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.cpp @@ -273,11 +273,7 @@ namespace AtomToolsFramework { AZ::TransformBus::EventResult(m_modelCenter, m_targetEntityId, &AZ::TransformBus::Events::GetLocalTranslation); m_targetBounds.GetAsSphere(m_modelCenter, m_radius); - m_distanceMin = DepthNear + 0.5f * AZ::GetMin( - AZ::GetMin( - m_targetBounds.GetExtents().GetX(), - m_targetBounds.GetExtents().GetY()), - m_targetBounds.GetExtents().GetZ()); + m_distanceMin = m_targetBounds.GetExtents().GetMinElement() * 0.5f + DepthNear; m_distanceMax = m_radius * MaxDistanceMultiplier; }