Turn pass1 shaders to singleton template.

This commit is contained in:
vlj 2014-07-15 02:43:27 +02:00
parent 5e0fb8dcf7
commit 82b5097391
3 changed files with 31 additions and 29 deletions

View File

@ -58,10 +58,10 @@ void apply_instance(const T *Shader, const std::tuple<TupleType...> &arg)
unroll_args_instance<std::tuple_size<std::tuple<TupleType...> >::value >::template exec<T>(Shader, arg);
}
template<typename T, enum E_VERTEX_TYPE VertexType, typename... TupleType>
void renderMeshes1stPass(const T *Shader, const std::vector<GLuint> &TexUnits, std::vector<std::tuple<TupleType...> > &meshes)
template<typename Shader, enum E_VERTEX_TYPE VertexType, typename... TupleType>
void renderMeshes1stPass(const std::vector<GLuint> &TexUnits, std::vector<std::tuple<TupleType...> > &meshes)
{
glUseProgram(Shader->Program);
glUseProgram(Shader::getInstance<Shader>()->Program);
glBindVertexArray(getVAO(VertexType));
for (unsigned i = 0; i < meshes.size(); i++)
{
@ -80,7 +80,7 @@ void renderMeshes1stPass(const T *Shader, const std::vector<GLuint> &TexUnits, s
#endif
continue;
}
apply_instance(Shader, meshes[i]);
apply_instance(Shader::getInstance<Shader>(), meshes[i]);
}
}
@ -109,11 +109,11 @@ void IrrDriver::renderSolidFirstPass()
{
ScopedGPUTimer Timer(getGPUTimer(Q_SOLID_PASS1));
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_STANDARD>(MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>(), { MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>()->TU_tex }, ListDefaultStandardG::Arguments);
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_2TCOORDS>(MeshShader::ObjectPass1Shader::getInstance(), { MeshShader::ObjectPass1Shader::getInstance()->TU_tex }, ListDefault2TCoordG::Arguments);
renderMeshes1stPass<MeshShader::ObjectRefPass1Shader, video::EVT_STANDARD>(MeshShader::ObjectRefPass1ShaderInstance, { MeshShader::ObjectRefPass1ShaderInstance->TU_tex }, ListAlphaRefG::Arguments);
renderMeshes1stPass<MeshShader::NormalMapShader, video::EVT_TANGENTS>(MeshShader::NormalMapShaderInstance, { MeshShader::NormalMapShaderInstance->TU_glossy, MeshShader::NormalMapShaderInstance->TU_normalmap }, ListNormalG::Arguments);
renderMeshes1stPass<MeshShader::GrassPass1Shader, video::EVT_STANDARD>(MeshShader::GrassPass1ShaderInstance, { MeshShader::GrassPass1ShaderInstance->TU_tex }, ListGrassG::Arguments);
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_STANDARD>({ MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>()->TU_tex }, ListDefaultStandardG::Arguments);
renderMeshes1stPass<MeshShader::ObjectPass1Shader, video::EVT_2TCOORDS>({ MeshShader::ObjectPass1Shader::getInstance<MeshShader::ObjectPass1Shader>()->TU_tex }, ListDefault2TCoordG::Arguments);
renderMeshes1stPass<MeshShader::ObjectRefPass1Shader, video::EVT_STANDARD>({ MeshShader::ObjectRefPass1Shader::getInstance<MeshShader::ObjectRefPass1Shader>()->TU_tex }, ListAlphaRefG::Arguments);
renderMeshes1stPass<MeshShader::NormalMapShader, video::EVT_TANGENTS>({ MeshShader::NormalMapShader::getInstance<MeshShader::NormalMapShader>()->TU_glossy, MeshShader::NormalMapShader::getInstance<MeshShader::NormalMapShader>()->TU_normalmap }, ListNormalG::Arguments);
renderMeshes1stPass<MeshShader::GrassPass1Shader, video::EVT_STANDARD>({ MeshShader::GrassPass1Shader::getInstance<MeshShader::GrassPass1Shader>()->TU_tex }, ListGrassG::Arguments);
}
}

View File

@ -325,9 +325,6 @@ void Shaders::loadShaders()
FullScreenShader::MLAABlendWeightSHader::init();
FullScreenShader::MLAAGatherSHader::init();
MeshShader::ColorizeShader::init();
MeshShader::NormalMapShaderInstance = new MeshShader::NormalMapShader();
// MeshShader::ObjectPass1ShaderInstance = new MeshShader::ObjectPass1Shader();
MeshShader::ObjectRefPass1ShaderInstance = new MeshShader::ObjectRefPass1Shader();
MeshShader::InstancedObjectPass1ShaderInstance = new MeshShader::InstancedObjectPass1Shader();
MeshShader::InstancedObjectRefPass1ShaderInstance = new MeshShader::InstancedObjectRefPass1Shader();
MeshShader::InstancedGrassPass1ShaderInstance = new MeshShader::InstancedGrassPass1Shader();
@ -340,7 +337,6 @@ void Shaders::loadShaders()
MeshShader::ObjectUnlitShaderInstance = new MeshShader::ObjectUnlitShader();
MeshShader::SphereMapShaderInstance = new MeshShader::SphereMapShader();
MeshShader::SplattingShaderInstance = new MeshShader::SplattingShader();
MeshShader::GrassPass1ShaderInstance = new MeshShader::GrassPass1Shader();
MeshShader::GrassPass2ShaderInstance = new MeshShader::GrassPass2Shader();
MeshShader::BubbleShader::init();
MeshShader::TransparentShaderInstance = new MeshShader::TransparentShader();
@ -489,7 +485,7 @@ namespace MeshShader
{
// Solid Normal and depth pass shaders
ObjectPass1Shader::ObjectPass1Shader() : Singleton<ObjectPass1Shader>()
ObjectPass1Shader::ObjectPass1Shader()
{
Program = LoadProgram(
GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
@ -520,7 +516,6 @@ namespace MeshShader
TU_tex = 0;
AssignTextureUnit(Program, { { TU_tex, "tex" } });
}
ObjectRefPass1Shader *ObjectRefPass1ShaderInstance;
GrassPass1Shader::GrassPass1Shader()
{
@ -533,8 +528,6 @@ namespace MeshShader
AssignTextureUnit(Program, { { TU_tex, "tex" } });
}
GrassPass1Shader *GrassPass1ShaderInstance;
NormalMapShader::NormalMapShader()
{
Program = LoadProgram(
@ -551,7 +544,6 @@ namespace MeshShader
TU_glossy = 0;
AssignTextureUnit(Program, { { TU_normalmap, "normalMap" }, { TU_glossy, "DiffuseForAlpha" } });
}
NormalMapShader *NormalMapShaderInstance;
InstancedObjectPass1Shader::InstancedObjectPass1Shader()
{

View File

@ -120,26 +120,40 @@ public:
}
};
template<typename T, typename... Args>
class ShaderHelperSingleton : public Singleton<T>
{
protected:
std::vector<GLuint> uniforms;
public:
friend class Singleton<class ObjectPass1Shader>;
GLuint Program;
void setUniforms(const Args & ... args) const
{
if (UserConfigParams::m_ubo_disabled)
bypassUBO(Program);
UniformHelper::setUniformsHelper(uniforms, args...);
}
};
namespace MeshShader
{
class ObjectPass1Shader : public ShaderHelper<core::matrix4, core::matrix4>, public Singleton<class ObjectPass1Shader>
class ObjectPass1Shader : public ShaderHelperSingleton<ObjectPass1Shader, core::matrix4, core::matrix4>
{
friend class Singleton<class ObjectPass1Shader>;
public:
GLuint TU_tex;
ObjectPass1Shader();
};
class ObjectRefPass1Shader : public ShaderHelper<core::matrix4, core::matrix4, core::matrix4>
class ObjectRefPass1Shader : public ShaderHelperSingleton<ObjectRefPass1Shader, core::matrix4, core::matrix4, core::matrix4>
{
public:
GLuint TU_tex;
ObjectRefPass1Shader();
};
extern ObjectRefPass1Shader *ObjectRefPass1ShaderInstance;
class GrassPass1Shader : public ShaderHelper<core::matrix4, core::matrix4, core::vector3df>
class GrassPass1Shader : public ShaderHelperSingleton<GrassPass1Shader, core::matrix4, core::matrix4, core::vector3df>
{
public:
GLuint TU_tex;
@ -147,17 +161,13 @@ public:
GrassPass1Shader();
};
extern GrassPass1Shader *GrassPass1ShaderInstance;
class NormalMapShader : public ShaderHelper<core::matrix4, core::matrix4>
class NormalMapShader : public ShaderHelperSingleton<NormalMapShader, core::matrix4, core::matrix4>
{
public:
GLuint TU_normalmap, TU_glossy;
NormalMapShader();
};
extern NormalMapShader *NormalMapShaderInstance;
class InstancedObjectPass1Shader : public ShaderHelper<>
{
public: