Turn shadow shaders into singletons.
This commit is contained in:
parent
7b9fc60f9c
commit
b2fc9eb682
@ -910,10 +910,10 @@ void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, siz
|
||||
delete []tmp;
|
||||
}
|
||||
|
||||
template<typename Shader, enum E_VERTEX_TYPE VertexType, typename... Args>
|
||||
void drawShadow(const std::vector<GLuint> TextureUnits, const std::vector<std::tuple<GLMesh *, core::matrix4, Args...> >&t)
|
||||
template<typename T, enum E_VERTEX_TYPE VertexType, typename... Args>
|
||||
void drawShadow(const T *Shader, const std::vector<GLuint> TextureUnits, const std::vector<std::tuple<GLMesh *, core::matrix4, Args...> >&t)
|
||||
{
|
||||
glUseProgram(Shader::Program);
|
||||
glUseProgram(Shader->Program);
|
||||
glBindVertexArray(getVAO(VertexType));
|
||||
for (unsigned i = 0; i < t.size(); i++)
|
||||
{
|
||||
@ -928,7 +928,7 @@ void drawShadow(const std::vector<GLuint> TextureUnits, const std::vector<std::t
|
||||
setTexture(TextureUnits[j], getTextureGLuint(mesh->textures[j]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
}
|
||||
|
||||
Shader::setUniforms(std::get<1>(t[i]));
|
||||
Shader->setUniforms(std::get<1>(t[i]));
|
||||
glDrawElementsInstancedBaseVertex(ptype, count, itype, (GLvoid *)mesh->vaoOffset, 4, mesh->vaoBaseVertex);
|
||||
}
|
||||
}
|
||||
@ -964,10 +964,10 @@ void IrrDriver::renderShadows()
|
||||
|
||||
m_scene_manager->drawAll(scene::ESNRP_SOLID);
|
||||
|
||||
drawShadow<MeshShader::ShadowShader, EVT_STANDARD>({}, ListDefaultStandardG::Arguments);
|
||||
drawShadow<MeshShader::ShadowShader, EVT_2TCOORDS>({}, ListDefault2TCoordG::Arguments);
|
||||
drawShadow<MeshShader::ShadowShader, EVT_TANGENTS>({}, ListNormalG::Arguments);
|
||||
drawShadow<MeshShader::RefShadowShader, EVT_STANDARD>({ MeshShader::RefShadowShader::TU_tex }, ListAlphaRefG::Arguments);
|
||||
drawShadow<MeshShader::ShadowShader, EVT_STANDARD>(MeshShader::ShadowShaderInstance, {}, ListDefaultStandardG::Arguments);
|
||||
drawShadow<MeshShader::ShadowShader, EVT_2TCOORDS>(MeshShader::ShadowShaderInstance, {}, ListDefault2TCoordG::Arguments);
|
||||
drawShadow<MeshShader::ShadowShader, EVT_TANGENTS>(MeshShader::ShadowShaderInstance, {}, ListNormalG::Arguments);
|
||||
drawShadow<MeshShader::RefShadowShader, EVT_STANDARD>(MeshShader::RefShadowShaderInstance, { MeshShader::RefShadowShaderInstance->TU_tex }, ListAlphaRefG::Arguments);
|
||||
|
||||
glDisable(GL_POLYGON_OFFSET_FILL);
|
||||
|
||||
|
@ -349,10 +349,10 @@ void Shaders::loadShaders()
|
||||
LightShader::PointLightShader::init();
|
||||
MeshShader::DisplaceShader::init();
|
||||
MeshShader::DisplaceMaskShader::init();
|
||||
MeshShader::ShadowShader::init();
|
||||
MeshShader::ShadowShaderInstance = new MeshShader::ShadowShader();
|
||||
MeshShader::RSMShader::init();
|
||||
MeshShader::InstancedShadowShader::init();
|
||||
MeshShader::RefShadowShader::init();
|
||||
MeshShader::RefShadowShaderInstance = new MeshShader::RefShadowShader();
|
||||
MeshShader::InstancedRefShadowShader::init();
|
||||
MeshShader::GrassShadowShader::init();
|
||||
MeshShader::SkyboxShader::init();
|
||||
@ -991,10 +991,7 @@ namespace MeshShader
|
||||
glUniform3f(uniform_col, r, g, b);
|
||||
}
|
||||
|
||||
GLuint ShadowShader::Program;
|
||||
GLuint ShadowShader::uniform_MM;
|
||||
|
||||
void ShadowShader::init()
|
||||
ShadowShader::ShadowShader()
|
||||
{
|
||||
// Geometry shader needed
|
||||
if (irr_driver->getGLSLVersion() < 150)
|
||||
@ -1012,16 +1009,12 @@ namespace MeshShader
|
||||
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/shadow.geom").c_str(),
|
||||
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str());
|
||||
}
|
||||
uniform_MM = glGetUniformLocation(Program, "ModelMatrix");
|
||||
AssignUniforms(Program, uniforms, { "ModelMatrix" });
|
||||
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
|
||||
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
|
||||
}
|
||||
|
||||
void ShadowShader::setUniforms(const core::matrix4 &ModelMatrix)
|
||||
{
|
||||
|
||||
glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer());
|
||||
}
|
||||
ShadowShader *ShadowShaderInstance;
|
||||
|
||||
GLuint RSMShader::Program;
|
||||
GLuint RSMShader::uniform_MM;
|
||||
@ -1076,11 +1069,7 @@ namespace MeshShader
|
||||
{
|
||||
}
|
||||
|
||||
GLuint RefShadowShader::Program;
|
||||
GLuint RefShadowShader::uniform_MM;
|
||||
GLuint RefShadowShader::TU_tex;
|
||||
|
||||
void RefShadowShader::init()
|
||||
RefShadowShader::RefShadowShader()
|
||||
{
|
||||
// Geometry shader needed
|
||||
if (irr_driver->getGLSLVersion() < 150)
|
||||
@ -1098,17 +1087,15 @@ namespace MeshShader
|
||||
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/shadow.geom").c_str(),
|
||||
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str());
|
||||
}
|
||||
uniform_MM = glGetUniformLocation(Program, "ModelMatrix");
|
||||
AssignUniforms(Program, uniforms, { "ModelMatrix" });
|
||||
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
|
||||
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
|
||||
TU_tex = 0;
|
||||
|
||||
AssignTextureUnit(Program, { { TU_tex, "tex" } });
|
||||
}
|
||||
|
||||
void RefShadowShader::setUniforms(const core::matrix4 &ModelMatrix)
|
||||
{
|
||||
glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer());
|
||||
}
|
||||
RefShadowShader *RefShadowShaderInstance;
|
||||
|
||||
GLuint InstancedRefShadowShader::Program;
|
||||
GLuint InstancedRefShadowShader::uniform_tex;
|
||||
|
@ -335,16 +335,14 @@ public:
|
||||
static void setUniforms(const core::matrix4 &ModelMatrix, float r, float g, float b);
|
||||
};
|
||||
|
||||
class ShadowShader
|
||||
class ShadowShader : public ShaderHelper<core::matrix4>
|
||||
{
|
||||
public:
|
||||
static GLuint Program;
|
||||
static GLuint uniform_MM, uniform_ViewProjectionMatrixesUBO;
|
||||
|
||||
static void init();
|
||||
static void setUniforms(const core::matrix4 &ModelMatrix);
|
||||
ShadowShader();
|
||||
};
|
||||
|
||||
extern ShadowShader *ShadowShaderInstance;
|
||||
|
||||
class RSMShader
|
||||
{
|
||||
public:
|
||||
@ -365,17 +363,16 @@ public:
|
||||
static void setUniforms();
|
||||
};
|
||||
|
||||
class RefShadowShader
|
||||
class RefShadowShader : public ShaderHelper<core::matrix4>
|
||||
{
|
||||
public:
|
||||
static GLuint Program;
|
||||
static GLuint uniform_MM;
|
||||
static GLuint TU_tex;
|
||||
GLuint TU_tex;
|
||||
|
||||
static void init();
|
||||
static void setUniforms(const core::matrix4 &ModelMatrix);
|
||||
RefShadowShader();
|
||||
};
|
||||
|
||||
extern RefShadowShader *RefShadowShaderInstance;
|
||||
|
||||
class InstancedRefShadowShader
|
||||
{
|
||||
public:
|
||||
|
Loading…
x
Reference in New Issue
Block a user