Ported RenderPlugin from MCore::AABB to AZ::AaBB

* Containing functionality verified.
* Zoom to joints
* Normals scale multiplier
* View closeup
* Calculating the scene aabb
* Rendering the actor instance aabbs
* Selection aabb

Signed-off-by: Benjamin Jillich <jillich@amazon.com>
This commit is contained in:
Benjamin Jillich
2021-07-28 15:59:11 +02:00
parent e9718d9ce8
commit e80931185b
2 changed files with 41 additions and 41 deletions
@@ -266,8 +266,7 @@ namespace EMStudio
return;
}
MCore::AABB aabb;
aabb.Init();
AZ::Aabb aabb = AZ::Aabb::CreateNull();
const EMotionFX::Actor* actor = actorInstance->GetActor();
const EMotionFX::Skeleton* skeleton = actor->GetSkeleton();
@@ -276,21 +275,20 @@ namespace EMStudio
for (const EMotionFX::Node* joint : joints)
{
const AZ::Vector3 jointPosition = pose->GetWorldSpaceTransform(joint->GetNodeIndex()).mPosition;
aabb.Encapsulate(jointPosition);
aabb.AddPoint(jointPosition);
const AZ::u32 childCount = joint->GetNumChildNodes();
for (AZ::u32 i = 0; i < childCount; ++i)
{
EMotionFX::Node* childJoint = skeleton->GetNode(joint->GetChildIndex(i));
const AZ::Vector3 childPosition = pose->GetWorldSpaceTransform(childJoint->GetNodeIndex()).mPosition;
aabb.Encapsulate(childPosition);
aabb.AddPoint(childPosition);
}
}
if (aabb.CheckIfIsValid())
if (aabb.IsValid())
{
aabb.Widen(aabb.CalcRadius());
aabb.Expand(AZ::Vector3(aabb.GetExtents().GetLength() * 0.5f));
bool isFollowModeActive = false;
for (const RenderViewWidget* viewWidget : m_viewWidgets)
@@ -619,35 +617,30 @@ namespace EMStudio
EMotionFX::ActorInstance* actorInstance = EMotionFX::ActorInstance::Create(mActor);
actorInstance->UpdateMeshDeformers(0.0f, true);
MCore::AABB aabb;
actorInstance->CalcMeshBasedAABB(0, &aabb);
AZ::Aabb aabb;
actorInstance->CalcMeshBasedAabb(0, &aabb);
if (aabb.CheckIfIsValid() == false)
if (!aabb.IsValid())
{
actorInstance->CalcNodeOBBBasedAABB(&aabb);
actorInstance->CalcNodeBasedAabb(&aabb);
}
if (aabb.CheckIfIsValid() == false)
{
actorInstance->CalcNodeBasedAABB(&aabb);
}
mCharacterHeight = aabb.CalcHeight();
mCharacterHeight = aabb.GetExtents().GetZ();
mOffsetFromTrajectoryNode = aabb.GetMin().GetY() + (mCharacterHeight * 0.5f);
actorInstance->Destroy();
// scale the normals down to 1% of the character size, that looks pretty nice on all models
mNormalsScaleMultiplier = aabb.CalcRadius() * 0.01f;
const float radius = AZ::Vector3(aabb.GetMax() - aabb.GetMin()).GetLength() * 0.5f;
mNormalsScaleMultiplier = radius * 0.01f;
}
// zoom to characters
void RenderPlugin::ViewCloseup(bool selectedInstancesOnly, RenderWidget* renderWidget, float flightTime)
{
const MCore::AABB sceneAABB = GetSceneAABB(selectedInstancesOnly);
if (sceneAABB.CheckIfIsValid())
const AZ::Aabb sceneAabb = GetSceneAabb(selectedInstancesOnly);
if (sceneAabb.IsValid())
{
// in case the given view widget parameter is nullptr apply it on all view widgets
if (!renderWidget)
@@ -655,13 +648,13 @@ namespace EMStudio
for (RenderViewWidget* viewWidget : m_viewWidgets)
{
RenderWidget* current = viewWidget->GetRenderWidget();
current->ViewCloseup(sceneAABB, flightTime);
current->ViewCloseup(sceneAabb, flightTime);
}
}
// only apply it to the given view widget
else
{
renderWidget->ViewCloseup(sceneAABB, flightTime);
renderWidget->ViewCloseup(sceneAabb, flightTime);
}
}
}
@@ -882,9 +875,9 @@ namespace EMStudio
// get the AABB containing all actor instances in the scene
MCore::AABB RenderPlugin::GetSceneAABB(bool selectedInstancesOnly)
AZ::Aabb RenderPlugin::GetSceneAabb(bool selectedInstancesOnly)
{
MCore::AABB finalAABB;
AZ::Aabb finalAabb = AZ::Aabb::CreateNull();
CommandSystem::SelectionList& selection = GetCommandManager()->GetCurrentSelection();
if (mUpdateCallback)
@@ -922,20 +915,28 @@ namespace EMStudio
}
// get the mesh based AABB
MCore::AABB aabb;
actorInstance->CalcMeshBasedAABB(0, &aabb);
AZ::Aabb aabb;
actorInstance->CalcMeshBasedAabb(0, &aabb);
// get the node based AABB
if (aabb.CheckIfIsValid() == false)
if (!aabb.IsValid())
{
actorInstance->CalcNodeBasedAABB(&aabb);
actorInstance->CalcNodeBasedAabb(&aabb);
}
// make sure the actor instance is covered in our global bounding box
finalAABB.Encapsulate(aabb);
if (aabb.IsValid())
{
finalAabb.AddAabb(aabb);
}
}
return finalAABB;
if (!finalAabb.IsValid())
{
finalAabb.Set(AZ::Vector3(-1.0f, -1.0f, 0.0f), AZ::Vector3(1.0f, 1.0f, 0.0f));
}
return finalAabb;
}
@@ -1155,9 +1156,8 @@ namespace EMStudio
settings.mNodeBasedColor = renderOptions->GetNodeAABBColor();
settings.mStaticBasedColor = renderOptions->GetStaticAABBColor();
settings.mMeshBasedColor = renderOptions->GetMeshAABBColor();
settings.mCollisionMeshBasedColor = renderOptions->GetCollisionMeshAABBColor();
renderUtil->RenderAABBs(actorInstance, settings);
renderUtil->RenderAabbs(actorInstance, settings);
}
if (widget->GetRenderFlag(RenderViewWidget::RENDER_OBB))
@@ -1169,10 +1169,10 @@ namespace EMStudio
const MCommon::Camera* camera = widget->GetRenderWidget()->GetCamera();
const AZ::Vector3& cameraPos = camera->GetPosition();
MCore::AABB aabb;
actorInstance->CalcNodeBasedAABB(&aabb);
const AZ::Vector3 aabbMid = aabb.CalcMiddle();
const float aabbRadius = aabb.CalcRadius();
AZ::Aabb aabb;
actorInstance->CalcNodeBasedAabb(&aabb);
const AZ::Vector3 aabbMid = aabb.GetCenter();
const float aabbRadius = AZ::Vector3(aabb.GetMax() - aabb.GetMin()).GetLength() * 0.5f;
const float camDistance = fabs((cameraPos - aabbMid).GetLength());
// Avoid rendering too big joint spheres when zooming in onto a joint.
@@ -1185,7 +1185,7 @@ namespace EMStudio
// Scale the joint spheres based on the character's extents, to avoid really large joint spheres
// on small characters and too small spheres on large characters.
static const float baseRadius = 0.005f;
const float jointSphereRadius = aabb.CalcRadius() * scaleMultiplier * baseRadius;
const float jointSphereRadius = aabbRadius * scaleMultiplier * baseRadius;
renderUtil->RenderSimpleSkeleton(actorInstance, &visibleJointIndices, &selectedJointIndices,
renderOptions->GetLineSkeletonColor(), renderOptions->GetSelectedObjectColor(), jointSphereRadius);
@@ -1268,8 +1268,8 @@ namespace EMStudio
// render the selection
if (renderOptions->GetRenderSelectionBox() && EMotionFX::GetActorManager().GetNumActorInstances() != 1 && GetCurrentSelection()->CheckIfHasActorInstance(actorInstance))
{
MCore::AABB aabb = actorInstance->GetAABB();
aabb.Widen(aabb.CalcRadius() * 0.005f);
AZ::Aabb aabb = actorInstance->GetAabb();
aabb.Expand(AZ::Vector3(0.005f));
renderUtil->RenderSelection(aabb, renderOptions->GetSelectionColor());
}
@@ -154,7 +154,7 @@ namespace EMStudio
MCORE_INLINE CommandSystem::SelectionList* GetCurrentSelection() const { return mCurrentSelection; }
MCORE_INLINE MCommon::RenderUtil* GetRenderUtil() const { return mRenderUtil; }
MCore::AABB GetSceneAABB(bool selectedInstancesOnly);
AZ::Aabb GetSceneAabb(bool selectedInstancesOnly);
MCommon::RenderUtil::TrajectoryTracePath* FindTracePath(EMotionFX::ActorInstance* actorInstance);
void ResetSelectedTrajectoryPaths();