Big UberShader update

-Added GRAPHICS_MAX_LIGHTPERPASS macro
-Added glGetActiveUniform OpenGL function
-Added (Uber)ShaderLibrary
-Added (Uber)ShaderName parameter to models
-Changed uniform system
-Fixed Node copying
-Moved Material class to Graphics module
-Optimized lights
-Remade Shader class
-Renamed Node::Invalidate to Node::InvalidateNode
-Renamed ShaderProgram to Shader


Former-commit-id: 15f0cad52969e91a2442e7d750ba2dc412f3549d
This commit is contained in:
Lynix
2014-02-21 19:27:39 +01:00
parent 4ee2ceaef0
commit 86bdab9055
147 changed files with 2693 additions and 4135 deletions

View File

@@ -3,26 +3,28 @@
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Renderer/DebugDrawer.hpp>
#include <Nazara/Core/ErrorFlags.hpp>
#include <Nazara/Renderer/OpenGL.hpp>
#include <Nazara/Renderer/Renderer.hpp>
#include <Nazara/Renderer/RenderStates.hpp>
#include <Nazara/Renderer/ShaderProgramManager.hpp>
#include <Nazara/Renderer/Shader.hpp>
#include <Nazara/Utility/BufferMapper.hpp>
#include <Nazara/Utility/Mesh.hpp>
#include <Nazara/Utility/Skeleton.hpp>
#include <Nazara/Utility/VertexBuffer.hpp>
#include <Nazara/Utility/VertexDeclaration.hpp>
#include <Nazara/Utility/VertexStruct.hpp>
#include <memory>
#include <Nazara/Renderer/Debug.hpp>
///TODO: Améliorer
namespace
{
static std::unique_ptr<NzShader> s_shader = nullptr;
static NzColor s_primaryColor;
static NzColor s_secondaryColor;
static NzRenderStates s_renderStates;
static const NzShaderProgram* s_program = nullptr;
static NzVertexBuffer s_vertexBuffer;
static bool s_initialized = false;
static int s_colorLocation = -1;
@@ -126,10 +128,10 @@ void NzDebugDrawer::Draw(const NzBoxf& box)
mapper.Unmap();
NzRenderer::SetRenderStates(s_renderStates);
NzRenderer::SetShaderProgram(s_program);
NzRenderer::SetShader(s_shader.get());
NzRenderer::SetVertexBuffer(&s_vertexBuffer);
s_program->SendColor(s_colorLocation, s_primaryColor);
s_shader->SendColor(s_colorLocation, s_primaryColor);
NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, 24);
}
@@ -213,10 +215,10 @@ void NzDebugDrawer::Draw(const NzFrustumf& frustum)
mapper.Unmap();
NzRenderer::SetRenderStates(s_renderStates);
NzRenderer::SetShaderProgram(s_program);
NzRenderer::SetShader(s_shader.get());
NzRenderer::SetVertexBuffer(&s_vertexBuffer);
s_program->SendColor(s_colorLocation, s_primaryColor);
s_shader->SendColor(s_colorLocation, s_primaryColor);
NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, 24);
}
@@ -295,10 +297,10 @@ void NzDebugDrawer::Draw(const NzOrientedBoxf& orientedBox)
mapper.Unmap();
NzRenderer::SetRenderStates(s_renderStates);
NzRenderer::SetShaderProgram(s_program);
NzRenderer::SetShader(s_shader.get());
NzRenderer::SetVertexBuffer(&s_vertexBuffer);
s_program->SendColor(s_colorLocation, s_primaryColor);
s_shader->SendColor(s_colorLocation, s_primaryColor);
NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, 24);
}
@@ -343,13 +345,13 @@ void NzDebugDrawer::Draw(const NzSkeleton* skeleton)
if (vertexCount > 0)
{
NzRenderer::SetRenderStates(s_renderStates);
NzRenderer::SetShaderProgram(s_program);
NzRenderer::SetShader(s_shader.get());
NzRenderer::SetVertexBuffer(&s_vertexBuffer);
s_program->SendColor(s_colorLocation, s_primaryColor);
s_shader->SendColor(s_colorLocation, s_primaryColor);
NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, vertexCount);
s_program->SendColor(s_colorLocation, s_secondaryColor);
s_shader->SendColor(s_colorLocation, s_secondaryColor);
NzRenderer::DrawPrimitives(nzPrimitiveMode_PointList, 0, vertexCount);
}
}
@@ -393,10 +395,10 @@ void NzDebugDrawer::DrawBinormals(const NzStaticMesh* subMesh)
if (vertexCount > 0)
{
NzRenderer::SetRenderStates(s_renderStates);
NzRenderer::SetShaderProgram(s_program);
NzRenderer::SetShader(s_shader.get());
NzRenderer::SetVertexBuffer(&s_vertexBuffer);
s_program->SendColor(s_colorLocation, s_primaryColor);
s_shader->SendColor(s_colorLocation, s_primaryColor);
NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, vertexCount);
}
}
@@ -469,10 +471,10 @@ void NzDebugDrawer::DrawCone(const NzVector3f& origin, const NzQuaternionf& rota
mapper.Unmap();
NzRenderer::SetRenderStates(s_renderStates);
NzRenderer::SetShaderProgram(s_program);
NzRenderer::SetShader(s_shader.get());
NzRenderer::SetVertexBuffer(&s_vertexBuffer);
s_program->SendColor(s_colorLocation, s_primaryColor);
s_shader->SendColor(s_colorLocation, s_primaryColor);
NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, 16);
}
@@ -516,10 +518,10 @@ void NzDebugDrawer::DrawNormals(const NzStaticMesh* subMesh)
if (vertexCount > 0)
{
NzRenderer::SetRenderStates(s_renderStates);
NzRenderer::SetShaderProgram(s_program);
NzRenderer::SetShader(s_shader.get());
NzRenderer::SetVertexBuffer(&s_vertexBuffer);
s_program->SendColor(s_colorLocation, s_primaryColor);
s_shader->SendColor(s_colorLocation, s_primaryColor);
NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, vertexCount);
}
}
@@ -563,10 +565,10 @@ void NzDebugDrawer::DrawTangents(const NzStaticMesh* subMesh)
if (vertexCount > 0)
{
NzRenderer::SetRenderStates(s_renderStates);
NzRenderer::SetShaderProgram(s_program);
NzRenderer::SetShader(s_shader.get());
NzRenderer::SetVertexBuffer(&s_vertexBuffer);
s_program->SendColor(s_colorLocation, s_primaryColor);
s_shader->SendColor(s_colorLocation, s_primaryColor);
NzRenderer::DrawPrimitives(nzPrimitiveMode_LineList, 0, vertexCount);
}
}
@@ -600,35 +602,85 @@ bool NzDebugDrawer::Initialize()
{
if (!s_initialized)
{
// s_program
// s_shader
{
NzShaderProgramManagerParams params;
params.target = nzShaderTarget_Model;
params.flags = 0;
params.model.alphaMapping = false;
params.model.alphaTest = false;
params.model.diffuseMapping = false;
params.model.emissiveMapping = false;
params.model.lighting = false;
params.model.normalMapping = false;
params.model.parallaxMapping = false;
params.model.specularMapping = false;
const char* fragmentSource110 =
"#version 110\n"
"uniform vec3 color;\n"
"void main()\n"
"{\n"
" gl_FragColor = vec4(color, 1.0);\n"
"}\n";
s_program = NzShaderProgramManager::Get(params);
if (!s_program)
const char* fragmentSource140 =
"#version 140\n"
"uniform vec3 color;\n"
"out vec4 RenderTarget0;\n"
"void main()\n"
"{\n"
" RenderTarget0 = vec4(color, 1.0);\n"
"}\n";
const char* vertexSource110 =
"#version 110\n"
"attribute vec3 Position;\n"
"uniform mat4 WorldViewProjMatrix;\n"
"void main()\n"
"{\n"
" gl_Position = WorldViewProjMatrix * vec4(Position, 1.0);\n"
"}\n";
const char* vertexSource140 =
"#version 140\n"
"in vec3 Position;\n"
"uniform mat4 WorldViewProjMatrix;\n"
"void main()\n"
"{\n"
" gl_Position = WorldViewProjMatrix * vec4(Position, 1.0);\n"
"}\n";
bool useGLSL140 = (NzOpenGL::GetVersion() >= 310);
s_shader.reset(new NzShader);
if (!s_shader->Create())
{
NazaraError("Failed to build debug s_program");
Uninitialize();
NazaraError("Failed to create shader");
return false;
}
s_colorLocation = s_program->GetUniformLocation(nzShaderUniform_MaterialDiffuse);
if (!s_shader->AttachStageFromSource(nzShaderStage_Fragment, (useGLSL140) ? fragmentSource140 : fragmentSource110))
{
Uninitialize();
NazaraError("Failed to load fragment shader");
return false;
}
if (!s_shader->AttachStageFromSource(nzShaderStage_Vertex, (useGLSL140) ? vertexSource140 : vertexSource110))
{
Uninitialize();
NazaraError("Failed to load vertex shader");
return false;
}
if (!s_shader->Link())
{
Uninitialize();
NazaraError("Failed to link shader");
return false;
}
s_colorLocation = s_shader->GetUniformLocation("color");
}
// s_vertexBuffer
try
{
NzErrorFlags flags(nzErrorFlag_ThrowException);
s_vertexBuffer.Reset(NzVertexDeclaration::Get(nzVertexLayout_XYZ), 65365, nzBufferStorage_Hardware, nzBufferUsage_Dynamic);
}
catch (const std::exception& e)
@@ -676,6 +728,7 @@ void NzDebugDrawer::SetSecondaryColor(const NzColor& color)
void NzDebugDrawer::Uninitialize()
{
s_shader.reset();
s_vertexBuffer.Reset();
s_initialized = false;
}