Merge pull request #16503 from Chaosus/particlesfix
Fix invalid particle movement when time_scale is zero
This commit is contained in:
commit
b88a16c7ac
1 changed files with 17 additions and 3 deletions
|
@ -29,6 +29,7 @@
|
|||
/*************************************************************************/
|
||||
|
||||
#include "rasterizer_storage_gles3.h"
|
||||
#include "engine.h"
|
||||
#include "project_settings.h"
|
||||
#include "rasterizer_canvas_gles3.h"
|
||||
#include "rasterizer_scene_gles3.h"
|
||||
|
@ -5855,6 +5856,8 @@ void RasterizerStorageGLES3::update_particles() {
|
|||
shaders.particles.set_uniform(ParticlesShaderGLES3::EMITTING, particles->emitting);
|
||||
shaders.particles.set_uniform(ParticlesShaderGLES3::RANDOMNESS, particles->randomness);
|
||||
|
||||
bool zero_time_scale = Engine::get_singleton()->get_time_scale() <= 0.0;
|
||||
|
||||
if (particles->clear && particles->pre_process_time > 0.0) {
|
||||
|
||||
float frame_time;
|
||||
|
@ -5872,7 +5875,15 @@ void RasterizerStorageGLES3::update_particles() {
|
|||
}
|
||||
|
||||
if (particles->fixed_fps > 0) {
|
||||
float frame_time = 1.0 / particles->fixed_fps;
|
||||
float frame_time;
|
||||
float decr;
|
||||
if (zero_time_scale) {
|
||||
frame_time = 0.0;
|
||||
decr = 1.0 / particles->fixed_fps;
|
||||
} else {
|
||||
frame_time = 1.0 / particles->fixed_fps;
|
||||
decr = frame_time;
|
||||
}
|
||||
float delta = frame.delta;
|
||||
if (delta > 0.1) { //avoid recursive stalls if fps goes below 10
|
||||
delta = 0.1;
|
||||
|
@ -5883,13 +5894,16 @@ void RasterizerStorageGLES3::update_particles() {
|
|||
|
||||
while (todo >= frame_time) {
|
||||
_particles_process(particles, frame_time);
|
||||
todo -= frame_time;
|
||||
todo -= decr;
|
||||
}
|
||||
|
||||
particles->frame_remainder = todo;
|
||||
|
||||
} else {
|
||||
_particles_process(particles, frame.delta);
|
||||
if (zero_time_scale)
|
||||
_particles_process(particles, 0.0);
|
||||
else
|
||||
_particles_process(particles, frame.delta);
|
||||
}
|
||||
|
||||
particle_update_list.remove(particle_update_list.first());
|
||||
|
|
Loading…
Reference in a new issue