Final touches on the first pass of imgui hierarchy debugger

Signed-off-by: AMZN-Olex <5432499+AMZN-Olex@users.noreply.github.com>
This commit is contained in:
AMZN-Olex
2021-10-07 12:53:33 -04:00
parent 77c23b6c8f
commit a114077e72
4 changed files with 298 additions and 13 deletions
@@ -8,6 +8,8 @@
#include "MultiplayerDebugHierarchyReporter.h"
#include <Atom/RPI.Public/ViewportContext.h>
#include <Atom/RPI.Public/ViewportContextBus.h>
#include <AzFramework/Entity/EntityDebugDisplayBus.h>
#include <AzFramework/Visibility/IVisibilitySystem.h>
#include <Multiplayer/Components/NetBindComponent.h>
@@ -17,8 +19,6 @@
#include <imgui/imgui.h>
#endif
#pragma optimize("", off)
namespace Multiplayer
{
MultiplayerDebugHierarchyReporter::MultiplayerDebugHierarchyReporter()
@@ -39,6 +39,9 @@ namespace Multiplayer
void MultiplayerDebugHierarchyReporter::OnImGuiUpdate()
{
#if defined(IMGUI_ENABLED)
ImGui::Text("Hierarchies");
ImGui::Separator();
for (const auto& root : m_hierarchyRoots)
{
if (const auto* rootComponent = root.second.m_rootComponent)
@@ -48,7 +51,7 @@ namespace Multiplayer
const AZStd::vector<AZ::Entity*>& hierarchicalChildren = rootComponent->GetHierarchicalEntities();
if (ImGui::TreeNode(rootComponent->GetEntity()->GetName().c_str(),
"Hierarchy, Root entity name [%s]: %4zu members",
"[%s] %4zu members",
rootComponent->GetEntity()->GetName().c_str(),
hierarchicalChildren.size()))
{
@@ -99,6 +102,16 @@ namespace Multiplayer
}
}
}
ImGui::Separator();
if (ImGui::InputFloat("Awareness Radius", &m_awarenessRadius))
{
CollectHierarchyRoots();
}
if (ImGui::Button("Refresh"))
{
CollectHierarchyRoots();
}
#endif
}
@@ -168,9 +181,18 @@ namespace Multiplayer
void MultiplayerDebugHierarchyReporter::CollectHierarchyRoots()
{
m_hierarchyRoots.clear();
AZ::Sphere awarenessSphere(AZ::Vector3::CreateZero(), m_awarenessRadius);
const auto viewportContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get();
if (const auto viewportContext = viewportContextManager->GetDefaultViewportContext())
{
awarenessSphere.SetCenter(viewportContext->GetCameraTransform().GetTranslation());
}
AZStd::vector<AzFramework::VisibilityEntry*> gatheredEntries;
const AZ::Sphere awarenessSphere = AZ::Sphere(AZ::Vector3::CreateZero(), 1000.f);
AZ::Interface<AzFramework::IVisibilitySystem>::Get()->GetDefaultVisibilityScene()->Enumerate(awarenessSphere, [&gatheredEntries](const AzFramework::IVisibilityScene::NodeData& nodeData)
AZ::Interface<AzFramework::IVisibilitySystem>::Get()->GetDefaultVisibilityScene()->Enumerate(awarenessSphere,
[&gatheredEntries](const AzFramework::IVisibilityScene::NodeData& nodeData)
{
gatheredEntries.reserve(gatheredEntries.size() + nodeData.m_entries.size());
for (AzFramework::VisibilityEntry* visEntry : nodeData.m_entries)
@@ -188,12 +210,15 @@ namespace Multiplayer
const AZ::Entity* entity = static_cast<AZ::Entity*>(entry->m_userData);
if (auto* rootComponent = entity->FindComponent<NetworkHierarchyRootComponent>())
{
HierarchyRootInfo info;
info.m_rootComponent = rootComponent;
rootComponent->BindNetworkHierarchyChangedEventHandler(info.m_changedEvent);
rootComponent->BindNetworkHierarchyLeaveEventHandler(info.m_leaveEvent);
if (awarenessSphere.GetCenter().GetDistanceEstimate(entity->GetTransform()->GetWorldTranslation()) < m_awarenessRadius)
{
HierarchyRootInfo info;
info.m_rootComponent = rootComponent;
rootComponent->BindNetworkHierarchyChangedEventHandler(info.m_changedEvent);
rootComponent->BindNetworkHierarchyLeaveEventHandler(info.m_leaveEvent);
m_hierarchyRoots.insert(AZStd::make_pair(rootComponent, info));
m_hierarchyRoots.insert(AZStd::make_pair(rootComponent, info));
}
}
}
}