Przeglądaj źródła

Fix for camera being reset in animation editor (#13590)

Signed-off-by: Tom Hulton-Harrop <[email protected]>
Tom Hulton-Harrop 2 lat temu
rodzic
commit
ced2d6c87c

+ 6 - 0
Code/Editor/EditorModularViewportCameraComposer.cpp

@@ -268,6 +268,12 @@ namespace SandboxEditor
         m_orbitCamera->SetActivationEndedFn(
             [this]
             {
+                // when the orbit camera ends, ensure that the internal camera returns to a look state
+                // (internal offset value for camera is zero)
+                AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
+                    m_viewportId,
+                    &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::LookFromOrbit);
+
                 // when the orbit behavior ends the pivot point should fade out and no longer display
                 m_pivotDisplayState = PivotDisplayState::Hidden;
             });

+ 1 - 0
Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ModularViewportCameraController.h

@@ -126,6 +126,7 @@ namespace AtomToolsFramework
         void SetCameraPivotDetachedImmediate(const AZ::Vector3& pivot) override;
         void SetCameraOffset(const AZ::Vector3& offset) override;
         void SetCameraOffsetImmediate(const AZ::Vector3& offset) override;
+        void LookFromOrbit() override;
         bool AddCameras(const AZStd::vector<AZStd::shared_ptr<AzFramework::CameraInput>>& cameraInputs) override;
         bool RemoveCameras(const AZStd::vector<AZStd::shared_ptr<AzFramework::CameraInput>>& cameraInputs) override;
         void ResetCameras() override;

+ 2 - 0
Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/ModularViewportCameraControllerRequestBus.h

@@ -66,6 +66,8 @@ namespace AtomToolsFramework
         virtual void SetCameraOffset(const AZ::Vector3& offset) = 0;
         //! Same as SetCameraOffset only the offset is set on the current and target cameras so no interpolation occurs.
         virtual void SetCameraOffsetImmediate(const AZ::Vector3& offset) = 0;
+        //! Transitions a camera from an orbit state (pivot and non-zero offset) to a look state (pivot and zero offset).
+        virtual void LookFromOrbit() = 0;
         //! Add one or more camera inputs (behaviors) to run for the current camera.
         virtual bool AddCameras(const AZStd::vector<AZStd::shared_ptr<AzFramework::CameraInput>>& cameraInputs) = 0;
         //! Remove one or more camera inputs (behaviors) to stop them running for the current camera.

+ 7 - 4
Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ModularViewportCameraController.cpp

@@ -337,6 +337,13 @@ namespace AtomToolsFramework
         m_targetCamera.m_offset = offset;
     }
 
+    void ModularViewportCameraControllerInstance::LookFromOrbit()
+    {
+        m_targetCamera.m_pivot = m_targetCamera.Translation();
+        m_targetCamera.m_offset = AZ::Vector3::CreateZero();
+        m_camera = m_targetCamera;
+    }
+
     bool ModularViewportCameraControllerInstance::AddCameras(const AZStd::vector<AZStd::shared_ptr<AzFramework::CameraInput>>& cameraInputs)
     {
         return m_cameraSystem.m_cameras.AddCameras(cameraInputs);
@@ -350,10 +357,6 @@ namespace AtomToolsFramework
 
     void ModularViewportCameraControllerInstance::ResetCameras()
     {
-        // clear any pivot oribit offset and store combined
-        // translation as new pivot
-        m_targetCamera.m_pivot = m_targetCamera.Translation();
-        m_targetCamera.m_offset = AZ::Vector3::CreateZero();
         m_cameraSystem.m_cameras.Reset();
     }