diff --git a/include/Nazara/Renderer/DebugDrawer.hpp b/include/Nazara/Renderer/DebugDrawer.hpp index efce27d6d..19bbcf753 100644 --- a/include/Nazara/Renderer/DebugDrawer.hpp +++ b/include/Nazara/Renderer/DebugDrawer.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include class NzAxisAlignedBox; @@ -22,6 +23,7 @@ class NAZARA_API NzDebugDrawer static void Draw(const NzCubef& cube); static void Draw(const NzCubei& cube); static void Draw(const NzCubeui& cube); + static void Draw(const NzFrustumf& frustum); static void Draw(const NzSkeleton* skeleton); static void DrawNormals(const NzSubMesh* subMesh); static void DrawTangents(const NzSubMesh* subMesh); diff --git a/src/Nazara/Renderer/DebugDrawer.cpp b/src/Nazara/Renderer/DebugDrawer.cpp index 23d35441e..724a2b6ae 100644 --- a/src/Nazara/Renderer/DebugDrawer.cpp +++ b/src/Nazara/Renderer/DebugDrawer.cpp @@ -157,6 +157,109 @@ void NzDebugDrawer::Draw(const NzCubeui& cube) Draw(NzCubef(cube)); } +void NzDebugDrawer::Draw(const NzFrustumf& frustum) +{ + if (!initialized) + { + NazaraError("Debug drawer is not initialized"); + return; + } + + NzBufferMapper mapper(vertexBuffer, nzBufferAccess_DiscardAndWrite, 0, 24); + NzVertexStruct_XYZ* vertex = reinterpret_cast(mapper.GetPointer()); + + vertex->position.Set(frustum.GetCorner(nzCorner_NearLeftBottom)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_NearRightBottom)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_NearLeftBottom)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_NearLeftTop)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_NearLeftBottom)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_FarLeftBottom)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_FarRightTop)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_FarLeftTop)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_FarRightTop)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_FarRightBottom)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_FarRightTop)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_NearRightTop)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_FarLeftBottom)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_FarRightBottom)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_FarLeftBottom)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_FarLeftTop)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_NearLeftTop)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_NearRightTop)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_NearLeftTop)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_FarLeftTop)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_NearRightBottom)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_NearRightTop)); + vertex++; + + vertex->position.Set(frustum.GetCorner(nzCorner_NearRightBottom)); + vertex++; + vertex->position.Set(frustum.GetCorner(nzCorner_FarRightBottom)); + vertex++; + + mapper.Unmap(); + + const NzShader* oldShader = NzRenderer::GetShader(); + + if (!NzRenderer::SetShader(shader)) + { + NazaraError("Failed to set debug shader"); + return; + } + + bool depthTestActive = NzRenderer::IsEnabled(nzRendererParameter_DepthTest); + if (depthTestActive != depthTest) + NzRenderer::Enable(nzRendererParameter_DepthTest, depthTest); + + float oldLineWidth = NzRenderer::GetLineWidth(); + NzRenderer::SetLineWidth(lineWidth); + + NzRenderer::SetVertexBuffer(vertexBuffer); + + shader->SendColor(colorLocation, primaryColor); + + NzRenderer::DrawPrimitives(nzPrimitiveType_LineList, 0, 24); + + NzRenderer::SetLineWidth(oldLineWidth); + + if (depthTestActive != depthTest) + NzRenderer::Enable(nzRendererParameter_DepthTest, depthTestActive); + + if (!NzRenderer::SetShader(oldShader)) + NazaraWarning("Failed to reset shader"); +} + void NzDebugDrawer::Draw(const NzSkeleton* skeleton) { if (!initialized)