Made SimpleParticleRender based on the new shader base class.

This commit is contained in:
hiker
2015-04-24 08:26:17 +10:00
parent a51225ec36
commit 1a96ed6249
4 changed files with 81 additions and 31 deletions

View File

@@ -448,7 +448,7 @@ void ParticleSystemProxy::drawNotFlip()
glBlendFunc(GL_ONE, GL_ONE);
else
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glUseProgram(SimpleParticleRender::getInstance()->Program);
SimpleParticleRender::getInstance()->use();
SimpleParticleRender::getInstance()->SetTextureUnits(texture, irr_driver->getDepthStencilTexture());
video::SColorf ColorFrom = video::SColorf(getColorFrom()[0], getColorFrom()[1], getColorFrom()[2]);
@@ -549,7 +549,22 @@ PointEmitterShader::PointEmitterShader()
};
loadTFBProgram("pointemitter.vert", varyings, 4);
assignUniforms("sourcematrix", "dt", "level", "size_increase_factor");
}
} // PointEmitterShader
// ============================================================================
SimpleParticleRender::SimpleParticleRender()
{
loadProgram(PARTICLES_RENDERING,
GL_VERTEX_SHADER, "particle.vert",
GL_FRAGMENT_SHADER, "utils/getPosFromUVDepth.frag",
GL_FRAGMENT_SHADER, "particle.frag");
assignUniforms("color_from", "color_to");
AssignSamplerNames(m_program, 0, "tex", 1, "dtex");
} // SimpleParticleRender
// ============================================================================
struct TexUnit
@@ -608,17 +623,6 @@ HeightmapSimulationShader::HeightmapSimulationShader()
AssignUniforms("sourcematrix", "dt", "level", "size_increase_factor", "track_x", "track_x_len", "track_z", "track_z_len");
}
SimpleParticleRender::SimpleParticleRender()
{
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());
AssignUniforms("color_from", "color_to");
AssignSamplerNames(Program, 0, "tex", 1, "dtex");
}
FlipParticleRender::FlipParticleRender()
{
Program = LoadProgram(PARTICLES_RENDERING,

View File

@@ -29,9 +29,19 @@ class PointEmitterShader : public Shader
{
public:
PointEmitterShader();
};
}; // PointEmitterShader
// ============================================================================
class SimpleParticleRender : public Shader<SimpleParticleRender, video::SColorf,
video::SColorf>,
public TextureRead<Trilinear_Anisotropic_Filtered,
Nearest_Filtered>
{
public:
SimpleParticleRender();
}; // SimpleParticleRender
// ============================================================================
class HeightmapSimulationShader : public ShaderHelperSingleton<HeightmapSimulationShader, core::matrix4, int, int, float, float, float, float, float>
{
@@ -41,11 +51,6 @@ public:
HeightmapSimulationShader();
};
class SimpleParticleRender : public ShaderHelperSingleton<SimpleParticleRender, video::SColorf, video::SColorf>, public TextureRead<Trilinear_Anisotropic_Filtered, Nearest_Filtered>
{
public:
SimpleParticleRender();
};
class FlipParticleRender : public ShaderHelperSingleton<FlipParticleRender>, public TextureRead<Trilinear_Anisotropic_Filtered, Nearest_Filtered>
{

View File

@@ -71,7 +71,7 @@ GLuint ShaderBase::loadShader(const std::string &file, unsigned type)
code << "#extension GL_ARB_bindless_texture : enable\n";
code << "#define Use_Bindless_Texture\n";
}
code << "//" + std::string(file) + "\n";
code << "//" << file << "\n";
if (!CVS->isARBUniformBufferObjectUsable())
code << "#define UBO_DISABLED\n";
if (CVS->isAMDVertexShaderLayerUsable())
@@ -80,12 +80,12 @@ GLuint ShaderBase::loadShader(const std::string &file, unsigned type)
code << "#define SRGBBindlessFix\n";
code << getHeader();
std::ifstream stream(file, std::ios::in);
std::ifstream stream(file_manager->getShader(file), std::ios::in);
if (stream.is_open())
{
std::string Line = "";
while (getline(stream, Line))
code << "\n" + Line;
code << "\n" << Line;
stream.close();
}
else
@@ -127,9 +127,8 @@ int ShaderBase::loadTFBProgram(const std::string &shader_name,
const char **varyings,
unsigned varying_count)
{
std::string full_path = file_manager->getShader(shader_name);
m_program = glCreateProgram();
loadAndAttachShader(GL_VERTEX_SHADER, full_path);
loadAndAttachShader(GL_VERTEX_SHADER, shader_name);
if (CVS->getGLSLVersion() < 330)
setAttribute(PARTICLES_SIM);

View File

@@ -40,24 +40,24 @@ private:
/** Maintains a list of all shaders. */
static std::vector<ShaderBase *> m_all_shaders;
protected:
enum AttributeType
{
OBJECT,
PARTICLES_SIM,
PARTICLES_RENDERING,
};
}; // AttributeType
protected:
/** OpenGL's program id. */
GLuint m_program;
void bypassUBO() const;
private:
protected:
// ------------------------------------------------------------------------
// Ends vararg template
template<typename ... Types>
void loadAndAttachShader(GLint ProgramID)
void loadAndAttachShader()
{
return;
} // loadAndAttachShader
@@ -69,12 +69,21 @@ private:
GLint shader_id = loadShader(name, shader_type);
glAttachShader(m_program, shader_id);
glDeleteShader(shader_id);
loadAndAttachShader(shader_type, args...);
loadAndAttachShader(args...);
} // loadAndAttachShader
// ------------------------------------------------------------------------
template<typename ... Types>
void loadAndAttachShader(GLint shader_type, const char *name,
Types ... args)
{
loadAndAttachShader(shader_type, std::string(name), args...);
} // loadAndAttachShader
// ------------------------------------------------------------------------
const std::string& getHeader();
GLuint loadShader(const std::string &file, unsigned type);
protected:
void setAttribute(AttributeType type);
public:
@@ -139,6 +148,7 @@ private:
} // setUniformImpl
// ------------------------------------------------------------------------
/** Implementation for setUniforms for a matrix SColorF values. */
template<unsigned N = 0, typename... Args>
void setUniformsImpl(const irr::video::SColorf &col, Args... arg) const
{
@@ -147,6 +157,7 @@ private:
} // setUniformsImpl
// ------------------------------------------------------------------------
/** Implementation for setUniforms for a SColor uniform. */
template<unsigned N = 0, typename... Args>
void setUniformsImpl(const irr::video::SColor &col, Args... arg) const
{
@@ -156,6 +167,7 @@ private:
} // setUniformsImpl
// ------------------------------------------------------------------------
/** Implementation for setUniforms for a vector3df uniform. */
template<unsigned N = 0, typename... Args>
void setUniformsImpl(const irr::core::vector3df &v, Args... arg) const
{
@@ -163,8 +175,8 @@ private:
setUniformsImpl<N + 1>(arg...);
} // setUniformsImpl
// ------------------------------------------------------------------------
/** Implementation for setUniforms for a vector2df uniform. */
template<unsigned N = 0, typename... Args>
void setUniformsImpl(const irr::core::vector2df &v, Args... arg) const
{
@@ -173,6 +185,7 @@ private:
} // setUniformsImpl
// ------------------------------------------------------------------------
/** Implementation for setUniforms for a dimension2df uniform. */
template<unsigned N = 0, typename... Args>
void setUniformsImpl(const irr::core::dimension2df &v, Args... arg) const
{
@@ -181,6 +194,7 @@ private:
} // setUniformsImpl
// ------------------------------------------------------------------------
/** Implementation for setUniforms for a float uniform. */
template<unsigned N = 0, typename... Args>
void setUniformsImpl(float f, Args... arg) const
{
@@ -189,6 +203,7 @@ private:
} // setUniformsImpl
// ------------------------------------------------------------------------
/** Implementation for setUniforms for an int uniform. */
template<unsigned N = 0, typename... Args>
void setUniformsImpl(int f, Args... arg) const
{
@@ -197,6 +212,7 @@ private:
} // setUniformsImpl
// ------------------------------------------------------------------------
/** Implementation for setUniforms for a vector<float> uniform. */
template<unsigned N = 0, typename... Args>
void setUniformsImpl(const std::vector<float> &v, Args... arg) const
{
@@ -204,7 +220,32 @@ private:
setUniformsImpl<N + 1>(arg...);
} // setUniformsImpl
public:
template<typename ... Types>
void loadProgram(AttributeType type, Types ... args)
{
m_program = glCreateProgram();
loadAndAttachShader(args...);
if (getGLSLVersion() < 330)
setAttribute(type);
glLinkProgram(m_program);
GLint Result = GL_FALSE;
glGetProgramiv(m_program, GL_LINK_STATUS, &Result);
if (Result == GL_FALSE) {
int info_length;
Log::error("GLWrapp", "Error when linking these shaders :");
printFileList(args...);
glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &info_length);
char *error_message = new char[info_length];
glGetProgramInfoLog(m_program, info_length, NULL, error_message);
Log::error("GLWrapp", error_message);
delete[] error_message;
}
} // loadProgram
// ------------------------------------------------------------------------
/** This variadic template collects all names of uniforms in
* a std::vector. */
@@ -217,12 +258,13 @@ public:
} // assignUniforms
// ------------------------------------------------------------------------
/** Sets the uniforms for this shader. */
void setUniforms(const Args & ... args) const
{
if (!CVS->isARBUniformBufferObjectUsable())
bypassUBO();
setUniformsImpl(args...);
}
} // setUniforms
}; // Shader