diff --git a/data/shaders/pointemitter.vert b/data/shaders/pointemitter.vert index 361ace64e..503acd2d1 100644 --- a/data/shaders/pointemitter.vert +++ b/data/shaders/pointemitter.vert @@ -39,19 +39,23 @@ void main(void) if (gl_VertexID < level) { float dt_from_last_frame = fract(updated_lifetime) * lifetime_initial; - float coeff = 1. - dt_from_last_frame / dt; + float coeff = dt_from_last_frame / dt; vec4 previous_frame_position = previous_frame_sourcematrix * vec4(particle_position_initial, 1.0); vec4 current_frame_position = sourcematrix * vec4(particle_position_initial, 1.0); - vec4 updated_initialposition = mix(previous_frame_position, - current_frame_position, - coeff); + vec4 updated_initialposition = mix(current_frame_position, + previous_frame_position, + coeff); - vec4 updated_initial_velocity = mix(previous_frame_sourcematrix * vec4(particle_velocity_initial, 0.0), - sourcematrix * vec4(particle_velocity_initial, 0.0), - coeff) ; //TODO: add emitter speed + vec4 updated_initial_velocity = mix(sourcematrix * vec4(particle_velocity_initial, 0.0), + previous_frame_sourcematrix * vec4(particle_velocity_initial, 0.0), + coeff); //+ (current_frame_position - previous_frame_position) / dt; + //To be accurate, emitter speed should be added. + //But the simple formula ( (current_frame_position - previous_frame_position) / dt ) with a constant speed + //between 2 frames creates visual artifacts when the framerate is low, and a more accurate formula would need + //more complex computations. new_particle_position = updated_initialposition.xyz + dt_from_last_frame * updated_initial_velocity.xyz; new_particle_velocity = updated_initial_velocity.xyz; diff --git a/src/graphics/gpu_particles.hpp b/src/graphics/gpu_particles.hpp index b988ef167..d23d3952f 100644 --- a/src/graphics/gpu_particles.hpp +++ b/src/graphics/gpu_particles.hpp @@ -40,7 +40,7 @@ protected: float m_color_to[3]; bool m_first_execution; bool m_randomize_initial_y; - + GLuint texture; /** Previous frame particles emitter source matrix */ diff --git a/src/karts/kart.cpp b/src/karts/kart.cpp index 6012a0a0b..dd7cffc06 100644 --- a/src/karts/kart.cpp +++ b/src/karts/kart.cpp @@ -2605,9 +2605,8 @@ void Kart::updateGraphics(float dt, const Vec3& offset_xyz, // the normal maximum speed of the kart. if(nitro_frac>1.0f) nitro_frac = 1.0f; } - // speed * dt is the new size of the box in which particles start - m_kart_gfx->updateNitroGraphics(nitro_frac, getSpeed()*dt); - + m_kart_gfx->updateNitroGraphics(nitro_frac); + // Handle leaning of karts // ----------------------- // Note that we compare with maximum speed of the kart, not diff --git a/src/karts/kart_gfx.cpp b/src/karts/kart_gfx.cpp index ae62b1073..35785a31c 100644 --- a/src/karts/kart_gfx.cpp +++ b/src/karts/kart_gfx.cpp @@ -350,11 +350,10 @@ void KartGFX::update(float dt) } // update // ---------------------------------------------------------------------------- -/** Updates nitro dependent particle effects (and box sizes). +/** Updates nitro dependent particle effects. * \param nitro_frac Nitro fraction/ - * \param new_size New size of the box in which new particles are emitted. */ -void KartGFX::updateNitroGraphics(float nitro_frac, float new_size) +void KartGFX::updateNitroGraphics(float nitro_frac) { // Upate particle effects (creation rate, and emitter size // depending on speed) @@ -375,11 +374,6 @@ void KartGFX::updateNitroGraphics(float nitro_frac, float new_size) setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE2, 0); m_nitro_light->setVisible(false); } - resizeBox(KartGFX::KGFX_NITRO1, new_size); - resizeBox(KartGFX::KGFX_NITRO2, new_size); - resizeBox(KartGFX::KGFX_NITROSMOKE1, new_size); - resizeBox(KartGFX::KGFX_NITROSMOKE2, new_size); - resizeBox(KartGFX::KGFX_ZIPPER, new_size); } // updateGraphics diff --git a/src/karts/kart_gfx.hpp b/src/karts/kart_gfx.hpp index 5ac31df26..8f3c26490 100644 --- a/src/karts/kart_gfx.hpp +++ b/src/karts/kart_gfx.hpp @@ -99,7 +99,7 @@ public: void setCreationRateRelative(const KartGFXType type, float f); void updateTerrain(const ParticleKind *pk); void update(float dt); - void updateNitroGraphics(float f, float new_size); + void updateNitroGraphics(float f); void updateSkidLight(unsigned int level); }; // KartWGFX