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