diff --git a/include/Nazara/Renderer/DebugDrawer.hpp b/include/Nazara/Renderer/DebugDrawer.hpp index 0828f4f2d..b09de52d6 100644 --- a/include/Nazara/Renderer/DebugDrawer.hpp +++ b/include/Nazara/Renderer/DebugDrawer.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include class NzAxisAlignedBox; class NzSkeleton; @@ -23,6 +23,7 @@ class NAZARA_API NzDebugDrawer static void Draw(const NzCubei& cube); static void Draw(const NzCubeui& cube); static void Draw(const NzSkeleton* skeleton); + static void DrawNormals(const NzSubMesh* subMesh); static bool Initialize(); diff --git a/src/Nazara/Renderer/DebugDrawer.cpp b/src/Nazara/Renderer/DebugDrawer.cpp index bc70d492c..182edf97b 100644 --- a/src/Nazara/Renderer/DebugDrawer.cpp +++ b/src/Nazara/Renderer/DebugDrawer.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include #include @@ -51,12 +53,8 @@ void NzDebugDrawer::Draw(const NzCubef& cube) return; } - NzVertexStruct_XYZ* vertex = reinterpret_cast(vertexBuffer->Map(nzBufferAccess_DiscardAndWrite, 0, 24)); - if (!vertex) - { - NazaraError("Failed to map buffer"); - return; - } + NzBufferMapper mapper(vertexBuffer, nzBufferAccess_DiscardAndWrite, 0, 24); + NzVertexStruct_XYZ* vertex = reinterpret_cast(mapper.GetPointer()); NzVector3f max, min; max = cube.GetPosition() + cube.GetSize(); @@ -122,7 +120,7 @@ void NzDebugDrawer::Draw(const NzCubef& cube) vertex->position.Set(max.x, min.y, max.z); vertex++; - vertexBuffer->Unmap(); + mapper.Unmap(); const NzShader* oldShader = NzRenderer::GetShader(); @@ -174,12 +172,8 @@ void NzDebugDrawer::Draw(const NzSkeleton* skeleton) return; } - NzVertexStruct_XYZ* vertex = reinterpret_cast(vertexBuffer->Map(nzBufferAccess_DiscardAndWrite, 0, jointCount*2)); - if (!vertex) - { - NazaraError("Failed to map buffer"); - return; - } + NzBufferMapper mapper(vertexBuffer, nzBufferAccess_DiscardAndWrite, 0, jointCount*2); + NzVertexStruct_XYZ* vertex = reinterpret_cast(mapper.GetPointer()); unsigned int vertexCount = 0; for (unsigned int i = 0; i < jointCount; ++i) @@ -198,7 +192,7 @@ void NzDebugDrawer::Draw(const NzSkeleton* skeleton) } } - vertexBuffer->Unmap(); + mapper.Unmap(); if (vertexCount > 0) { @@ -239,6 +233,74 @@ void NzDebugDrawer::Draw(const NzSkeleton* skeleton) } } +void NzDebugDrawer::DrawNormals(const NzSubMesh* subMesh) +{ + if (!initialized) + { + NazaraError("Debug drawer is not initialized"); + return; + } + + unsigned int normalCount = subMesh->GetVertexCount(); + unsigned int vertexCount = normalCount*2; + if (vertexBuffer->GetVertexCount() < vertexCount) + { + NazaraError("Debug buffer not length enougth to draw object"); + return; + } + + NzBufferMapper inputMapper(subMesh->GetVertexBuffer(), nzBufferAccess_ReadOnly); + NzBufferMapper outputMapper(vertexBuffer, nzBufferAccess_DiscardAndWrite, 0, vertexCount); + + NzMeshVertex* inputVertex = reinterpret_cast(inputMapper.GetPointer()); + NzVertexStruct_XYZ* outputVertex = reinterpret_cast(outputMapper.GetPointer()); + + for (unsigned int i = 0; i < normalCount; ++i) + { + outputVertex->position = inputVertex->position; + outputVertex++; + + outputVertex->position = inputVertex->position + inputVertex->normal; + outputVertex++; + + inputVertex++; + } + + inputMapper.Unmap(); + outputMapper.Unmap(); + + if (vertexCount > 0) + { + 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); + + NzRenderer::SetVertexBuffer(vertexBuffer); + + float oldLineWidth = NzRenderer::GetLineWidth(); + NzRenderer::SetLineWidth(lineWidth); + + shader->SendColor(colorLocation, primaryColor); + NzRenderer::DrawPrimitives(nzPrimitiveType_LineList, 0, vertexCount); + + NzRenderer::SetLineWidth(oldLineWidth); + + if (depthTestActive != depthTest) + NzRenderer::Enable(nzRendererParameter_DepthTest, depthTestActive); + + if (!NzRenderer::SetShader(oldShader)) + NazaraWarning("Failed to reset shader"); + } +} + bool NzDebugDrawer::Initialize() { if (!initialized) @@ -274,7 +336,7 @@ bool NzDebugDrawer::Initialize() // VertexBuffer (Nécessite la déclaration) { - vertexBuffer = new NzVertexBuffer(vertexDeclaration, 256, nzBufferStorage_Hardware, nzBufferUsage_Dynamic); + vertexBuffer = new NzVertexBuffer(vertexDeclaration, 1024, nzBufferStorage_Hardware, nzBufferUsage_Dynamic); if (!vertexBuffer->GetBuffer()->IsValid()) { NazaraError("Failed to create buffer");