@ -6,17 +6,17 @@
*
*/
# include <AzCore/Math/MatrixUtils.h>
# include <AzFramework/Viewport/ViewportControllerList.h>
# include <AzFramework/Viewport/CameraInput.h>
# include <Atom/RPI.Public/ViewportContext.h>
# include <Atom/RPI.Public/View.h>
# include <Atom/RPI.Public/ViewportContext.h>
# include <AtomToolsFramework/Viewport/ModularViewportCameraController.h>
# include <AzCore/Math/MatrixUtils.h>
# include <AzFramework/Viewport/CameraInput.h>
# include <AzFramework/Viewport/ViewportControllerList.h>
# include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/EMStudioManager.h>
# include <EMStudio/AnimViewportWidget.h>
# include <EMStudio/AnimViewportRenderer.h>
# include <EMStudio/AnimViewportSettings.h>
# include <EMStudio/AnimViewportWidget.h>
# include <EMStudio/AtomRenderPlugin.h>
namespace EMStudio
@ -64,31 +64,44 @@ namespace EMStudio
void AnimViewportWidget : : SetupCameras ( )
{
m_rotateCamera = AZStd : : make_shared < AzFramework : : RotateCameraInput > ( EMStudio : : ViewportUtil : : RotateCameraInputChannelId ( ) ) ;
const auto translateCameraInputChannelIds = EMStudio : : ViewportUtil : : TranslateCameraInputChannelIds ( ) ;
m_translateCamera = AZStd : : make_shared < AzFramework : : TranslateCameraInput > (
m_lookRotateCamera = AZStd : : make_shared < AzFramework : : RotateCameraInput > ( EMStudio : : ViewportUtil : : RotateCameraInputChannelId ( ) ) ;
m_lookTranslateCamera = AZStd : : make_shared < AzFramework : : TranslateCameraInput > (
translateCameraInputChannelIds , AzFramework : : LookTranslation , AzFramework : : TranslatePivotLook ) ;
m_translateCamera . get ( ) - > m_translateSpeedFn = [ ]
m_ lookTranslateCamera - > m_translateSpeedFn = [ ]
{
return 3.0f ;
} ;
m_lookScrollCamera = AZStd : : make_shared < AzFramework : : LookScrollTranslationCameraInput > ( ) ;
m_lookScrollTranslationCamera = AZStd : : make_shared < AzFramework : : LookScrollTranslationCameraInput > ( ) ;
m_lookPanCamera = AZStd : : make_shared < AzFramework : : PanCameraInput > (
EMStudio : : ViewportUtil : : PanCameraInputChannelId ( ) , AzFramework : : LookPan , AzFramework : : TranslatePivotLook ) ;
m_orbitCamera = AZStd : : make_shared < AzFramework : : OrbitCameraInput > ( EMStudio : : ViewportUtil : : OrbitCameraInputChannelId ( ) ) ;
m_orbitCamera - > SetPivotFn (
[ this ] ( const AZ : : Vector3 & position , const AZ : : Vector3 & direction )
[ this ] ( [[maybe_unused]] const AZ::Vector3& position, [[maybe_unused]] const AZ : : Vector3 & direction )
{
if ( m_orbitCamera - > Beginning ( ) )
{
m_defaultOrbitPoint = position + direction * EMStudio : : ViewportUtil : : CameraDefaultOrbitDistance ( ) ;
}
return m_defaultOrbitPoint ;
return m_renderer - > GetCharacterCenter ( ) ;
} ) ;
m_orbitTranslateCamera = AZStd : : make_shared < AzFramework : : TranslateCameraInput > (
translateCameraInputChannelIds , AzFramework : : LookTranslation , AzFramework : : TranslatePivotLook ) ;
m_orbitRotateCamera = AZStd : : make_shared < AzFramework : : RotateCameraInput > ( EMStudio : : ViewportUtil : : OrbitLookCameraInputChannelId ( ) ) ;
m_orbitDollyScrollCamera = AZStd : : make_shared < AzFramework : : OrbitDollyScrollCameraInput > ( ) ;
m_orbitScrollDollyCamera = AZStd : : make_shared < AzFramework : : OrbitScrollDollyCameraInput > ( ) ;
m_orbitPanCamera = AZStd : : make_shared < AzFramework : : PanCameraInput > (
EMStudio : : ViewportUtil : : PanCameraInputChannelId ( ) , AzFramework : : LookPan , AzFramework : : TranslateOffsetOrbit ) ;
m_orbitMotionDollyCamera =
AZStd : : make_shared < AzFramework : : OrbitMotionDollyCameraInput > ( EMStudio : : ViewportUtil : : OrbitDollyCameraInputChannelId ( ) ) ;
m_orbitCamera - > m_orbitCameras . AddCamera ( m_orbitRotateCamera ) ;
m_orbitCamera - > m_orbitCameras . AddCamera ( m_orbitDollyScrollCamera ) ;
m_orbitCamera - > m_orbitCameras . AddCamera ( m_orbitScrollDollyCamera ) ;
m_orbitCamera - > m_orbitCameras . AddCamera ( m_orbitTranslateCamera ) ;
m_orbitCamera - > m_orbitCameras . AddCamera ( m_orbitMotionDollyCamera ) ;
m_orbitCamera - > m_orbitCameras . AddCamera ( m_orbitPanCamera ) ;
m_followRotateCamera = AZStd : : make_shared < AzFramework : : RotateCameraInput > ( EMStudio : : ViewportUtil : : OrbitLookCameraInputChannelId ( ) ) ;
m_followScrollDollyCamera = AZStd : : make_shared < AzFramework : : OrbitScrollDollyCameraInput > ( ) ;
m_followScrollMotionCamera =
AZStd : : make_shared < AzFramework : : OrbitMotionDollyCameraInput > ( EMStudio : : ViewportUtil : : OrbitDollyCameraInputChannelId ( ) ) ;
}
void AnimViewportWidget : : SetupCameraController ( )
@ -134,11 +147,13 @@ namespace EMStudio
controller - > SetCameraListBuilderCallback (
[ this ] ( AzFramework : : Cameras & cameras )
{
cameras . AddCamera ( m_rotateCamera ) ;
cameras . AddCamera ( m_translateCamera ) ;
cameras . AddCamera ( m_lookScrollCamera ) ;
cameras . AddCamera ( m_lookRotateCamera ) ;
cameras . AddCamera ( m_lookTranslateCamera ) ;
cameras . AddCamera ( m_lookScrollTranslationCamera ) ;
cameras . AddCamera ( m_lookPanCamera ) ;
cameras . AddCamera ( m_orbitCamera ) ;
} ) ;
GetControllerList ( ) - > Add ( controller ) ;
}
@ -183,14 +198,34 @@ namespace EMStudio
void AnimViewportWidget : : UpdateCameraFollowUp ( bool followUp )
{
const auto lookAndOrbitCameras =
AZStd : : vector < AZStd : : shared_ptr < AzFramework : : CameraInput > > { m_lookRotateCamera , m_lookTranslateCamera ,
m_lookScrollTranslationCamera , m_lookPanCamera , m_orbitCamera } ;
const auto followCameras =
AZStd : : vector < AZStd : : shared_ptr < AzFramework : : CameraInput > > { m_followRotateCamera , m_followScrollDollyCamera ,
m_followScrollMotionCamera } ;
if ( followUp )
{
AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Event (
GetViewportId ( ) , & AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Events : : RemoveCameras ,
lookAndOrbitCameras ) ;
AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Event (
GetViewportId ( ) , & AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Events : : AddCameras , followCameras ) ;
AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Event (
GetViewportId ( ) , & AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Events : : SetCameraOffset ,
AZ : : Vector3 : : CreateAxisY ( - CameraDistance ) ) ;
}
else
{
AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Event (
GetViewportId ( ) , & AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Events : : RemoveCameras , followCameras ) ;
AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Event (
GetViewportId ( ) , & AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Events : : AddCameras , lookAndOrbitCameras ) ;
AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Event (
GetViewportId ( ) , & AtomToolsFramework : : ModularViewportCameraControllerRequestBus : : Events : : SetCameraOffset ,
AZ : : Vector3 : : CreateZero ( ) ) ;
@ -219,8 +254,9 @@ namespace EMStudio
const RenderOptions * renderOptions = m_plugin - > GetRenderOptions ( ) ;
AZ : : Matrix4x4 viewToClipMatrix ;
AZ : : MakePerspectiveFovMatrixRH ( viewToClipMatrix , AZ : : DegToRad ( renderOptions - > GetFOV ( ) ) , aspectRatio ,
renderOptions - > GetNearClipPlaneDistance ( ) , renderOptions - > GetFarClipPlaneDistance ( ) , true ) ;
AZ : : MakePerspectiveFovMatrixRH (
viewToClipMatrix , AZ : : DegToRad ( renderOptions - > GetFOV ( ) ) , aspectRatio , renderOptions - > GetNearClipPlaneDistance ( ) ,
renderOptions - > GetFarClipPlaneDistance ( ) , true ) ;
viewportContext - > GetDefaultView ( ) - > SetViewToClipMatrix ( viewToClipMatrix ) ;
}