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 <guthadam@amazon.com>
This commit is contained in:
Guthrie Adams
2022-02-14 03:29:14 -06:00
parent deeb59cb83
commit cd0079c199
25 changed files with 460 additions and 525 deletions
@@ -5,19 +5,20 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <Viewport/InputController/Behavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h>
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
@@ -5,18 +5,18 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <Viewport/InputController/Behavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h>
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
@@ -5,19 +5,19 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <Viewport/InputController/Behavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h>
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
@@ -5,20 +5,20 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <Viewport/InputController/Behavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h>
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
@@ -5,9 +5,10 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <Viewport/InputController/Behavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h>
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
@@ -5,18 +5,18 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <Viewport/InputController/Behavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h>
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
@@ -5,22 +5,24 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <AzCore/Component/EntityId.h>
#include <AzCore/Math/Quaternion.h>
#include <AzCore/Component/TickBus.h>
#include <AzCore/Math/Quaternion.h>
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
@@ -7,48 +7,25 @@
*/
#pragma once
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h>
#include <AzFramework/Input/Events/InputChannelEventListener.h>
#include <AzFramework/Viewport/SingleViewportController.h>
#include <Viewport/InputController/Behavior.h>
#include <Viewport/InputController/MaterialEditorViewportInputControllerBus.h>
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)
MaterialEditorViewportInputController();
virtual ~MaterialEditorViewportInputController();
void Init(const AZ::EntityId& cameraEntityId, const AZ::EntityId& targetEntityId, const AZ::EntityId& iblEntityId);
// MaterialEditorViewportInputControllerRequestBus::Handler interface overrides...
const AZ::EntityId& GetCameraEntityId() const override;
const AZ::EntityId& GetTargetEntityId() const override;
const AZ::EntityId& GetIblEntityId() const override;
const AZ::Vector3& GetTargetPosition() const override;
void SetTargetPosition(const AZ::Vector3& targetPosition) override;
float GetDistanceToTarget() const override;
void GetExtents(float& distanceMin, float& distanceMax) const override;
float GetRadius() const override;
void Reset() override;
void SetFieldOfView(float value) override;
bool IsCameraCentered() const override;
// AzFramework::ViewportControllerInstance interface overrides...
bool HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) override;
void UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) override;
private:
using KeyMask = uint32_t;
enum Keys
@@ -62,13 +39,36 @@ namespace MaterialEditor
Shift = 1 << 5
};
ViewportInputBehaviorController(
const AZ::EntityId& cameraEntityId, const AZ::EntityId& targetEntityId, const AZ::EntityId& environmentEntityId);
virtual ~ViewportInputBehaviorController();
void AddBehavior(KeyMask mask, AZStd::shared_ptr<ViewportInputBehavior> behavior);
// ViewportInputBehaviorControllerInterface overrides...
const AZ::EntityId& GetCameraEntityId() const override;
const AZ::EntityId& GetTargetEntityId() 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;
void Reset() override;
void SetFieldOfView(float value) override;
bool IsCameraCentered() const override;
// AzFramework::ViewportControllerInstance overrides...
bool HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) override;
void UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) override;
private:
//! 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<Behavior> m_behavior;
AZStd::unordered_map<KeyMask, AZStd::shared_ptr<Behavior>> m_behaviorMap;
AZStd::shared_ptr<ViewportInputBehavior> m_behavior;
AZStd::unordered_map<KeyMask, AZStd::shared_ptr<ViewportInputBehavior>> 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
@@ -8,16 +8,15 @@
#pragma once
#include <AzCore/EBus/EBus.h>
#include <AzCore/Math/Aabb.h>
#include <AzCore/Math/Vector3.h>
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<MaterialEditorViewportInputControllerRequests>;
} // namespace MaterialEditor
} // namespace AtomToolsFramework
@@ -6,21 +6,25 @@
*
*/
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h>
#include <AzCore/Component/TransformBus.h>
#include <AzCore/Math/MathUtils.h>
#include <AzCore/Math/Vector3.h>
#include <Viewport/InputController/DollyCameraBehavior.h>
#include <Viewport/InputController/MaterialEditorViewportInputController.h>
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
@@ -6,27 +6,25 @@
*
*/
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h>
#include <AzCore/Component/TransformBus.h>
#include <AzCore/Math/Vector3.h>
#include <Viewport/InputController/MaterialEditorViewportInputControllerBus.h>
#include <Viewport/InputController/MoveCameraBehavior.h>
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
@@ -6,15 +6,20 @@
*
*/
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h>
#include <AzCore/Component/TransformBus.h>
#include <Viewport/InputController/MaterialEditorViewportInputController.h>
#include <Viewport/InputController/OrbitCameraBehavior.h>
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
@@ -6,28 +6,26 @@
*
*/
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/PanCameraBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h>
#include <AzCore/Component/TransformBus.h>
#include <AzCore/Math/Quaternion.h>
#include <AzCore/Math/Vector3.h>
#include <Viewport/InputController/MaterialEditorViewportInputControllerBus.h>
#include <Viewport/InputController/PanCameraBehavior.h>
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
@@ -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 <Atom/Feature/SkyBox/SkyBoxFeatureProcessorInterface.h>
#include <Atom/RPI.Public/RPISystemInterface.h>
#include <Atom/RPI.Public/Scene.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h>
#include <AzCore/Component/TransformBus.h>
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<AZ::Render::SkyBoxFeatureProcessorInterface>(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
@@ -6,25 +6,27 @@
*
*/
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateModelBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h>
#include <AzCore/Component/TransformBus.h>
#include <Viewport/InputController/MaterialEditorViewportInputController.h>
#include <Viewport/InputController/RotateModelBehavior.h>
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
@@ -6,78 +6,67 @@
*
*/
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorControllerInterface.h>
#include <AzCore/Component/TransformBus.h>
#include <AzCore/Math/Vector3.h>
#include <Viewport/InputController/Behavior.h>
#include <Viewport/InputController/MaterialEditorViewportInputController.h>
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<float>::min() ||
AZ::GetAbs(m_y) > std::numeric_limits<float>::min() ||
return AZ::GetAbs(m_x) > std::numeric_limits<float>::min() || AZ::GetAbs(m_y) > std::numeric_limits<float>::min() ||
AZ::GetAbs(m_z) > std::numeric_limits<float>::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
@@ -6,120 +6,94 @@
*
*/
#include <QApplication>
#include <QWidget>
#include <Atom/Feature/SkyBox/SkyBoxFeatureProcessorInterface.h>
#include <Atom/RPI.Public/RPISystemInterface.h>
#include <Atom/RPI.Public/Scene.h>
#include <Atom/RPI.Reflect/Model/ModelAsset.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.h>
#include <AzCore/Component/TransformBus.h>
#include <AzCore/Math/Matrix4x4.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzFramework/Components/CameraBus.h>
#include <AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.h>
#include <AzFramework/Input/Devices/Mouse/InputDeviceMouse.h>
#include <AzFramework/Viewport/ScreenGeometry.h>
#include <AzToolsFramework/Viewport/ViewportMessages.h>
#include <Atom/Feature/SkyBox/SkyBoxFeatureProcessorInterface.h>
#include <Atom/RPI.Public/RPISystemInterface.h>
#include <Atom/RPI.Public/Scene.h>
#include <Atom/RPI.Reflect/Model/ModelAsset.h>
#include <AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h>
#include <QApplication>
#include <QWidget>
#include <Viewport/InputController/DollyCameraBehavior.h>
#include <Viewport/InputController/IdleBehavior.h>
#include <Viewport/InputController/MaterialEditorViewportInputController.h>
#include <Viewport/InputController/MoveCameraBehavior.h>
#include <Viewport/InputController/OrbitCameraBehavior.h>
#include <Viewport/InputController/PanCameraBehavior.h>
#include <Viewport/InputController/RotateEnvironmentBehavior.h>
#include <Viewport/InputController/RotateModelBehavior.h>
namespace MaterialEditor
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<IdleBehavior>();
m_behaviorMap[Lmb] = AZStd::make_shared<PanCameraBehavior>();
m_behaviorMap[Mmb] = AZStd::make_shared<MoveCameraBehavior>();
m_behaviorMap[Rmb] = AZStd::make_shared<OrbitCameraBehavior>();
m_behaviorMap[Alt ^ Lmb] = AZStd::make_shared<OrbitCameraBehavior>();
m_behaviorMap[Alt ^ Mmb] = AZStd::make_shared<MoveCameraBehavior>();
m_behaviorMap[Alt ^ Rmb] = AZStd::make_shared<DollyCameraBehavior>();
m_behaviorMap[Lmb ^ Rmb] = AZStd::make_shared<DollyCameraBehavior>();
m_behaviorMap[Ctrl ^ Lmb] = AZStd::make_shared<RotateModelBehavior>();
m_behaviorMap[Shift ^ Lmb] = AZStd::make_shared<RotateEnvironmentBehavior>();
}
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<ViewportInputBehavior> 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<AZ::Render::SkyBoxFeatureProcessorInterface>(m_iblEntityId);
skyBoxFeatureProcessorInterface->SetCubemapRotationMatrix(rotationMatrix);
auto skyBoxFeatureProcessor =
AZ::RPI::Scene::GetFeatureProcessorForEntity<AZ::Render::SkyBoxFeatureProcessorInterface>(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);
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;
}
AZ::Data::AssetId modelAssetId;
AZ::Render::MeshComponentRequestBus::EventResult(modelAssetId, m_targetEntityId,
&AZ::Render::MeshComponentRequestBus::Events::GetModelAssetId);
if (modelAssetId.IsValid())
void ViewportInputBehaviorController::EvaluateControlBehavior()
{
auto it = m_behaviorMap.find(m_keys);
AZStd::shared_ptr<ViewportInputBehavior> nextBehavior =
it != m_behaviorMap.end() ? it->second : AZStd::shared_ptr<ViewportInputBehavior>();
if (m_behavior != nextBehavior)
{
AZ::Data::Asset<AZ::RPI::ModelAsset> modelAsset = AZ::Data::AssetManager::Instance().GetAsset(modelAssetId, azrtti_typeid<AZ::RPI::ModelAsset>(), AZ::Data::AssetLoadBehavior::PreLoad);
modelAsset.BlockUntilLoadComplete();
if (modelAsset.IsReady())
if (m_behavior)
{
const AZ::Aabb& aabb = modelAsset->GetAabb();
aabb.GetAsSphere(m_modelCenter, m_radius);
m_behavior->End();
}
m_distanceMin = 0.5f * AZ::GetMin(AZ::GetMin(aabb.GetExtents().GetX(), aabb.GetExtents().GetY()), aabb.GetExtents().GetZ()) + DepthNear;
m_distanceMax = m_radius * MaxDistanceMultiplier;
m_behavior = nextBehavior;
if (m_behavior)
{
m_behavior->Start();
}
}
}
void MaterialEditorViewportInputController::EvaluateControlBehavior()
{
AZStd::shared_ptr<Behavior> nextBehavior;
auto it = m_behaviorMap.find(m_keys);
if (it == m_behaviorMap.end())
{
nextBehavior = m_behaviorMap[None];
}
else
{
nextBehavior = it->second;
}
if (nextBehavior == m_behavior)
{
return;
}
if (m_behavior)
{
m_behavior->End();
}
m_behavior = nextBehavior;
m_behavior->Start();
}
} // namespace MaterialEditor
} // namespace AtomToolsFramework
@@ -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
)
@@ -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 <Viewport/InputController/IdleBehavior.h>
namespace MaterialEditor
{
} // namespace MaterialEditor
@@ -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 <Viewport/InputController/Behavior.h>
namespace MaterialEditor
{
//! No action taken
class IdleBehavior final
: public Behavior
{
public:
IdleBehavior() = default;
virtual ~IdleBehavior() = default;
};
} // namespace MaterialEditor
@@ -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 <AzCore/Component/TransformBus.h>
#include <Atom/Feature/SkyBox/SkyBoxFeatureProcessorInterface.h>
#include <Atom/RPI.Public/RPISystemInterface.h>
#include <Atom/RPI.Public/Scene.h>
#include <Viewport/InputController/MaterialEditorViewportInputController.h>
#include <Viewport/InputController/RotateEnvironmentBehavior.h>
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<AZ::Render::SkyBoxFeatureProcessorInterface>(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
@@ -394,7 +394,7 @@ namespace MaterialEditor
return m_viewportSettings->m_displayMapperOperationType;
}
inline void MaterialViewportComponent::OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset)
void MaterialViewportComponent::OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset)
{
if (AZ::Data::Asset<AZ::RPI::AnyAsset> anyAsset = asset)
{
@@ -40,6 +40,12 @@
#include <AtomLyIntegration/CommonFeatures/PostProcess/ExposureControl/ExposureControlBus.h>
#include <AtomLyIntegration/CommonFeatures/PostProcess/ExposureControl/ExposureControlComponentConstants.h>
#include <AtomLyIntegration/CommonFeatures/PostProcess/PostFxLayerComponentConstants.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/DollyCameraBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/MoveCameraBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/OrbitCameraBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/PanCameraBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateEnvironmentBehavior.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/RotateModelBehavior.h>
#include <AzCore/Component/Component.h>
#include <AzCore/Component/Entity.h>
#include <AzFramework/Components/NonUniformScaleComponent.h>
@@ -64,7 +70,6 @@ namespace MaterialEditor
: AtomToolsFramework::RenderViewportWidget(parent)
, m_ui(new Ui::MaterialViewportWidget)
, m_toolId(toolId)
, m_viewportController(AZStd::make_shared<MaterialEditorViewportInputController>())
{
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<AzFramework::TransformComponent>(), azrtti_typeid<AZ::Debug::CameraComponent>() });
// 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<AZ::Debug::CameraComponent>());
m_cameraComponent->SetConfiguration(cameraConfig);
m_cameraEntity->CreateComponent(azrtti_typeid<AzFramework::TransformComponent>());
m_cameraEntity->Deactivate();
m_cameraEntity->FindComponent(azrtti_typeid<AZ::Debug::CameraComponent>())->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<AzFramework::TransformComponent>());
m_postProcessEntity->Activate();
m_postProcessEntity = CreateEntity(
"PostProcessEntity",
{ AZ::Render::PostFxLayerComponentTypeId, AZ::Render::ExposureControlComponentTypeId,
azrtti_typeid<AzFramework::TransformComponent>() });
// Init directional light processor
m_directionalLightFeatureProcessor = m_scene->GetFeatureProcessor<AZ::Render::DirectionalLightFeatureProcessorInterface>();
@@ -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<AzFramework::TransformComponent>());
m_iblEntity->Activate();
m_iblEntity =
CreateEntity("IblEntity", { AZ::Render::ImageBasedLightComponentTypeId, azrtti_typeid<AzFramework::TransformComponent>() });
// 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<AzFramework::TransformComponent>());
m_modelEntity->Activate();
m_modelEntity = CreateEntity(
"ViewportModel",
{ AZ::Render::MeshComponentTypeId, AZ::Render::MaterialComponentTypeId, azrtti_typeid<AzFramework::TransformComponent>() });
// 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<AzFramework::TransformComponent>());
m_shadowCatcherEntity->CreateComponent(azrtti_typeid<AzFramework::NonUniformScaleComponent>());
m_shadowCatcherEntity->Activate();
m_shadowCatcherEntity = CreateEntity(
"ViewportShadowCatcher",
{ AZ::Render::MeshComponentTypeId, AZ::Render::MaterialComponentTypeId, azrtti_typeid<AzFramework::TransformComponent>(),
azrtti_typeid<AzFramework::NonUniformScaleComponent>() });
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<AzFramework::TransformComponent>() });
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<AzFramework::TransformComponent>());
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<MaterialViewportSettings> viewportSettings =
AZ::UserSettings::CreateFind<MaterialViewportSettings>(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<AZ::Uuid>& 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<PanCameraBehavior>(m_viewportController.get()));
m_viewportController->AddBehavior(
ViewportInputBehaviorController::Mmb, AZStd::make_shared<MoveCameraBehavior>(m_viewportController.get()));
m_viewportController->AddBehavior(
ViewportInputBehaviorController::Rmb, AZStd::make_shared<OrbitCameraBehavior>(m_viewportController.get()));
m_viewportController->AddBehavior(
ViewportInputBehaviorController::Alt ^ ViewportInputBehaviorController::Lmb,
AZStd::make_shared<OrbitCameraBehavior>(m_viewportController.get()));
m_viewportController->AddBehavior(
ViewportInputBehaviorController::Alt ^ ViewportInputBehaviorController::Mmb,
AZStd::make_shared<MoveCameraBehavior>(m_viewportController.get()));
m_viewportController->AddBehavior(
ViewportInputBehaviorController::Alt ^ ViewportInputBehaviorController::Rmb,
AZStd::make_shared<DollyCameraBehavior>(m_viewportController.get()));
m_viewportController->AddBehavior(
ViewportInputBehaviorController::Lmb ^ ViewportInputBehaviorController::Rmb,
AZStd::make_shared<DollyCameraBehavior>(m_viewportController.get()));
m_viewportController->AddBehavior(
ViewportInputBehaviorController::Ctrl ^ ViewportInputBehaviorController::Lmb,
AZStd::make_shared<RotateModelBehavior>(m_viewportController.get()));
m_viewportController->AddBehavior(
ViewportInputBehaviorController::Shift ^ ViewportInputBehaviorController::Lmb,
AZStd::make_shared<RotateEnvironmentBehavior>(m_viewportController.get()));
GetControllerList()->Add(m_viewportController);
}
void MaterialViewportWidget::OnDocumentOpened(const AZ::Uuid& documentId)
{
AZ::Data::Instance<AZ::RPI::Material> 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<AZ::RPI::ModelAsset> modelAsset = asset;
m_viewportController->SetTargetBounds(modelAsset->GetAabb());
m_viewportController->Reset();
AZ::Data::AssetBus::Handler::BusDisconnect(asset.GetId());
}
}
@@ -15,9 +15,9 @@
#include <AtomCore/Instance/Instance.h>
#include <AtomToolsFramework/Document/AtomToolsDocumentNotificationBus.h>
#include <AtomToolsFramework/Viewport/RenderViewportWidget.h>
#include <AtomToolsFramework/Viewport/ViewportInputBehaviorController/ViewportInputBehaviorController.h>
#include <AzCore/Component/TransformBus.h>
#include <AzFramework/Windowing/WindowBus.h>
#include <Viewport/InputController/MaterialEditorViewportInputController.h>
#include <Viewport/MaterialViewportNotificationBus.h>
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<AZ::Uuid>& 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<MaterialEditorViewportInputController> m_viewportController;
AZStd::shared_ptr<AtomToolsFramework::ViewportInputBehaviorController> m_viewportController;
QScopedPointer<Ui::MaterialViewportWidget> m_ui;
};
@@ -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