Merge pull request #1637 from aws-lumberyard-dev/nvsickle/FixRapidCameraSwitch

Fix switching cameras rapidly in the Editor accidentally copying camera positions
main
Nicholas Van Sickle 5 years ago committed by GitHub
commit f570925c0d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -28,6 +28,10 @@
#include "UndoConfigSpec.h" #include "UndoConfigSpec.h"
#include "ViewManager.h" #include "ViewManager.h"
// Atom
#include <Atom/RPI.Public/ViewportContextBus.h>
#include <Atom/RPI.Public/ViewportContext.h>
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
namespace namespace
{ {
@ -224,33 +228,49 @@ namespace
AZ::Vector3 PyGetCurrentViewPosition() AZ::Vector3 PyGetCurrentViewPosition()
{ {
Vec3 pos = GetIEditor()->GetSystem()->GetViewCamera().GetPosition(); auto viewportContextRequests = AZ::RPI::ViewportContextRequests::Get();
return AZ::Vector3(pos.x, pos.y, pos.z); if (viewportContextRequests)
{
AZ::RPI::ViewportContextPtr viewportContext = viewportContextRequests->GetDefaultViewportContext();
AZ::Transform transform = viewportContext->GetCameraTransform();
return transform.GetTranslation();
}
return AZ::Vector3();
} }
AZ::Vector3 PyGetCurrentViewRotation() AZ::Vector3 PyGetCurrentViewRotation()
{ {
Ang3 ang = RAD2DEG(Ang3::GetAnglesXYZ(Matrix33(GetIEditor()->GetSystem()->GetViewCamera().GetMatrix()))); auto viewportContextRequests = AZ::RPI::ViewportContextRequests::Get();
return AZ::Vector3(ang.x, ang.y, ang.z); if (viewportContextRequests)
{
AZ::RPI::ViewportContextPtr viewportContext = viewportContextRequests->GetDefaultViewportContext();
AZ::Transform transform = viewportContext->GetCameraTransform();
return transform.GetRotation().GetEulerDegrees();
}
return AZ::Vector3();
} }
void PySetCurrentViewPosition(float x, float y, float z) void PySetCurrentViewPosition(float x, float y, float z)
{ {
AzToolsFramework::IEditorCameraController* editorCameraController = AZ::Interface<AzToolsFramework::IEditorCameraController>::Get(); auto viewportContextRequests = AZ::RPI::ViewportContextRequests::Get();
AZ_Error("editor", editorCameraController, "IEditorCameraController is not registered."); if (viewportContextRequests)
if (editorCameraController)
{ {
editorCameraController->SetCurrentViewPosition(AZ::Vector3{ x, y, z }); AZ::RPI::ViewportContextPtr viewportContext = viewportContextRequests->GetDefaultViewportContext();
AZ::Transform transform = viewportContext->GetCameraTransform();
transform.SetTranslation(x, y, z);
viewportContextRequests->GetDefaultViewportContext()->SetCameraTransform(transform);
} }
} }
void PySetCurrentViewRotation(float x, float y, float z) void PySetCurrentViewRotation(float x, float y, float z)
{ {
AzToolsFramework::IEditorCameraController* editorCameraController = AZ::Interface<AzToolsFramework::IEditorCameraController>::Get(); auto viewportContextRequests = AZ::RPI::ViewportContextRequests::Get();
AZ_Error("editor", editorCameraController, "IEditorCameraController is not registered."); if (viewportContextRequests)
if (editorCameraController)
{ {
editorCameraController->SetCurrentViewRotation(AZ::Vector3{ x, y, z }); AZ::RPI::ViewportContextPtr viewportContext = viewportContextRequests->GetDefaultViewportContext();
AZ::Transform transform = viewportContext->GetCameraTransform();
transform.SetRotation(AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(x, y, z)));
viewportContextRequests->GetDefaultViewportContext()->SetCameraTransform(transform);
} }
} }
} }

@ -452,8 +452,19 @@ void EditorViewportWidget::Update()
return; return;
} }
m_updatingCameraPosition = true; if (m_updateCameraPositionNextTick)
if (!ed_useNewCameraSystem) {
auto cameraState = m_renderViewport->GetCameraState();
AZ::Matrix3x4 matrix;
matrix.SetBasisAndTranslation(cameraState.m_side, cameraState.m_forward, cameraState.m_up, cameraState.m_position);
auto m = AZMatrix3x4ToLYMatrix3x4(matrix);
SetViewTM(m);
SetFOV(cameraState.m_fovOrZoom);
m_Camera.SetZRange(cameraState.m_nearClip, cameraState.m_farClip);
m_updateCameraPositionNextTick = false;
}
else if (!ed_useNewCameraSystem)
{ {
m_renderViewport->GetViewportContext()->SetCameraTransform(LYTransformToAZTransform(m_Camera.GetMatrix())); m_renderViewport->GetViewportContext()->SetCameraTransform(LYTransformToAZTransform(m_Camera.GetMatrix()));
} }
@ -472,8 +483,6 @@ void EditorViewportWidget::Update()
); );
m_renderViewport->GetViewportContext()->SetCameraProjectionMatrix(clipMatrix); m_renderViewport->GetViewportContext()->SetCameraProjectionMatrix(clipMatrix);
} }
m_updatingCameraPosition = false;
// Don't wait for changes to update the focused viewport. // Don't wait for changes to update the focused viewport.
if (CheckRespondToInput()) if (CheckRespondToInput())
@ -2894,22 +2903,8 @@ void EditorViewportWidget::UpdateScene()
void EditorViewportWidget::UpdateCameraFromViewportContext() void EditorViewportWidget::UpdateCameraFromViewportContext()
{ {
// If we're not updating because the cry camera position changed, we should make sure our position gets copied back to the Cry Camera // Queue a sync for the next tick, to ensure the latest version of the viewport context transform is used
if (m_updatingCameraPosition) m_updateCameraPositionNextTick = true;
{
return;
}
auto cameraState = m_renderViewport->GetCameraState();
AZ::Matrix3x4 matrix;
matrix.SetBasisAndTranslation(cameraState.m_side, cameraState.m_forward, cameraState.m_up, cameraState.m_position);
auto m = AZMatrix3x4ToLYMatrix3x4(matrix);
m_updatingCameraPosition = true;
SetViewTM(m);
SetFOV(cameraState.m_fovOrZoom);
m_Camera.SetZRange(cameraState.m_nearClip, cameraState.m_farClip);
m_updatingCameraPosition = false;
} }
void EditorViewportWidget::SetAsActiveViewport() void EditorViewportWidget::SetAsActiveViewport()

@ -579,7 +579,7 @@ private:
AZStd::unique_ptr<AZ::ViewportHelpers::EditorEntityNotifications> m_editorEntityNotifications; AZStd::unique_ptr<AZ::ViewportHelpers::EditorEntityNotifications> m_editorEntityNotifications;
AtomToolsFramework::RenderViewportWidget* m_renderViewport = nullptr; AtomToolsFramework::RenderViewportWidget* m_renderViewport = nullptr;
bool m_updatingCameraPosition = false; bool m_updateCameraPositionNextTick = false;
AZ::RPI::ViewportContext::MatrixChangedEvent::Handler m_cameraViewMatrixChangeHandler; AZ::RPI::ViewportContext::MatrixChangedEvent::Handler m_cameraViewMatrixChangeHandler;
AZ::RPI::ViewportContext::MatrixChangedEvent::Handler m_cameraProjectionMatrixChangeHandler; AZ::RPI::ViewportContext::MatrixChangedEvent::Handler m_cameraProjectionMatrixChangeHandler;
AzFramework::DebugDisplayRequests* m_debugDisplay = nullptr; AzFramework::DebugDisplayRequests* m_debugDisplay = nullptr;

@ -101,9 +101,9 @@ namespace Camera
OnTransformChanged(localTransform, worldTransform); OnTransformChanged(localTransform, worldTransform);
// Push the Atom camera after we make sure we're up-to-date with our component's transform to ensure the viewport reads the correct state // Push the Atom camera after we make sure we're up-to-date with our component's transform to ensure the viewport reads the correct state
UpdateCamera();
atomViewportRequests->PushView(contextName, m_atomCamera); atomViewportRequests->PushView(contextName, m_atomCamera);
AZ::RPI::ViewportContextNotificationBus::Handler::BusConnect(contextName); AZ::RPI::ViewportContextNotificationBus::Handler::BusConnect(contextName);
UpdateCamera();
} }
} }

Loading…
Cancel
Save