summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scene/2d/gpu_particles_2d.cpp13
-rw-r--r--scene/2d/gpu_particles_2d.h1
-rw-r--r--scene/3d/gpu_particles_3d.cpp7
-rw-r--r--scene/3d/gpu_particles_3d.h1
4 files changed, 16 insertions, 6 deletions
diff --git a/scene/2d/gpu_particles_2d.cpp b/scene/2d/gpu_particles_2d.cpp
index ee33ff88d4..71da9cc520 100644
--- a/scene/2d/gpu_particles_2d.cpp
+++ b/scene/2d/gpu_particles_2d.cpp
@@ -712,12 +712,15 @@ void GPUParticles2D::_notification(int p_what) {
} break;
case NOTIFICATION_INTERNAL_PROCESS: {
- RS::get_singleton()->particles_set_emitter_velocity(particles,
- Vector3((get_global_position() - previous_position).x,
- (get_global_position() - previous_position).y,
- 0.0) /
- get_process_delta_time());
+ 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) {
diff --git a/scene/2d/gpu_particles_2d.h b/scene/2d/gpu_particles_2d.h
index 40831cd30e..58996b0327 100644
--- a/scene/2d/gpu_particles_2d.h
+++ b/scene/2d/gpu_particles_2d.h
@@ -64,6 +64,7 @@ private:
bool fractional_delta = false;
bool interpolate = true;
float interp_to_end_factor = 0;
+ Vector3 previous_velocity;
Vector2 previous_position;
#ifdef TOOLS_ENABLED
bool show_visibility_rect = false;
diff --git a/scene/3d/gpu_particles_3d.cpp b/scene/3d/gpu_particles_3d.cpp
index fc84b3308e..dfb039d709 100644
--- a/scene/3d/gpu_particles_3d.cpp
+++ b/scene/3d/gpu_particles_3d.cpp
@@ -460,7 +460,12 @@ void GPUParticles3D::_notification(int p_what) {
// Use internal process when emitting and one_shot is on so that when
// the shot ends the editor can properly update.
case NOTIFICATION_INTERNAL_PROCESS: {
- RS::get_singleton()->particles_set_emitter_velocity(particles, (get_global_position() - previous_position) / get_process_delta_time());
+ const Vector3 velocity = (get_global_position() - previous_position) / 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) {
diff --git a/scene/3d/gpu_particles_3d.h b/scene/3d/gpu_particles_3d.h
index ae9349817c..0c9f2c1378 100644
--- a/scene/3d/gpu_particles_3d.h
+++ b/scene/3d/gpu_particles_3d.h
@@ -95,6 +95,7 @@ private:
double emission_time = 0.0;
double active_time = 0.0;
float interp_to_end_factor = 0;
+ Vector3 previous_velocity;
Vector3 previous_position;
void _attach_sub_emitter();