Merge pull request #4748 from aws-lumberyard-dev/animation/rhhong/renderOptions
Add toolbar for anim viewport and some more camera controls.
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 60 (88103) - https://sketch.com -->
|
||||
<title>Icons / Video Control / Video</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Icons-/-Video-Control-/-Video" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<rect id="Path" fill-opacity="0" fill="#E9E9E9" x="0" y="0" width="24" height="24"></rect>
|
||||
<polygon id="Combined-Shape" fill="#FFFFFF" points="20 19 15 14 15 20 2 20 2 4 15 4 15 10 20 5 22 5 22 19"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 681 B |
@@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/EMotionFXAtom">
|
||||
<file>Camera_category.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -49,6 +49,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS)
|
||||
NAME EMotionFX_Atom.Editor GEM_MODULE
|
||||
|
||||
NAMESPACE Gem
|
||||
AUTORCC
|
||||
FILES_CMAKE
|
||||
emotionfx_atom_editor_files.cmake
|
||||
INCLUDE_DIRECTORIES
|
||||
|
||||
@@ -181,6 +181,31 @@ namespace EMStudio
|
||||
ResetEnvironment();
|
||||
}
|
||||
|
||||
AZ::Vector3 AnimViewportRenderer::GetCharacterCenter() const
|
||||
{
|
||||
AZ::Vector3 result = AZ::Vector3::CreateZero();
|
||||
if (!m_actorEntities.empty())
|
||||
{
|
||||
// Find the actor instance and calculate the center from aabb.
|
||||
AZ::Vector3 actorCenter = AZ::Vector3::CreateZero();
|
||||
EMotionFX::Integration::ActorComponent* actorComponent =
|
||||
m_actorEntities[0]->FindComponent<EMotionFX::Integration::ActorComponent>();
|
||||
EMotionFX::ActorInstance* actorInstance = actorComponent->GetActorInstance();
|
||||
if (actorInstance)
|
||||
{
|
||||
actorCenter += actorInstance->GetAabb().GetCenter();
|
||||
}
|
||||
|
||||
// Just return the position of the first entity.
|
||||
AZ::Transform worldTransform;
|
||||
AZ::TransformBus::EventResult(worldTransform, m_actorEntities[0]->GetId(), &AZ::TransformBus::Events::GetWorldTM);
|
||||
result = worldTransform.GetTranslation();
|
||||
result += actorCenter;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void AnimViewportRenderer::ResetEnvironment()
|
||||
{
|
||||
// Reset environment
|
||||
|
||||
@@ -49,6 +49,9 @@ namespace EMStudio
|
||||
|
||||
void Reinit();
|
||||
|
||||
//! Return the center position of the existing objects.
|
||||
AZ::Vector3 GetCharacterCenter() const;
|
||||
|
||||
private:
|
||||
|
||||
// This function resets the light, camera and other environment settings.
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/EBus/EBus.h>
|
||||
|
||||
|
||||
namespace EMStudio
|
||||
{
|
||||
enum CameraViewMode
|
||||
{
|
||||
FRONT,
|
||||
BACK,
|
||||
TOP,
|
||||
BOTTOM,
|
||||
LEFT,
|
||||
RIGHT,
|
||||
DEFAULT
|
||||
};
|
||||
|
||||
class AnimViewportRequests
|
||||
: public AZ::EBusTraits
|
||||
{
|
||||
public:
|
||||
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
|
||||
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
|
||||
|
||||
//! Reset the camera to initial state.
|
||||
virtual void ResetCamera() = 0;
|
||||
|
||||
//! Set the camera view mode.
|
||||
virtual void SetCameraViewMode(CameraViewMode mode) = 0;
|
||||
};
|
||||
|
||||
using AnimViewportRequestBus = AZ::EBus<AnimViewportRequests>;
|
||||
} // namespace EMStudio
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <QToolButton>
|
||||
#include <QMenu>
|
||||
#include <EMStudio/AnimViewportToolBar.h>
|
||||
#include <EMStudio/AnimViewportRequestBus.h>
|
||||
#include <AzCore/std/string/string.h>
|
||||
#include <AzQtComponents/Components/Widgets/ToolBar.h>
|
||||
|
||||
|
||||
namespace EMStudio
|
||||
{
|
||||
AnimViewportToolBar::AnimViewportToolBar(QWidget* parent)
|
||||
: QToolBar(parent)
|
||||
{
|
||||
AzQtComponents::ToolBar::addMainToolBarStyle(this);
|
||||
|
||||
// Add the camera button
|
||||
QToolButton* cameraButton = new QToolButton(this);
|
||||
QMenu* cameraMenu = new QMenu(cameraButton);
|
||||
|
||||
// Add the camera option
|
||||
const AZStd::vector<AZStd::pair<CameraViewMode, AZStd::string>> cameraOptionNames = {
|
||||
{ CameraViewMode::FRONT, "Front" }, { CameraViewMode::BACK, "Back" }, { CameraViewMode::TOP, "Top" },
|
||||
{ CameraViewMode::BOTTOM, "Bottom" }, { CameraViewMode::LEFT, "Left" }, { CameraViewMode::RIGHT, "Right" },
|
||||
};
|
||||
|
||||
for (const auto& pair : cameraOptionNames)
|
||||
{
|
||||
CameraViewMode mode = pair.first;
|
||||
cameraMenu->addAction(
|
||||
pair.second.c_str(),
|
||||
[mode]()
|
||||
{
|
||||
// Send the reset camera event.
|
||||
AnimViewportRequestBus::Broadcast(&AnimViewportRequestBus::Events::SetCameraViewMode, mode);
|
||||
});
|
||||
}
|
||||
|
||||
cameraMenu->addSeparator();
|
||||
cameraMenu->addAction("Reset Camera",
|
||||
[]()
|
||||
{
|
||||
// Send the reset camera event.
|
||||
AnimViewportRequestBus::Broadcast(&AnimViewportRequestBus::Events::ResetCamera);
|
||||
});
|
||||
cameraButton->setMenu(cameraMenu);
|
||||
cameraButton->setText("Camera Option");
|
||||
cameraButton->setPopupMode(QToolButton::InstantPopup);
|
||||
cameraButton->setVisible(true);
|
||||
cameraButton->setIcon(QIcon(":/EMotionFXAtom/Camera_category.svg"));
|
||||
addWidget(cameraButton);
|
||||
}
|
||||
} // namespace EMStudio
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <QAction>
|
||||
#include <QToolBar>
|
||||
#endif
|
||||
|
||||
namespace EMStudio
|
||||
{
|
||||
class AnimViewportToolBar : public QToolBar
|
||||
{
|
||||
public:
|
||||
AnimViewportToolBar(QWidget* parent = nullptr);
|
||||
~AnimViewportToolBar() = default;
|
||||
};
|
||||
}
|
||||
@@ -34,6 +34,23 @@ namespace EMStudio
|
||||
|
||||
SetupCameras();
|
||||
SetupCameraController();
|
||||
Reinit();
|
||||
|
||||
AnimViewportRequestBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
AnimViewportWidget::~AnimViewportWidget()
|
||||
{
|
||||
AnimViewportRequestBus::Handler::BusDisconnect();
|
||||
}
|
||||
|
||||
void AnimViewportWidget::Reinit(bool resetCamera)
|
||||
{
|
||||
if (resetCamera)
|
||||
{
|
||||
ResetCamera();
|
||||
}
|
||||
m_renderer->Reinit();
|
||||
}
|
||||
|
||||
void AnimViewportWidget::SetupCameras()
|
||||
@@ -100,4 +117,42 @@ namespace EMStudio
|
||||
});
|
||||
GetControllerList()->Add(controller);
|
||||
}
|
||||
|
||||
void AnimViewportWidget::ResetCamera()
|
||||
{
|
||||
SetCameraViewMode(CameraViewMode::DEFAULT);
|
||||
}
|
||||
|
||||
void AnimViewportWidget::SetCameraViewMode([[maybe_unused]]CameraViewMode mode)
|
||||
{
|
||||
// Set the camera view mode.
|
||||
const AZ::Vector3 targetPosition = m_renderer->GetCharacterCenter();
|
||||
AZ::Vector3 cameraPosition;
|
||||
switch (mode)
|
||||
{
|
||||
case CameraViewMode::FRONT:
|
||||
cameraPosition.Set(0.0f, CameraDistance, targetPosition.GetZ());
|
||||
break;
|
||||
case CameraViewMode::BACK:
|
||||
cameraPosition.Set(0.0f, -CameraDistance, targetPosition.GetZ());
|
||||
break;
|
||||
case CameraViewMode::TOP:
|
||||
cameraPosition.Set(0.0f, 0.0f, CameraDistance + targetPosition.GetZ());
|
||||
break;
|
||||
case CameraViewMode::BOTTOM:
|
||||
cameraPosition.Set(0.0f, 0.0f, -CameraDistance + targetPosition.GetZ());
|
||||
break;
|
||||
case CameraViewMode::LEFT:
|
||||
cameraPosition.Set(-CameraDistance, 0.0f, targetPosition.GetZ());
|
||||
break;
|
||||
case CameraViewMode::RIGHT:
|
||||
cameraPosition.Set(CameraDistance, 0.0f, targetPosition.GetZ());
|
||||
break;
|
||||
case CameraViewMode::DEFAULT:
|
||||
// The default view mode is looking from the top left of the character.
|
||||
cameraPosition.Set(-CameraDistance, CameraDistance, CameraDistance + targetPosition.GetZ());
|
||||
break;
|
||||
}
|
||||
GetViewportContext()->SetCameraTransform(AZ::Transform::CreateLookAt(cameraPosition, targetPosition));
|
||||
}
|
||||
} // namespace EMStudio
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <AtomToolsFramework/Viewport/RenderViewportWidget.h>
|
||||
#include <AzFramework/Viewport/CameraInput.h>
|
||||
#include <EMStudio/AnimViewportRequestBus.h>
|
||||
|
||||
namespace EMStudio
|
||||
{
|
||||
@@ -16,15 +17,25 @@ namespace EMStudio
|
||||
|
||||
class AnimViewportWidget
|
||||
: public AtomToolsFramework::RenderViewportWidget
|
||||
, private AnimViewportRequestBus::Handler
|
||||
{
|
||||
public:
|
||||
AnimViewportWidget(QWidget* parent = nullptr);
|
||||
~AnimViewportWidget() override;
|
||||
AnimViewportRenderer* GetAnimViewportRenderer() { return m_renderer.get(); }
|
||||
|
||||
void Reinit(bool resetCamera = true);
|
||||
|
||||
private:
|
||||
void SetupCameras();
|
||||
void SetupCameraController();
|
||||
|
||||
// AnimViewportRequestBus::Handler overrides
|
||||
void ResetCamera();
|
||||
void SetCameraViewMode(CameraViewMode mode);
|
||||
|
||||
static constexpr float CameraDistance = 2.0f;
|
||||
|
||||
AZStd::unique_ptr<AnimViewportRenderer> m_renderer;
|
||||
AZStd::shared_ptr<AzFramework::RotateCameraInput> m_rotateCamera;
|
||||
AZStd::shared_ptr<AzFramework::TranslateCameraInput> m_translateCamera;
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <EMStudio/AtomRenderPlugin.h>
|
||||
#include <EMStudio/AnimViewportRenderer.h>
|
||||
#include <EMStudio/AnimViewportToolBar.h>
|
||||
|
||||
#include <Integration/Components/ActorComponent.h>
|
||||
#include <EMotionFX/CommandSystem/Source/CommandManager.h>
|
||||
@@ -76,7 +77,7 @@ namespace EMStudio
|
||||
|
||||
void AtomRenderPlugin::ReinitRenderer()
|
||||
{
|
||||
m_animViewportWidget->GetAnimViewportRenderer()->Reinit();
|
||||
m_animViewportWidget->Reinit();
|
||||
}
|
||||
|
||||
bool AtomRenderPlugin::Init()
|
||||
@@ -88,6 +89,12 @@ namespace EMStudio
|
||||
verticalLayout->setSizeConstraint(QLayout::SetNoConstraint);
|
||||
verticalLayout->setSpacing(1);
|
||||
verticalLayout->setMargin(0);
|
||||
|
||||
// Add the tool bar
|
||||
AnimViewportToolBar* toolBar = new AnimViewportToolBar(m_innerWidget);
|
||||
verticalLayout->addWidget(toolBar);
|
||||
|
||||
// Add the viewport widget
|
||||
m_animViewportWidget = new AnimViewportWidget(m_innerWidget);
|
||||
verticalLayout->addWidget(m_animViewportWidget);
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#
|
||||
|
||||
set(FILES
|
||||
../Assets/Icons/Resources.qrc
|
||||
Source/ActorModule.cpp
|
||||
Source/Editor/EditorSystemComponent.h
|
||||
Source/Editor/EditorSystemComponent.cpp
|
||||
@@ -18,4 +19,7 @@ set(FILES
|
||||
Tools/EMStudio/AnimViewportRenderer.cpp
|
||||
Tools/EMStudio/AnimViewportSettings.h
|
||||
Tools/EMStudio/AnimViewportSettings.cpp
|
||||
Tools/EMStudio/AnimViewportToolBar.h
|
||||
Tools/EMStudio/AnimViewportToolBar.cpp
|
||||
Tools/EMStudio/AnimViewportRequestBus.h
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user