diff --git a/code/nel/src/3d/driver/OpenGL3/driver_glsl_shader_generator.cpp b/code/nel/src/3d/driver/OpenGL3/driver_glsl_shader_generator.cpp
new file mode 100644
index 000000000..80b56a24b
--- /dev/null
+++ b/code/nel/src/3d/driver/OpenGL3/driver_glsl_shader_generator.cpp
@@ -0,0 +1,128 @@
+// NeL - MMORPG Framework
+// Copyright (C) 2010 Winch Gate Property Limited
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+#include "sstream"
+#include "driver_glsl_shader_generator.h"
+#include "nel/3d/vertex_buffer.h"
+
+namespace
+{
+ inline bool hasFlag( uint32 data, uint32 flag )
+ {
+ if( ( data & flag ) != 0 )
+ return true;
+ else
+ return false;
+ }
+}
+
+namespace NL3D
+{
+ uint16 vertexFlags[ CVertexBuffer::NumValue ] =
+ {
+ CVertexBuffer::PositionFlag,
+ CVertexBuffer::WeightFlag,
+ CVertexBuffer::NormalFlag,
+ CVertexBuffer::PrimaryColorFlag,
+ CVertexBuffer::SecondaryColorFlag,
+ CVertexBuffer::FogFlag,
+ CVertexBuffer::PaletteSkinFlag,
+ 0,
+ CVertexBuffer::TexCoord0Flag,
+ CVertexBuffer::TexCoord1Flag,
+ CVertexBuffer::TexCoord2Flag,
+ CVertexBuffer::TexCoord3Flag,
+ CVertexBuffer::TexCoord4Flag,
+ CVertexBuffer::TexCoord5Flag,
+ CVertexBuffer::TexCoord6Flag,
+ CVertexBuffer::TexCoord7Flag
+ };
+
+ const char *attribNames[ CVertexBuffer::NumValue ] =
+ {
+ "position",
+ "weight",
+ "normal",
+ "color",
+ "color2",
+ "fog",
+ "paletteSkin",
+ "none",
+ "texCoord0",
+ "texCoord1",
+ "texCoord2",
+ "texCoord3",
+ "texCoord4",
+ "texCoord5",
+ "texCoord6",
+ "texCoord7"
+ };
+
+
+
+ CGLSLShaderGenerator::CGLSLShaderGenerator()
+ {
+ reset();
+ }
+
+ CGLSLShaderGenerator::~CGLSLShaderGenerator()
+ {
+ }
+
+ void CGLSLShaderGenerator::reset()
+ {
+ material = NULL;
+ vbFormat = 0;
+ }
+
+ void CGLSLShaderGenerator::generateVS( std::string &vs )
+ {
+ std::stringstream ss;
+
+ ss << "#version 330" << std::endl;
+ ss << "uniform mat4 mvpMatrix;" << std::endl;
+ ss << std::endl;
+
+ for( int i = 0; i < CVertexBuffer::NumValue; i++ )
+ {
+ if( hasFlag( vbFormat, vertexFlags[ i ] ) )
+ {
+ ss << "layout ( location = ";
+ ss << i;
+ ss << " ) ";
+ ss << "in vec4 ";
+ ss << attribNames[ i ];
+ ss << ";";
+ ss << std::endl;
+ }
+ }
+ ss << std::endl;
+
+ ss << "void main( void )" << std::endl;
+ ss << "{" << std::endl;
+ ss << "gl_Position = mvp * " << attribNames[ 0 ] << ";" << std::endl;
+ ss << "}" << std::endl;
+
+ vs.append( ss.str() );
+ }
+
+ void CGLSLShaderGenerator::generatePS( std::string &ps )
+ {
+ }
+
+}
+
+
diff --git a/code/nel/src/3d/driver/OpenGL3/driver_glsl_shader_generator.h b/code/nel/src/3d/driver/OpenGL3/driver_glsl_shader_generator.h
new file mode 100644
index 000000000..9246b6a5e
--- /dev/null
+++ b/code/nel/src/3d/driver/OpenGL3/driver_glsl_shader_generator.h
@@ -0,0 +1,48 @@
+// NeL - MMORPG Framework
+// Copyright (C) 2010 Winch Gate Property Limited
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+
+#ifndef GLSL_SHADER_GENERATOR
+#define GLSL_SHADER_GENERATOR
+
+#include
+
+namespace NL3D
+{
+ class CMaterial;
+
+ class CGLSLShaderGenerator
+ {
+ public:
+ CGLSLShaderGenerator();
+ ~CGLSLShaderGenerator();
+ void reset();
+
+ void generateVS( std::string &vs );
+ void generatePS( std::string &ps );
+
+ void setMaterial( CMaterial *mat ){ material = mat; }
+ void setVBFormat( uint16 format ){ vbFormat = format; }
+
+ private:
+ uint16 vbFormat;
+ CMaterial const *material;
+ };
+}
+
+#endif
+
+
diff --git a/code/nel/src/3d/driver/OpenGL3/driver_opengl.cpp b/code/nel/src/3d/driver/OpenGL3/driver_opengl.cpp
index 79fa574b8..8212e5f7f 100644
--- a/code/nel/src/3d/driver/OpenGL3/driver_opengl.cpp
+++ b/code/nel/src/3d/driver/OpenGL3/driver_opengl.cpp
@@ -33,6 +33,7 @@
#include "nel/misc/hierarchical_timer.h"
#include "nel/misc/dynloadlib.h"
#include "driver_opengl_vertex_buffer_hard.h"
+#include "driver_glsl_shader_generator.h"
using namespace std;
@@ -333,14 +334,25 @@ CDriverGL3::CDriverGL3()
_TextureTargetUpload = false;
currentProgram = NULL;
+ shaderGenerator = new CGLSLShaderGenerator();
}
// ***************************************************************************
CDriverGL3::~CDriverGL3()
{
H_AUTO_OGL(CDriverGL3_CDriverGLDtor)
+
+ if( currentProgram != NULL )
+ {
+ delete currentProgram;
+ currentProgram = NULL;
+ }
+
release();
+ delete shaderGenerator;
+ shaderGenerator = NULL;
+
#if defined(NL_OS_MAC)
[_autoreleasePool release];
#endif
diff --git a/code/nel/src/3d/driver/OpenGL3/driver_opengl.h b/code/nel/src/3d/driver/OpenGL3/driver_opengl.h
index f90c655c9..c5f02b7c7 100644
--- a/code/nel/src/3d/driver/OpenGL3/driver_opengl.h
+++ b/code/nel/src/3d/driver/OpenGL3/driver_opengl.h
@@ -277,6 +277,8 @@ public:
};
+class CGLSLShaderGenerator;
+
// ***************************************************************************
class CDriverGL3 : public IDriver
@@ -374,6 +376,7 @@ public:
static inline void setupCausticsSecondTex(uint stage);*/
virtual bool setupMaterial(CMaterial& mat);
+ bool setupProgram(CMaterial& mat);
virtual void startSpecularBatch();
virtual void endSpecularBatch();
@@ -431,6 +434,7 @@ public:
virtual bool renderLines(CMaterial& mat, uint32 firstIndex, uint32 nlines);
virtual bool renderTriangles(CMaterial& Mat, uint32 firstIndex, uint32 ntris);
+ bool renderTriangles2(CMaterial& Mat, uint32 firstIndex, uint32 ntris );
virtual bool renderSimpleTriangles(uint32 firstTri, uint32 ntris);
virtual bool renderRawPoints(CMaterial& Mat, uint32 startIndex, uint32 numPoints);
virtual bool renderRawLines(CMaterial& Mat, uint32 startIndex, uint32 numLines);
@@ -1351,6 +1355,8 @@ private:
private:
+ CGLSLShaderGenerator *shaderGenerator;
+
IProgramObject *currentProgram;
bool setupARBVertexProgram (const CVPParser::TProgram &parsedProgram, GLuint id, bool &specularWritten);
diff --git a/code/nel/src/3d/driver/OpenGL3/driver_opengl_program.cpp b/code/nel/src/3d/driver/OpenGL3/driver_opengl_program.cpp
index e087f1a2e..4e3ef9dfe 100644
--- a/code/nel/src/3d/driver/OpenGL3/driver_opengl_program.cpp
+++ b/code/nel/src/3d/driver/OpenGL3/driver_opengl_program.cpp
@@ -2,6 +2,8 @@
#include "driver_glsl_program.h"
#include "driver_glsl_vertex_program.h"
#include "driver_glsl_pixel_program.h"
+#include "driver_glsl_shader_generator.h"
+#include "driver_opengl_vertex_buffer_hard.h"
#include "nel/3d/i_program_object.h"
namespace NL3D
@@ -114,6 +116,29 @@ namespace NL3D
return true;
}
+ bool CDriverGL3::renderTriangles2( CMaterial &mat, uint32 startIndex, uint32 numTris )
+ {
+ if( !setupProgram( mat ) )
+ return false;
+
+ glDrawArrays( GL_TRIANGLES, startIndex * 3, numTris * 3 );
+
+ return true;
+ }
+
+ bool CDriverGL3::setupProgram( CMaterial &mat )
+ {
+ std::string vs;
+ std::string ps;
+
+ shaderGenerator->reset();
+ shaderGenerator->setMaterial( &mat );
+ shaderGenerator->setVBFormat( _CurrentVertexBufferHard->VB->getVertexFormat() );
+ shaderGenerator->generateVS( vs );
+ shaderGenerator->generatePS( ps );
+
+ return true;
+ }
}
diff --git a/code/nel/src/3d/driver/OpenGL3/driver_opengl_vertex.cpp b/code/nel/src/3d/driver/OpenGL3/driver_opengl_vertex.cpp
index ef8c5d574..8d76c1e43 100644
--- a/code/nel/src/3d/driver/OpenGL3/driver_opengl_vertex.cpp
+++ b/code/nel/src/3d/driver/OpenGL3/driver_opengl_vertex.cpp
@@ -265,6 +265,8 @@ bool CDriverGL3::renderTriangles(CMaterial& mat, uint32 firstIndex, uint32 ntris
if ( !setupMaterial(mat) || _LastIB._Values == NULL )
return false;
+ setupProgram( mat );
+
refreshTexMatrices();
if (_CurrentVertexBufferHard && _CurrentVertexBufferHard->isInvalid()) return true;