Material Editor camera controller zoom respects viewport boundary

This commit is contained in:
mnaumov
2021-05-06 13:10:55 -07:00
parent abce15ea20
commit dfd0cbb0fd
4 changed files with 23 additions and 2 deletions
@@ -246,6 +246,8 @@ namespace AzToolsFramework
/// from ViewportCursorScreenPosition. This method will always return the correct position to generate a mouse /// from ViewportCursorScreenPosition. This method will always return the correct position to generate a mouse
/// position delta. /// position delta.
virtual AZStd::optional<AzFramework::ScreenPoint> PreviousViewportCursorScreenPosition() = 0; virtual AZStd::optional<AzFramework::ScreenPoint> PreviousViewportCursorScreenPosition() = 0;
/// Is mouse over viewport.
virtual bool IsMouseOver() const = 0;
protected: protected:
~ViewportMouseCursorRequests() = default; ~ViewportMouseCursorRequests() = default;
@@ -103,6 +103,7 @@ namespace AtomToolsFramework
void EndCursorCapture() override; void EndCursorCapture() override;
AzFramework::ScreenPoint ViewportCursorScreenPosition() override; AzFramework::ScreenPoint ViewportCursorScreenPosition() override;
AZStd::optional<AzFramework::ScreenPoint> PreviousViewportCursorScreenPosition() override; AZStd::optional<AzFramework::ScreenPoint> PreviousViewportCursorScreenPosition() override;
bool IsMouseOver() const override;
// AzFramework::WindowRequestBus::Handler ... // AzFramework::WindowRequestBus::Handler ...
void SetWindowTitle(const AZStd::string& title) override; void SetWindowTitle(const AZStd::string& title) override;
@@ -472,6 +472,11 @@ namespace AtomToolsFramework
: AZStd::optional<AzFramework::ScreenPoint>{}; : AZStd::optional<AzFramework::ScreenPoint>{};
} }
bool RenderViewportWidget::IsMouseOver() const
{
return m_mouseOver;
}
void RenderViewportWidget::BeginCursorCapture() void RenderViewportWidget::BeginCursorCapture()
{ {
if (m_capturingCursor) if (m_capturingCursor)
@@ -17,6 +17,8 @@
#include <AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.h> #include <AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard.h>
#include <AzFramework/Input/Devices/Mouse/InputDeviceMouse.h> #include <AzFramework/Input/Devices/Mouse/InputDeviceMouse.h>
#include <AzFramework/Components/CameraBus.h> #include <AzFramework/Components/CameraBus.h>
#include <AzFramework/Viewport/ScreenGeometry.h>
#include <AzToolsFramework/Viewport/ViewportMessages.h>
#include <AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h> #include <AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h>
#include <Atom/RPI.Public/RPISystemInterface.h> #include <Atom/RPI.Public/RPISystemInterface.h>
@@ -136,6 +138,11 @@ namespace MaterialEditor
const InputChannel::State state = event.m_inputChannel.GetState(); const InputChannel::State state = event.m_inputChannel.GetState();
const KeyMask keysOld = m_keys; const KeyMask keysOld = m_keys;
bool mouseOver = false;
AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::EventResult(
mouseOver, GetViewportId(),
&AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Events::IsMouseOver);
if (!m_behavior) if (!m_behavior)
{ {
EvaluateControlBehavior(); EvaluateControlBehavior();
@@ -178,7 +185,10 @@ namespace MaterialEditor
} }
else if (inputChannelId == InputDeviceMouse::Movement::Z) else if (inputChannelId == InputDeviceMouse::Movement::Z)
{ {
m_behavior->MoveZ(event.m_inputChannel.GetValue()); if (mouseOver)
{
m_behavior->MoveZ(event.m_inputChannel.GetValue());
}
} }
break; break;
case InputChannel::State::Ended: case InputChannel::State::Ended:
@@ -222,7 +232,10 @@ namespace MaterialEditor
} }
else if (inputChannelId == InputDeviceMouse::Movement::Z) else if (inputChannelId == InputDeviceMouse::Movement::Z)
{ {
m_behavior->MoveZ(event.m_inputChannel.GetValue()); if (mouseOver)
{
m_behavior->MoveZ(event.m_inputChannel.GetValue());
}
} }
break; break;
} }