Add toolbar for anim viewport and some more camera controls.

Signed-off-by: rhhong <rhhong@amazon.com>
monroegm-disable-blank-issue-2
rhhong 4 years ago
parent 960e3fc1b9
commit 13781a759f

@ -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,20 @@ namespace EMStudio
ResetEnvironment();
}
AZ::Vector3 AnimViewportRenderer::GetCenter() const
{
AZ::Vector3 result = AZ::Vector3::CreateZero();
if (!m_actorEntities.empty())
{
// 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();
}
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 GetCenter() 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,43 @@ namespace EMStudio
});
GetControllerList()->Add(controller);
}
void AnimViewportWidget::ResetCamera()
{
SetCameraViewMode(CameraViewMode::DEFAULT);
}
void AnimViewportWidget::SetCameraViewMode([[maybe_unused]]CameraViewMode mode)
{
// Set the camera view mode.
AZ::Vector3 targetPosition = m_renderer->GetCenter();
targetPosition.SetZ(targetPosition.GetY() + TargetCenterOffsetZ);
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,26 @@ namespace EMStudio
class AnimViewportWidget
: public AtomToolsFramework::RenderViewportWidget
, private AnimViewportRequestBus::Handler
{
public:
AnimViewportWidget(QWidget* parent = nullptr);
~AnimViewportWidget();
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;
static constexpr float TargetCenterOffsetZ = 1.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
)

Loading…
Cancel
Save