GPUParticle: Fix some parameters not used correctly.
Some previous value (like dt) came from debug attempt. This fixes the particles behind the wheels of the wagon in minel. git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14848 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
43f4d1cdfb
commit
8670aa86dc
@ -14,8 +14,8 @@ out vec4 new_particle_velocity;
|
|||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
vec4 initialposition = sourcematrix * vec4(0., 0., 0., 1.0);
|
vec4 initialposition = sourcematrix * vec4(0., 0., 0., 1.0);
|
||||||
new_particle_position = (lifetime > 0.) ? particle_position + particle_velocity.xyz * float(dt) : initialposition.xyz;
|
new_particle_position = (lifetime > 0.) ? particle_position + particle_velocity.xyz * float(dt) : initialposition.xyz - particle_velocity.xyz * lifetime;
|
||||||
new_lifetime = (lifetime > 0.) ? lifetime - float(dt) : float(duration);
|
new_lifetime = (lifetime > 0.) ? lifetime - float(dt) : float(duration) - lifetime;
|
||||||
new_particle_velocity = particle_velocity;
|
new_particle_velocity = particle_velocity;
|
||||||
gl_Position = vec4(0.);
|
gl_Position = vec4(0.);
|
||||||
}
|
}
|
||||||
|
@ -239,10 +239,10 @@ void ParticleSystemProxy::setEmitter(scene::IParticleEmitter* emitter)
|
|||||||
// Pass a fake material type to force irrlicht to update its internal states on rendering
|
// Pass a fake material type to force irrlicht to update its internal states on rendering
|
||||||
setMaterialType(irr_driver->getShader(ES_RAIN));
|
setMaterialType(irr_driver->getShader(ES_RAIN));
|
||||||
setAutomaticCulling(0);
|
setAutomaticCulling(0);
|
||||||
|
LastEmitTime = 0;
|
||||||
initGL();
|
initGL();
|
||||||
count = emitter->getMaxParticlesPerSecond();
|
|
||||||
duration = emitter->getMaxLifeTime();
|
duration = emitter->getMaxLifeTime();
|
||||||
float initial_lifetime_incr = 1000.;
|
count = emitter->getMaxParticlesPerSecond() * duration / 1000;
|
||||||
const char *varyings[] = {
|
const char *varyings[] = {
|
||||||
"new_particle_position",
|
"new_particle_position",
|
||||||
"new_lifetime",
|
"new_lifetime",
|
||||||
@ -258,7 +258,7 @@ void ParticleSystemProxy::setEmitter(scene::IParticleEmitter* emitter)
|
|||||||
loc_position = glGetAttribLocation(SimulationProgram, "particle_position");
|
loc_position = glGetAttribLocation(SimulationProgram, "particle_position");
|
||||||
loc_lifetime = glGetAttribLocation(SimulationProgram, "lifetime");
|
loc_lifetime = glGetAttribLocation(SimulationProgram, "lifetime");
|
||||||
loc_velocity = glGetAttribLocation(SimulationProgram, "particle_velocity");
|
loc_velocity = glGetAttribLocation(SimulationProgram, "particle_velocity");
|
||||||
printf("count:%d\nduration:%d\ninitial_lifetine:%f\n", count, duration, initial_lifetime_incr);
|
printf("count:%d\nduration:%d\n", count, duration);
|
||||||
|
|
||||||
RenderProgram = LoadProgram(file_manager->getAsset("shaders/particle.vert").c_str(), file_manager->getAsset("shaders/particle.frag").c_str());
|
RenderProgram = LoadProgram(file_manager->getAsset("shaders/particle.vert").c_str(), file_manager->getAsset("shaders/particle.frag").c_str());
|
||||||
loc_matrix = glGetUniformLocation(RenderProgram, "matrix");
|
loc_matrix = glGetUniformLocation(RenderProgram, "matrix");
|
||||||
@ -293,6 +293,17 @@ void ParticleSystemProxy::setEmitter(scene::IParticleEmitter* emitter)
|
|||||||
|
|
||||||
void ParticleSystemProxy::simulate()
|
void ParticleSystemProxy::simulate()
|
||||||
{
|
{
|
||||||
|
unsigned time = os::Timer::getTime();
|
||||||
|
if (LastEmitTime == 0)
|
||||||
|
{
|
||||||
|
LastEmitTime = time;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 now = time;
|
||||||
|
u32 timediff = time - LastEmitTime;
|
||||||
|
LastEmitTime = time;
|
||||||
|
|
||||||
core::matrix4 matrix = getAbsoluteTransformation();
|
core::matrix4 matrix = getAbsoluteTransformation();
|
||||||
glUseProgram(SimulationProgram);
|
glUseProgram(SimulationProgram);
|
||||||
glEnable(GL_RASTERIZER_DISCARD);
|
glEnable(GL_RASTERIZER_DISCARD);
|
||||||
@ -305,7 +316,7 @@ void ParticleSystemProxy::simulate()
|
|||||||
glVertexAttribPointer(loc_velocity, 4, GL_FLOAT, GL_FALSE, COMPONENTCOUNT * sizeof(float), (GLvoid*)(4 * sizeof(float)));
|
glVertexAttribPointer(loc_velocity, 4, GL_FLOAT, GL_FALSE, COMPONENTCOUNT * sizeof(float), (GLvoid*)(4 * sizeof(float)));
|
||||||
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfb_buffers[1]);
|
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfb_buffers[1]);
|
||||||
|
|
||||||
glUniform1i(loc_dt, 1);
|
glUniform1i(loc_dt, timediff);
|
||||||
glUniform1i(loc_duration, duration);
|
glUniform1i(loc_duration, duration);
|
||||||
glUniformMatrix4fv(loc_sourcematrix, 1, GL_FALSE, matrix.pointer());
|
glUniformMatrix4fv(loc_sourcematrix, 1, GL_FALSE, matrix.pointer());
|
||||||
glBeginTransformFeedback(GL_POINTS);
|
glBeginTransformFeedback(GL_POINTS);
|
||||||
|
@ -34,7 +34,7 @@ protected:
|
|||||||
GLuint loc_position, loc_velocity, loc_lifetime;
|
GLuint loc_position, loc_velocity, loc_lifetime;
|
||||||
GLuint tfb_buffers[2];
|
GLuint tfb_buffers[2];
|
||||||
GLuint texture, normal_and_depth;
|
GLuint texture, normal_and_depth;
|
||||||
unsigned duration, count;
|
unsigned duration, count, LastEmitTime;
|
||||||
|
|
||||||
virtual void simulate();
|
virtual void simulate();
|
||||||
virtual void draw();
|
virtual void draw();
|
||||||
|
Loading…
Reference in New Issue
Block a user