summaryrefslogtreecommitdiffstats
path: root/scene/2d/gpu_particles_2d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/2d/gpu_particles_2d.cpp')
-rw-r--r--scene/2d/gpu_particles_2d.cpp23
1 files changed, 14 insertions, 9 deletions
diff --git a/scene/2d/gpu_particles_2d.cpp b/scene/2d/gpu_particles_2d.cpp
index 1d3f1ceada..bfbdb49f22 100644
--- a/scene/2d/gpu_particles_2d.cpp
+++ b/scene/2d/gpu_particles_2d.cpp
@@ -688,6 +688,7 @@ void GPUParticles2D::_notification(int p_what) {
RS::get_singleton()->particles_set_speed_scale(particles, 0);
}
set_process_internal(true);
+ set_physics_process_internal(true);
previous_position = get_global_position();
} break;
@@ -711,15 +712,6 @@ void GPUParticles2D::_notification(int p_what) {
} break;
case NOTIFICATION_INTERNAL_PROCESS: {
- const Vector3 velocity = Vector3((get_global_position() - previous_position).x, (get_global_position() - previous_position).y, 0.0) /
- get_process_delta_time();
-
- if (velocity != previous_velocity) {
- RS::get_singleton()->particles_set_emitter_velocity(particles, velocity);
- previous_velocity = velocity;
- }
- previous_position = get_global_position();
-
if (one_shot) {
time += get_process_delta_time();
if (time > emission_time) {
@@ -739,6 +731,19 @@ void GPUParticles2D::_notification(int p_what) {
}
}
} break;
+
+ case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: {
+ // Update velocity in physics process, so that velocity calculations remain correct
+ // if the physics tick rate is lower than the rendered framerate (especially without physics interpolation).
+ const Vector3 velocity = Vector3((get_global_position() - previous_position).x, (get_global_position() - previous_position).y, 0.0) /
+ get_physics_process_delta_time();
+
+ if (velocity != previous_velocity) {
+ RS::get_singleton()->particles_set_emitter_velocity(particles, velocity);
+ previous_velocity = velocity;
+ }
+ previous_position = get_global_position();
+ } break;
}
}