Made SimpleParticleRender based on the new shader base class.
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user