From 0bd70f8df18afc92398e0cd3ad289746d15c64ed Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 25 Jun 2013 00:31:31 +0200 Subject: [PATCH] Readded DebugDrawer::Draw[Binormals|Normals|Tangent] Former-commit-id: 7e5f98670914da0618d40b2e5fcf49b66f0627a1 --- include/Nazara/Renderer/DebugDrawer.hpp | 7 +- src/Nazara/Renderer/DebugDrawer.cpp | 120 ++++++++++++------------ 2 files changed, 66 insertions(+), 61 deletions(-) diff --git a/include/Nazara/Renderer/DebugDrawer.hpp b/include/Nazara/Renderer/DebugDrawer.hpp index de6573856..60d3f128b 100644 --- a/include/Nazara/Renderer/DebugDrawer.hpp +++ b/include/Nazara/Renderer/DebugDrawer.hpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include class NzSkeleton; @@ -27,8 +27,9 @@ class NAZARA_API NzDebugDrawer static void Draw(const NzFrustumf& frustum); static void Draw(const NzOrientedBoxf& orientedBox); static void Draw(const NzSkeleton* skeleton); - //static void DrawNormals(const NzSubMesh* subMesh); - //static void DrawTangents(const NzSubMesh* subMesh); + static void DrawBinormals(const NzStaticMesh* subMesh); + static void DrawNormals(const NzStaticMesh* subMesh); + static void DrawTangents(const NzStaticMesh* subMesh); static void EnableDepthBuffer(bool depthBuffer); diff --git a/src/Nazara/Renderer/DebugDrawer.cpp b/src/Nazara/Renderer/DebugDrawer.cpp index 54eeccdcb..8c73f52af 100644 --- a/src/Nazara/Renderer/DebugDrawer.cpp +++ b/src/Nazara/Renderer/DebugDrawer.cpp @@ -317,7 +317,7 @@ void NzDebugDrawer::Draw(const NzSkeleton* skeleton) unsigned int jointCount = skeleton->GetJointCount(); if (vertexBuffer->GetVertexCount() < jointCount*2) { - NazaraError("Debug buffer not length enougth to draw object"); + NazaraError("Debug buffer not large enougth to draw object"); return; } @@ -356,8 +356,8 @@ void NzDebugDrawer::Draw(const NzSkeleton* skeleton) NzRenderer::DrawPrimitives(nzPrimitiveMode_PointList, 0, vertexCount); } } -/* -void NzDebugDrawer::DrawNormals(const NzSubMesh* subMesh) + +void NzDebugDrawer::DrawBinormals(const NzStaticMesh* subMesh) { if (!initialized) { @@ -369,7 +369,7 @@ void NzDebugDrawer::DrawNormals(const NzSubMesh* subMesh) unsigned int vertexCount = normalCount*2; if (vertexBuffer->GetVertexCount() < vertexCount) { - NazaraError("Debug buffer not length enougth to draw object"); + NazaraError("Debug buffer not large enougth to draw object"); return; } @@ -384,7 +384,7 @@ void NzDebugDrawer::DrawNormals(const NzSubMesh* subMesh) outputVertex->position = inputVertex->position; outputVertex++; - outputVertex->position = inputVertex->position + inputVertex->normal; + outputVertex->position = inputVertex->position + NzVector3f::CrossProduct(inputVertex->normal, inputVertex->tangent)*0.01f; outputVertex++; inputVertex++; @@ -395,37 +395,63 @@ void NzDebugDrawer::DrawNormals(const NzSubMesh* subMesh) 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::SetRenderStates(renderStates); + NzRenderer::SetShader(shader); 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"); + NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, vertexCount); } } -void NzDebugDrawer::DrawTangents(const NzSubMesh* subMesh) +void NzDebugDrawer::DrawNormals(const NzStaticMesh* 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 large 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*0.01f; + outputVertex++; + + inputVertex++; + } + + inputMapper.Unmap(); + outputMapper.Unmap(); + + if (vertexCount > 0) + { + NzRenderer::SetRenderStates(renderStates); + NzRenderer::SetShader(shader); + NzRenderer::SetVertexBuffer(vertexBuffer); + + shader->SendColor(colorLocation, primaryColor); + NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, vertexCount); + } +} + +void NzDebugDrawer::DrawTangents(const NzStaticMesh* subMesh) { if (!initialized) { @@ -437,7 +463,7 @@ void NzDebugDrawer::DrawTangents(const NzSubMesh* subMesh) unsigned int vertexCount = tangentCount*2; if (vertexBuffer->GetVertexCount() < vertexCount) { - NazaraError("Debug buffer not length enougth to draw object"); + NazaraError("Debug buffer not large enougth to draw object"); return; } @@ -452,7 +478,7 @@ void NzDebugDrawer::DrawTangents(const NzSubMesh* subMesh) outputVertex->position = inputVertex->position; outputVertex++; - outputVertex->position = inputVertex->position + inputVertex->tangent; + outputVertex->position = inputVertex->position + inputVertex->tangent*0.01f; outputVertex++; inputVertex++; @@ -463,36 +489,14 @@ void NzDebugDrawer::DrawTangents(const NzSubMesh* subMesh) 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::SetRenderStates(renderStates); + NzRenderer::SetShader(shader); 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"); + NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, vertexCount); } } -*/ void NzDebugDrawer::EnableDepthBuffer(bool depthBuffer) { @@ -554,7 +558,7 @@ bool NzDebugDrawer::Initialize() // VertexBuffer (Nécessite la déclaration) { - vertexBuffer = new NzVertexBuffer(vertexDeclaration, 1024, nzBufferStorage_Hardware, nzBufferUsage_Dynamic); + vertexBuffer = new NzVertexBuffer(vertexDeclaration, 65365, nzBufferStorage_Hardware, nzBufferUsage_Dynamic); if (!vertexBuffer->GetBuffer()->IsValid()) { NazaraError("Failed to create buffer");