code review feedback. Also add the renderflag as qsettings.
Signed-off-by: rhhong <rhhong@amazon.com>
This commit is contained in:
@@ -27,7 +27,7 @@ namespace AZ::Render
|
||||
m_auxGeomFeatureProcessor = RPI::Scene::GetFeatureProcessorForEntity<RPI::AuxGeomFeatureProcessorInterface>(entityId);
|
||||
}
|
||||
|
||||
void AtomActorDebugDraw::DebugDraw(const EMotionFX::ActorRenderFlagMask& renderFlags, EMotionFX::ActorInstance* instance)
|
||||
void AtomActorDebugDraw::DebugDraw(const EMotionFX::ActorRenderFlagBitset& renderFlags, EMotionFX::ActorInstance* instance)
|
||||
{
|
||||
if (!m_auxGeomFeatureProcessor || !instance)
|
||||
{
|
||||
@@ -47,7 +47,7 @@ namespace AZ::Render
|
||||
}
|
||||
|
||||
// Render skeleton
|
||||
if (renderFlags[EMotionFX::ActorRenderFlag::RENDER_SKELETON])
|
||||
if (renderFlags[EMotionFX::ActorRenderFlag::RENDER_LINESKELETON])
|
||||
{
|
||||
RenderSkeleton(instance);
|
||||
}
|
||||
@@ -345,7 +345,7 @@ namespace AZ::Render
|
||||
const AZ::Color colorTangents = AZ::Colors::Red;
|
||||
const AZ::Color mirroredBitangentColor = AZ::Colors::Yellow;
|
||||
const AZ::Color colorBitangents = AZ::Colors::White;
|
||||
const float scale = 1.0f;
|
||||
const float scale = 0.01f;
|
||||
|
||||
// Get the tangents and check if this mesh actually has tangents
|
||||
AZ::Vector4* tangents = static_cast<AZ::Vector4*>(mesh->FindVertexData(EMotionFX::Mesh::ATTRIB_TANGENTS));
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace AZ::Render
|
||||
public:
|
||||
AtomActorDebugDraw(AZ::EntityId entityId);
|
||||
|
||||
void DebugDraw(const EMotionFX::ActorRenderFlagMask& renderFlags, EMotionFX::ActorInstance* instance);
|
||||
void DebugDraw(const EMotionFX::ActorRenderFlagBitset& renderFlags, EMotionFX::ActorInstance* instance);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace AZ
|
||||
UpdateBounds();
|
||||
}
|
||||
|
||||
void AtomActorInstance::DebugDraw(const EMotionFX::ActorRenderFlagMask& renderFlags)
|
||||
void AtomActorInstance::DebugDraw(const EMotionFX::ActorRenderFlagBitset& renderFlags)
|
||||
{
|
||||
m_atomActorDebugDraw->DebugDraw(renderFlags, m_actorInstance);
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ namespace AZ
|
||||
|
||||
// RenderActorInstance overrides ...
|
||||
void OnTick(float timeDelta) override;
|
||||
void DebugDraw(const EMotionFX::ActorRenderFlagMask& renderFlags);
|
||||
void DebugDraw(const EMotionFX::ActorRenderFlagBitset& renderFlags);
|
||||
void UpdateBounds() override;
|
||||
void SetMaterials(const EMotionFX::Integration::ActorAsset::MaterialList& materialPerLOD) override { AZ_UNUSED(materialPerLOD); };
|
||||
void SetSkinningMethod(EMotionFX::Integration::SkinningMethod emfxSkinningMethod) override;
|
||||
|
||||
@@ -206,14 +206,14 @@ namespace EMStudio
|
||||
return result;
|
||||
}
|
||||
|
||||
void AnimViewportRenderer::UpdateActorRenderFlag(EMotionFX::ActorRenderFlagMask renderFlags)
|
||||
void AnimViewportRenderer::UpdateActorRenderFlag(EMotionFX::ActorRenderFlagBitset renderFlags)
|
||||
{
|
||||
for (AZ::Entity* entity : m_actorEntities)
|
||||
{
|
||||
EMotionFX::Integration::ActorComponent* actorComponent = entity->FindComponent<EMotionFX::Integration::ActorComponent>();
|
||||
if (!actorComponent)
|
||||
{
|
||||
AZ_ErrorOnce("AnimViewport", false, "Found entity without actor component in the actor entity list.");
|
||||
AZ_Assert(false, "Found entity without actor component in the actor entity list.");
|
||||
continue;
|
||||
}
|
||||
actorComponent->SetRenderFlag(renderFlags);
|
||||
|
||||
@@ -52,7 +52,7 @@ namespace EMStudio
|
||||
//! Return the center position of the existing objects.
|
||||
AZ::Vector3 GetCharacterCenter() const;
|
||||
|
||||
void UpdateActorRenderFlag(EMotionFX::ActorRenderFlagMask renderFlags);
|
||||
void UpdateActorRenderFlag(EMotionFX::ActorRenderFlagBitset renderFlags);
|
||||
|
||||
private:
|
||||
|
||||
@@ -81,10 +81,6 @@ namespace EMStudio
|
||||
|
||||
AZ::Entity* m_postProcessEntity = nullptr;
|
||||
AZ::Entity* m_iblEntity = nullptr;
|
||||
AZ::Entity* m_cameraEntity = nullptr;
|
||||
AZ::Component* m_cameraComponent = nullptr;
|
||||
AZ::Entity* m_modelEntity = nullptr;
|
||||
AZ::Data::AssetId m_modelAssetId;
|
||||
AZ::Entity* m_gridEntity = nullptr;
|
||||
AZStd::vector<AZ::Entity*> m_actorEntities;
|
||||
|
||||
|
||||
@@ -111,4 +111,16 @@ namespace EMStudio
|
||||
|
||||
m_actions[actionIndex] = action;
|
||||
}
|
||||
|
||||
void AnimViewportToolBar::SetRenderFlags(EMotionFX::ActorRenderFlagBitset renderFlags)
|
||||
{
|
||||
for (size_t i = 0; i < renderFlags.size(); ++i)
|
||||
{
|
||||
QAction* action = m_actions[i];
|
||||
if (action)
|
||||
{
|
||||
action->setChecked(renderFlags[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace EMStudio
|
||||
|
||||
@@ -24,10 +24,12 @@ namespace EMStudio
|
||||
AnimViewportToolBar(QWidget* parent = nullptr);
|
||||
~AnimViewportToolBar() = default;
|
||||
|
||||
void SetRenderFlags(EMotionFX::ActorRenderFlagBitset renderFlags);
|
||||
|
||||
private:
|
||||
void CreateViewOptionEntry(
|
||||
QMenu* menu, const char* menuEntryName, uint32_t actionIndex, bool visible = true, char* iconFileName = nullptr);
|
||||
|
||||
QAction* m_actions[EMotionFX::ActorRenderFlag::NUM_RENDER_OPTIONS];
|
||||
QAction* m_actions[EMotionFX::ActorRenderFlag::NUM_RENDERFLAGS] = { nullptr };
|
||||
};
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <AzFramework/Viewport/CameraInput.h>
|
||||
#include <Atom/RPI.Public/ViewportContext.h>
|
||||
#include <AtomToolsFramework/Viewport/ModularViewportCameraController.h>
|
||||
#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/EMStudioManager.h>
|
||||
|
||||
#include <EMStudio/AnimViewportWidget.h>
|
||||
#include <EMStudio/AnimViewportRenderer.h>
|
||||
@@ -32,6 +33,7 @@ namespace EMStudio
|
||||
|
||||
m_renderer = AZStd::make_unique<AnimViewportRenderer>(GetViewportContext());
|
||||
|
||||
LoadRenderFlags();
|
||||
SetupCameras();
|
||||
SetupCameraController();
|
||||
Reinit();
|
||||
@@ -41,6 +43,7 @@ namespace EMStudio
|
||||
|
||||
AnimViewportWidget::~AnimViewportWidget()
|
||||
{
|
||||
SaveRenderFlags();
|
||||
AnimViewportRequestBus::Handler::BusDisconnect();
|
||||
}
|
||||
|
||||
@@ -50,7 +53,14 @@ namespace EMStudio
|
||||
{
|
||||
ResetCamera();
|
||||
}
|
||||
|
||||
m_renderer->Reinit();
|
||||
m_renderer->UpdateActorRenderFlag(m_renderFlags);
|
||||
}
|
||||
|
||||
EMotionFX::ActorRenderFlagBitset AnimViewportWidget::GetRenderFlags() const
|
||||
{
|
||||
return m_renderFlags;
|
||||
}
|
||||
|
||||
void AnimViewportWidget::SetupCameras()
|
||||
@@ -161,4 +171,32 @@ namespace EMStudio
|
||||
m_renderFlags[flag] = !m_renderFlags[flag];
|
||||
m_renderer->UpdateActorRenderFlag(m_renderFlags);
|
||||
}
|
||||
|
||||
void AnimViewportWidget::LoadRenderFlags()
|
||||
{
|
||||
AZStd::string renderFlagsFilename(EMStudioManager::GetInstance()->GetAppDataFolder());
|
||||
renderFlagsFilename += "AnimViewportRenderFlags.cfg";
|
||||
QSettings settings(renderFlagsFilename.c_str(), QSettings::IniFormat, this);
|
||||
|
||||
for (uint32 i = 0; i < EMotionFX::ActorRenderFlag::NUM_RENDERFLAGS; ++i)
|
||||
{
|
||||
QString name = QString(i);
|
||||
const bool isEnabled = settings.value(name).toBool();
|
||||
m_renderFlags[i] = isEnabled;
|
||||
}
|
||||
m_renderer->UpdateActorRenderFlag(m_renderFlags);
|
||||
}
|
||||
|
||||
void AnimViewportWidget::SaveRenderFlags()
|
||||
{
|
||||
AZStd::string renderFlagsFilename(EMStudioManager::GetInstance()->GetAppDataFolder());
|
||||
renderFlagsFilename += "AnimViewportRenderFlags.cfg";
|
||||
QSettings settings(renderFlagsFilename.c_str(), QSettings::IniFormat, this);
|
||||
|
||||
for (uint32 i = 0; i < EMotionFX::ActorRenderFlag::NUM_RENDERFLAGS; ++i)
|
||||
{
|
||||
QString name = QString(i);
|
||||
settings.setValue(name, (bool)m_renderFlags[i]);
|
||||
}
|
||||
}
|
||||
} // namespace EMStudio
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <QSettings>
|
||||
#include <AtomToolsFramework/Viewport/RenderViewportWidget.h>
|
||||
#include <AzFramework/Viewport/CameraInput.h>
|
||||
#include <EMStudio/AnimViewportRequestBus.h>
|
||||
@@ -26,11 +27,15 @@ namespace EMStudio
|
||||
AnimViewportRenderer* GetAnimViewportRenderer() { return m_renderer.get(); }
|
||||
|
||||
void Reinit(bool resetCamera = true);
|
||||
EMotionFX::ActorRenderFlagBitset GetRenderFlags() const;
|
||||
|
||||
private:
|
||||
void SetupCameras();
|
||||
void SetupCameraController();
|
||||
|
||||
void LoadRenderFlags();
|
||||
void SaveRenderFlags();
|
||||
|
||||
// AnimViewportRequestBus::Handler overrides
|
||||
void ResetCamera();
|
||||
void SetCameraViewMode(CameraViewMode mode);
|
||||
@@ -42,6 +47,6 @@ namespace EMStudio
|
||||
AZStd::shared_ptr<AzFramework::RotateCameraInput> m_rotateCamera;
|
||||
AZStd::shared_ptr<AzFramework::TranslateCameraInput> m_translateCamera;
|
||||
AZStd::shared_ptr<AzFramework::OrbitDollyScrollCameraInput> m_orbitDollyScrollCamera;
|
||||
EMotionFX::ActorRenderFlagMask m_renderFlags;
|
||||
EMotionFX::ActorRenderFlagBitset m_renderFlags;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -90,12 +90,14 @@ namespace EMStudio
|
||||
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);
|
||||
|
||||
// Add the tool bar
|
||||
AnimViewportToolBar* toolBar = new AnimViewportToolBar(m_innerWidget);
|
||||
toolBar->SetRenderFlags(m_animViewportWidget->GetRenderFlags());
|
||||
|
||||
verticalLayout->addWidget(toolBar);
|
||||
verticalLayout->addWidget(m_animViewportWidget);
|
||||
|
||||
// Register command callbacks.
|
||||
|
||||
@@ -394,7 +394,7 @@ namespace EMotionFX
|
||||
return m_sceneFinishSimHandler.IsConnected();
|
||||
}
|
||||
|
||||
void ActorComponent::SetRenderFlag(ActorRenderFlagMask renderFlags)
|
||||
void ActorComponent::SetRenderFlag(ActorRenderFlagBitset renderFlags)
|
||||
{
|
||||
m_debugRenderFlags = renderFlags;
|
||||
}
|
||||
|
||||
@@ -180,7 +180,7 @@ namespace EMotionFX
|
||||
bool IsPhysicsSceneSimulationFinishEventConnected() const;
|
||||
AZ::Data::Asset<ActorAsset> GetActorAsset() const { return m_configuration.m_actorAsset; }
|
||||
|
||||
void SetRenderFlag(ActorRenderFlagMask renderFlags);
|
||||
void SetRenderFlag(ActorRenderFlagBitset renderFlags);
|
||||
|
||||
private:
|
||||
// AZ::TransformNotificationBus::MultiHandler
|
||||
@@ -202,7 +202,7 @@ namespace EMotionFX
|
||||
AZStd::vector<AZ::EntityId> m_attachments;
|
||||
|
||||
AZStd::unique_ptr<RenderActorInstance> m_renderActorInstance;
|
||||
ActorRenderFlagMask m_debugRenderFlags; ///< Actor debug render flag
|
||||
ActorRenderFlagBitset m_debugRenderFlags; ///< Actor debug render flag
|
||||
|
||||
AzPhysics::SceneEvents::OnSceneSimulationFinishHandler m_sceneFinishSimHandler;
|
||||
};
|
||||
|
||||
@@ -952,7 +952,7 @@ namespace EMotionFX
|
||||
}
|
||||
}
|
||||
|
||||
void EditorActorComponent::SetRenderFlag(ActorRenderFlagMask renderFlags)
|
||||
void EditorActorComponent::SetRenderFlag(ActorRenderFlagBitset renderFlags)
|
||||
{
|
||||
m_debugRenderFlags = renderFlags;
|
||||
}
|
||||
|
||||
@@ -104,7 +104,7 @@ namespace EMotionFX
|
||||
ActorComponent::GetRequiredServices(required);
|
||||
}
|
||||
|
||||
void SetRenderFlag(ActorRenderFlagMask renderFlags);
|
||||
void SetRenderFlag(ActorRenderFlagBitset renderFlags);
|
||||
|
||||
static void Reflect(AZ::ReflectContext* context);
|
||||
|
||||
@@ -164,7 +164,7 @@ namespace EMotionFX
|
||||
size_t m_lodLevel;
|
||||
ActorComponent::BoundingBoxConfiguration m_bboxConfig;
|
||||
bool m_forceUpdateJointsOOV = false;
|
||||
ActorRenderFlagMask m_debugRenderFlags; ///< Actor debug render flag
|
||||
ActorRenderFlagBitset m_debugRenderFlags; ///< Actor debug render flag
|
||||
// \todo attachmentTarget node nr
|
||||
|
||||
// Note: LOD work in progress. For now we use one material instead of a list of material, because we don't have the support for LOD with multiple scene files.
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace EMotionFX
|
||||
virtual ~RenderActorInstance() = default;
|
||||
|
||||
virtual void OnTick(float timeDelta) = 0;
|
||||
virtual void DebugDraw(const EMotionFX::ActorRenderFlagMask& renderFlags) = 0;
|
||||
virtual void DebugDraw(const EMotionFX::ActorRenderFlagBitset& renderFlags) = 0;
|
||||
|
||||
SkinningMethod GetSkinningMethod() const;
|
||||
virtual void SetSkinningMethod(SkinningMethod skinningMethod);
|
||||
|
||||
@@ -37,8 +37,8 @@ namespace EMotionFX
|
||||
RENDER_SIMULATEDOBJECT_COLLIDERS = 21,
|
||||
RENDER_SIMULATEJOINTS = 22,
|
||||
RENDER_EMFX_DEBUG = 23,
|
||||
NUM_RENDER_OPTIONS = 24
|
||||
NUM_RENDERFLAGS = 24
|
||||
};
|
||||
|
||||
using ActorRenderFlagMask = AZStd::bitset<ActorRenderFlag::NUM_RENDER_OPTIONS>;
|
||||
using ActorRenderFlagBitset = AZStd::bitset<ActorRenderFlag::NUM_RENDERFLAGS>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user