diff --git a/data/gui/racesetup.stkgui b/data/gui/racesetup.stkgui
index dd52aa0ea..4865798fb 100644
--- a/data/gui/racesetup.stkgui
+++ b/data/gui/racesetup.stkgui
@@ -19,7 +19,7 @@
I18N="Difficulty" text="SuperTux"/>
-
+
diff --git a/data/shaders/particle.vert b/data/shaders/particle.vert
index 99d38137c..78d32ef29 100644
--- a/data/shaders/particle.vert
+++ b/data/shaders/particle.vert
@@ -1,12 +1,21 @@
uniform vec3 color_from;
uniform vec3 color_to;
+#if __VERSION__ >= 330
layout(location=0) in vec3 Position;
layout(location = 1) in float lifetime;
layout(location = 2) in float size;
layout(location=3) in vec2 Texcoord;
layout(location = 4) in vec2 quadcorner;
+#else
+in vec3 Position;
+in float lifetime;
+in float size;
+
+in vec2 Texcoord;
+in vec2 quadcorner;
+#endif
out float lf;
out vec2 tc;
diff --git a/data/shaders/particlesimheightmap.vert b/data/shaders/particlesimheightmap.vert
index dc5241719..eec3151c1 100644
--- a/data/shaders/particlesimheightmap.vert
+++ b/data/shaders/particlesimheightmap.vert
@@ -9,6 +9,7 @@ uniform float track_x_len;
uniform float track_z_len;
uniform samplerBuffer heightmap;
+#if __VERSION__ >= 330
layout (location = 4) in vec3 particle_position_initial;
layout (location = 5) in float lifetime_initial;
layout (location = 6) in vec3 particle_velocity_initial;
@@ -18,6 +19,17 @@ layout (location = 0) in vec3 particle_position;
layout (location = 1) in float lifetime;
layout (location = 2) in vec3 particle_velocity;
layout (location = 3) in float size;
+#else
+in vec3 particle_position_initial;
+in float lifetime_initial;
+in vec3 particle_velocity_initial;
+in float size_initial;
+
+in vec3 particle_position;
+in float lifetime;
+in vec3 particle_velocity;
+in float size;
+#endif
out vec3 new_particle_position;
out float new_lifetime;
diff --git a/data/shaders/pointemitter.vert b/data/shaders/pointemitter.vert
index 003c128d6..3203d965b 100644
--- a/data/shaders/pointemitter.vert
+++ b/data/shaders/pointemitter.vert
@@ -3,6 +3,7 @@ uniform mat4 sourcematrix;
uniform int level;
uniform float size_increase_factor;
+#if __VERSION__ >= 330
layout (location = 4) in vec3 particle_position_initial;
layout (location = 5) in float lifetime_initial;
layout (location = 6) in vec3 particle_velocity_initial;
@@ -12,6 +13,17 @@ layout (location = 0) in vec3 particle_position;
layout (location = 1) in float lifetime;
layout (location = 2) in vec3 particle_velocity;
layout (location = 3) in float size;
+#else
+in vec3 particle_position_initial;
+in float lifetime_initial;
+in vec3 particle_velocity_initial;
+in float size_initial;
+
+in vec3 particle_position;
+in float lifetime;
+in vec3 particle_velocity;
+in float size;
+#endif
out vec3 new_particle_position;
out float new_lifetime;
diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceLinux.cpp b/lib/irrlicht/source/Irrlicht/CIrrDeviceLinux.cpp
index b5423ca57..00353a264 100644
--- a/lib/irrlicht/source/Irrlicht/CIrrDeviceLinux.cpp
+++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceLinux.cpp
@@ -3,6 +3,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
+extern bool GLContextDebugBit;
+
#include "CIrrDeviceLinux.h"
#ifdef _IRR_COMPILE_WITH_X11_DEVICE_
@@ -497,7 +499,7 @@ void IrrPrintXGrabError(int grabResult, const c8 * grabCommand )
static GLXContext getMeAGLContext(Display *display, GLXFBConfig glxFBConfig)
{
GLXContext Context;
- int compat33ctx[] =
+ int compat33ctxdebug[] =
{
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 3,
@@ -505,7 +507,14 @@ static GLXContext getMeAGLContext(Display *display, GLXFBConfig glxFBConfig)
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB,
None
};
- int core33ctx[] =
+ int compat33ctx[] =
+ {
+ GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
+ GLX_CONTEXT_MINOR_VERSION_ARB, 3,
+ GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
+ None
+ };
+ int core33ctxdebug[] =
{
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 3,
@@ -513,12 +522,26 @@ static GLXContext getMeAGLContext(Display *display, GLXFBConfig glxFBConfig)
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB,
None
};
+ int core33ctx[] =
+ {
+ GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
+ GLX_CONTEXT_MINOR_VERSION_ARB, 3,
+ GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
+ None
+ };
+ int core31ctxdebug[] =
+ {
+ GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
+ GLX_CONTEXT_MINOR_VERSION_ARB, 1,
+ GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
+ GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB,
+ None
+ };
int core31ctx[] =
{
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 1,
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
- GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB,
None
};
int legacyctx[] =
@@ -532,19 +555,19 @@ static GLXContext getMeAGLContext(Display *display, GLXFBConfig glxFBConfig)
glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB" );
// create compat 3.3 context (for proprietary drivers)
- Context = glXCreateContextAttribsARB(display, glxFBConfig, 0, True, compat33ctx);
+ Context = glXCreateContextAttribsARB(display, glxFBConfig, 0, True, GLContextDebugBit ? compat33ctxdebug : compat33ctx);
if (!XErrorSignaled)
return Context;
XErrorSignaled = false;
// create core 3.3 context (for mesa)
- Context = glXCreateContextAttribsARB(display, glxFBConfig, 0, True, core33ctx);
+ Context = glXCreateContextAttribsARB(display, glxFBConfig, 0, True, GLContextDebugBit ? core33ctxdebug : core33ctx);
if (!XErrorSignaled)
return Context;
XErrorSignaled = false;
// create core 3.1 context (for older mesa)
- Context = glXCreateContextAttribsARB(display, glxFBConfig, 0, True, core31ctx);
+ Context = glXCreateContextAttribsARB(display, glxFBConfig, 0, True, GLContextDebugBit ? core31ctxdebug : core31ctx);
if (!XErrorSignaled)
return Context;
diff --git a/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp b/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp
index 0c07edcc4..451cd60af 100644
--- a/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp
+++ b/lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp
@@ -2,6 +2,9 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+extern bool GLContextDebugBit;
+
#include "COpenGLDriver.h"
// needed here also because of the create methods' parameters
#include "CNullDriver.h"
@@ -89,7 +92,7 @@ static PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribs_ARB;
static HGLRC getMeAGLContext(HDC HDc)
{
HGLRC hrc = 0;
- int ctx44[] =
+ int ctx44debug[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
WGL_CONTEXT_MINOR_VERSION_ARB, 3,
@@ -98,11 +101,19 @@ static HGLRC getMeAGLContext(HDC HDc)
0
};
- hrc = wglCreateContextAttribs_ARB(HDc, 0, ctx44);
+ int ctx44[] =
+ {
+ WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
+ WGL_CONTEXT_MINOR_VERSION_ARB, 3,
+ WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
+ 0
+ };
+
+ hrc = wglCreateContextAttribs_ARB(HDc, 0, GLContextDebugBit ? ctx44debug : ctx44);
if (hrc)
return hrc;
- int ctx40[] =
+ int ctx40debug[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
WGL_CONTEXT_MINOR_VERSION_ARB, 0,
@@ -111,11 +122,19 @@ static HGLRC getMeAGLContext(HDC HDc)
0
};
- hrc = wglCreateContextAttribs_ARB(HDc, 0, ctx40);
+ int ctx40[] =
+ {
+ WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
+ WGL_CONTEXT_MINOR_VERSION_ARB, 0,
+ WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
+ 0
+ };
+
+ hrc = wglCreateContextAttribs_ARB(HDc, 0, GLContextDebugBit ? ctx40debug : ctx40);
if (hrc)
return hrc;
- int ctx33[] =
+ int ctx33debug[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 3,
@@ -124,11 +143,19 @@ static HGLRC getMeAGLContext(HDC HDc)
0
};
- hrc = wglCreateContextAttribs_ARB(HDc, 0, ctx33);
+ int ctx33[] =
+ {
+ WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
+ WGL_CONTEXT_MINOR_VERSION_ARB, 3,
+ WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
+ 0
+ };
+
+ hrc = wglCreateContextAttribs_ARB(HDc, 0, GLContextDebugBit ? ctx33debug : ctx33);
if (hrc)
return hrc;
- int ctx31[] =
+ int ctx31debug[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 1,
@@ -136,7 +163,15 @@ static HGLRC getMeAGLContext(HDC HDc)
WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
0
};
- hrc = wglCreateContextAttribs_ARB(HDc, 0, ctx31);
+
+ int ctx31[] =
+ {
+ WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
+ WGL_CONTEXT_MINOR_VERSION_ARB, 1,
+ WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
+ 0
+ };
+ hrc = wglCreateContextAttribs_ARB(HDc, 0, GLContextDebugBit ? ctx31debug : ctx31);
if (hrc)
return hrc;
diff --git a/src/graphics/gl_headers.hpp b/src/graphics/gl_headers.hpp
index 50069f23f..a30fabc67 100644
--- a/src/graphics/gl_headers.hpp
+++ b/src/graphics/gl_headers.hpp
@@ -1,7 +1,13 @@
#ifndef GL_HEADER_HPP
#define GL_HEADER_HPP
-#define GLEW_STATIC
+#if defined(WIN32) && !defined(__CYGWIN__)
+ // glew in the binary distribution only comes as dynamic library.
+# undef GLEW_STATIC
+#else
+# define GLEW_STATIC
+#endif
+
extern "C" {
#include
}
@@ -29,12 +35,6 @@ extern "C" {
# include
#endif
-#define Bindless_Texture_Support
-#define Base_Instance_Support
-#define Buffer_Storage
-#define Multi_Draw_Indirect
-#define Draw_Indirect
-
struct DrawElementsIndirectCommand{
GLuint count;
GLuint instanceCount;
@@ -43,4 +43,4 @@ struct DrawElementsIndirectCommand{
GLuint baseInstance;
};
-#endif
\ No newline at end of file
+#endif
diff --git a/src/graphics/glwrap.cpp b/src/graphics/glwrap.cpp
index 7c7975fbd..f6eae07f1 100644
--- a/src/graphics/glwrap.cpp
+++ b/src/graphics/glwrap.cpp
@@ -11,6 +11,12 @@
static bool is_gl_init = false;
+#if DEBUG
+bool GLContextDebugBit = true;
+#else
+bool GLContextDebugBit = false;
+#endif
+
#ifdef DEBUG
#if !defined(__APPLE__)
#define ARB_DEBUG_OUTPUT
@@ -181,10 +187,46 @@ GLuint LoadShader(const char * file, unsigned type)
return Id;
}
+void setAttribute(AttributeType Tp, GLuint ProgramID)
+{
+ switch (Tp)
+ {
+ case OBJECT:
+ glBindAttribLocation(ProgramID, 0, "Position");
+ glBindAttribLocation(ProgramID, 1, "Normal");
+ glBindAttribLocation(ProgramID, 2, "Color");
+ glBindAttribLocation(ProgramID, 3, "Texcoord");
+ glBindAttribLocation(ProgramID, 4, "SecondTexcoord");
+ glBindAttribLocation(ProgramID, 5, "Tangent");
+ glBindAttribLocation(ProgramID, 6, "Bitangent");
+ glBindAttribLocation(ProgramID, 7, "Origin");
+ glBindAttribLocation(ProgramID, 8, "Orientation");
+ glBindAttribLocation(ProgramID, 9, "Scale");
+ break;
+ case PARTICLES_SIM:
+ glBindAttribLocation(ProgramID, 0, "particle_position");
+ glBindAttribLocation(ProgramID, 1, "lifetime");
+ glBindAttribLocation(ProgramID, 2, "particle_velocity");
+ glBindAttribLocation(ProgramID, 3, "size");
+ glBindAttribLocation(ProgramID, 4, "particle_position_initial");
+ glBindAttribLocation(ProgramID, 5, "lifetime_initial");
+ glBindAttribLocation(ProgramID, 6, "particle_velocity_initial");
+ glBindAttribLocation(ProgramID, 7, "size_initial");
+ break;
+ case PARTICLES_RENDERING:
+ glBindAttribLocation(ProgramID, 1, "lifetime");
+ glBindAttribLocation(ProgramID, 2, "size");
+ glBindAttribLocation(ProgramID, 4, "quadcorner");
+ break;
+ }
+}
+
GLuint LoadTFBProgram(const char * vertex_file_path, const char **varyings, unsigned varyingscount)
{
GLuint Program = glCreateProgram();
loadAndAttach(Program, GL_VERTEX_SHADER, vertex_file_path);
+ if (irr_driver->getGLSLVersion() < 330)
+ setAttribute(PARTICLES_SIM, Program);
glTransformFeedbackVaryings(Program, varyingscount, varyings, GL_INTERLEAVED_ATTRIBS);
glLinkProgram(Program);
@@ -397,340 +439,6 @@ void setTexture(unsigned TextureUnit, GLuint TextureId, GLenum MagFilter, GLenum
glGetError();
}
-VAOManager::VAOManager()
-{
- vao[0] = vao[1] = vao[2] = 0;
- vbo[0] = vbo[1] = vbo[2] = 0;
- ibo[0] = ibo[1] = ibo[2] = 0;
- vtx_cnt[0] = vtx_cnt[1] = vtx_cnt[2] = 0;
- idx_cnt[0] = idx_cnt[1] = idx_cnt[2] = 0;
- vtx_mirror[0] = vtx_mirror[1] = vtx_mirror[2] = NULL;
- idx_mirror[0] = idx_mirror[1] = idx_mirror[2] = NULL;
- instance_count[0] = 0;
-
- for (unsigned i = 0; i < InstanceTypeCount; i++)
- {
- glGenBuffers(1, &instance_vbo[i]);
- glBindBuffer(GL_ARRAY_BUFFER, instance_vbo[i]);
-#ifdef Buffer_Storage
- if (irr_driver->hasBufferStorageExtension())
- {
- glBufferStorage(GL_ARRAY_BUFFER, 10000 * sizeof(InstanceData), 0, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
- Ptr[i] = glMapBufferRange(GL_ARRAY_BUFFER, 0, 10000 * sizeof(InstanceData), GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
- }
- else
-#endif
- {
- glBufferData(GL_ARRAY_BUFFER, 10000 * sizeof(InstanceData), 0, GL_STREAM_DRAW);
- }
- }
-}
-
-static void cleanVAOMap(std::map, GLuint> Map)
-{
- std::map, GLuint>::iterator It = Map.begin(), E = Map.end();
- for (; It != E; It++)
- {
- glDeleteVertexArrays(1, &(It->second));
- }
-}
-
-void VAOManager::cleanInstanceVAOs()
-{
- cleanVAOMap(InstanceVAO);
- InstanceVAO.clear();
-}
-
-VAOManager::~VAOManager()
-{
- cleanInstanceVAOs();
- for (unsigned i = 0; i < 3; i++)
- {
- if (vtx_mirror[i])
- free(vtx_mirror[i]);
- if (idx_mirror[i])
- free(idx_mirror[i]);
- if (vbo[i])
- glDeleteBuffers(1, &vbo[i]);
- if (ibo[i])
- glDeleteBuffers(1, &ibo[i]);
- if (vao[i])
- glDeleteVertexArrays(1, &vao[i]);
- }
- for (unsigned i = 0; i < InstanceTypeCount; i++)
- {
- glDeleteBuffers(1, &instance_vbo[i]);
- }
-
-}
-
-void VAOManager::regenerateBuffer(enum VTXTYPE tp)
-{
- glBindVertexArray(0);
- if (vbo[tp])
- glDeleteBuffers(1, &vbo[tp]);
- glGenBuffers(1, &vbo[tp]);
- glBindBuffer(GL_ARRAY_BUFFER, vbo[tp]);
-#ifdef Buffer_Storage
- if (irr_driver->hasBufferStorageExtension())
- {
- glBufferStorage(GL_ARRAY_BUFFER, vtx_cnt[tp] * getVertexPitch(tp), vtx_mirror[tp], GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
- VBOPtr[tp] = glMapBufferRange(GL_ARRAY_BUFFER, 0, vtx_cnt[tp] * getVertexPitch(tp), GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
- }
- else
-#endif
- glBufferData(GL_ARRAY_BUFFER, vtx_cnt[tp] * getVertexPitch(tp), vtx_mirror[tp], GL_DYNAMIC_DRAW);
-
-
- if (ibo[tp])
- glDeleteBuffers(1, &ibo[tp]);
- glGenBuffers(1, &ibo[tp]);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo[tp]);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(u16)* idx_cnt[tp], idx_mirror[tp], GL_DYNAMIC_DRAW);
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-}
-
-void VAOManager::regenerateVAO(enum VTXTYPE tp)
-{
- if (vao[tp])
- glDeleteVertexArrays(1, &vao[tp]);
- glGenVertexArrays(1, &vao[tp]);
- glBindVertexArray(vao[tp]);
- glBindBuffer(GL_ARRAY_BUFFER, vbo[tp]);
- switch (tp)
- {
- case VTXTYPE_STANDARD:
- // Position
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, getVertexPitch(tp), 0);
- // Normal
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, getVertexPitch(tp), (GLvoid*)12);
- // Color
- glEnableVertexAttribArray(2);
- glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, getVertexPitch(tp), (GLvoid*)24);
- // Texcoord
- glEnableVertexAttribArray(3);
- glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, getVertexPitch(tp), (GLvoid*)28);
- break;
- case VTXTYPE_TCOORD:
- // Position
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, getVertexPitch(tp), 0);
- // Normal
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, getVertexPitch(tp), (GLvoid*)12);
- // Color
- glEnableVertexAttribArray(2);
- glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, getVertexPitch(tp), (GLvoid*)24);
- // Texcoord
- glEnableVertexAttribArray(3);
- glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, getVertexPitch(tp), (GLvoid*)28);
- // SecondTexcoord
- glEnableVertexAttribArray(4);
- glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, getVertexPitch(tp), (GLvoid*)36);
- break;
- case VTXTYPE_TANGENT:
- // Position
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, getVertexPitch(tp), 0);
- // Normal
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, getVertexPitch(tp), (GLvoid*)12);
- // Color
- glEnableVertexAttribArray(2);
- glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, getVertexPitch(tp), (GLvoid*)24);
- // Texcoord
- glEnableVertexAttribArray(3);
- glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, getVertexPitch(tp), (GLvoid*)28);
- // Tangent
- glEnableVertexAttribArray(5);
- glVertexAttribPointer(5, 3, GL_FLOAT, GL_FALSE, getVertexPitch(tp), (GLvoid*)36);
- // Bitangent
- glEnableVertexAttribArray(6);
- glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, getVertexPitch(tp), (GLvoid*)48);
- break;
- }
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo[tp]);
- glBindVertexArray(0);
-}
-
-void VAOManager::regenerateInstancedVAO()
-{
- cleanInstanceVAOs();
-
- enum video::E_VERTEX_TYPE IrrVT[] = { video::EVT_STANDARD, video::EVT_2TCOORDS, video::EVT_TANGENTS };
- for (unsigned i = 0; i < VTXTYPE_COUNT; i++)
- {
- video::E_VERTEX_TYPE tp = IrrVT[i];
- if (!vbo[tp] || !ibo[tp])
- continue;
- GLuint vao = createVAO(vbo[tp], ibo[tp], tp);
- glBindBuffer(GL_ARRAY_BUFFER, instance_vbo[InstanceTypeDefault]);
-
- glEnableVertexAttribArray(7);
- glVertexAttribPointer(7, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), 0);
- glVertexAttribDivisor(7, 1);
- glEnableVertexAttribArray(8);
- glVertexAttribPointer(8, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), (GLvoid*)(3 * sizeof(float)));
- glVertexAttribDivisor(8, 1);
- glEnableVertexAttribArray(9);
- glVertexAttribPointer(9, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), (GLvoid*)(6 * sizeof(float)));
- glVertexAttribDivisor(9, 1);
- glEnableVertexAttribArray(10);
- glVertexAttribIPointer(10, 2, GL_UNSIGNED_INT, sizeof(InstanceData), (GLvoid*)(9 * sizeof(float)));
- glVertexAttribDivisor(10, 1);
- glEnableVertexAttribArray(11);
- glVertexAttribIPointer(11, 2, GL_UNSIGNED_INT, sizeof(InstanceData), (GLvoid*)(9 * sizeof(float) + 2 * sizeof(unsigned)));
- glVertexAttribDivisor(11, 1);
- InstanceVAO[std::pair(tp, InstanceTypeDefault)] = vao;
-
- vao = createVAO(vbo[tp], ibo[tp], tp);
- glBindBuffer(GL_ARRAY_BUFFER, instance_vbo[InstanceTypeShadow]);
-
- glEnableVertexAttribArray(7);
- glVertexAttribPointer(7, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), 0);
- glVertexAttribDivisor(7, 1);
- glEnableVertexAttribArray(8);
- glVertexAttribPointer(8, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), (GLvoid*)(3 * sizeof(float)));
- glVertexAttribDivisor(8, 1);
- glEnableVertexAttribArray(9);
- glVertexAttribPointer(9, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), (GLvoid*)(6 * sizeof(float)));
- glVertexAttribDivisor(9, 1);
- glEnableVertexAttribArray(10);
- glVertexAttribIPointer(10, 2, GL_UNSIGNED_INT, sizeof(InstanceData), (GLvoid*)(9 * sizeof(float)));
- glVertexAttribDivisor(10, 1);
- glEnableVertexAttribArray(11);
- glVertexAttribIPointer(11, 2, GL_UNSIGNED_INT, sizeof(InstanceData), (GLvoid*)(9 * sizeof(float) + 2 * sizeof(unsigned)));
- glVertexAttribDivisor(11, 1);
- InstanceVAO[std::pair(tp, InstanceTypeShadow)] = vao;
-
- vao = createVAO(vbo[tp], ibo[tp], tp);
- glBindBuffer(GL_ARRAY_BUFFER, instance_vbo[InstanceTypeRSM]);
-
- glEnableVertexAttribArray(7);
- glVertexAttribPointer(7, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), 0);
- glVertexAttribDivisor(7, 1);
- glEnableVertexAttribArray(8);
- glVertexAttribPointer(8, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), (GLvoid*)(3 * sizeof(float)));
- glVertexAttribDivisor(8, 1);
- glEnableVertexAttribArray(9);
- glVertexAttribPointer(9, 3, GL_FLOAT, GL_FALSE, sizeof(InstanceData), (GLvoid*)(6 * sizeof(float)));
- glVertexAttribDivisor(9, 1);
- glEnableVertexAttribArray(10);
- glVertexAttribIPointer(10, 2, GL_UNSIGNED_INT, sizeof(InstanceData), (GLvoid*)(9 * sizeof(float)));
- glVertexAttribDivisor(10, 1);
- glEnableVertexAttribArray(11);
- glVertexAttribIPointer(11, 2, GL_UNSIGNED_INT, sizeof(InstanceData), (GLvoid*)(9 * sizeof(float) + 2 * sizeof(unsigned)));
- glVertexAttribDivisor(11, 1);
- InstanceVAO[std::pair(tp, InstanceTypeRSM)] = vao;
-
- vao = createVAO(vbo[tp], ibo[tp], tp);
- glBindBuffer(GL_ARRAY_BUFFER, instance_vbo[InstanceTypeGlow]);
-
- glEnableVertexAttribArray(7);
- glVertexAttribPointer(7, 3, GL_FLOAT, GL_FALSE, sizeof(GlowInstanceData), 0);
- glVertexAttribDivisor(7, 1);
- glEnableVertexAttribArray(8);
- glVertexAttribPointer(8, 3, GL_FLOAT, GL_FALSE, sizeof(GlowInstanceData), (GLvoid*)(3 * sizeof(float)));
- glVertexAttribDivisor(8, 1);
- glEnableVertexAttribArray(9);
- glVertexAttribPointer(9, 3, GL_FLOAT, GL_FALSE, sizeof(GlowInstanceData), (GLvoid*)(6 * sizeof(float)));
- glVertexAttribDivisor(9, 1);
- glEnableVertexAttribArray(12);
- glVertexAttribPointer(12, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(GlowInstanceData), (GLvoid*)(9 * sizeof(float)));
- glVertexAttribDivisor(12, 1);
- InstanceVAO[std::pair(tp, InstanceTypeGlow)] = vao;
- glBindVertexArray(0);
- }
-
-
-
-}
-
-size_t VAOManager::getVertexPitch(enum VTXTYPE tp) const
-{
- switch (tp)
- {
- case VTXTYPE_STANDARD:
- return getVertexPitchFromType(video::EVT_STANDARD);
- case VTXTYPE_TCOORD:
- return getVertexPitchFromType(video::EVT_2TCOORDS);
- case VTXTYPE_TANGENT:
- return getVertexPitchFromType(video::EVT_TANGENTS);
- default:
- assert(0 && "Wrong vtxtype");
- return -1;
- }
-}
-
-VAOManager::VTXTYPE VAOManager::getVTXTYPE(video::E_VERTEX_TYPE type)
-{
- switch (type)
- {
- default:
- assert(0 && "Wrong vtxtype");
- case video::EVT_STANDARD:
- return VTXTYPE_STANDARD;
- case video::EVT_2TCOORDS:
- return VTXTYPE_TCOORD;
- case video::EVT_TANGENTS:
- return VTXTYPE_TANGENT;
- }
-};
-
-void VAOManager::append(scene::IMeshBuffer *mb, VTXTYPE tp)
-{
- size_t old_vtx_cnt = vtx_cnt[tp];
- vtx_cnt[tp] += mb->getVertexCount();
- vtx_mirror[tp] = realloc(vtx_mirror[tp], vtx_cnt[tp] * getVertexPitch(tp));
- intptr_t dstptr = (intptr_t)vtx_mirror[tp] + (old_vtx_cnt * getVertexPitch(tp));
- memcpy((void *)dstptr, mb->getVertices(), mb->getVertexCount() * getVertexPitch(tp));
- mappedBaseVertex[tp][mb] = old_vtx_cnt;
-
- size_t old_idx_cnt = idx_cnt[tp];
- idx_cnt[tp] += mb->getIndexCount();
- idx_mirror[tp] = realloc(idx_mirror[tp], idx_cnt[tp] * sizeof(u16));
-
- dstptr = (intptr_t)idx_mirror[tp] + (old_idx_cnt * sizeof(u16));
- memcpy((void *)dstptr, mb->getIndices(), mb->getIndexCount() * sizeof(u16));
- mappedBaseIndex[tp][mb] = old_idx_cnt * sizeof(u16);
-}
-
-std::pair VAOManager::getBase(scene::IMeshBuffer *mb)
-{
- VTXTYPE tp = getVTXTYPE(mb->getVertexType());
- if (mappedBaseVertex[tp].find(mb) == mappedBaseVertex[tp].end())
- {
- assert(mappedBaseIndex[tp].find(mb) == mappedBaseIndex[tp].end());
- storedCPUBuffer[tp].push_back(mb);
- append(mb, tp);
- regenerateBuffer(tp);
- regenerateVAO(tp);
- regenerateInstancedVAO();
- }
-
- std::map::iterator It;
- It = mappedBaseVertex[tp].find(mb);
- assert(It != mappedBaseVertex[tp].end());
- unsigned vtx = It->second;
- It = mappedBaseIndex[tp].find(mb);
- assert(It != mappedBaseIndex[tp].end());
- return std::pair(vtx, It->second);
-}
-
-size_t VAOManager::appendInstance(enum InstanceType, const std::vector &instance_data)
-{
- glBindBuffer(GL_ARRAY_BUFFER, instance_vbo[0]);
- glBufferSubData(GL_ARRAY_BUFFER, instance_count[0] * sizeof(InstanceData), instance_data.size() * sizeof(InstanceData), instance_data.data());
- size_t result = instance_count[0];
- instance_count[0] += instance_data.size();
- return result;
-}
-
ScopedGPUTimer::ScopedGPUTimer(GPUTimer &t) : timer(t)
{
if (!UserConfigParams::m_profiler_enabled) return;
diff --git a/src/graphics/glwrap.hpp b/src/graphics/glwrap.hpp
index cd4da2a20..8fa49c6c4 100644
--- a/src/graphics/glwrap.hpp
+++ b/src/graphics/glwrap.hpp
@@ -6,7 +6,7 @@
#include
#include "irr_driver.hpp"
#include "utils/log.hpp"
-
+#include "vaomanager.hpp"
void initGL();
GLuint LoadTFBProgram(const char * vertex_file_path, const char **varyings, unsigned varyingscount);
@@ -42,24 +42,22 @@ void printFileList(GLint ShaderType, const char *filepath, Types ... args)
printFileList(args...);
}
+enum AttributeType
+{
+ OBJECT,
+ PARTICLES_SIM,
+ PARTICLES_RENDERING,
+};
+
+void setAttribute(AttributeType Tp, GLuint ProgramID);
+
template
-GLint LoadProgram(Types ... args)
+GLint LoadProgram(AttributeType Tp, Types ... args)
{
GLint ProgramID = glCreateProgram();
loadAndAttach(ProgramID, args...);
if (irr_driver->getGLSLVersion() < 330)
- {
- glBindAttribLocation(ProgramID, 0, "Position");
- glBindAttribLocation(ProgramID, 1, "Normal");
- glBindAttribLocation(ProgramID, 2, "Color");
- glBindAttribLocation(ProgramID, 3, "Texcoord");
- glBindAttribLocation(ProgramID, 4, "SecondTexcoord");
- glBindAttribLocation(ProgramID, 5, "Tangent");
- glBindAttribLocation(ProgramID, 6, "Bitangent");
- glBindAttribLocation(ProgramID, 7, "Origin");
- glBindAttribLocation(ProgramID, 8, "Orientation");
- glBindAttribLocation(ProgramID, 9, "Scale");
- }
+ setAttribute(Tp, ProgramID);
glLinkProgram(ProgramID);
GLint Result = GL_FALSE;
@@ -139,110 +137,6 @@ void compressTexture(irr::video::ITexture *tex, bool srgb, bool premul_alpha = f
bool loadCompressedTexture(const std::string& compressed_tex);
void saveCompressedTexture(const std::string& compressed_tex);
-enum InstanceType
-{
- InstanceTypeDefault,
- InstanceTypeShadow,
- InstanceTypeRSM,
- InstanceTypeGlow,
- InstanceTypeCount,
-};
-
-#ifdef WIN32
-#pragma pack(push, 1)
-#endif
-struct InstanceData
-{
- struct
- {
- float X;
- float Y;
- float Z;
- } Origin;
- struct
- {
- float X;
- float Y;
- float Z;
- } Orientation;
- struct
- {
- float X;
- float Y;
- float Z;
- } Scale;
- uint64_t Texture;
- uint64_t SecondTexture;
-#ifdef WIN32
-};
-#else
-} __attribute__((packed));
-#endif
-
-struct GlowInstanceData
-{
- struct
- {
- float X;
- float Y;
- float Z;
- } Origin;
- struct
- {
- float X;
- float Y;
- float Z;
- } Orientation;
- struct
- {
- float X;
- float Y;
- float Z;
- } Scale;
- unsigned Color;
-#ifdef WIN32
-};
-#else
-} __attribute__((packed));
-#endif
-#ifdef WIN32
-#pragma pack(pop)
-#endif
-
-class VAOManager : public Singleton
-{
- enum VTXTYPE { VTXTYPE_STANDARD, VTXTYPE_TCOORD, VTXTYPE_TANGENT, VTXTYPE_COUNT };
- GLuint vbo[VTXTYPE_COUNT], ibo[VTXTYPE_COUNT], vao[VTXTYPE_COUNT];
- GLuint instance_vbo[InstanceTypeCount];
- size_t instance_count[InstanceTypeCount];
- void *Ptr[InstanceTypeCount];
- void *VBOPtr[VTXTYPE_COUNT];
- std::vector storedCPUBuffer[VTXTYPE_COUNT];
- void *vtx_mirror[VTXTYPE_COUNT], *idx_mirror[VTXTYPE_COUNT];
- size_t vtx_cnt[VTXTYPE_COUNT], idx_cnt[VTXTYPE_COUNT];
- std::map mappedBaseVertex[VTXTYPE_COUNT], mappedBaseIndex[VTXTYPE_COUNT];
- std::map, GLuint> InstanceVAO;
-
- void cleanInstanceVAOs();
- void regenerateBuffer(enum VTXTYPE);
- void regenerateVAO(enum VTXTYPE);
- void regenerateInstancedVAO();
- size_t getVertexPitch(enum VTXTYPE) const;
- VTXTYPE getVTXTYPE(video::E_VERTEX_TYPE type);
- void append(scene::IMeshBuffer *, VTXTYPE tp);
-public:
- VAOManager();
- std::pair getBase(scene::IMeshBuffer *);
- size_t appendInstance(enum InstanceType, const std::vector &instance_data);
- GLuint getInstanceBuffer(InstanceType it) { return instance_vbo[it]; }
- void *getInstanceBufferPtr(InstanceType it) { return Ptr[it]; }
- unsigned getVBO(video::E_VERTEX_TYPE type) { return vbo[getVTXTYPE(type)]; }
- void *getVBOPtr(video::E_VERTEX_TYPE type) { return VBOPtr[getVTXTYPE(type)]; }
- unsigned getVAO(video::E_VERTEX_TYPE type) { return vao[getVTXTYPE(type)]; }
- unsigned getInstanceVAO(video::E_VERTEX_TYPE vt, enum InstanceType it) { return InstanceVAO[std::pair(vt, it)]; }
- ~VAOManager();
-};
-
void draw3DLine(const core::vector3df& start,
const core::vector3df& end, irr::video::SColor color);
diff --git a/src/graphics/gpuparticles.cpp b/src/graphics/gpuparticles.cpp
index 2c7656863..d8e36019e 100644
--- a/src/graphics/gpuparticles.cpp
+++ b/src/graphics/gpuparticles.cpp
@@ -1,4 +1,5 @@
#include "graphics/irr_driver.hpp"
+#include "graphics/glwrap.hpp"
#include "gpuparticles.hpp"
#include "io/file_manager.hpp"
#include "config/user_config.hpp"
diff --git a/src/graphics/gpuparticles.hpp b/src/graphics/gpuparticles.hpp
index 94ca75f81..138734bb9 100644
--- a/src/graphics/gpuparticles.hpp
+++ b/src/graphics/gpuparticles.hpp
@@ -1,8 +1,6 @@
#ifndef GPUPARTICLES_H
#define GPUPARTICLES_H
-#include "graphics/glwrap.hpp"
-
#include "../lib/irrlicht/source/Irrlicht/CParticleSystemSceneNode.h"
#include
#include
diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp
index 15d911208..8e7ed3c75 100644
--- a/src/graphics/irr_driver.cpp
+++ b/src/graphics/irr_driver.cpp
@@ -504,34 +504,35 @@ void IrrDriver::initDevice()
hasComputeShaders = false;
hasTextureStorage = false;
// Default false value for hasVSLayer if --no-graphics argument is used
+#if !defined(__APPLE__)
if (!ProfileWorld::isNoGraphics())
{
- if (GLEW_AMD_vertex_shader_layer) {
+ if (hasGLExtension("GL_AMD_vertex_shader_layer")) {
hasVSLayer = true;
Log::info("GLDriver", "AMD Vertex Shader Layer enabled");
}
- if (GLEW_ARB_buffer_storage) {
+ if (hasGLExtension("GL_ARB_buffer_storage")) {
hasBuffserStorage = true;
Log::info("GLDriver", "ARB Buffer Storage enabled");
}
- if (GLEW_ARB_base_instance) {
+ if (hasGLExtension("GL_ARB_base_instance")) {
hasBaseInstance = true;
Log::info("GLDriver", "ARB Base Instance enabled");
}
- if (GLEW_ARB_draw_indirect) {
+ if (hasGLExtension("GL_ARB_draw_indirect")) {
hasDrawIndirect = true;
Log::info("GLDriver", "ARB Draw Indirect enabled");
}
- if (GLEW_ARB_compute_shader) {
+ if (hasGLExtension("GL_ARB_compute_shader")) {
hasComputeShaders = true;
Log::info("GLDriver", "ARB Compute Shader enabled");
}
- if (GLEW_ARB_texture_storage) {
+ if (hasGLExtension("GL_ARB_texture_storage")) {
hasTextureStorage = true;
Log::info("GLDriver", "ARB Texture Storage enabled");
}
}
-
+#endif
// This remaps the window, so it has to be done before the clear to avoid flicker
@@ -1742,17 +1743,12 @@ void IrrDriver::displayFPS()
if (low > kilotris) low = kilotris;
if (high < kilotris) high = kilotris;
- static char buffer[128];
+ core::stringw fpsString;
if (UserConfigParams::m_artist_debug_mode)
{
- sprintf(
- buffer, "FPS: %i/%i/%i - PolyCount (Solid:%d Shadows:%d) - LightDst : ~%d",
- min, fps, max,
- poly_count[SOLID_NORMAL_AND_DEPTH_PASS],
- poly_count[SHADOW_PASS],
- m_last_light_bucket_distance
- );
+ fpsString = StringUtils::insertValues(_("FPS: %d/%d/%d - PolyCount: %d Solid, %d Shadows - LightDist : %d"),
+ min, fps, max, poly_count[SOLID_NORMAL_AND_DEPTH_PASS], poly_count[SHADOW_PASS], m_last_light_bucket_distance);
poly_count[SOLID_NORMAL_AND_DEPTH_PASS] = 0;
poly_count[SHADOW_PASS] = 0;
object_count[SOLID_NORMAL_AND_DEPTH_PASS] = 0;
@@ -1760,12 +1756,7 @@ void IrrDriver::displayFPS()
object_count[TRANSPARENT_PASS] = 0;
}
else
- {
- sprintf(buffer, "FPS: %i/%i/%i - %i KTris", min, fps, max,
- (int)roundf(kilotris));
- }
-
- core::stringw fpsString = buffer;
+ fpsString = StringUtils::insertValues(_("FPS: %d/%d/%d - %d KTris"), min, fps, max, (int)roundf(kilotris));
static video::SColor fpsColor = video::SColor(255, 0, 0, 0);
diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp
index f324b1dcd..95da8891b 100644
--- a/src/graphics/irr_driver.hpp
+++ b/src/graphics/irr_driver.hpp
@@ -419,7 +419,7 @@ private:
void renderRSM();
void renderGlow(std::vector& glows);
void renderSSAO();
- void renderLights(unsigned pointlightCount);
+ void renderLights(unsigned pointlightCount, bool hasShadow);
void renderShadowsDebug();
void doScreenShot();
void PrepareDrawCalls(scene::ICameraSceneNode *camnode);
diff --git a/src/graphics/lod_node.cpp b/src/graphics/lod_node.cpp
index 6a4e0ddf7..a044906db 100644
--- a/src/graphics/lod_node.cpp
+++ b/src/graphics/lod_node.cpp
@@ -68,6 +68,9 @@ void LODNode::render()
*/
int LODNode::getLevel()
{
+ if (m_nodes.size() == 0)
+ return -1;
+
// If a level is forced, use it
if(m_forced_lod>-1)
return m_forced_lod;
@@ -79,14 +82,13 @@ int LODNode::getLevel()
AbstractKart* kart = camera->getKart();
const Vec3 &pos = kart->getFrontXYZ();
- // Assumes all children are at the same location
const int dist =
- (int)((getPosition() + m_nodes[0]->getPosition()).getDistanceFromSQ( core::vector3df(pos.getX(), pos.getY(), pos.getZ())));
+ (int)((m_nodes[0]->getAbsolutePosition()).getDistanceFromSQ( core::vector3df(pos.getX(), pos.getY(), pos.getZ())));
for (unsigned int n=0; n 0)
{
// update absolute position
updateAbsolutePosition();
diff --git a/src/graphics/post_processing.cpp b/src/graphics/post_processing.cpp
index 0075fa354..139b6f023 100644
--- a/src/graphics/post_processing.cpp
+++ b/src/graphics/post_processing.cpp
@@ -337,7 +337,7 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a
assert(in_fbo.getWidth() == auxiliary.getWidth() && in_fbo.getHeight() == auxiliary.getHeight());
float inv_width = 1.0f / in_fbo.getWidth(), inv_height = 1.0f / in_fbo.getHeight();
{
- if (irr_driver->hasARBComputeShaders())
+ if (!irr_driver->hasARBComputeShaders())
{
auxiliary.Bind();
FullScreenShader::Gaussian17TapHShader::getInstance()->SetTextureUnits(createVector(in_fbo.getRTT()[0], irr_driver->getFBO(FBO_LINEAR_DEPTH).getRTT()[0]));
@@ -355,7 +355,7 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a
}
}
{
- if (irr_driver->hasARBComputeShaders())
+ if (!irr_driver->hasARBComputeShaders())
{
in_fbo.Bind();
diff --git a/src/graphics/post_processing.hpp b/src/graphics/post_processing.hpp
index 8c37a212b..a6b990432 100644
--- a/src/graphics/post_processing.hpp
+++ b/src/graphics/post_processing.hpp
@@ -22,7 +22,8 @@
#include "S3DVertex.h"
#include "SMaterial.h"
#include "graphics/camera.hpp"
-#include "graphics/glwrap.hpp"
+
+class FrameBuffer;
#include
diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp
index ee510d776..645f6793e 100644
--- a/src/graphics/render.cpp
+++ b/src/graphics/render.cpp
@@ -47,6 +47,9 @@
#include "utils/log.hpp"
#include "utils/profiler.hpp"
#include "stkscenemanager.hpp"
+#include "items/powerup_manager.hpp"
+#include "../../lib/irrlicht/source/Irrlicht/CSceneManager.h"
+#include "../../lib/irrlicht/source/Irrlicht/os.h"
#include
#include
@@ -60,6 +63,27 @@ void IrrDriver::renderGLSL(float dt)
Track *track = world->getTrack();
+ for (unsigned i = 0; i < PowerupManager::POWERUP_MAX; i++)
+ {
+ scene::IMesh *mesh = powerup_manager->m_all_meshes[i];
+ if (!mesh)
+ continue;
+ for (unsigned j = 0; j < mesh->getMeshBufferCount(); j++)
+ {
+ scene::IMeshBuffer *mb = mesh->getMeshBuffer(j);
+ if (!mb)
+ continue;
+ for (unsigned k = 0; k < 4; k++)
+ {
+ video::ITexture *tex = mb->getMaterial().getTexture(k);
+ if (!tex)
+ continue;
+ compressTexture(tex, true);
+ }
+ }
+ }
+
+
// Overrides
video::SOverrideMaterial &overridemat = m_video_driver->getOverrideMaterial();
overridemat.EnablePasses = scene::ESNRP_SOLID | scene::ESNRP_TRANSPARENT;
@@ -311,7 +335,7 @@ void IrrDriver::renderScene(scene::ICameraSceneNode * const camnode, unsigned po
// Lights
{
PROFILER_PUSH_CPU_MARKER("- Light", 0x00, 0xFF, 0x00);
- renderLights(pointlightcount);
+ renderLights(pointlightcount, hasShadow);
PROFILER_POP_CPU_MARKER();
}
@@ -572,7 +596,8 @@ core::matrix4 getTighestFitOrthoProj(const core::matrix4 &transform, const std::
void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, size_t width, size_t height)
{
- m_scene_manager->drawAll(scene::ESNRP_CAMERA);
+ static_cast(m_scene_manager)->OnAnimate(os::Timer::getTime());
+ camnode->render();
irr_driver->setProjMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_PROJECTION));
irr_driver->setViewMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_VIEW));
irr_driver->genProjViewMatrix();
diff --git a/src/graphics/render_geometry.cpp b/src/graphics/render_geometry.cpp
index 74c89078b..c9543e907 100644
--- a/src/graphics/render_geometry.cpp
+++ b/src/graphics/render_geometry.cpp
@@ -32,6 +32,51 @@
#include
+/**
+\page render_geometry Geometry Rendering Overview
+
+/**
+\section adding_material Adding a solid material
+
+You need to consider twice before adding a new material : in the worst case a material requires 8 shaders :
+one for each solid pass, one for shadow pass, one for RSM pass, and you need to double that for instanced version.
+
+You need to declare a new enum in MeshMaterial and to write the corresponding dispatch code in MaterialTypeToMeshMaterial
+and to create 2 new List* structures (one for standard and one for instanced version).
+
+Then you need to write the code in stkscenemanager.cpp that will add any mesh with the new material to their corresponding
+lists : in handleSTKCommon for the standard version and in the body of PrepareDrawCalls for instanced version.
+
+\section vertex_layout Available Vertex Layout
+
+There are 3 different layout that comes from Irrlicht loading routines :
+EVT_STANDARD, EVT_2TCOORDS, EVT_TANGENT.
+
+Below are the attributes for each vertex layout and their predefined location.
+
+\subsection EVT_STANDARD
+layout(location = 0) in vec3 Position;
+layout(location = 1) in vec3 Normal;
+layout(location = 2) in vec4 Color;
+layout(location = 3) in vec2 Texcoord;
+
+\subsection EVT_2TCOORDS
+layout(location = 0) in vec3 Position;
+layout(location = 1) in vec3 Normal;
+layout(location = 2) in vec4 Color;
+layout(location = 3) in vec2 Texcoord;
+layout(location = 4) in vec2 SecondTexcoord;
+
+\subsection EVT_TANGENT
+layout(location = 0) in vec3 Position;
+layout(location = 1) in vec3 Normal;
+layout(location = 2) in vec4 Color;
+layout(location = 3) in vec2 Texcoord;
+layout(location = 5) in vec3 Tangent;
+layout(location = 6) in vec3 Bitangent;
+
+*/
+
namespace RenderGeometry
{
struct TexUnit
@@ -151,7 +196,6 @@ void renderMeshes1stPass(const std::vector &TexUnits, std::vector
void renderInstancedMeshes1stPass(const std::vector &TexUnits, std::vector &meshes, Args...args)
{
@@ -173,9 +217,7 @@ void renderInstancedMeshes1stPass(const std::vector &TexUnits, std::vec
glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)((SolidPassCmd::getInstance()->Offset[Mat] + i) * sizeof(DrawElementsIndirectCommand)));
}
}
-#endif
-#ifdef Multi_Draw_Indirect
template
void multidraw1stPass(Args...args)
{
@@ -190,7 +232,6 @@ void multidraw1stPass(Args...args)
sizeof(DrawElementsIndirectCommand));
}
}
-#endif
static core::vector3df windDir;
@@ -208,6 +249,9 @@ void IrrDriver::renderSolidFirstPass()
glDisable(GL_BLEND);
glEnable(GL_CULL_FACE);
+ if (irr_driver->hasARB_draw_indirect())
+ glBindBuffer(GL_DRAW_INDIRECT_BUFFER, SolidPassCmd::getInstance()->drawindirectcmd);
+
if (!UserConfigParams::m_dynamic_lights)
return;
@@ -231,12 +275,8 @@ void IrrDriver::renderSolidFirstPass()
renderMeshes1stPass(object_pass1_texunits, ListMatSphereMap::getInstance()->SolidPass);
renderMeshes1stPass(object_pass1_texunits, ListMatDetails::getInstance()->SolidPass);
- if (irr_driver->hasARB_draw_indirect())
- glBindBuffer(GL_DRAW_INDIRECT_BUFFER, SolidPassCmd::getInstance()->drawindirectcmd);
-
if (UserConfigParams::m_azdo)
{
-#ifdef Multi_Draw_Indirect
multidraw1stPass();
multidraw1stPass();
multidraw1stPass();
@@ -244,9 +284,7 @@ void IrrDriver::renderSolidFirstPass()
multidraw1stPass();
multidraw1stPass();
multidraw1stPass(windDir);
-#endif
}
-#ifdef Draw_Indirect
else if (irr_driver->hasARB_draw_indirect())
{
// Default
@@ -273,7 +311,6 @@ void IrrDriver::renderSolidFirstPass()
renderInstancedMeshes1stPass(
TexUnits(TexUnit(1, false), TexUnit(0, true)), ListInstancedMatNormalMap::getInstance()->SolidPass);
}
-#endif
}
}
@@ -315,7 +352,6 @@ void renderMeshes2ndPass(const std::vector &TexUnits, std::vector
void renderInstancedMeshes2ndPass(const std::vector &TexUnits, const std::vector &Prefilled_tex, std::vector &meshes, Args...args)
{
@@ -332,9 +368,7 @@ void renderInstancedMeshes2ndPass(const std::vector &TexUnits, const st
glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)((SolidPassCmd::getInstance()->Offset[Mat] + i) * sizeof(DrawElementsIndirectCommand)));
}
}
-#endif
-#ifdef Multi_Draw_Indirect
template
void multidraw2ndPass(const std::vector &Handles, Args... args)
{
@@ -350,7 +384,6 @@ void multidraw2ndPass(const std::vector &Handles, Args... args)
sizeof(DrawElementsIndirectCommand));
}
}
-#endif
void IrrDriver::renderSolidSecondPass()
{
@@ -379,7 +412,6 @@ void IrrDriver::renderSolidSecondPass()
if (UserConfigParams::m_azdo)
{
-#ifdef Bindless_Texture_Support
DiffuseHandle = glGetTextureSamplerHandleARB(m_rtts->getRenderTarget(RTT_DIFFUSE), MeshShader::ObjectPass2Shader::getInstance()->SamplersId[0]);
if (!glIsTextureHandleResidentARB(DiffuseHandle))
glMakeTextureHandleResidentARB(DiffuseHandle);
@@ -395,7 +427,6 @@ void IrrDriver::renderSolidSecondPass()
DepthHandle = glGetTextureSamplerHandleARB(getDepthStencilTexture(), MeshShader::ObjectPass2Shader::getInstance()->SamplersId[3]);
if (!glIsTextureHandleResidentARB(DepthHandle))
glMakeTextureHandleResidentARB(DepthHandle);
-#endif
}
{
@@ -441,7 +472,6 @@ void IrrDriver::renderSolidSecondPass()
if (UserConfigParams::m_azdo)
{
-#ifdef Multi_Draw_Indirect
multidraw2ndPass(createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
multidraw2ndPass(createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
multidraw2ndPass(createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
@@ -450,9 +480,7 @@ void IrrDriver::renderSolidSecondPass()
multidraw2ndPass(createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
SunLightProvider * const cb = (SunLightProvider *)irr_driver->getCallback(ES_SUNLIGHT);
multidraw2ndPass(createVector(DiffuseHandle, SpecularHandle, SSAOHandle, DepthHandle, 0), windDir, cb->getPosition());
-#endif
}
-#ifdef Draw_Indirect
else if (irr_driver->hasARB_draw_indirect())
{
// Default
@@ -481,7 +509,6 @@ void IrrDriver::renderSolidSecondPass()
renderInstancedMeshes2ndPass(
TexUnits(TexUnit(0, true)), DiffSpecSSAOTex, ListInstancedMatGrass::getInstance()->SolidPass, windDir, cb->getPosition());
}
-#endif
}
}
@@ -537,12 +564,10 @@ void renderTransparenPass(const std::vector &TexUnits, std::vectorSamplersId[Handles.size()]);
if (!glIsTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id]))
glMakeTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id]);
-#endif
Handles.push_back(mesh.TextureHandles[TexUnits[j].m_id]);
}
else
@@ -752,7 +777,6 @@ void renderShadow(const std::vector TextureUnits, unsigned cascade, cons
}
}
-#ifdef Draw_Indirect
template
void renderInstancedShadow(const std::vector TextureUnits, unsigned cascade, const std::vector &t, Args ...args)
{
@@ -773,9 +797,7 @@ void renderInstancedShadow(const std::vector TextureUnits, unsigned casc
glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)((tmp) * sizeof(DrawElementsIndirectCommand)));
}
}
-#endif
-#ifdef Multi_Draw_Indirect
template
static void multidrawShadow(unsigned i, Args ...args)
{
@@ -787,7 +809,6 @@ static void multidrawShadow(unsigned i, Args ...args)
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)(ShadowPassCmd::getInstance()->Offset[i][Mat] * sizeof(DrawElementsIndirectCommand)), ShadowPassCmd::getInstance()->Size[i][Mat], sizeof(DrawElementsIndirectCommand));
}
}
-#endif
void IrrDriver::renderShadows()
{
@@ -824,16 +845,13 @@ void IrrDriver::renderShadows()
if (UserConfigParams::m_azdo)
{
-#ifdef Multi_Draw_Indirect
multidrawShadow(cascade);
multidrawShadow(cascade);
multidrawShadow(cascade);
multidrawShadow(cascade);
multidrawShadow(cascade);
multidrawShadow(cascade, windDir);
-#endif
}
-#ifdef Draw_Indirect
else if (irr_driver->hasARB_draw_indirect())
{
renderInstancedShadow(noTexUnits, cascade, ListInstancedMatDefault::getInstance()->Shadows[cascade]);
@@ -843,7 +861,6 @@ void IrrDriver::renderShadows()
renderInstancedShadow(std::vector < GLuint > { 0 }, cascade, ListInstancedMatGrass::getInstance()->Shadows[cascade], windDir);
renderInstancedShadow(noTexUnits, cascade, ListInstancedMatNormalMap::getInstance()->Shadows[cascade]);
}
-#endif
}
glDisable(GL_POLYGON_OFFSET_FILL);
@@ -893,7 +910,6 @@ void drawRSM(const core::matrix4 & rsm_matrix, const std::vector &Textur
}
}
-#ifdef Draw_Indirect
template
void renderRSMShadow(const std::vector TextureUnits, const std::vector &t, Args ...args)
{
@@ -913,9 +929,7 @@ void renderRSMShadow(const std::vector TextureUnits, const std::vectorOffset[Mat] + i)* sizeof(DrawElementsIndirectCommand)));
}
}
-#endif
-#ifdef Multi_Draw_Indirect
template
void multidrawRSM(Args...args)
{
@@ -927,7 +941,6 @@ void multidrawRSM(Args...args)
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)(RSMPassCmd::getInstance()->Offset[Mat] * sizeof(DrawElementsIndirectCommand)), RSMPassCmd::getInstance()->Size[Mat], sizeof(DrawElementsIndirectCommand));
}
}
-#endif
void IrrDriver::renderRSM()
{
@@ -947,15 +960,12 @@ void IrrDriver::renderRSM()
if (UserConfigParams::m_azdo)
{
-#ifdef Multi_Draw_Indirect
multidrawRSM(rsm_matrix);
multidrawRSM(rsm_matrix);
multidrawRSM(rsm_matrix);
multidrawRSM(rsm_matrix);
multidrawRSM(rsm_matrix);
-#endif
}
-#ifdef Draw_Indirect
else if (irr_driver->hasARB_draw_indirect())
{
renderRSMShadow(std::vector < GLuint > { 0 }, ListInstancedMatDefault::getInstance()->RSM, rsm_matrix);
@@ -964,5 +974,4 @@ void IrrDriver::renderRSM()
renderRSMShadow(std::vector < GLuint > { 0 }, ListInstancedMatNormalMap::getInstance()->RSM, rsm_matrix);
renderRSMShadow(std::vector < GLuint > { 0 }, ListInstancedMatDetails::getInstance()->RSM, rsm_matrix);
}
-#endif
}
diff --git a/src/graphics/render_lighting.cpp b/src/graphics/render_lighting.cpp
index d69c7a843..ee033432b 100644
--- a/src/graphics/render_lighting.cpp
+++ b/src/graphics/render_lighting.cpp
@@ -126,10 +126,10 @@ unsigned IrrDriver::UpdateLightsInfo(scene::ICameraSceneNode * const camnode, fl
return lightnum;
}
-void IrrDriver::renderLights(unsigned pointlightcount)
+void IrrDriver::renderLights(unsigned pointlightcount, bool hasShadow)
{
//RH
- if (UserConfigParams::m_gi)
+ if (UserConfigParams::m_gi && UserConfigParams::m_shadows && hasShadow)
{
ScopedGPUTimer timer(irr_driver->getGPUTimer(Q_RH));
glDisable(GL_BLEND);
@@ -171,7 +171,7 @@ void IrrDriver::renderLights(unsigned pointlightcount)
return;
m_rtts->getFBO(FBO_DIFFUSE).Bind();
- if (UserConfigParams::m_gi)
+ if (UserConfigParams::m_gi && UserConfigParams::m_shadows && hasShadow)
{
ScopedGPUTimer timer(irr_driver->getGPUTimer(Q_GI));
m_post_processing->renderGI(rh_matrix, rh_extend, m_rtts->getRH().getRTT()[0], m_rtts->getRH().getRTT()[1], m_rtts->getRH().getRTT()[2]);
diff --git a/src/graphics/render_skybox.cpp b/src/graphics/render_skybox.cpp
index 8fcd5c9a6..94d28fb2e 100644
--- a/src/graphics/render_skybox.cpp
+++ b/src/graphics/render_skybox.cpp
@@ -439,7 +439,7 @@ GLuint generateCubeMapFromTextures(const std::vector &texture
swapPixels(tmp, rgba[i], size, x, y, (size - y - 1), x);
}
}
- free(tmp);
+ delete[] tmp;
}
glBindTexture(GL_TEXTURE_CUBE_MAP, result);
@@ -574,4 +574,4 @@ void IrrDriver::renderSkybox(const scene::ICameraSceneNode *camera)
glDrawElements(GL_TRIANGLES, 6 * 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
-}
\ No newline at end of file
+}
diff --git a/src/graphics/rtts.hpp b/src/graphics/rtts.hpp
index e93f1edf1..6dd1e7aa4 100644
--- a/src/graphics/rtts.hpp
+++ b/src/graphics/rtts.hpp
@@ -17,15 +17,19 @@
#ifndef HEADER_RTTS_HPP
#define HEADER_RTTS_HPP
-#include "graphics/glwrap.hpp"
#include "graphics/irr_driver.hpp"
#include "utils/ptr_vector.hpp"
#include "utils/leak_check.hpp"
+class FrameBuffer;
+
namespace irr {
namespace video {
class ITexture;
};
+ namespace scene {
+ class ICameraSceneNode;
+ }
};
using irr::video::ITexture;
@@ -46,7 +50,7 @@ public:
unsigned getRenderTarget(enum TypeRTT target) const { return RenderTargetTextures[target]; }
FrameBuffer& getFBO(enum TypeFBO fbo) { return FrameBuffers[fbo]; }
- FrameBuffer* render(scene::ICameraSceneNode* camera, float dt);
+ FrameBuffer* render(irr::scene::ICameraSceneNode* camera, float dt);
private:
unsigned RenderTargetTextures[RTT_COUNT];
diff --git a/src/graphics/screenquad.hpp b/src/graphics/screenquad.hpp
index 478500946..dc2d7b2b2 100644
--- a/src/graphics/screenquad.hpp
+++ b/src/graphics/screenquad.hpp
@@ -17,8 +17,6 @@
#ifndef HEADER_SCREENQUAD_H
#define HEADER_SCREENQUAD_H
-#include "graphics/glwrap.hpp"
-
#include
#include
diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp
index 0b1391a8e..160760b8c 100644
--- a/src/graphics/shaders.cpp
+++ b/src/graphics/shaders.cpp
@@ -467,7 +467,7 @@ namespace UtilShader
void ColoredLine::init()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/coloredquad.frag").c_str());
glGenVertexArrays(1, &vao);
@@ -479,10 +479,6 @@ namespace UtilShader
glEnableVertexAttribArray(attrib_position);
glVertexAttribPointer(attrib_position, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);
uniform_color = glGetUniformLocation(Program, "color");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
}
void ColoredLine::setUniforms(const irr::video::SColor &col)
@@ -774,60 +770,47 @@ namespace MeshShader
// Solid Normal and depth pass shaders
ObjectPass1Shader::ObjectPass1Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_pass1.frag").c_str());
AssignUniforms("ModelMatrix", "InverseModelMatrix");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "tex");
}
ObjectRefPass1Shader::ObjectRefPass1Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectref_pass1.frag").c_str());
AssignUniforms("ModelMatrix", "InverseModelMatrix", "TextureMatrix");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "tex");
}
GrassPass1Shader::GrassPass1Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/grass_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectref_pass1.frag").c_str());
AssignUniforms("ModelMatrix", "InverseModelMatrix", "windDir");
-
AssignSamplerNames(Program, 0, "tex");
}
NormalMapShader::NormalMapShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/normalmap.frag").c_str());
AssignUniforms("ModelMatrix", "InverseModelMatrix");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 1, "normalMap", 0, "DiffuseForAlpha");
}
InstancedObjectPass1Shader::InstancedObjectPass1Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(),
@@ -835,14 +818,11 @@ namespace MeshShader
AssignUniforms();
AssignSamplerNames(Program, 0, "tex");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
InstancedObjectRefPass1Shader::InstancedObjectRefPass1Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(),
@@ -850,216 +830,160 @@ namespace MeshShader
AssignUniforms();
AssignSamplerNames(Program, 0, "tex");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
InstancedGrassPass1Shader::InstancedGrassPass1Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_grass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_objectref_pass1.frag").c_str());
AssignUniforms("windDir");
-
AssignSamplerNames(Program, 0, "tex");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
InstancedNormalMapShader::InstancedNormalMapShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_normalmap.frag").c_str());
AssignUniforms();
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "normalMap", 1, "DiffuseForAlpha");
}
// Solid Lit pass shaders
ObjectPass2Shader::ObjectPass2Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_pass2.frag").c_str());
AssignUniforms("ModelMatrix", "TextureMatrix");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "Albedo");
}
InstancedObjectPass2Shader::InstancedObjectPass2Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_object_pass2.frag").c_str());
AssignUniforms();
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "Albedo");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
}
InstancedObjectRefPass2Shader::InstancedObjectRefPass2Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_objectref_pass2.frag").c_str());
AssignUniforms();
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "Albedo");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
DetailledObjectPass2Shader::DetailledObjectPass2Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/detailledobject_pass2.frag").c_str());
AssignUniforms("ModelMatrix");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "Albedo", 4, "Detail");
}
InstancedDetailledObjectPass2Shader::InstancedDetailledObjectPass2Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_detailledobject_pass2.frag").c_str());
AssignUniforms();
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "Albedo", 4, "Detail");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
ObjectUnlitShader::ObjectUnlitShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str());
AssignUniforms("ModelMatrix", "TextureMatrix");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "tex");
}
InstancedObjectUnlitShader::InstancedObjectUnlitShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_object_unlit.frag").c_str());
AssignUniforms();
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "tex");
}
ObjectRefPass2Shader::ObjectRefPass2Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectref_pass2.frag").c_str());
AssignUniforms("ModelMatrix", "TextureMatrix");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "Albedo");
}
GrassPass2Shader::GrassPass2Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/grass_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/grass_pass2.frag").c_str());
AssignUniforms("ModelMatrix", "windDir");
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "Albedo");
}
InstancedGrassPass2Shader::InstancedGrassPass2Shader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_grass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_grass_pass2.frag").c_str());
AssignUniforms("windDir", "SunDir");
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "dtex", 4, "Albedo");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
SphereMapShader::SphereMapShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectpass_spheremap.frag").c_str());
AssignUniforms("ModelMatrix", "InverseModelMatrix");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "tex");
}
InstancedSphereMapShader::InstancedSphereMapShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_objectpass_spheremap.frag").c_str());
AssignUniforms();
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "DiffuseMap", 1, "SpecularMap", 2, "SSAO", 3, "tex");
}
SplattingShader::SplattingShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/splatting.frag").c_str());
@@ -1084,7 +1008,7 @@ namespace MeshShader
void BubbleShader::init()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/bubble.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/bubble.frag").c_str());
uniform_MVP = glGetUniformLocation(Program, "ModelViewProjectionMatrix");
@@ -1102,64 +1026,47 @@ namespace MeshShader
TransparentShader::TransparentShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/transparent.frag").c_str());
AssignUniforms("ModelMatrix", "TextureMatrix");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "tex");
}
TransparentFogShader::TransparentFogShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/transparentfog.frag").c_str());
AssignUniforms("ModelMatrix", "TextureMatrix", "fogmax", "startH", "endH", "start", "end", "col");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "tex");
}
BillboardShader::BillboardShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/billboard.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/billboard.frag").c_str());
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
AssignUniforms("ModelViewMatrix", "ProjectionMatrix", "Position", "Size");
-
AssignSamplerNames(Program, 0, "tex");
}
ColorizeShader::ColorizeShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/colorize.frag").c_str());
AssignUniforms("ModelMatrix", "col");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
InstancedColorizeShader::InstancedColorizeShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/glow_object.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/glow_object.frag").c_str());
AssignUniforms();
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
ShadowShader::ShadowShader()
@@ -1169,60 +1076,49 @@ namespace MeshShader
return;
if (irr_driver->hasVSLayerExtension())
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/shadow.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str());
}
else
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/shadow.vert").c_str(),
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/shadow.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str());
}
AssignUniforms("layer", "ModelMatrix");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
RSMShader::RSMShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/rsm.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/rsm.frag").c_str());
AssignUniforms("RSMMatrix", "ModelMatrix", "TextureMatrix");
AssignSamplerNames(Program, 0, "tex");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
InstancedRSMShader::InstancedRSMShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_rsm.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_rsm.frag").c_str());
AssignUniforms("RSMMatrix");
AssignSamplerNames(Program, 0, "tex");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
SplattingRSMShader::SplattingRSMShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/rsm.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/splatting_rsm.frag").c_str());
AssignUniforms("RSMMatrix", "ModelMatrix");
AssignSamplerNames(Program, 0, "tex_layout", 1, "tex_detail0", 2, "tex_detail1", 3, "tex_detail2", 4, "tex_detail3");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
InstancedShadowShader::InstancedShadowShader()
@@ -1232,22 +1128,20 @@ namespace MeshShader
return;
if (irr_driver->hasVSLayerExtension())
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanciedshadow.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str());
}
else
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanciedshadow.vert").c_str(),
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/instanced_shadow.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str());
}
AssignUniforms("layer");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
RefShadowShader::RefShadowShader()
@@ -1257,21 +1151,18 @@ namespace MeshShader
return;
if (irr_driver->hasVSLayerExtension())
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/shadow.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str());
}
else
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/shadow.vert").c_str(),
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/shadow.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str());
}
AssignUniforms("layer", "ModelMatrix");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "tex");
}
@@ -1282,14 +1173,14 @@ namespace MeshShader
return;
if (irr_driver->hasVSLayerExtension())
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanciedshadow.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_shadowref.frag").c_str());
}
else
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanciedshadow.vert").c_str(),
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/instanced_shadow.geom").c_str(),
@@ -1297,8 +1188,6 @@ namespace MeshShader
}
AssignUniforms("layer");
AssignSamplerNames(Program, 0, "tex");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
GrassShadowShader::GrassShadowShader()
@@ -1308,21 +1197,18 @@ namespace MeshShader
return;
if (irr_driver->hasVSLayerExtension())
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/shadow_grass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str());
}
else
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/shadow_grass.vert").c_str(),
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/shadow.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str());
}
AssignUniforms("layer", "ModelMatrix", "windDir");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
AssignSamplerNames(Program, 0, "tex");
}
@@ -1333,14 +1219,14 @@ namespace MeshShader
return;
if (irr_driver->hasVSLayerExtension())
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanciedgrassshadow.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/instanced_shadowref.frag").c_str());
}
else
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/utils/getworldmatrix.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanciedgrassshadow.vert").c_str(),
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/instanced_shadow.geom").c_str(),
@@ -1348,27 +1234,21 @@ namespace MeshShader
}
AssignSamplerNames(Program, 0, "tex");
-
AssignUniforms("layer", "windDir");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
DisplaceMaskShader::DisplaceMaskShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/displace.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str());
AssignUniforms("ModelMatrix");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
DisplaceShader::DisplaceShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/displace.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/displace.frag").c_str());
AssignUniforms("ModelMatrix", "dir", "dir2");
@@ -1378,21 +1258,16 @@ namespace MeshShader
1, "color_tex",
2, "mask_tex",
3, "tex");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
SkyboxShader::SkyboxShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/sky.frag").c_str());
AssignUniforms("ModelMatrix");
AssignSamplerNames(Program, 0, "tex");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
glGenVertexArrays(1, &cubevao);
glBindVertexArray(cubevao);
glBindBuffer(GL_ARRAY_BUFFER, SharedObject::cubevbo);
@@ -1404,14 +1279,11 @@ namespace MeshShader
NormalVisualizer::NormalVisualizer()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/normal_visualizer.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/coloredquad.frag").c_str());
AssignUniforms("ModelMatrix", "InverseModelMatrix", "color");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
GLuint ViewFrustrumShader::Program;
@@ -1422,14 +1294,11 @@ namespace MeshShader
void ViewFrustrumShader::init()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/frustrum.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/coloredquad.frag").c_str());
attrib_position = glGetAttribLocation(Program, "Position");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
-
uniform_color = glGetUniformLocation(Program, "color");
uniform_idx = glGetUniformLocation(Program, "idx");
@@ -1453,7 +1322,7 @@ namespace LightShader
{
PointLightShader::PointLightShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/pointlight.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/decodeNormal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getSpecular.frag").c_str(),
@@ -1522,7 +1391,7 @@ namespace ParticleShader
SimpleParticleRender::SimpleParticleRender()
{
- Program = LoadProgram(
+ Program = LoadProgram(PARTICLES_RENDERING,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/particle.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/particle.frag").c_str());
@@ -1533,7 +1402,7 @@ namespace ParticleShader
FlipParticleRender::FlipParticleRender()
{
- Program = LoadProgram(
+ Program = LoadProgram(PARTICLES_RENDERING,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/flipparticle.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/particle.frag").c_str());
@@ -1563,7 +1432,7 @@ namespace FullScreenShader
{
BloomShader::BloomShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getCIEXYZ.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/bloom.frag").c_str());
@@ -1574,7 +1443,7 @@ namespace FullScreenShader
BloomBlendShader::BloomBlendShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/bloomblend.frag").c_str());
AssignUniforms();
@@ -1584,7 +1453,7 @@ namespace FullScreenShader
ToneMapShader::ToneMapShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getRGBfromCIEXxy.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getCIEXYZ.frag").c_str(),
@@ -1596,20 +1465,17 @@ namespace FullScreenShader
DepthOfFieldShader::DepthOfFieldShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/dof.frag").c_str());
AssignUniforms();
AssignSamplerNames(Program, 0, "tex", 1, "dtex");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
SunLightShader::SunLightShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/decodeNormal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getSpecular.frag").c_str(),
@@ -1618,14 +1484,11 @@ namespace FullScreenShader
AssignSamplerNames(Program, 0, "ntex", 1, "dtex");
AssignUniforms("direction", "col");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
DiffuseEnvMapShader::DiffuseEnvMapShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/decodeNormal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/diffuseenvmap.frag").c_str());
@@ -1635,7 +1498,7 @@ namespace FullScreenShader
ShadowedSunLightShader::ShadowedSunLightShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/decodeNormal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getSpecular.frag").c_str(),
@@ -1645,24 +1508,19 @@ namespace FullScreenShader
// Use 8 to circumvent a catalyst bug when binding sampler
AssignSamplerNames(Program, 0, "ntex", 1, "dtex", 8, "shadowtex");
AssignUniforms("direction", "col");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
RadianceHintsConstructionShader::RadianceHintsConstructionShader()
{
- if (irr_driver->getGLSLVersion() < 150)
- return;
if (irr_driver->hasVSLayerExtension())
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/slicedscreenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/rh.frag").c_str());
}
else
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/slicedscreenquad.vert").c_str(),
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/rhpassthrough.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/rh.frag").c_str());
@@ -1674,9 +1532,7 @@ namespace FullScreenShader
NVWorkaroundRadianceHintsConstructionShader::NVWorkaroundRadianceHintsConstructionShader()
{
- if (irr_driver->getGLSLVersion() < 150)
- return;
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/slicedscreenquad_nvworkaround.vert").c_str(),
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/rhpassthrough.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/rh.frag").c_str());
@@ -1688,7 +1544,7 @@ namespace FullScreenShader
RHDebug::RHDebug()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/rhdebug.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/rhdebug.frag").c_str());
AssignUniforms("RHMatrix", "extents");
@@ -1696,41 +1552,32 @@ namespace FullScreenShader
TU_SHG = 1;
TU_SHB = 2;
AssignTextureUnit(Program, TexUnit(TU_SHR, "SHR"), TexUnit(TU_SHG, "SHG"), TexUnit(TU_SHB, "SHB"));
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
GlobalIlluminationReconstructionShader::GlobalIlluminationReconstructionShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/decodeNormal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/gi.frag").c_str());
AssignUniforms("RHMatrix", "InvRHMatrix", "extents");
-
AssignSamplerNames(Program, 0, "ntex", 1, "dtex", 2, "SHR", 3, "SHG", 4, "SHB");
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
Gaussian17TapHShader::Gaussian17TapHShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/bilateralH.frag").c_str());
AssignUniforms("pixel");
-
AssignSamplerNames(Program, 0, "tex", 1, "depth");
}
ComputeGaussian17TapHShader::ComputeGaussian17TapHShader()
{
-
- if (irr_driver->hasARBComputeShaders())
- return;
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_COMPUTE_SHADER, file_manager->getAsset("shaders/bilateralH.comp").c_str());
TU_source = 0;
TU_depth = 1;
@@ -1741,7 +1588,7 @@ namespace FullScreenShader
Gaussian6HBlurShader::Gaussian6HBlurShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/gaussian6h.frag").c_str());
AssignUniforms("pixel");
@@ -1751,7 +1598,7 @@ namespace FullScreenShader
Gaussian3HBlurShader::Gaussian3HBlurShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/gaussian3h.frag").c_str());
AssignUniforms("pixel");
@@ -1761,7 +1608,7 @@ namespace FullScreenShader
Gaussian17TapVShader::Gaussian17TapVShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/bilateralV.frag").c_str());
AssignUniforms("pixel");
@@ -1771,9 +1618,7 @@ namespace FullScreenShader
ComputeGaussian17TapVShader::ComputeGaussian17TapVShader()
{
- if (irr_driver->hasARBComputeShaders())
- return;
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_COMPUTE_SHADER, file_manager->getAsset("shaders/bilateralV.comp").c_str());
TU_source = 0;
TU_depth = 1;
@@ -1783,7 +1628,7 @@ namespace FullScreenShader
Gaussian6VBlurShader::Gaussian6VBlurShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/gaussian6v.frag").c_str());
AssignUniforms("pixel");
@@ -1793,7 +1638,7 @@ namespace FullScreenShader
Gaussian3VBlurShader::Gaussian3VBlurShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/gaussian3v.frag").c_str());
AssignUniforms("pixel");
@@ -1803,7 +1648,7 @@ namespace FullScreenShader
PassThroughShader::PassThroughShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/texturedquad.frag").c_str());
@@ -1814,7 +1659,7 @@ namespace FullScreenShader
LayerPassThroughShader::LayerPassThroughShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/layertexturequad.frag").c_str());
TU_texture = 0;
@@ -1825,7 +1670,7 @@ namespace FullScreenShader
LinearizeDepthShader::LinearizeDepthShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/linearizedepth.frag").c_str());
AssignUniforms("zn", "zf");
@@ -1835,7 +1680,7 @@ namespace FullScreenShader
GlowShader::GlowShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/glow.frag").c_str());
AssignUniforms();
@@ -1846,7 +1691,7 @@ namespace FullScreenShader
SSAOShader::SSAOShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/decodeNormal.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(),
@@ -1854,39 +1699,32 @@ namespace FullScreenShader
AssignSamplerNames(Program, 0, "dtex");
AssignUniforms("radius", "k", "sigma");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
FogShader::FogShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/fog.frag").c_str());
AssignUniforms("fogmax", "startH", "endH", "start", "end", "col");
AssignSamplerNames(Program, 0, "tex");
-
- GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
- glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
MotionBlurShader::MotionBlurShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/motion_blur.frag").c_str());
AssignUniforms("previous_viewproj", "center", "boost_amount", "mask_radius");
-
AssignSamplerNames(Program, 0, "color_buffer", 1, "dtex");
}
GodFadeShader::GodFadeShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/godfade.frag").c_str());
AssignUniforms("col");
@@ -1897,7 +1735,7 @@ namespace FullScreenShader
GodRayShader::GodRayShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/godray.frag").c_str());
@@ -1908,7 +1746,7 @@ namespace FullScreenShader
MLAAColorEdgeDetectionSHader::MLAAColorEdgeDetectionSHader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/mlaa_offset.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/mlaa_color1.frag").c_str());
AssignUniforms("PIXEL_SIZE");
@@ -1919,7 +1757,7 @@ namespace FullScreenShader
MLAABlendWeightSHader::MLAABlendWeightSHader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/mlaa_blend2.frag").c_str());
AssignUniforms("PIXEL_SIZE");
@@ -1930,7 +1768,7 @@ namespace FullScreenShader
MLAAGatherSHader::MLAAGatherSHader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/mlaa_offset.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/mlaa_neigh3.frag").c_str());
AssignUniforms("PIXEL_SIZE");
@@ -1944,7 +1782,7 @@ namespace UIShader
{
TextureRectShader::TextureRectShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/texturedquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/texturedquad.frag").c_str());
AssignUniforms("center", "size", "texcenter", "texsize");
@@ -1954,7 +1792,7 @@ namespace UIShader
UniformColoredTextureRectShader::UniformColoredTextureRectShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/texturedquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/uniformcolortexturedquad.frag").c_str());
@@ -1965,7 +1803,7 @@ namespace UIShader
ColoredTextureRectShader::ColoredTextureRectShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/colortexturedquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/colortexturedquad.frag").c_str());
AssignUniforms("center", "size", "texcenter", "texsize");
@@ -1995,7 +1833,7 @@ namespace UIShader
ColoredRectShader::ColoredRectShader()
{
- Program = LoadProgram(
+ Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/coloredquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/coloredquad.frag").c_str());
AssignUniforms("center", "size", "color");
diff --git a/src/graphics/shaders.hpp b/src/graphics/shaders.hpp
index b5c5adbe5..c3d6f4f53 100644
--- a/src/graphics/shaders.hpp
+++ b/src/graphics/shaders.hpp
@@ -19,11 +19,9 @@
#include
#include
-#include
#include "config/user_config.hpp"
-#include "utils/singleton.hpp"
-#include "gl_headers.hpp"
+#include "shaders_util.hpp"
using namespace irr;
class ParticleSystemProxy;
@@ -52,429 +50,6 @@ public:
};
}
-bool needsUBO();
-
-unsigned getGLSLVersion();
-
-struct UniformHelper
-{
- template
- static void setUniformsHelper(const std::vector &uniforms)
- {
- }
-
- template
- static void setUniformsHelper(const std::vector &uniforms, const core::matrix4 &mat, Args... arg)
- {
- glUniformMatrix4fv(uniforms[N], 1, GL_FALSE, mat.pointer());
- setUniformsHelper(uniforms, arg...);
- }
-
- template
- static void setUniformsHelper(const std::vector &uniforms, const video::SColorf &col, Args... arg)
- {
- glUniform3f(uniforms[N], col.r, col.g, col.b);
- setUniformsHelper(uniforms, arg...);
- }
-
- template
- static void setUniformsHelper(const std::vector &uniforms, const video::SColor &col, Args... arg)
- {
- glUniform4i(uniforms[N], col.getRed(), col.getGreen(), col.getBlue(), col.getAlpha());
- setUniformsHelper(uniforms, arg...);
- }
-
- template
- static void setUniformsHelper(const std::vector &uniforms, const core::vector3df &v, Args... arg)
- {
- glUniform3f(uniforms[N], v.X, v.Y, v.Z);
- setUniformsHelper(uniforms, arg...);
- }
-
-
- template
- static void setUniformsHelper(const std::vector &uniforms, const core::vector2df &v, Args... arg)
- {
- glUniform2f(uniforms[N], v.X, v.Y);
- setUniformsHelper(uniforms, arg...);
- }
-
- template
- static void setUniformsHelper(const std::vector &uniforms, const core::dimension2df &v, Args... arg)
- {
- glUniform2f(uniforms[N], v.Width, v.Height);
- setUniformsHelper(uniforms, arg...);
- }
-
- template
- static void setUniformsHelper(const std::vector &uniforms, float f, Args... arg)
- {
- glUniform1f(uniforms[N], f);
- setUniformsHelper(uniforms, arg...);
- }
-
- template
- static void setUniformsHelper(const std::vector &uniforms, int f, Args... arg)
- {
- glUniform1i(uniforms[N], f);
- setUniformsHelper(uniforms, arg...);
- }
-
- template
- static void setUniformsHelper(const std::vector &uniforms, const std::vector &v, Args... arg)
- {
- glUniform1fv(uniforms[N], v.size(), v.data());
- setUniformsHelper(uniforms, arg...);
- }
-
-};
-
-void bypassUBO(GLuint Program);
-
-extern std::vector CleanTable;
-
-template
-class ShaderHelperSingleton : public Singleton
-{
-protected:
- std::vector uniforms;
-
- void AssignUniforms_impl()
- {
- }
-
- template
- void AssignUniforms_impl(const char* name, U... rest)
- {
- uniforms.push_back(glGetUniformLocation(Program, name));
- AssignUniforms_impl(rest...);
- }
-
- template
- void AssignUniforms(U... rest)
- {
- static_assert(sizeof...(rest) == sizeof...(Args), "Count of Uniform's name mismatch");
- AssignUniforms_impl(rest...);
- }
-
-public:
- GLuint Program;
-
- ShaderHelperSingleton()
- {
- CleanTable.push_back(this->kill);
- }
-
- ~ShaderHelperSingleton()
- {
- glDeleteProgram(Program);
- }
-
- void setUniforms(const Args & ... args) const
- {
- if (needsUBO())
- bypassUBO(Program);
- UniformHelper::setUniformsHelper(uniforms, args...);
- }
-};
-
-enum SamplerType {
- Trilinear_Anisotropic_Filtered,
- Semi_trilinear,
- Bilinear_Filtered,
- Bilinear_Clamped_Filtered,
- Nearest_Filtered,
- Shadow_Sampler,
- Volume_Linear_Filtered,
- Trilinear_cubemap,
-};
-
-void setTextureSampler(GLenum, GLuint, GLuint, GLuint);
-
-template
-struct CreateSamplers;
-
-template
-struct BindTexture;
-
-template<>
-struct CreateSamplers<>
-{
- static void exec(std::vector &, std::vector &e)
- {}
-};
-
-template<>
-struct BindTexture<>
-{
- static void exec(const std::vector &TU, const std::vector &TexId, unsigned N)
- {}
-};
-
-GLuint createNearestSampler();
-
-template
-struct CreateSamplers
-{
- static void exec(std::vector &v, std::vector &e)
- {
- v.push_back(createNearestSampler());
- e.push_back(GL_TEXTURE_2D);
- CreateSamplers::exec(v, e);
- }
-};
-
-void BindTextureNearest(unsigned TU, unsigned tid);
-
-template
-struct BindTexture
-{
- static void exec(const std::vector &TU, const std::vector &TexId, unsigned N)
- {
- BindTextureNearest(TU[N], TexId[N]);
- BindTexture::exec(TU, TexId, N + 1);
- }
-};
-
-GLuint createBilinearSampler();
-
-template
-struct CreateSamplers
-{
- static void exec(std::vector &v, std::vector &e)
- {
- v.push_back(createBilinearSampler());
- e.push_back(GL_TEXTURE_2D);
- CreateSamplers::exec(v, e);
- }
-};
-
-void BindTextureBilinear(unsigned TU, unsigned tex);
-
-template
-struct BindTexture
-{
- static void exec(const std::vector &TU, const std::vector &TexId, unsigned N)
- {
- BindTextureBilinear(TU[N], TexId[N]);
- BindTexture::exec(TU, TexId, N + 1);
- }
-};
-
-GLuint createBilinearClampedSampler();
-
-template
-struct CreateSamplers
-{
- static void exec(std::vector &v, std::vector &e)
- {
- v.push_back(createBilinearClampedSampler());
- e.push_back(GL_TEXTURE_2D);
- CreateSamplers::exec(v, e);
- }
-};
-
-void BindTextureBilinearClamped(unsigned TU, unsigned tex);
-
-template
-struct BindTexture
-{
- static void exec(const std::vector &TU, const std::vector &TexId, unsigned N)
- {
- BindTextureBilinearClamped(TU[N], TexId[N]);
- BindTexture::exec(TU, TexId, N + 1);
- }
-};
-
-GLuint createSemiTrilinearSampler();
-
-template
-struct CreateSamplers
-{
- static void exec(std::vector &v, std::vector &e)
- {
- v.push_back(createSemiTrilinearSampler());
- e.push_back(GL_TEXTURE_2D);
- CreateSamplers::exec(v, e);
- }
-};
-
-void BindTextureSemiTrilinear(unsigned TU, unsigned tex);
-
-template
-struct BindTexture
-{
- static void exec(const std::vector &TU, const std::vector &TexId, unsigned N)
- {
- BindTextureSemiTrilinear(TU[N], TexId[N]);
- BindTexture::exec(TU, TexId, N + 1);
- }
-};
-
-GLuint createTrilinearSampler();
-
-template
-struct CreateSamplers
-{
- static void exec(std::vector &v, std::vector &e)
- {
- v.push_back(createTrilinearSampler());
- e.push_back(GL_TEXTURE_2D);
- CreateSamplers::exec(v, e);
- }
-};
-
-void BindTextureTrilinearAnisotropic(unsigned TU, unsigned tex);
-
-template
-struct CreateSamplers
-{
- static void exec(std::vector &v, std::vector &e)
- {
- v.push_back(createTrilinearSampler());
- e.push_back(GL_TEXTURE_CUBE_MAP);
- CreateSamplers::exec(v, e);
- }
-};
-
-void BindCubemapTrilinear(unsigned TU, unsigned tex);
-
-template
-struct BindTexture
-{
- static void exec(const std::vector &TU, const std::vector &TexId, unsigned N)
- {
- BindCubemapTrilinear(TU[N], TexId[N]);
- BindTexture::exec(TU, TexId, N + 1);
- }
-};
-
-template
-struct BindTexture
-{
- static void exec(const std::vector &TU, const std::vector &TexId, unsigned N)
- {
- BindTextureTrilinearAnisotropic(TU[N], TexId[N]);
- BindTexture::exec(TU, TexId, N + 1);
- }
-};
-
-template
-struct CreateSamplers
-{
- static void exec(std::vector &v, std::vector &e)
- {
- v.push_back(createBilinearSampler());
- e.push_back(GL_TEXTURE_3D);
- CreateSamplers::exec(v, e);
- }
-};
-
-void BindTextureVolume(unsigned TU, unsigned tex);
-
-template
-struct BindTexture
-{
- static void exec(const std::vector &TU, const std::vector &TexId, unsigned N)
- {
- BindTextureVolume(TU[N], TexId[N]);
- BindTexture::exec(TU, TexId, N + 1);
- }
-};
-
-GLuint createShadowSampler();
-
-template
-struct CreateSamplers
-{
- static void exec(std::vector &v, std::vector &e)
- {
- v.push_back(createShadowSampler());
- e.push_back(GL_TEXTURE_2D_ARRAY);
- CreateSamplers::exec(v, e);
- }
-};
-
-void BindTextureShadow(unsigned TU, unsigned tex);
-
-template
-struct BindTexture
-{
- static void exec(const std::vector &TU, const std::vector &TexId, unsigned N)
- {
- BindTextureShadow(TU[N], TexId[N]);
- BindTexture::exec(TU, TexId, N + 1);
- }
-};
-
-template
-class TextureRead
-{
-private:
- template
- void AssignTextureNames_impl(GLuint)
- {
- static_assert(N == sizeof...(tp), "Wrong number of texture name");
- }
-
- template
- void AssignTextureNames_impl(GLuint Program, GLuint TexUnit, const char *name, Args...args)
- {
- GLuint location = glGetUniformLocation(Program, name);
- TextureLocation.push_back(location);
- glUniform1i(location, TexUnit);
- TextureUnits.push_back(TexUnit);
- AssignTextureNames_impl(Program, args...);
- }
-
-protected:
- std::vector TextureUnits;
- std::vector TextureType;
- std::vector TextureLocation;
- template
- void AssignSamplerNames(GLuint Program, Args...args)
- {
- CreateSamplers::exec(SamplersId, TextureType);
-
- glUseProgram(Program);
- AssignTextureNames_impl<0>(Program, args...);
- glUseProgram(0);
- }
-
-public:
- std::vector SamplersId;
- void SetTextureUnits(const std::vector &args)
- {
- assert(args.size() == sizeof...(tp) && "Too much texture unit provided");
- if (getGLSLVersion() >= 330)
- {
- for (unsigned i = 0; i < args.size(); i++)
- {
- setTextureSampler(TextureType[i], TextureUnits[i], args[i], SamplersId[i]);
- }
- }
- else
- BindTexture::exec(TextureUnits, args, 0);
- }
-
- ~TextureRead()
- {
- for (unsigned i = 0; i < SamplersId.size(); i++)
- glDeleteSamplers(1, &SamplersId[i]);
- }
-
- void SetTextureHandles(const std::vector &args)
- {
- assert(args.size() == TextureLocation.size() && "Wrong Handle count");
- for (unsigned i = 0; i < args.size(); i++)
- {
-#ifdef Bindless_Texture_Support
- if (args[i])
- glUniformHandleui64ARB(TextureLocation[i], args[i]);
-#endif
- }
- }
-};
namespace MeshShader
{
diff --git a/src/graphics/shaders_util.hpp b/src/graphics/shaders_util.hpp
new file mode 100644
index 000000000..378163a8e
--- /dev/null
+++ b/src/graphics/shaders_util.hpp
@@ -0,0 +1,435 @@
+#ifndef SHADERS_UTIL_HPP
+#define SHADERS_UTIL_HPP
+
+#include "utils/singleton.hpp"
+#include
+#include
+#include
+#include
+#include "gl_headers.hpp"
+
+bool needsUBO();
+
+unsigned getGLSLVersion();
+
+struct UniformHelper
+{
+ template
+ static void setUniformsHelper(const std::vector &uniforms)
+ {
+ }
+
+ template
+ static void setUniformsHelper(const std::vector &uniforms, const irr::core::matrix4 &mat, Args... arg)
+ {
+ glUniformMatrix4fv(uniforms[N], 1, GL_FALSE, mat.pointer());
+ setUniformsHelper(uniforms, arg...);
+ }
+
+ template
+ static void setUniformsHelper(const std::vector &uniforms, const irr::video::SColorf &col, Args... arg)
+ {
+ glUniform3f(uniforms[N], col.r, col.g, col.b);
+ setUniformsHelper(uniforms, arg...);
+ }
+
+ template
+ static void setUniformsHelper(const std::vector &uniforms, const irr::video::SColor &col, Args... arg)
+ {
+ glUniform4i(uniforms[N], col.getRed(), col.getGreen(), col.getBlue(), col.getAlpha());
+ setUniformsHelper