Update modular viewport camera controller interface (#6282)

* update modular viewport camera controller interface to make follow behaviors easier

Signed-off-by: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com>

* updates following PR feedback

Signed-off-by: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com>
This commit is contained in:
Tom Hulton-Harrop
2021-12-10 09:49:43 +00:00
committed by GitHub
parent 2ac049eacd
commit 633a9e939a
5 changed files with 57 additions and 17 deletions
@@ -170,11 +170,32 @@ namespace EMStudio
targetPosition.GetX() - CameraDistance, targetPosition.GetY() + CameraDistance, targetPosition.GetZ() + CameraDistance);
break;
}
GetViewportContext()->SetCameraTransform(AZ::Transform::CreateLookAt(cameraPosition, targetPosition));
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
GetViewportId(), &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::SetCameraOffset,
AZ::Vector3::CreateAxisY(-CameraDistance));
}
void AnimViewportWidget::SetFollowCharacter(bool follow)
{
if (follow)
{
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
GetViewportId(), &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::SetCameraOffset,
AZ::Vector3::CreateAxisY(-CameraDistance));
}
else
{
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
GetViewportId(), &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::SetCameraOffset,
AZ::Vector3::CreateZero());
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
GetViewportId(), &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::SetCameraPivotAttached,
GetViewportContext()->GetCameraTransform().GetTranslation());
}
m_followCharacter = follow;
}
@@ -190,7 +211,7 @@ namespace EMStudio
{
auto viewportContext = GetViewportContext();
auto windowSize = viewportContext->GetViewportSize();
// Prevent devided by zero
// Prevent division by zero
const float height = AZStd::max<float>(aznumeric_cast<float>(windowSize.m_height), 1.0f);
const float aspectRatio = aznumeric_cast<float>(windowSize.m_width) / height;
@@ -216,14 +237,10 @@ namespace EMStudio
{
if (m_followCharacter)
{
// When follow charater move is enabled, we are adding the delta of the character movement to the camera per frame.
AZ::Vector3 camPos = GetViewportContext()->GetCameraTransform().GetTranslation();
camPos += m_renderer->GetCharacterCenter() - m_prevCharacterPos;
AZ::Transform newCamTransform = GetViewportContext()->GetCameraTransform();
newCamTransform.SetTranslation(camPos);
GetViewportContext()->SetCameraTransform(newCamTransform);
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
GetViewportId(), &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::SetCameraPivotAttached,
m_renderer->GetCharacterCenter());
}
m_prevCharacterPos = m_renderer->GetCharacterCenter();
}
void AnimViewportWidget::ToggleRenderFlag(EMotionFX::ActorRenderFlag flag)
@@ -64,6 +64,5 @@ namespace EMStudio
AZStd::shared_ptr<AzFramework::OrbitDollyScrollCameraInput> m_orbitDollyScrollCamera;
EMotionFX::ActorRenderFlagBitset m_renderFlags;
bool m_followCharacter = false;
AZ::Vector3 m_prevCharacterPos;
};
}