소스 검색

Merge pull request #103068 from QbieShay/fix-particle-rand2

Fix particle not re-randomizing every emission
Rémi Verschelde 8 달 전
부모
커밋
8ec34e966e
6개의 변경된 파일39개의 추가작업 그리고 11개의 파일을 삭제
  1. 16 3
      scene/2d/cpu_particles_2d.cpp
  2. 1 0
      scene/2d/cpu_particles_2d.h
  3. 3 0
      scene/2d/gpu_particles_2d.cpp
  4. 15 7
      scene/3d/cpu_particles_3d.cpp
  5. 1 0
      scene/3d/cpu_particles_3d.h
  6. 3 1
      scene/3d/gpu_particles_3d.cpp

+ 16 - 3
scene/2d/cpu_particles_2d.cpp

@@ -45,10 +45,22 @@ void CPUParticles2D::set_emitting(bool p_emitting) {
 		return;
 	}
 
+	if (p_emitting && !use_fixed_seed) {
+		set_seed(Math::rand());
+	}
+
 	emitting = p_emitting;
 	if (emitting) {
-		active = true;
-		set_process_internal(true);
+		_set_emitting();
+	}
+}
+
+void CPUParticles2D::_set_emitting() {
+	active = true;
+	set_process_internal(true);
+	// first update before rendering to avoid one frame delay after emitting starts
+	if (time == 0) {
+		_update_internal();
 	}
 }
 
@@ -310,7 +322,8 @@ void CPUParticles2D::restart(bool p_keep_seed) {
 		seed = Math::rand();
 	}
 
-	set_emitting(true);
+	emitting = true;
+	_set_emitting();
 }
 
 void CPUParticles2D::set_direction(Vector2 p_direction) {

+ 1 - 0
scene/2d/cpu_particles_2d.h

@@ -186,6 +186,7 @@ private:
 	void _update_internal();
 	void _particles_process(double p_delta);
 	void _update_particle_data_buffer();
+	void _set_emitting();
 
 	Mutex update_mutex;
 

+ 3 - 0
scene/2d/gpu_particles_2d.cpp

@@ -41,6 +41,9 @@
 void GPUParticles2D::set_emitting(bool p_emitting) {
 	// Do not return even if `p_emitting == emitting` because `emitting` is just an approximation.
 
+	if (p_emitting && p_emitting != emitting && !use_fixed_seed) {
+		set_seed(Math::rand());
+	}
 	if (p_emitting && one_shot) {
 		if (!active && !emitting) {
 			// Last cycle ended.

+ 15 - 7
scene/3d/cpu_particles_3d.cpp

@@ -48,15 +48,22 @@ void CPUParticles3D::set_emitting(bool p_emitting) {
 		return;
 	}
 
+	if (p_emitting && !use_fixed_seed) {
+		set_seed(Math::rand());
+	}
+
 	emitting = p_emitting;
 	if (emitting) {
-		active = true;
-		set_process_internal(true);
+		_set_emitting();
+	}
+}
 
-		// first update before rendering to avoid one frame delay after emitting starts
-		if (time == 0) {
-			_update_internal();
-		}
+void CPUParticles3D::_set_emitting() {
+	active = true;
+	set_process_internal(true);
+	// first update before rendering to avoid one frame delay after emitting starts
+	if (time == 0) {
+		_update_internal();
 	}
 }
 
@@ -251,7 +258,8 @@ void CPUParticles3D::restart(bool p_keep_seed) {
 		seed = Math::rand();
 	}
 
-	set_emitting(true);
+	emitting = true;
+	_set_emitting();
 }
 
 void CPUParticles3D::set_direction(Vector3 p_direction) {

+ 1 - 0
scene/3d/cpu_particles_3d.h

@@ -197,6 +197,7 @@ private:
 	void _update_internal();
 	void _particles_process(double p_delta);
 	void _update_particle_data_buffer();
+	void _set_emitting();
 
 	Mutex update_mutex;
 

+ 3 - 1
scene/3d/gpu_particles_3d.cpp

@@ -42,7 +42,9 @@ AABB GPUParticles3D::get_aabb() const {
 
 void GPUParticles3D::set_emitting(bool p_emitting) {
 	// Do not return even if `p_emitting == emitting` because `emitting` is just an approximation.
-
+	if (p_emitting && p_emitting != emitting && !use_fixed_seed) {
+		set_seed(Math::rand());
+	}
 	if (p_emitting && one_shot) {
 		if (!active && !emitting) {
 			// Last cycle ended.