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:
parent
7a95d46448
commit
88bb3a8da8
@ -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.);
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user