SDK/DebugSystem: Add EnableDepthBuffer
This commit is contained in:
parent
ae996ae09d
commit
960eb5f475
|
|
@ -22,6 +22,10 @@ namespace Ndk
|
||||||
DebugSystem();
|
DebugSystem();
|
||||||
~DebugSystem() = default;
|
~DebugSystem() = default;
|
||||||
|
|
||||||
|
void EnableDepthBuffer(bool enable);
|
||||||
|
|
||||||
|
inline bool IsDepthBufferEnabled() const;
|
||||||
|
|
||||||
static SystemIndex systemIndex;
|
static SystemIndex systemIndex;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -29,14 +33,13 @@ namespace Ndk
|
||||||
Nz::InstancedRenderableRef GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* offset);
|
Nz::InstancedRenderableRef GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* offset);
|
||||||
Nz::InstancedRenderableRef GenerateCollision3DMesh(Entity* entity);
|
Nz::InstancedRenderableRef GenerateCollision3DMesh(Entity* entity);
|
||||||
|
|
||||||
|
std::pair<Nz::IndexBufferRef, Nz::VertexBufferRef> GetBoxMesh();
|
||||||
Nz::MaterialRef GetCollisionMaterial();
|
Nz::MaterialRef GetCollisionMaterial();
|
||||||
Nz::MaterialRef GetGlobalAABBMaterial();
|
Nz::MaterialRef GetGlobalAABBMaterial();
|
||||||
Nz::MaterialRef GetLocalAABBMaterial();
|
Nz::MaterialRef GetLocalAABBMaterial();
|
||||||
Nz::MaterialRef GetOBBMaterial();
|
Nz::MaterialRef GetOBBMaterial();
|
||||||
std::pair<Nz::IndexBufferRef, Nz::VertexBufferRef> GetBoxMesh();
|
|
||||||
|
|
||||||
void OnEntityValidation(Entity* entity, bool justAdded) override;
|
void OnEntityValidation(Entity* entity, bool justAdded) override;
|
||||||
|
|
||||||
void OnUpdate(float elapsedTime) override;
|
void OnUpdate(float elapsedTime) override;
|
||||||
|
|
||||||
Nz::MaterialRef m_globalAabbMaterial;
|
Nz::MaterialRef m_globalAabbMaterial;
|
||||||
|
|
@ -45,6 +48,7 @@ namespace Ndk
|
||||||
Nz::MaterialRef m_obbMaterial;
|
Nz::MaterialRef m_obbMaterial;
|
||||||
Nz::IndexBufferRef m_boxMeshIndexBuffer;
|
Nz::IndexBufferRef m_boxMeshIndexBuffer;
|
||||||
Nz::VertexBufferRef m_boxMeshVertexBuffer;
|
Nz::VertexBufferRef m_boxMeshVertexBuffer;
|
||||||
|
bool m_isDepthBufferEnabled;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,3 +4,10 @@
|
||||||
|
|
||||||
#include <NDK/Systems/DebugSystem.hpp>
|
#include <NDK/Systems/DebugSystem.hpp>
|
||||||
|
|
||||||
|
namespace Ndk
|
||||||
|
{
|
||||||
|
inline bool DebugSystem::IsDepthBufferEnabled() const
|
||||||
|
{
|
||||||
|
return m_isDepthBufferEnabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -153,151 +153,28 @@ namespace Ndk
|
||||||
/*!
|
/*!
|
||||||
* \brief Constructs an DebugSystem object by default
|
* \brief Constructs an DebugSystem object by default
|
||||||
*/
|
*/
|
||||||
DebugSystem::DebugSystem()
|
DebugSystem::DebugSystem() :
|
||||||
|
m_isDepthBufferEnabled(true)
|
||||||
{
|
{
|
||||||
Requires<DebugComponent, GraphicsComponent, NodeComponent>();
|
Requires<DebugComponent, GraphicsComponent, NodeComponent>();
|
||||||
SetUpdateOrder(1000); //< Update last
|
SetUpdateOrder(1000); //< Update last
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<Nz::IndexBufferRef, Nz::VertexBufferRef> DebugSystem::GetBoxMesh()
|
void DebugSystem::EnableDepthBuffer(bool enable)
|
||||||
{
|
{
|
||||||
if (!m_boxMeshIndexBuffer)
|
m_isDepthBufferEnabled = enable;
|
||||||
{
|
|
||||||
std::array<Nz::UInt16, 24> indices = {
|
|
||||||
{
|
|
||||||
0, 1,
|
|
||||||
1, 2,
|
|
||||||
2, 3,
|
|
||||||
3, 0,
|
|
||||||
|
|
||||||
4, 5,
|
if (m_collisionMaterial)
|
||||||
5, 6,
|
m_collisionMaterial->EnableDepthBuffer(enable);
|
||||||
6, 7,
|
|
||||||
7, 4,
|
|
||||||
|
|
||||||
0, 4,
|
if (m_globalAabbMaterial)
|
||||||
1, 5,
|
m_globalAabbMaterial->EnableDepthBuffer(enable);
|
||||||
2, 6,
|
|
||||||
3, 7
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
m_boxMeshIndexBuffer = Nz::IndexBuffer::New(false, Nz::UInt32(indices.size()), Nz::DataStorage_Hardware, 0);
|
if (m_localAabbMaterial)
|
||||||
m_boxMeshIndexBuffer->Fill(indices.data(), 0, Nz::UInt32(indices.size()));
|
m_localAabbMaterial->EnableDepthBuffer(enable);
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_boxMeshVertexBuffer)
|
if (m_obbMaterial)
|
||||||
{
|
m_obbMaterial->EnableDepthBuffer(enable);
|
||||||
Nz::Boxf box(-0.5f, -0.5f, -0.5f, 1.f, 1.f, 1.f);
|
|
||||||
|
|
||||||
std::array<Nz::Vector3f, 8> positions = {
|
|
||||||
{
|
|
||||||
box.GetCorner(Nz::BoxCorner_FarLeftBottom),
|
|
||||||
box.GetCorner(Nz::BoxCorner_NearLeftBottom),
|
|
||||||
box.GetCorner(Nz::BoxCorner_NearRightBottom),
|
|
||||||
box.GetCorner(Nz::BoxCorner_FarRightBottom),
|
|
||||||
box.GetCorner(Nz::BoxCorner_FarLeftTop),
|
|
||||||
box.GetCorner(Nz::BoxCorner_NearLeftTop),
|
|
||||||
box.GetCorner(Nz::BoxCorner_NearRightTop),
|
|
||||||
box.GetCorner(Nz::BoxCorner_FarRightTop)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
m_boxMeshVertexBuffer = Nz::VertexBuffer::New(Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ), Nz::UInt32(positions.size()), Nz::DataStorage_Hardware, 0);
|
|
||||||
m_boxMeshVertexBuffer->Fill(positions.data(), 0, Nz::UInt32(positions.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return { m_boxMeshIndexBuffer, m_boxMeshVertexBuffer };
|
|
||||||
}
|
|
||||||
|
|
||||||
void DebugSystem::OnEntityValidation(Entity* entity, bool /*justAdded*/)
|
|
||||||
{
|
|
||||||
static constexpr int DebugDrawOrder = 1'000;
|
|
||||||
|
|
||||||
DebugComponent& entityDebug = entity->GetComponent<DebugComponent>();
|
|
||||||
GraphicsComponent& entityGfx = entity->GetComponent<GraphicsComponent>();
|
|
||||||
NodeComponent& entityNode = entity->GetComponent<NodeComponent>();
|
|
||||||
|
|
||||||
DebugDrawFlags enabledFlags = entityDebug.GetEnabledFlags();
|
|
||||||
DebugDrawFlags flags = entityDebug.GetFlags();
|
|
||||||
|
|
||||||
DebugDrawFlags flagsToEnable = flags & ~enabledFlags;
|
|
||||||
for (std::size_t i = 0; i <= static_cast<std::size_t>(DebugDraw::Max); ++i)
|
|
||||||
{
|
|
||||||
DebugDraw option = static_cast<DebugDraw>(i);
|
|
||||||
if (flagsToEnable & option)
|
|
||||||
{
|
|
||||||
switch (option)
|
|
||||||
{
|
|
||||||
case DebugDraw::Collider2D:
|
|
||||||
{
|
|
||||||
Nz::Vector3f offset;
|
|
||||||
Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &offset);
|
|
||||||
if (renderable)
|
|
||||||
entityGfx.Attach(renderable, Nz::Matrix4f::Translate(offset), DebugDrawOrder);
|
|
||||||
|
|
||||||
entityDebug.UpdateDebugRenderable(option, std::move(renderable));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DebugDraw::Collider3D:
|
|
||||||
{
|
|
||||||
const Nz::Boxf& obb = entityGfx.GetAABB();
|
|
||||||
|
|
||||||
Nz::InstancedRenderableRef renderable = GenerateCollision3DMesh(entity);
|
|
||||||
if (renderable)
|
|
||||||
entityGfx.Attach(renderable, Nz::Matrix4f::Translate(obb.GetCenter() - entityNode.GetPosition()), DebugDrawOrder);
|
|
||||||
|
|
||||||
entityDebug.UpdateDebugRenderable(option, std::move(renderable));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DebugDraw::GraphicsAABB:
|
|
||||||
{
|
|
||||||
auto indexVertexBuffers = GetBoxMesh();
|
|
||||||
|
|
||||||
Nz::InstancedRenderableRef renderable = new AABBDebugRenderable(entity, GetGlobalAABBMaterial(), GetLocalAABBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second);
|
|
||||||
renderable->SetPersistent(false);
|
|
||||||
|
|
||||||
entityGfx.Attach(renderable, Nz::Matrix4f::Identity(), DebugDrawOrder);
|
|
||||||
|
|
||||||
entityDebug.UpdateDebugRenderable(option, std::move(renderable));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DebugDraw::GraphicsOBB:
|
|
||||||
{
|
|
||||||
auto indexVertexBuffers = GetBoxMesh();
|
|
||||||
|
|
||||||
Nz::InstancedRenderableRef renderable = new OBBDebugRenderable(entity, GetOBBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second);
|
|
||||||
renderable->SetPersistent(false);
|
|
||||||
|
|
||||||
entityGfx.Attach(renderable, Nz::Matrix4f::Identity(), DebugDrawOrder);
|
|
||||||
|
|
||||||
entityDebug.UpdateDebugRenderable(option, std::move(renderable));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DebugDrawFlags flagsToDisable = enabledFlags & ~flags;
|
|
||||||
for (std::size_t i = 0; i <= static_cast<std::size_t>(DebugDraw::Max); ++i)
|
|
||||||
{
|
|
||||||
DebugDraw option = static_cast<DebugDraw>(i);
|
|
||||||
if (flagsToDisable & option)
|
|
||||||
entityGfx.Detach(entityDebug.GetDebugRenderable(option));
|
|
||||||
}
|
|
||||||
|
|
||||||
entityDebug.UpdateEnabledFlags(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DebugSystem::OnUpdate(float elapsedTime)
|
|
||||||
{
|
|
||||||
// Nothing to do
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Nz::InstancedRenderableRef DebugSystem::GenerateBox(Nz::Boxf box)
|
Nz::InstancedRenderableRef DebugSystem::GenerateBox(Nz::Boxf box)
|
||||||
|
|
@ -444,6 +321,57 @@ namespace Ndk
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<Nz::IndexBufferRef, Nz::VertexBufferRef> DebugSystem::GetBoxMesh()
|
||||||
|
{
|
||||||
|
if (!m_boxMeshIndexBuffer)
|
||||||
|
{
|
||||||
|
std::array<Nz::UInt16, 24> indices = {
|
||||||
|
{
|
||||||
|
0, 1,
|
||||||
|
1, 2,
|
||||||
|
2, 3,
|
||||||
|
3, 0,
|
||||||
|
|
||||||
|
4, 5,
|
||||||
|
5, 6,
|
||||||
|
6, 7,
|
||||||
|
7, 4,
|
||||||
|
|
||||||
|
0, 4,
|
||||||
|
1, 5,
|
||||||
|
2, 6,
|
||||||
|
3, 7
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
m_boxMeshIndexBuffer = Nz::IndexBuffer::New(false, Nz::UInt32(indices.size()), Nz::DataStorage_Hardware, 0);
|
||||||
|
m_boxMeshIndexBuffer->Fill(indices.data(), 0, Nz::UInt32(indices.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_boxMeshVertexBuffer)
|
||||||
|
{
|
||||||
|
Nz::Boxf box(-0.5f, -0.5f, -0.5f, 1.f, 1.f, 1.f);
|
||||||
|
|
||||||
|
std::array<Nz::Vector3f, 8> positions = {
|
||||||
|
{
|
||||||
|
box.GetCorner(Nz::BoxCorner_FarLeftBottom),
|
||||||
|
box.GetCorner(Nz::BoxCorner_NearLeftBottom),
|
||||||
|
box.GetCorner(Nz::BoxCorner_NearRightBottom),
|
||||||
|
box.GetCorner(Nz::BoxCorner_FarRightBottom),
|
||||||
|
box.GetCorner(Nz::BoxCorner_FarLeftTop),
|
||||||
|
box.GetCorner(Nz::BoxCorner_NearLeftTop),
|
||||||
|
box.GetCorner(Nz::BoxCorner_NearRightTop),
|
||||||
|
box.GetCorner(Nz::BoxCorner_FarRightTop)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
m_boxMeshVertexBuffer = Nz::VertexBuffer::New(Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ), Nz::UInt32(positions.size()), Nz::DataStorage_Hardware, 0);
|
||||||
|
m_boxMeshVertexBuffer->Fill(positions.data(), 0, Nz::UInt32(positions.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return { m_boxMeshIndexBuffer, m_boxMeshVertexBuffer };
|
||||||
|
}
|
||||||
|
|
||||||
Nz::MaterialRef DebugSystem::GetGlobalAABBMaterial()
|
Nz::MaterialRef DebugSystem::GetGlobalAABBMaterial()
|
||||||
{
|
{
|
||||||
if (!m_globalAabbMaterial)
|
if (!m_globalAabbMaterial)
|
||||||
|
|
@ -504,5 +432,95 @@ namespace Ndk
|
||||||
return m_obbMaterial;
|
return m_obbMaterial;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DebugSystem::OnEntityValidation(Entity* entity, bool /*justAdded*/)
|
||||||
|
{
|
||||||
|
static constexpr int DebugDrawOrder = 1'000;
|
||||||
|
|
||||||
|
DebugComponent& entityDebug = entity->GetComponent<DebugComponent>();
|
||||||
|
GraphicsComponent& entityGfx = entity->GetComponent<GraphicsComponent>();
|
||||||
|
NodeComponent& entityNode = entity->GetComponent<NodeComponent>();
|
||||||
|
|
||||||
|
DebugDrawFlags enabledFlags = entityDebug.GetEnabledFlags();
|
||||||
|
DebugDrawFlags flags = entityDebug.GetFlags();
|
||||||
|
|
||||||
|
DebugDrawFlags flagsToEnable = flags & ~enabledFlags;
|
||||||
|
for (std::size_t i = 0; i <= static_cast<std::size_t>(DebugDraw::Max); ++i)
|
||||||
|
{
|
||||||
|
DebugDraw option = static_cast<DebugDraw>(i);
|
||||||
|
if (flagsToEnable & option)
|
||||||
|
{
|
||||||
|
switch (option)
|
||||||
|
{
|
||||||
|
case DebugDraw::Collider2D:
|
||||||
|
{
|
||||||
|
Nz::Vector3f offset;
|
||||||
|
Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &offset);
|
||||||
|
if (renderable)
|
||||||
|
entityGfx.Attach(renderable, Nz::Matrix4f::Translate(offset), DebugDrawOrder);
|
||||||
|
|
||||||
|
entityDebug.UpdateDebugRenderable(option, std::move(renderable));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DebugDraw::Collider3D:
|
||||||
|
{
|
||||||
|
const Nz::Boxf& obb = entityGfx.GetAABB();
|
||||||
|
|
||||||
|
Nz::InstancedRenderableRef renderable = GenerateCollision3DMesh(entity);
|
||||||
|
if (renderable)
|
||||||
|
entityGfx.Attach(renderable, Nz::Matrix4f::Translate(obb.GetCenter() - entityNode.GetPosition()), DebugDrawOrder);
|
||||||
|
|
||||||
|
entityDebug.UpdateDebugRenderable(option, std::move(renderable));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DebugDraw::GraphicsAABB:
|
||||||
|
{
|
||||||
|
auto indexVertexBuffers = GetBoxMesh();
|
||||||
|
|
||||||
|
Nz::InstancedRenderableRef renderable = new AABBDebugRenderable(entity, GetGlobalAABBMaterial(), GetLocalAABBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second);
|
||||||
|
renderable->SetPersistent(false);
|
||||||
|
|
||||||
|
entityGfx.Attach(renderable, Nz::Matrix4f::Identity(), DebugDrawOrder);
|
||||||
|
|
||||||
|
entityDebug.UpdateDebugRenderable(option, std::move(renderable));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DebugDraw::GraphicsOBB:
|
||||||
|
{
|
||||||
|
auto indexVertexBuffers = GetBoxMesh();
|
||||||
|
|
||||||
|
Nz::InstancedRenderableRef renderable = new OBBDebugRenderable(entity, GetOBBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second);
|
||||||
|
renderable->SetPersistent(false);
|
||||||
|
|
||||||
|
entityGfx.Attach(renderable, Nz::Matrix4f::Identity(), DebugDrawOrder);
|
||||||
|
|
||||||
|
entityDebug.UpdateDebugRenderable(option, std::move(renderable));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugDrawFlags flagsToDisable = enabledFlags & ~flags;
|
||||||
|
for (std::size_t i = 0; i <= static_cast<std::size_t>(DebugDraw::Max); ++i)
|
||||||
|
{
|
||||||
|
DebugDraw option = static_cast<DebugDraw>(i);
|
||||||
|
if (flagsToDisable & option)
|
||||||
|
entityGfx.Detach(entityDebug.GetDebugRenderable(option));
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDebug.UpdateEnabledFlags(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DebugSystem::OnUpdate(float elapsedTime)
|
||||||
|
{
|
||||||
|
// Nothing to do
|
||||||
|
}
|
||||||
|
|
||||||
SystemIndex DebugSystem::systemIndex;
|
SystemIndex DebugSystem::systemIndex;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue