From 4d6dda4df0da2369dcdc6734ad592d535122d15a Mon Sep 17 00:00:00 2001 From: lawnjelly Date: Mon, 18 Apr 2022 15:18:43 +0100 Subject: [PATCH] Fix CPUParticles emission updating using physics interpolation When switching emission on and off, processing was always being switched on and off using internal_process, which was incorrect for using physics interpolation (where physics_process is the relevant one). This PR correctly updates the process mode according to whether physics interpolation is being used. --- scene/3d/cpu_particles.cpp | 22 ++++++++++++++++++---- scene/3d/cpu_particles.h | 1 + 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/scene/3d/cpu_particles.cpp b/scene/3d/cpu_particles.cpp index 49215ba74..218f89c94 100644 --- a/scene/3d/cpu_particles.cpp +++ b/scene/3d/cpu_particles.cpp @@ -46,6 +46,14 @@ PoolVector CPUParticles::get_faces(uint32_t p_usage_flags) const { return PoolVector(); } +void CPUParticles::_set_particles_processing(bool p_enable) { + if (_interpolated) { + set_physics_process_internal(p_enable); + } else { + set_process_internal(p_enable); + } +} + void CPUParticles::set_emitting(bool p_emitting) { if (emitting == p_emitting) { return; @@ -53,7 +61,7 @@ void CPUParticles::set_emitting(bool p_emitting) { emitting = p_emitting; if (emitting) { - set_process_internal(true); + _set_particles_processing(true); // first update before rendering to avoid one frame delay after emitting starts if ((time == 0) && !_interpolated) { @@ -537,7 +545,7 @@ void CPUParticles::_update_internal(bool p_on_physics_tick) { } else { inactive_time += delta; if (inactive_time > lifetime * 1.2) { - set_process_internal(false); + _set_particles_processing(false); _set_redraw(false); //reset variables @@ -1209,8 +1217,14 @@ void CPUParticles::_refresh_interpolation_state() { _set_redraw(false); _interpolated = interpolated; - set_process_internal(!_interpolated); - set_physics_process_internal(_interpolated); + + if (_interpolated) { + set_process_internal(false); + set_physics_process_internal(emitting); + } else { + set_physics_process_internal(false); + set_process_internal(emitting); + } // re-establish all connections _set_redraw(curr_redraw); diff --git a/scene/3d/cpu_particles.h b/scene/3d/cpu_particles.h index fa7f8d0ef..80cfd9982 100644 --- a/scene/3d/cpu_particles.h +++ b/scene/3d/cpu_particles.h @@ -215,6 +215,7 @@ private: void _update_render_thread(); void _set_redraw(bool p_redraw); + void _set_particles_processing(bool p_enable); void _refresh_interpolation_state(); void _fill_particle_data(const ParticleBase &p_source, float *r_dest, bool p_active) const {