浏览代码

Only update particle velocity when it changes

kobewi 1 年之前
父节点
当前提交
cb0a37f61a
共有 4 个文件被更改,包括 16 次插入6 次删除
  1. 8 5
      scene/2d/gpu_particles_2d.cpp
  2. 1 0
      scene/2d/gpu_particles_2d.h
  3. 6 1
      scene/3d/gpu_particles_3d.cpp
  4. 1 0
      scene/3d/gpu_particles_3d.h

+ 8 - 5
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) {

+ 1 - 0
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;

+ 6 - 1
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) {

+ 1 - 0
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();