diff --git a/scene/3d/cpu_particles.cpp b/scene/3d/cpu_particles.cpp index e91f41ec246..ab776bace4d 100644 --- a/scene/3d/cpu_particles.cpp +++ b/scene/3d/cpu_particles.cpp @@ -43,6 +43,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; @@ -50,7 +58,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) { @@ -534,7 +542,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 @@ -1206,8 +1214,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 5a871d1219e..808bdf240f1 100644 --- a/scene/3d/cpu_particles.h +++ b/scene/3d/cpu_particles.h @@ -212,6 +212,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 {