diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2019-06-27 17:29:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-27 17:29:40 +0200 |
commit | 0636f709af58adfb04d9326192ae915f389c59f7 (patch) | |
tree | 251181b9f8526b5bc7b38d7a3b66263cac1248f4 | |
parent | fca9f0bb7f5a378c2270449a0f830d6ad82f3885 (diff) | |
parent | d59dbda24f780b1e52681b604ead650acd065a22 (diff) |
Merge pull request #29937 from clayjohn/particles-one-shot-bug
Update emitting status on one-shot particles
-rw-r--r-- | scene/2d/cpu_particles_2d.cpp | 3 | ||||
-rw-r--r-- | scene/2d/particles_2d.cpp | 26 | ||||
-rw-r--r-- | scene/3d/cpu_particles.cpp | 3 | ||||
-rw-r--r-- | scene/3d/particles.cpp | 28 |
4 files changed, 54 insertions, 6 deletions
diff --git a/scene/2d/cpu_particles_2d.cpp b/scene/2d/cpu_particles_2d.cpp index fba1c26d1c..faa0a08d10 100644 --- a/scene/2d/cpu_particles_2d.cpp +++ b/scene/2d/cpu_particles_2d.cpp @@ -532,7 +532,8 @@ void CPUParticles2D::_particles_process(float p_delta) { time = Math::fmod(time, lifetime); cycle++; if (one_shot && cycle > 0) { - emitting = false; + set_emitting(false); + _change_notify(); } } diff --git a/scene/2d/particles_2d.cpp b/scene/2d/particles_2d.cpp index 823794c3ba..7759897420 100644 --- a/scene/2d/particles_2d.cpp +++ b/scene/2d/particles_2d.cpp @@ -41,6 +41,12 @@ void Particles2D::set_emitting(bool p_emitting) { VS::get_singleton()->particles_set_emitting(particles, p_emitting); + + if (p_emitting && one_shot) { + set_process_internal(true); + } else if (!p_emitting) { + set_process_internal(false); + } } void Particles2D::set_amount(int p_amount) { @@ -60,8 +66,16 @@ void Particles2D::set_one_shot(bool p_enable) { one_shot = p_enable; VS::get_singleton()->particles_set_one_shot(particles, one_shot); - if (!one_shot && is_emitting()) - VisualServer::get_singleton()->particles_restart(particles); + + if (is_emitting()) { + + set_process_internal(true); + if (!one_shot) + VisualServer::get_singleton()->particles_restart(particles); + } + + if (!one_shot) + set_process_internal(false); } void Particles2D::set_pre_process_time(float p_time) { @@ -314,6 +328,14 @@ void Particles2D::_notification(int p_what) { if (p_what == NOTIFICATION_TRANSFORM_CHANGED) { _update_particle_emission_transform(); } + + if (p_what == NOTIFICATION_INTERNAL_PROCESS) { + + if (one_shot && !is_emitting()) { + _change_notify(); + set_process_internal(false); + } + } } void Particles2D::_bind_methods() { diff --git a/scene/3d/cpu_particles.cpp b/scene/3d/cpu_particles.cpp index ee5d416930..6ede9c10ef 100644 --- a/scene/3d/cpu_particles.cpp +++ b/scene/3d/cpu_particles.cpp @@ -505,7 +505,8 @@ void CPUParticles::_particles_process(float p_delta) { time = Math::fmod(time, lifetime); cycle++; if (one_shot && cycle > 0) { - emitting = false; + set_emitting(false); + _change_notify(); } } diff --git a/scene/3d/particles.cpp b/scene/3d/particles.cpp index 949de110f5..2bcd0eaa46 100644 --- a/scene/3d/particles.cpp +++ b/scene/3d/particles.cpp @@ -47,6 +47,12 @@ PoolVector<Face3> Particles::get_faces(uint32_t p_usage_flags) const { void Particles::set_emitting(bool p_emitting) { VS::get_singleton()->particles_set_emitting(particles, p_emitting); + + if (p_emitting && one_shot) { + set_process_internal(true); + } else if (!p_emitting) { + set_process_internal(false); + } } void Particles::set_amount(int p_amount) { @@ -66,8 +72,16 @@ void Particles::set_one_shot(bool p_one_shot) { one_shot = p_one_shot; VS::get_singleton()->particles_set_one_shot(particles, one_shot); - if (!one_shot && is_emitting()) - VisualServer::get_singleton()->particles_restart(particles); + + if (is_emitting()) { + + set_process_internal(true); + if (!one_shot) + VisualServer::get_singleton()->particles_restart(particles); + } + + if (!one_shot) + set_process_internal(false); } void Particles::set_pre_process_time(float p_time) { @@ -307,6 +321,16 @@ void Particles::_notification(int p_what) { VS::get_singleton()->particles_set_speed_scale(particles, 0); } } + + // Use internal process when emitting and one_shot are on so that when + // the shot ends the editor can properly update + if (p_what == NOTIFICATION_INTERNAL_PROCESS) { + + if (one_shot && !is_emitting()) { + _change_notify(); + set_process_internal(false); + } + } } void Particles::_bind_methods() { |