GPUParticles: Factorize shader loading in shader.h/cpp

This commit is contained in:
Vincent Lejeune
2014-01-21 19:36:55 +01:00
parent 0d57f4db0d
commit 43e4db99b1
3 changed files with 338 additions and 264 deletions

View File

@@ -12,136 +12,8 @@ GLuint getTextureGLuint(irr::video::ITexture *tex) {
#define COMPONENTCOUNT 8
namespace SimpleSimulationShader
{
GLuint Program;
GLuint attrib_position, attrib_velocity, attrib_lifetime, attrib_initial_position, attrib_initial_velocity, attrib_initial_lifetime, attrib_size, attrib_initial_size;
GLuint uniform_sourcematrix, uniform_dt, uniform_level, uniform_size_increase_factor;
void init()
{
initGL();
const char *varyings[] = {
"new_particle_position",
"new_lifetime",
"new_particle_velocity",
"new_size",
};
Program = LoadTFBProgram(file_manager->getAsset("shaders/pointemitter.vert").c_str(), varyings, 4);
uniform_dt = glGetUniformLocation(Program, "dt");
uniform_sourcematrix = glGetUniformLocation(Program, "sourcematrix");
uniform_level = glGetUniformLocation(Program, "level");
uniform_size_increase_factor = glGetUniformLocation(Program, "size_increase_factor");
attrib_position = glGetAttribLocation(Program, "particle_position");
attrib_lifetime = glGetAttribLocation(Program, "lifetime");
attrib_velocity = glGetAttribLocation(Program, "particle_velocity");
attrib_size = glGetAttribLocation(Program, "size");
attrib_initial_position = glGetAttribLocation(Program, "particle_position_initial");
attrib_initial_lifetime = glGetAttribLocation(Program, "lifetime_initial");
attrib_initial_velocity = glGetAttribLocation(Program, "particle_velocity_initial");
attrib_initial_size = glGetAttribLocation(Program, "size_initial");
}
}
namespace HeightmapSimulationShader
{
GLuint Program;
GLuint attrib_position, attrib_velocity, attrib_lifetime, attrib_initial_position, attrib_initial_velocity, attrib_initial_lifetime, attrib_size, attrib_initial_size;
GLuint uniform_sourcematrix, uniform_dt, uniform_level, uniform_size_increase_factor;
GLuint uniform_track_x, uniform_track_z, uniform_track_x_len, uniform_track_z_len, uniform_heightmap;
void init()
{
initGL();
const char *varyings[] = {
"new_particle_position",
"new_lifetime",
"new_particle_velocity",
"new_size",
};
Program = LoadTFBProgram(file_manager->getAsset("shaders/particlesimheightmap.vert").c_str(), varyings, 4);
uniform_dt = glGetUniformLocation(Program, "dt");
uniform_sourcematrix = glGetUniformLocation(Program, "sourcematrix");
uniform_level = glGetUniformLocation(Program, "level");
uniform_size_increase_factor = glGetUniformLocation(Program, "size_increase_factor");
attrib_position = glGetAttribLocation(Program, "particle_position");
attrib_lifetime = glGetAttribLocation(Program, "lifetime");
attrib_velocity = glGetAttribLocation(Program, "particle_velocity");
attrib_size = glGetAttribLocation(Program, "size");
attrib_initial_position = glGetAttribLocation(Program, "particle_position_initial");
attrib_initial_lifetime = glGetAttribLocation(Program, "lifetime_initial");
attrib_initial_velocity = glGetAttribLocation(Program, "particle_velocity_initial");
attrib_initial_size = glGetAttribLocation(Program, "size_initial");
uniform_heightmap = glGetUniformLocation(Program, "heightmap");
uniform_track_x = glGetUniformLocation(Program, "track_x");
uniform_track_x_len = glGetUniformLocation(Program, "track_x_len");
uniform_track_z = glGetUniformLocation(Program, "track_z");
uniform_track_z_len = glGetUniformLocation(Program, "track_z_len");
}
}
namespace SimpleParticleRender
{
GLuint Program;
GLuint attrib_pos, attrib_lf, attrib_quadcorner, attrib_texcoord, attrib_sz;
GLuint uniform_matrix, uniform_viewmatrix, uniform_tex, uniform_normal_and_depths, uniform_screen, uniform_invproj;
void init()
{
initGL();
Program = LoadProgram(file_manager->getAsset("shaders/particle.vert").c_str(), file_manager->getAsset("shaders/particle.frag").c_str());
attrib_pos = glGetAttribLocation(Program, "position");
attrib_sz = glGetAttribLocation(Program, "size");
attrib_lf = glGetAttribLocation(Program, "lifetime");
attrib_quadcorner = glGetAttribLocation(Program, "quadcorner");
attrib_texcoord = glGetAttribLocation(Program, "texcoord");
uniform_matrix = glGetUniformLocation(Program, "ProjectionMatrix");
uniform_viewmatrix = glGetUniformLocation(Program, "ViewMatrix");
uniform_tex = glGetUniformLocation(Program, "tex");
uniform_invproj = glGetUniformLocation(Program, "invproj");
uniform_screen = glGetUniformLocation(Program, "screen");
uniform_normal_and_depths = glGetUniformLocation(Program, "normals_and_depth");
}
}
namespace FlipParticleRender
{
GLuint Program;
GLuint attrib_pos, attrib_lf, attrib_quadcorner, attrib_texcoord, attrib_sz, attrib_rotationvec, attrib_anglespeed;
GLuint uniform_matrix, uniform_viewmatrix, uniform_tex, uniform_normal_and_depths, uniform_screen, uniform_invproj;
void init()
{
initGL();
Program = LoadProgram(file_manager->getAsset("shaders/flipparticle.vert").c_str(), file_manager->getAsset("shaders/particle.frag").c_str());
attrib_pos = glGetAttribLocation(Program, "position");
attrib_sz = glGetAttribLocation(Program, "size");
attrib_lf = glGetAttribLocation(Program, "lifetime");
attrib_quadcorner = glGetAttribLocation(Program, "quadcorner");
attrib_texcoord = glGetAttribLocation(Program, "texcoord");
attrib_anglespeed = glGetAttribLocation(Program, "anglespeed");
attrib_rotationvec = glGetAttribLocation(Program, "rotationvec");
uniform_matrix = glGetUniformLocation(Program, "ProjectionMatrix");
uniform_viewmatrix = glGetUniformLocation(Program, "ViewMatrix");
uniform_tex = glGetUniformLocation(Program, "tex");
uniform_invproj = glGetUniformLocation(Program, "invproj");
uniform_screen = glGetUniformLocation(Program, "screen");
uniform_normal_and_depths = glGetUniformLocation(Program, "normals_and_depth");
}
}
GPUParticle::GPUParticle(scene::ISceneNode *parent, scene::ISceneManager* mgr, ITexture *tex)
: scene::ISceneNode(parent, mgr, -1) {
initGL();
fakemat.Lighting = false;
fakemat.ZWriteEnable = false;
fakemat.MaterialType = irr_driver->getShader(ES_RAIN);
@@ -452,13 +324,6 @@ void ParticleSystemProxy::setEmitter(scene::IParticleEmitter* emitter)
texture = getTextureGLuint(getMaterial(0).getTexture(0));
normal_and_depth = getTextureGLuint(irr_driver->getRTT(RTT_NORMAL_AND_DEPTH));
if (SimpleSimulationShader::Program && SimpleParticleRender::Program && FlipParticleRender::Program && HeightmapSimulationShader::Program)
return;
SimpleSimulationShader::init();
HeightmapSimulationShader::init();
SimpleParticleRender::init();
FlipParticleRender::init();
}
void ParticleSystemProxy::simulateHeightmap()
@@ -466,51 +331,51 @@ void ParticleSystemProxy::simulateHeightmap()
int timediff = int(GUIEngine::getLatestDt() * 1000.f);
int active_count = getEmitter()->getMaxLifeTime() * getEmitter()->getMaxParticlesPerSecond() / 1000;
core::matrix4 matrix = getAbsoluteTransformation();
glUseProgram(HeightmapSimulationShader::Program);
glUseProgram(ParticleShader::HeightmapSimulationShader::Program);
glEnable(GL_RASTERIZER_DISCARD);
glEnableVertexAttribArray(HeightmapSimulationShader::attrib_position);
glEnableVertexAttribArray(HeightmapSimulationShader::attrib_lifetime);
glEnableVertexAttribArray(HeightmapSimulationShader::attrib_velocity);
// glEnableVertexAttribArray(HeightmapSimulationShader::attrib_size);
glEnableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_position);
glEnableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_lifetime);
glEnableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_velocity);
// glEnableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_size);
glBindBuffer(GL_ARRAY_BUFFER, tfb_buffers[0]);
glVertexAttribPointer(HeightmapSimulationShader::attrib_position, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)0);
glVertexAttribPointer(HeightmapSimulationShader::attrib_lifetime, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(3 * sizeof(float)));
glVertexAttribPointer(HeightmapSimulationShader::attrib_velocity, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(4 * sizeof(float)));
//glVertexAttribPointer(HeightmapSimulationShader::attrib_size, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(7 * sizeof(float)));
glEnableVertexAttribArray(HeightmapSimulationShader::attrib_initial_position);
glEnableVertexAttribArray(HeightmapSimulationShader::attrib_initial_lifetime);
glEnableVertexAttribArray(HeightmapSimulationShader::attrib_initial_velocity);
glEnableVertexAttribArray(HeightmapSimulationShader::attrib_initial_size);
glVertexAttribPointer(ParticleShader::HeightmapSimulationShader::attrib_position, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)0);
glVertexAttribPointer(ParticleShader::HeightmapSimulationShader::attrib_lifetime, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(3 * sizeof(float)));
glVertexAttribPointer(ParticleShader::HeightmapSimulationShader::attrib_velocity, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(4 * sizeof(float)));
//glVertexAttribPointer(ParticleShader::HeightmapSimulationShader::attrib_size, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(7 * sizeof(float)));
glEnableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_initial_position);
glEnableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_initial_lifetime);
glEnableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_initial_velocity);
glEnableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_initial_size);
glBindBuffer(GL_ARRAY_BUFFER, initial_values_buffer);
glVertexAttribPointer(HeightmapSimulationShader::attrib_initial_position, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)0);
glVertexAttribPointer(HeightmapSimulationShader::attrib_initial_lifetime, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(3 * sizeof(float)));
glVertexAttribPointer(HeightmapSimulationShader::attrib_initial_velocity, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(4 * sizeof(float)));
glVertexAttribPointer(HeightmapSimulationShader::attrib_initial_size, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(7 * sizeof(float)));
glVertexAttribPointer(ParticleShader::HeightmapSimulationShader::attrib_initial_position, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)0);
glVertexAttribPointer(ParticleShader::HeightmapSimulationShader::attrib_initial_lifetime, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(3 * sizeof(float)));
glVertexAttribPointer(ParticleShader::HeightmapSimulationShader::attrib_initial_velocity, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(4 * sizeof(float)));
glVertexAttribPointer(ParticleShader::HeightmapSimulationShader::attrib_initial_size, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(7 * sizeof(float)));
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfb_buffers[1]);
glUniform1i(HeightmapSimulationShader::uniform_dt, timediff);
glUniform1i(HeightmapSimulationShader::uniform_level, active_count);
glUniformMatrix4fv(HeightmapSimulationShader::uniform_sourcematrix, 1, GL_FALSE, matrix.pointer());
glUniform1f(HeightmapSimulationShader::uniform_size_increase_factor, size_increase_factor);
glUniform1i(ParticleShader::HeightmapSimulationShader::uniform_dt, timediff);
glUniform1i(ParticleShader::HeightmapSimulationShader::uniform_level, active_count);
glUniformMatrix4fv(ParticleShader::HeightmapSimulationShader::uniform_sourcematrix, 1, GL_FALSE, matrix.pointer());
glUniform1f(ParticleShader::HeightmapSimulationShader::uniform_size_increase_factor, size_increase_factor);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_BUFFER, heightmaptexture);
glUniform1i(HeightmapSimulationShader::uniform_heightmap, 2);
glUniform1f(HeightmapSimulationShader::uniform_track_x, track_x);
glUniform1f(HeightmapSimulationShader::uniform_track_z, track_z);
glUniform1f(HeightmapSimulationShader::uniform_track_x_len, track_x_len);
glUniform1f(HeightmapSimulationShader::uniform_track_z_len, track_z_len);
glUniform1i(ParticleShader::HeightmapSimulationShader::uniform_heightmap, 2);
glUniform1f(ParticleShader::HeightmapSimulationShader::uniform_track_x, track_x);
glUniform1f(ParticleShader::HeightmapSimulationShader::uniform_track_z, track_z);
glUniform1f(ParticleShader::HeightmapSimulationShader::uniform_track_x_len, track_x_len);
glUniform1f(ParticleShader::HeightmapSimulationShader::uniform_track_z_len, track_z_len);
glBeginTransformFeedback(GL_POINTS);
glDrawArrays(GL_POINTS, 0, count);
glEndTransformFeedback();
glDisableVertexAttribArray(HeightmapSimulationShader::attrib_position);
glDisableVertexAttribArray(HeightmapSimulationShader::attrib_lifetime);
glDisableVertexAttribArray(HeightmapSimulationShader::attrib_velocity);
// glDisableVertexAttribArray(HeightmapSimulationShader::attrib_size);
glDisableVertexAttribArray(HeightmapSimulationShader::attrib_initial_position);
glDisableVertexAttribArray(HeightmapSimulationShader::attrib_initial_lifetime);
glDisableVertexAttribArray(HeightmapSimulationShader::attrib_initial_velocity);
glDisableVertexAttribArray(HeightmapSimulationShader::attrib_initial_size);
glDisableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_position);
glDisableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_lifetime);
glDisableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_velocity);
// glDisableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_size);
glDisableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_initial_position);
glDisableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_initial_lifetime);
glDisableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_initial_velocity);
glDisableVertexAttribArray(ParticleShader::HeightmapSimulationShader::attrib_initial_size);
glDisable(GL_RASTERIZER_DISCARD);
std::swap(tfb_buffers[0], tfb_buffers[1]);
}
@@ -520,44 +385,44 @@ void ParticleSystemProxy::simulateNoHeightmap()
int timediff = int(GUIEngine::getLatestDt() * 1000.f);
int active_count = getEmitter()->getMaxLifeTime() * getEmitter()->getMaxParticlesPerSecond() / 1000;
core::matrix4 matrix = getAbsoluteTransformation();
glUseProgram(SimpleSimulationShader::Program);
glUseProgram(ParticleShader::SimpleSimulationShader::Program);
glEnable(GL_RASTERIZER_DISCARD);
glEnableVertexAttribArray(SimpleSimulationShader::attrib_position);
glEnableVertexAttribArray(SimpleSimulationShader::attrib_lifetime);
glEnableVertexAttribArray(SimpleSimulationShader::attrib_velocity);
glEnableVertexAttribArray(SimpleSimulationShader::attrib_size);
glEnableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_position);
glEnableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_lifetime);
glEnableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_velocity);
glEnableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_size);
glBindBuffer(GL_ARRAY_BUFFER, tfb_buffers[0]);
glVertexAttribPointer(SimpleSimulationShader::attrib_position, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)0);
glVertexAttribPointer(SimpleSimulationShader::attrib_lifetime, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(3 * sizeof(float)));
glVertexAttribPointer(SimpleSimulationShader::attrib_velocity, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(4 * sizeof(float)));
glVertexAttribPointer(SimpleSimulationShader::attrib_size, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(7 * sizeof(float)));
glEnableVertexAttribArray(SimpleSimulationShader::attrib_initial_position);
glEnableVertexAttribArray(SimpleSimulationShader::attrib_initial_lifetime);
glEnableVertexAttribArray(SimpleSimulationShader::attrib_initial_velocity);
glEnableVertexAttribArray(SimpleSimulationShader::attrib_initial_size);
glVertexAttribPointer(ParticleShader::SimpleSimulationShader::attrib_position, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)0);
glVertexAttribPointer(ParticleShader::SimpleSimulationShader::attrib_lifetime, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(3 * sizeof(float)));
glVertexAttribPointer(ParticleShader::SimpleSimulationShader::attrib_velocity, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(4 * sizeof(float)));
glVertexAttribPointer(ParticleShader::SimpleSimulationShader::attrib_size, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(7 * sizeof(float)));
glEnableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_initial_position);
glEnableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_initial_lifetime);
glEnableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_initial_velocity);
glEnableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_initial_size);
glBindBuffer(GL_ARRAY_BUFFER, initial_values_buffer);
glVertexAttribPointer(SimpleSimulationShader::attrib_initial_position, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)0);
glVertexAttribPointer(SimpleSimulationShader::attrib_initial_lifetime, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(3 * sizeof(float)));
glVertexAttribPointer(SimpleSimulationShader::attrib_initial_velocity, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(4 * sizeof(float)));
glVertexAttribPointer(SimpleSimulationShader::attrib_initial_size, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(7 * sizeof(float)));
glVertexAttribPointer(ParticleShader::SimpleSimulationShader::attrib_initial_position, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)0);
glVertexAttribPointer(ParticleShader::SimpleSimulationShader::attrib_initial_lifetime, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(3 * sizeof(float)));
glVertexAttribPointer(ParticleShader::SimpleSimulationShader::attrib_initial_velocity, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(4 * sizeof(float)));
glVertexAttribPointer(ParticleShader::SimpleSimulationShader::attrib_initial_size, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid*)(7 * sizeof(float)));
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfb_buffers[1]);
glUniform1i(SimpleSimulationShader::uniform_dt, timediff);
glUniform1i(SimpleSimulationShader::uniform_level, active_count);
glUniformMatrix4fv(SimpleSimulationShader::uniform_sourcematrix, 1, GL_FALSE, matrix.pointer());
glUniform1f(SimpleSimulationShader::uniform_size_increase_factor, size_increase_factor);
glUniform1i(ParticleShader::SimpleSimulationShader::uniform_dt, timediff);
glUniform1i(ParticleShader::SimpleSimulationShader::uniform_level, active_count);
glUniformMatrix4fv(ParticleShader::SimpleSimulationShader::uniform_sourcematrix, 1, GL_FALSE, matrix.pointer());
glUniform1f(ParticleShader::SimpleSimulationShader::uniform_size_increase_factor, size_increase_factor);
glBeginTransformFeedback(GL_POINTS);
glDrawArrays(GL_POINTS, 0, count);
glEndTransformFeedback();
glDisableVertexAttribArray(SimpleSimulationShader::attrib_position);
glDisableVertexAttribArray(SimpleSimulationShader::attrib_lifetime);
glDisableVertexAttribArray(SimpleSimulationShader::attrib_velocity);
glDisableVertexAttribArray(SimpleSimulationShader::attrib_size);
glDisableVertexAttribArray(SimpleSimulationShader::attrib_initial_position);
glDisableVertexAttribArray(SimpleSimulationShader::attrib_initial_lifetime);
glDisableVertexAttribArray(SimpleSimulationShader::attrib_initial_velocity);
glDisableVertexAttribArray(SimpleSimulationShader::attrib_initial_size);
glDisableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_position);
glDisableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_lifetime);
glDisableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_velocity);
glDisableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_size);
glDisableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_initial_position);
glDisableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_initial_lifetime);
glDisableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_initial_velocity);
glDisableVertexAttribArray(ParticleShader::SimpleSimulationShader::attrib_initial_size);
glDisable(GL_RASTERIZER_DISCARD);
std::swap(tfb_buffers[0], tfb_buffers[1]);
}
@@ -580,59 +445,59 @@ void ParticleSystemProxy::drawFlip()
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
else
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glUseProgram(FlipParticleRender::Program);
glEnableVertexAttribArray(FlipParticleRender::attrib_pos);
glEnableVertexAttribArray(FlipParticleRender::attrib_lf);
glEnableVertexAttribArray(FlipParticleRender::attrib_quadcorner);
glEnableVertexAttribArray(FlipParticleRender::attrib_texcoord);
glEnableVertexAttribArray(FlipParticleRender::attrib_sz);
glUseProgram(ParticleShader::FlipParticleRender::Program);
glEnableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_pos);
glEnableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_lf);
glEnableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_quadcorner);
glEnableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_texcoord);
glEnableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_sz);
float screen[2] = {
(float)UserConfigParams::m_width,
(float)UserConfigParams::m_height
};
bindUniformToTextureUnit(FlipParticleRender::uniform_tex, texture, 0);
bindUniformToTextureUnit(FlipParticleRender::uniform_normal_and_depths, normal_and_depth, 1);
bindUniformToTextureUnit(ParticleShader::FlipParticleRender::uniform_tex, texture, 0);
bindUniformToTextureUnit(ParticleShader::FlipParticleRender::uniform_normal_and_depths, normal_and_depth, 1);
glUniformMatrix4fv(FlipParticleRender::uniform_invproj, 1, GL_FALSE, irr_driver->getInvProjMatrix().pointer());
glUniform2f(FlipParticleRender::uniform_screen, screen[0], screen[1]);
glUniformMatrix4fv(FlipParticleRender::uniform_matrix, 1, GL_FALSE, irr_driver->getProjMatrix().pointer());
glUniformMatrix4fv(FlipParticleRender::uniform_viewmatrix, 1, GL_FALSE, irr_driver->getViewMatrix().pointer());
glUniformMatrix4fv(ParticleShader::FlipParticleRender::uniform_invproj, 1, GL_FALSE, irr_driver->getInvProjMatrix().pointer());
glUniform2f(ParticleShader::FlipParticleRender::uniform_screen, screen[0], screen[1]);
glUniformMatrix4fv(ParticleShader::FlipParticleRender::uniform_matrix, 1, GL_FALSE, irr_driver->getProjMatrix().pointer());
glUniformMatrix4fv(ParticleShader::FlipParticleRender::uniform_viewmatrix, 1, GL_FALSE, irr_driver->getViewMatrix().pointer());
glEnableVertexAttribArray(FlipParticleRender::attrib_rotationvec);
glEnableVertexAttribArray(FlipParticleRender::attrib_anglespeed);
glEnableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_rotationvec);
glEnableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_anglespeed);
glBindBuffer(GL_ARRAY_BUFFER, quaternionsbuffer);
glVertexAttribPointer(FlipParticleRender::attrib_rotationvec, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glVertexAttribPointer(FlipParticleRender::attrib_anglespeed, 1, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (GLvoid *)(3 * sizeof(float)));
glVertexAttribPointer(ParticleShader::FlipParticleRender::attrib_rotationvec, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glVertexAttribPointer(ParticleShader::FlipParticleRender::attrib_anglespeed, 1, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (GLvoid *)(3 * sizeof(float)));
glBindBuffer(GL_ARRAY_BUFFER, quad_vertex_buffer);
glVertexAttribPointer(FlipParticleRender::attrib_quadcorner, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glVertexAttribPointer(FlipParticleRender::attrib_texcoord, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (GLvoid *)(2 * sizeof(float)));
glVertexAttribPointer(ParticleShader::FlipParticleRender::attrib_quadcorner, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glVertexAttribPointer(ParticleShader::FlipParticleRender::attrib_texcoord, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (GLvoid *)(2 * sizeof(float)));
glBindBuffer(GL_ARRAY_BUFFER, tfb_buffers[0]);
glVertexAttribPointer(FlipParticleRender::attrib_pos, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), 0);
glVertexAttribPointer(FlipParticleRender::attrib_lf, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid *)(3 * sizeof(float)));
glVertexAttribPointer(FlipParticleRender::attrib_sz, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid *)(7 * sizeof(float)));
glVertexAttribPointer(ParticleShader::FlipParticleRender::attrib_pos, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), 0);
glVertexAttribPointer(ParticleShader::FlipParticleRender::attrib_lf, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid *)(3 * sizeof(float)));
glVertexAttribPointer(ParticleShader::FlipParticleRender::attrib_sz, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid *)(7 * sizeof(float)));
glVertexAttribDivisor(FlipParticleRender::attrib_lf, 1);
glVertexAttribDivisor(FlipParticleRender::attrib_pos, 1);
glVertexAttribDivisor(FlipParticleRender::attrib_sz, 1);
glVertexAttribDivisor(FlipParticleRender::attrib_rotationvec, 1);
glVertexAttribDivisor(FlipParticleRender::attrib_anglespeed, 1);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_lf, 1);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_pos, 1);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_sz, 1);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_rotationvec, 1);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_anglespeed, 1);
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, count);
glVertexAttribDivisor(FlipParticleRender::attrib_lf, 0);
glVertexAttribDivisor(FlipParticleRender::attrib_pos, 0);
glVertexAttribDivisor(FlipParticleRender::attrib_sz, 0);
glVertexAttribDivisor(FlipParticleRender::attrib_rotationvec, 0);
glVertexAttribDivisor(FlipParticleRender::attrib_anglespeed, 0);
glDisableVertexAttribArray(FlipParticleRender::attrib_pos);
glDisableVertexAttribArray(FlipParticleRender::attrib_lf);
glDisableVertexAttribArray(FlipParticleRender::attrib_quadcorner);
glDisableVertexAttribArray(FlipParticleRender::attrib_texcoord);
glDisableVertexAttribArray(FlipParticleRender::attrib_sz);
glDisableVertexAttribArray(FlipParticleRender::attrib_rotationvec);
glDisableVertexAttribArray(FlipParticleRender::attrib_anglespeed);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_lf, 0);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_pos, 0);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_sz, 0);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_rotationvec, 0);
glVertexAttribDivisor(ParticleShader::FlipParticleRender::attrib_anglespeed, 0);
glDisableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_pos);
glDisableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_lf);
glDisableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_quadcorner);
glDisableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_texcoord);
glDisableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_sz);
glDisableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_rotationvec);
glDisableVertexAttribArray(ParticleShader::FlipParticleRender::attrib_anglespeed);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glActiveTexture(GL_TEXTURE0);
glDisable(GL_BLEND);
@@ -649,47 +514,47 @@ void ParticleSystemProxy::drawNotFlip()
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
else
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glUseProgram(SimpleParticleRender::Program);
glEnableVertexAttribArray(SimpleParticleRender::attrib_pos);
glEnableVertexAttribArray(SimpleParticleRender::attrib_lf);
glEnableVertexAttribArray(SimpleParticleRender::attrib_quadcorner);
glEnableVertexAttribArray(SimpleParticleRender::attrib_texcoord);
glEnableVertexAttribArray(SimpleParticleRender::attrib_sz);
glUseProgram(ParticleShader::SimpleParticleRender::Program);
glEnableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_pos);
glEnableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_lf);
glEnableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_quadcorner);
glEnableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_texcoord);
glEnableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_sz);
float screen[2] = {
(float)UserConfigParams::m_width,
(float)UserConfigParams::m_height
};
bindUniformToTextureUnit(SimpleParticleRender::uniform_tex, texture, 0);
bindUniformToTextureUnit(SimpleParticleRender::uniform_normal_and_depths, normal_and_depth, 1);
bindUniformToTextureUnit(ParticleShader::SimpleParticleRender::uniform_tex, texture, 0);
bindUniformToTextureUnit(ParticleShader::SimpleParticleRender::uniform_normal_and_depths, normal_and_depth, 1);
glUniformMatrix4fv(SimpleParticleRender::uniform_invproj, 1, GL_FALSE, irr_driver->getInvProjMatrix().pointer());
glUniform2f(SimpleParticleRender::uniform_screen, screen[0], screen[1]);
glUniformMatrix4fv(SimpleParticleRender::uniform_matrix, 1, GL_FALSE, irr_driver->getProjMatrix().pointer());
glUniformMatrix4fv(SimpleParticleRender::uniform_viewmatrix, 1, GL_FALSE, irr_driver->getViewMatrix().pointer());
glUniformMatrix4fv(ParticleShader::SimpleParticleRender::uniform_invproj, 1, GL_FALSE, irr_driver->getInvProjMatrix().pointer());
glUniform2f(ParticleShader::SimpleParticleRender::uniform_screen, screen[0], screen[1]);
glUniformMatrix4fv(ParticleShader::SimpleParticleRender::uniform_matrix, 1, GL_FALSE, irr_driver->getProjMatrix().pointer());
glUniformMatrix4fv(ParticleShader::SimpleParticleRender::uniform_viewmatrix, 1, GL_FALSE, irr_driver->getViewMatrix().pointer());
glBindBuffer(GL_ARRAY_BUFFER, quad_vertex_buffer);
glVertexAttribPointer(SimpleParticleRender::attrib_quadcorner, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glVertexAttribPointer(SimpleParticleRender::attrib_texcoord, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (GLvoid *)(2 * sizeof(float)));
glVertexAttribPointer(ParticleShader::SimpleParticleRender::attrib_quadcorner, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glVertexAttribPointer(ParticleShader::SimpleParticleRender::attrib_texcoord, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (GLvoid *)(2 * sizeof(float)));
glBindBuffer(GL_ARRAY_BUFFER, tfb_buffers[0]);
glVertexAttribPointer(SimpleParticleRender::attrib_pos, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), 0);
glVertexAttribPointer(SimpleParticleRender::attrib_lf, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid *)(3 * sizeof(float)));
glVertexAttribPointer(SimpleParticleRender::attrib_sz, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid *)(7 * sizeof(float)));
glVertexAttribPointer(ParticleShader::SimpleParticleRender::attrib_pos, 3, GL_FLOAT, GL_FALSE, sizeof(ParticleData), 0);
glVertexAttribPointer(ParticleShader::SimpleParticleRender::attrib_lf, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid *)(3 * sizeof(float)));
glVertexAttribPointer(ParticleShader::SimpleParticleRender::attrib_sz, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleData), (GLvoid *)(7 * sizeof(float)));
glVertexAttribDivisor(SimpleParticleRender::attrib_lf, 1);
glVertexAttribDivisor(SimpleParticleRender::attrib_pos, 1);
glVertexAttribDivisor(SimpleParticleRender::attrib_sz, 1);
glVertexAttribDivisor(ParticleShader::SimpleParticleRender::attrib_lf, 1);
glVertexAttribDivisor(ParticleShader::SimpleParticleRender::attrib_pos, 1);
glVertexAttribDivisor(ParticleShader::SimpleParticleRender::attrib_sz, 1);
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, count);
glVertexAttribDivisor(SimpleParticleRender::attrib_lf, 0);
glVertexAttribDivisor(SimpleParticleRender::attrib_pos, 0);
glVertexAttribDivisor(SimpleParticleRender::attrib_sz, 0);
glDisableVertexAttribArray(SimpleParticleRender::attrib_pos);
glDisableVertexAttribArray(SimpleParticleRender::attrib_lf);
glDisableVertexAttribArray(SimpleParticleRender::attrib_quadcorner);
glDisableVertexAttribArray(SimpleParticleRender::attrib_texcoord);
glDisableVertexAttribArray(SimpleParticleRender::attrib_sz);
glVertexAttribDivisor(ParticleShader::SimpleParticleRender::attrib_lf, 0);
glVertexAttribDivisor(ParticleShader::SimpleParticleRender::attrib_pos, 0);
glVertexAttribDivisor(ParticleShader::SimpleParticleRender::attrib_sz, 0);
glDisableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_pos);
glDisableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_lf);
glDisableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_quadcorner);
glDisableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_texcoord);
glDisableVertexAttribArray(ParticleShader::SimpleParticleRender::attrib_sz);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glActiveTexture(GL_TEXTURE0);
glDisable(GL_BLEND);

View File

@@ -249,6 +249,10 @@ void Shaders::loadShaders()
MeshShader::BubbleShader::init();
MeshShader::TransparentShader::init();
MeshShader::DisplaceShader::init();
ParticleShader::FlipParticleRender::init();
ParticleShader::HeightmapSimulationShader::init();
ParticleShader::SimpleParticleRender::init();
ParticleShader::SimpleSimulationShader::init();
}
Shaders::~Shaders()
@@ -676,6 +680,164 @@ namespace MeshShader
}
}
namespace ParticleShader
{
GLuint SimpleSimulationShader::Program;
GLuint SimpleSimulationShader::attrib_position;
GLuint SimpleSimulationShader::attrib_velocity;
GLuint SimpleSimulationShader::attrib_lifetime;
GLuint SimpleSimulationShader::attrib_initial_position;
GLuint SimpleSimulationShader::attrib_initial_velocity;
GLuint SimpleSimulationShader::attrib_initial_lifetime;
GLuint SimpleSimulationShader::attrib_size;
GLuint SimpleSimulationShader::attrib_initial_size;
GLuint SimpleSimulationShader::uniform_sourcematrix;
GLuint SimpleSimulationShader::uniform_dt;
GLuint SimpleSimulationShader::uniform_level;
GLuint SimpleSimulationShader::uniform_size_increase_factor;
void SimpleSimulationShader::init()
{
const char *varyings[] = {
"new_particle_position",
"new_lifetime",
"new_particle_velocity",
"new_size",
};
Program = LoadTFBProgram(file_manager->getAsset("shaders/pointemitter.vert").c_str(), varyings, 4);
uniform_dt = glGetUniformLocation(Program, "dt");
uniform_sourcematrix = glGetUniformLocation(Program, "sourcematrix");
uniform_level = glGetUniformLocation(Program, "level");
uniform_size_increase_factor = glGetUniformLocation(Program, "size_increase_factor");
attrib_position = glGetAttribLocation(Program, "particle_position");
attrib_lifetime = glGetAttribLocation(Program, "lifetime");
attrib_velocity = glGetAttribLocation(Program, "particle_velocity");
attrib_size = glGetAttribLocation(Program, "size");
attrib_initial_position = glGetAttribLocation(Program, "particle_position_initial");
attrib_initial_lifetime = glGetAttribLocation(Program, "lifetime_initial");
attrib_initial_velocity = glGetAttribLocation(Program, "particle_velocity_initial");
attrib_initial_size = glGetAttribLocation(Program, "size_initial");
}
GLuint HeightmapSimulationShader::Program;
GLuint HeightmapSimulationShader::attrib_position;
GLuint HeightmapSimulationShader::attrib_velocity;
GLuint HeightmapSimulationShader::attrib_lifetime;
GLuint HeightmapSimulationShader::attrib_initial_position;
GLuint HeightmapSimulationShader::attrib_initial_velocity;
GLuint HeightmapSimulationShader::attrib_initial_lifetime;
GLuint HeightmapSimulationShader::attrib_size;
GLuint HeightmapSimulationShader::attrib_initial_size;
GLuint HeightmapSimulationShader::uniform_sourcematrix;
GLuint HeightmapSimulationShader::uniform_dt;
GLuint HeightmapSimulationShader::uniform_level;
GLuint HeightmapSimulationShader::uniform_size_increase_factor;
GLuint HeightmapSimulationShader::uniform_track_x;
GLuint HeightmapSimulationShader::uniform_track_z;
GLuint HeightmapSimulationShader::uniform_track_x_len;
GLuint HeightmapSimulationShader::uniform_track_z_len;
GLuint HeightmapSimulationShader::uniform_heightmap;
void HeightmapSimulationShader::init()
{
const char *varyings[] = {
"new_particle_position",
"new_lifetime",
"new_particle_velocity",
"new_size",
};
Program = LoadTFBProgram(file_manager->getAsset("shaders/particlesimheightmap.vert").c_str(), varyings, 4);
uniform_dt = glGetUniformLocation(Program, "dt");
uniform_sourcematrix = glGetUniformLocation(Program, "sourcematrix");
uniform_level = glGetUniformLocation(Program, "level");
uniform_size_increase_factor = glGetUniformLocation(Program, "size_increase_factor");
attrib_position = glGetAttribLocation(Program, "particle_position");
attrib_lifetime = glGetAttribLocation(Program, "lifetime");
attrib_velocity = glGetAttribLocation(Program, "particle_velocity");
attrib_size = glGetAttribLocation(Program, "size");
attrib_initial_position = glGetAttribLocation(Program, "particle_position_initial");
attrib_initial_lifetime = glGetAttribLocation(Program, "lifetime_initial");
attrib_initial_velocity = glGetAttribLocation(Program, "particle_velocity_initial");
attrib_initial_size = glGetAttribLocation(Program, "size_initial");
uniform_heightmap = glGetUniformLocation(Program, "heightmap");
uniform_track_x = glGetUniformLocation(Program, "track_x");
uniform_track_x_len = glGetUniformLocation(Program, "track_x_len");
uniform_track_z = glGetUniformLocation(Program, "track_z");
uniform_track_z_len = glGetUniformLocation(Program, "track_z_len");
}
GLuint SimpleParticleRender::Program;
GLuint SimpleParticleRender::attrib_pos;
GLuint SimpleParticleRender::attrib_lf;
GLuint SimpleParticleRender::attrib_quadcorner;
GLuint SimpleParticleRender::attrib_texcoord;
GLuint SimpleParticleRender::attrib_sz;
GLuint SimpleParticleRender::uniform_matrix;
GLuint SimpleParticleRender::uniform_viewmatrix;
GLuint SimpleParticleRender::uniform_tex;
GLuint SimpleParticleRender::uniform_normal_and_depths;
GLuint SimpleParticleRender::uniform_screen;
GLuint SimpleParticleRender::uniform_invproj;
void SimpleParticleRender::init()
{
Program = LoadProgram(file_manager->getAsset("shaders/particle.vert").c_str(), file_manager->getAsset("shaders/particle.frag").c_str());
attrib_pos = glGetAttribLocation(Program, "position");
attrib_sz = glGetAttribLocation(Program, "size");
attrib_lf = glGetAttribLocation(Program, "lifetime");
attrib_quadcorner = glGetAttribLocation(Program, "quadcorner");
attrib_texcoord = glGetAttribLocation(Program, "texcoord");
uniform_matrix = glGetUniformLocation(Program, "ProjectionMatrix");
uniform_viewmatrix = glGetUniformLocation(Program, "ViewMatrix");
uniform_tex = glGetUniformLocation(Program, "tex");
uniform_invproj = glGetUniformLocation(Program, "invproj");
uniform_screen = glGetUniformLocation(Program, "screen");
uniform_normal_and_depths = glGetUniformLocation(Program, "normals_and_depth");
}
GLuint FlipParticleRender::Program;
GLuint FlipParticleRender::attrib_pos;
GLuint FlipParticleRender::attrib_lf;
GLuint FlipParticleRender::attrib_quadcorner;
GLuint FlipParticleRender::attrib_texcoord;
GLuint FlipParticleRender::attrib_sz;
GLuint FlipParticleRender::attrib_rotationvec;
GLuint FlipParticleRender::attrib_anglespeed;
GLuint FlipParticleRender::uniform_matrix;
GLuint FlipParticleRender::uniform_viewmatrix;
GLuint FlipParticleRender::uniform_tex;
GLuint FlipParticleRender::uniform_normal_and_depths;
GLuint FlipParticleRender::uniform_screen;
GLuint FlipParticleRender::uniform_invproj;
void FlipParticleRender::init()
{
Program = LoadProgram(file_manager->getAsset("shaders/flipparticle.vert").c_str(), file_manager->getAsset("shaders/particle.frag").c_str());
attrib_pos = glGetAttribLocation(Program, "position");
attrib_sz = glGetAttribLocation(Program, "size");
attrib_lf = glGetAttribLocation(Program, "lifetime");
attrib_quadcorner = glGetAttribLocation(Program, "quadcorner");
attrib_texcoord = glGetAttribLocation(Program, "texcoord");
attrib_anglespeed = glGetAttribLocation(Program, "anglespeed");
attrib_rotationvec = glGetAttribLocation(Program, "rotationvec");
uniform_matrix = glGetUniformLocation(Program, "ProjectionMatrix");
uniform_viewmatrix = glGetUniformLocation(Program, "ViewMatrix");
uniform_tex = glGetUniformLocation(Program, "tex");
uniform_invproj = glGetUniformLocation(Program, "invproj");
uniform_screen = glGetUniformLocation(Program, "screen");
uniform_normal_and_depths = glGetUniformLocation(Program, "normals_and_depth");
}
}
static GLuint createVAO(GLuint Program)
{
GLuint vao;

View File

@@ -172,6 +172,53 @@ public:
}
namespace ParticleShader
{
class SimpleSimulationShader
{
public:
static GLuint Program;
static GLuint attrib_position, attrib_velocity, attrib_lifetime, attrib_initial_position, attrib_initial_velocity, attrib_initial_lifetime, attrib_size, attrib_initial_size;
static GLuint uniform_sourcematrix, uniform_dt, uniform_level, uniform_size_increase_factor;
static void init();
};
class HeightmapSimulationShader
{
public:
static GLuint Program;
static GLuint attrib_position, attrib_velocity, attrib_lifetime, attrib_initial_position, attrib_initial_velocity, attrib_initial_lifetime, attrib_size, attrib_initial_size;
static GLuint uniform_sourcematrix, uniform_dt, uniform_level, uniform_size_increase_factor;
static GLuint uniform_track_x, uniform_track_z, uniform_track_x_len, uniform_track_z_len, uniform_heightmap;
static void init();
};
class SimpleParticleRender
{
public:
static GLuint Program;
static GLuint attrib_pos, attrib_lf, attrib_quadcorner, attrib_texcoord, attrib_sz;
static GLuint uniform_matrix, uniform_viewmatrix, uniform_tex, uniform_normal_and_depths, uniform_screen, uniform_invproj;
static void init();
};
class FlipParticleRender
{
public:
static GLuint Program;
static GLuint attrib_pos, attrib_lf, attrib_quadcorner, attrib_texcoord, attrib_sz, attrib_rotationvec, attrib_anglespeed;
static GLuint uniform_matrix, uniform_viewmatrix, uniform_tex, uniform_normal_and_depths, uniform_screen, uniform_invproj;
static void init();
};
}
namespace FullScreenShader
{