Merge pull request #71520 from conradhappeliv/fix-71480

Fix GPUParticles2D not recomputing transforms each frame
This commit is contained in:
Rémi Verschelde 2023-01-17 10:14:32 +01:00
commit e1e30f9fc7
No known key found for this signature in database
GPG key ID: C3336907360768E1

View file

@ -1415,7 +1415,6 @@ void ParticlesStorage::update_particles() {
} }
bool zero_time_scale = Engine::get_singleton()->get_time_scale() <= 0.0; bool zero_time_scale = Engine::get_singleton()->get_time_scale() <= 0.0;
bool updated = false;
if (particles->clear && particles->pre_process_time > 0.0) { if (particles->clear && particles->pre_process_time > 0.0) {
double frame_time; double frame_time;
@ -1430,7 +1429,6 @@ void ParticlesStorage::update_particles() {
while (todo >= 0) { while (todo >= 0) {
_particles_process(particles, frame_time); _particles_process(particles, frame_time);
todo -= frame_time; todo -= frame_time;
updated = true;
} }
} }
@ -1452,10 +1450,9 @@ void ParticlesStorage::update_particles() {
} }
double todo = particles->frame_remainder + delta; double todo = particles->frame_remainder + delta;
while (todo >= frame_time || (particles->clear && !updated)) { while (todo >= frame_time || particles->clear) {
_particles_process(particles, frame_time); _particles_process(particles, frame_time);
todo -= decr; todo -= decr;
updated = true;
} }
particles->frame_remainder = todo; particles->frame_remainder = todo;
@ -1463,16 +1460,16 @@ void ParticlesStorage::update_particles() {
} else { } else {
if (zero_time_scale) { if (zero_time_scale) {
_particles_process(particles, 0.0); _particles_process(particles, 0.0);
updated = true;
} else { } else {
_particles_process(particles, RendererCompositorRD::singleton->get_frame_delta_time()); _particles_process(particles, RendererCompositorRD::singleton->get_frame_delta_time());
updated = true;
} }
} }
//copy particles to instance buffer // Ensure that memory is initialized (the code above should ensure that _particles_process is always called at least once upon clearing).
DEV_ASSERT(!particles->clear);
if (updated && particles->draw_order != RS::PARTICLES_DRAW_ORDER_VIEW_DEPTH && particles->transform_align != RS::PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD && particles->transform_align != RS::PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD_Y_TO_VELOCITY) { // Copy particles to instance buffer.
if (particles->draw_order != RS::PARTICLES_DRAW_ORDER_VIEW_DEPTH && particles->transform_align != RS::PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD && particles->transform_align != RS::PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD_Y_TO_VELOCITY) {
//does not need view dependent operation, do copy here //does not need view dependent operation, do copy here
ParticlesShader::CopyPushConstant copy_push_constant; ParticlesShader::CopyPushConstant copy_push_constant;