GPUParticles: Add support for increase factor

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14945 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
vincentlj 2014-01-06 22:58:04 +00:00
parent 7a95d46448
commit 88bb3a8da8
4 changed files with 14 additions and 3 deletions

View File

@ -3,6 +3,7 @@ uniform int dt;
uniform mat4 sourcematrix;
uniform mat4 tinvsourcematrix;
uniform int level;
uniform float size_increase_factor;
in vec3 particle_position_initial;
in float lifetime_initial;
@ -30,6 +31,6 @@ void main(void)
new_particle_position = !reset ? particle_position + particle_velocity.xyz * float(dt) : initialposition.xyz;
new_lifetime = !reset ? adjusted_lifetime : 0.;
new_particle_velocity = !reset ? particle_velocity : adjusted_initial_velocity.xyz;
new_size = !reset ? size : size_initial;
new_size = !reset ? mix(size_initial, size_initial * size_increase_factor, adjusted_lifetime) : size_initial;
gl_Position = vec4(0.);
}

View File

@ -75,6 +75,7 @@ ParticleSystemProxy::ParticleSystemProxy(bool createDefaultEmitter,
fakemat.BackfaceCulling = false;
glGenBuffers(1, &initial_values_buffer);
glGenBuffers(2, tfb_buffers);
size_increase_factor = 0.;
if (quad_vertex_buffer)
return;
static const GLfloat quad_vertex[] = {
@ -95,7 +96,9 @@ ParticleSystemProxy::~ParticleSystemProxy()
glDeleteBuffers(1, &initial_values_buffer);
}
void ParticleSystemProxy::setAlphaAdditive(bool val) { m_alpha_additive = val; }
void ParticleSystemProxy::setAlphaAdditive(bool val) { m_alpha_additive = val; }
void ParticleSystemProxy::setIncreaseFactor(float val) { size_increase_factor = val; }
static
void generateLifetimeSizeDirection(scene::IParticleEmitter *emitter, float &lifetime, float &size, float &dirX, float &dirY, float &dirZ)
@ -240,6 +243,7 @@ GLuint ParticleSystemProxy::uniform_sourcematrix;
GLuint ParticleSystemProxy::uniform_tinvsourcematrix;
GLuint ParticleSystemProxy::uniform_dt;
GLuint ParticleSystemProxy::uniform_level;
GLuint ParticleSystemProxy::uniform_size_increase_factor;
GLuint ParticleSystemProxy::attrib_pos;
@ -313,6 +317,7 @@ void ParticleSystemProxy::setEmitter(scene::IParticleEmitter* emitter)
uniform_sourcematrix = glGetUniformLocation(SimulationProgram, "sourcematrix");
uniform_tinvsourcematrix = glGetUniformLocation(SimulationProgram, "tinvsourcematrix");
uniform_level = glGetUniformLocation(SimulationProgram, "level");
uniform_size_increase_factor = glGetUniformLocation(SimulationProgram, "size_increase_factor");
attrib_position = glGetAttribLocation(SimulationProgram, "particle_position");
attrib_lifetime = glGetAttribLocation(SimulationProgram, "lifetime");
@ -380,6 +385,7 @@ void ParticleSystemProxy::simulate()
glUniform1i(uniform_level, active_count);
glUniformMatrix4fv(uniform_sourcematrix, 1, GL_FALSE, matrix.pointer());
glUniformMatrix4fv(uniform_tinvsourcematrix, 1, GL_FALSE, tinvmatrix.pointer());
glUniform1f(uniform_size_increase_factor, size_increase_factor);
glBeginTransformFeedback(GL_POINTS);
glDrawArrays(GL_POINTS, 0, count);
glEndTransformFeedback();

View File

@ -29,10 +29,11 @@ protected:
video::SMaterial fakemat;
GLuint tfb_buffers[2], initial_values_buffer;
bool m_alpha_additive;
float size_increase_factor;
static GLuint SimulationProgram;
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_tinvsourcematrix, uniform_dt, uniform_level;
static GLuint uniform_sourcematrix, uniform_tinvsourcematrix, uniform_dt, uniform_level, uniform_size_increase_factor;
static GLuint RenderProgram;
static GLuint attrib_pos, attrib_lf, attrib_quadcorner, attrib_texcoord, attrib_sz;
@ -65,6 +66,7 @@ public:
virtual void setEmitter(scene::IParticleEmitter* emitter);
virtual void render();
void setAlphaAdditive(bool);
void setIncreaseFactor(float);
};
class PointEmitter : public GPUParticle

View File

@ -556,6 +556,8 @@ void ParticleEmitter::setParticleType(const ParticleKind* type)
m_node->createScaleParticleAffector(factor);
m_node->addAffector(scale_affector);
scale_affector->drop();
if (irr_driver->isGLSL())
static_cast<ParticleSystemProxy *>(m_node)->setIncreaseFactor(type->getScaleAffectorFactorX());
}
const float windspeed = type->getWindSpeed();