From 960eb5f4759f26743d2e00d05b621cf12a307914 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 30 Nov 2019 15:32:23 +0100 Subject: [PATCH] SDK/DebugSystem: Add EnableDepthBuffer --- SDK/include/NDK/Systems/DebugSystem.hpp | 8 +- SDK/include/NDK/Systems/DebugSystem.inl | 7 + SDK/src/NDK/Systems/DebugSystem.cpp | 288 +++++++++++++----------- 3 files changed, 166 insertions(+), 137 deletions(-) diff --git a/SDK/include/NDK/Systems/DebugSystem.hpp b/SDK/include/NDK/Systems/DebugSystem.hpp index 362b59f32..1d468ea41 100644 --- a/SDK/include/NDK/Systems/DebugSystem.hpp +++ b/SDK/include/NDK/Systems/DebugSystem.hpp @@ -22,6 +22,10 @@ namespace Ndk DebugSystem(); ~DebugSystem() = default; + void EnableDepthBuffer(bool enable); + + inline bool IsDepthBufferEnabled() const; + static SystemIndex systemIndex; private: @@ -29,14 +33,13 @@ namespace Ndk Nz::InstancedRenderableRef GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* offset); Nz::InstancedRenderableRef GenerateCollision3DMesh(Entity* entity); + std::pair GetBoxMesh(); Nz::MaterialRef GetCollisionMaterial(); Nz::MaterialRef GetGlobalAABBMaterial(); Nz::MaterialRef GetLocalAABBMaterial(); Nz::MaterialRef GetOBBMaterial(); - std::pair GetBoxMesh(); void OnEntityValidation(Entity* entity, bool justAdded) override; - void OnUpdate(float elapsedTime) override; Nz::MaterialRef m_globalAabbMaterial; @@ -45,6 +48,7 @@ namespace Ndk Nz::MaterialRef m_obbMaterial; Nz::IndexBufferRef m_boxMeshIndexBuffer; Nz::VertexBufferRef m_boxMeshVertexBuffer; + bool m_isDepthBufferEnabled; }; } diff --git a/SDK/include/NDK/Systems/DebugSystem.inl b/SDK/include/NDK/Systems/DebugSystem.inl index b7439fc12..b72b87f3f 100644 --- a/SDK/include/NDK/Systems/DebugSystem.inl +++ b/SDK/include/NDK/Systems/DebugSystem.inl @@ -4,3 +4,10 @@ #include +namespace Ndk +{ + inline bool DebugSystem::IsDepthBufferEnabled() const + { + return m_isDepthBufferEnabled; + } +} diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index d8c61b9bc..5b8bb7aa6 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -153,151 +153,28 @@ namespace Ndk /*! * \brief Constructs an DebugSystem object by default */ - DebugSystem::DebugSystem() + DebugSystem::DebugSystem() : + m_isDepthBufferEnabled(true) { Requires(); SetUpdateOrder(1000); //< Update last } - std::pair DebugSystem::GetBoxMesh() + void DebugSystem::EnableDepthBuffer(bool enable) { - if (!m_boxMeshIndexBuffer) - { - std::array indices = { - { - 0, 1, - 1, 2, - 2, 3, - 3, 0, + m_isDepthBufferEnabled = enable; - 4, 5, - 5, 6, - 6, 7, - 7, 4, + if (m_collisionMaterial) + m_collisionMaterial->EnableDepthBuffer(enable); - 0, 4, - 1, 5, - 2, 6, - 3, 7 - } - }; + if (m_globalAabbMaterial) + m_globalAabbMaterial->EnableDepthBuffer(enable); - 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_localAabbMaterial) + m_localAabbMaterial->EnableDepthBuffer(enable); - if (!m_boxMeshVertexBuffer) - { - Nz::Boxf box(-0.5f, -0.5f, -0.5f, 1.f, 1.f, 1.f); - - std::array 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(); - GraphicsComponent& entityGfx = entity->GetComponent(); - NodeComponent& entityNode = entity->GetComponent(); - - DebugDrawFlags enabledFlags = entityDebug.GetEnabledFlags(); - DebugDrawFlags flags = entityDebug.GetFlags(); - - DebugDrawFlags flagsToEnable = flags & ~enabledFlags; - for (std::size_t i = 0; i <= static_cast(DebugDraw::Max); ++i) - { - DebugDraw option = static_cast(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(DebugDraw::Max); ++i) - { - DebugDraw option = static_cast(i); - if (flagsToDisable & option) - entityGfx.Detach(entityDebug.GetDebugRenderable(option)); - } - - entityDebug.UpdateEnabledFlags(flags); - } - - void DebugSystem::OnUpdate(float elapsedTime) - { - // Nothing to do + if (m_obbMaterial) + m_obbMaterial->EnableDepthBuffer(enable); } Nz::InstancedRenderableRef DebugSystem::GenerateBox(Nz::Boxf box) @@ -444,6 +321,57 @@ namespace Ndk return nullptr; } + std::pair DebugSystem::GetBoxMesh() + { + if (!m_boxMeshIndexBuffer) + { + std::array 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 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() { if (!m_globalAabbMaterial) @@ -503,6 +431,96 @@ namespace Ndk return m_obbMaterial; } + + void DebugSystem::OnEntityValidation(Entity* entity, bool /*justAdded*/) + { + static constexpr int DebugDrawOrder = 1'000; + + DebugComponent& entityDebug = entity->GetComponent(); + GraphicsComponent& entityGfx = entity->GetComponent(); + NodeComponent& entityNode = entity->GetComponent(); + + DebugDrawFlags enabledFlags = entityDebug.GetEnabledFlags(); + DebugDrawFlags flags = entityDebug.GetFlags(); + + DebugDrawFlags flagsToEnable = flags & ~enabledFlags; + for (std::size_t i = 0; i <= static_cast(DebugDraw::Max); ++i) + { + DebugDraw option = static_cast(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(DebugDraw::Max); ++i) + { + DebugDraw option = static_cast(i); + if (flagsToDisable & option) + entityGfx.Detach(entityDebug.GetDebugRenderable(option)); + } + + entityDebug.UpdateEnabledFlags(flags); + } + + void DebugSystem::OnUpdate(float elapsedTime) + { + // Nothing to do + } SystemIndex DebugSystem::systemIndex; }