code review feedback. Also add the renderflag as qsettings.

Signed-off-by: rhhong <rhhong@amazon.com>
This commit is contained in:
rhhong
2021-10-25 19:11:36 -07:00
parent c76cb8ef74
commit ebf84c49ac
17 changed files with 83 additions and 28 deletions
@@ -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>;
}