diff --git a/include/Nazara/Renderer/DebugDrawer.hpp b/include/Nazara/Renderer/DebugDrawer.hpp index b09de52d6..efce27d6d 100644 --- a/include/Nazara/Renderer/DebugDrawer.hpp +++ b/include/Nazara/Renderer/DebugDrawer.hpp @@ -24,6 +24,7 @@ class NAZARA_API NzDebugDrawer static void Draw(const NzCubeui& cube); static void Draw(const NzSkeleton* skeleton); static void DrawNormals(const NzSubMesh* subMesh); + static void DrawTangents(const NzSubMesh* subMesh); static bool Initialize(); diff --git a/src/Nazara/Renderer/DebugDrawer.cpp b/src/Nazara/Renderer/DebugDrawer.cpp index 182edf97b..8f6c5929a 100644 --- a/src/Nazara/Renderer/DebugDrawer.cpp +++ b/src/Nazara/Renderer/DebugDrawer.cpp @@ -301,6 +301,74 @@ void NzDebugDrawer::DrawNormals(const NzSubMesh* subMesh) } } +void NzDebugDrawer::DrawTangents(const NzSubMesh* subMesh) +{ + if (!initialized) + { + NazaraError("Debug drawer is not initialized"); + return; + } + + unsigned int tangentCount = subMesh->GetVertexCount(); + unsigned int vertexCount = tangentCount*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 < tangentCount; ++i) + { + outputVertex->position = inputVertex->position; + outputVertex++; + + outputVertex->position = inputVertex->position + inputVertex->tangent; + 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)