Browse Source

Fix GPUParticles2D not recomputing transforms each frame

Conrad H. Appel, IV 2 years ago
parent
commit
ad6dd38795
1 changed files with 5 additions and 8 deletions
  1. 5 8
      servers/rendering/renderer_rd/storage_rd/particles_storage.cpp

+ 5 - 8
servers/rendering/renderer_rd/storage_rd/particles_storage.cpp

@@ -1415,7 +1415,6 @@ void ParticlesStorage::update_particles() {
 		}
 
 		bool zero_time_scale = Engine::get_singleton()->get_time_scale() <= 0.0;
-		bool updated = false;
 
 		if (particles->clear && particles->pre_process_time > 0.0) {
 			double frame_time;
@@ -1430,7 +1429,6 @@ void ParticlesStorage::update_particles() {
 			while (todo >= 0) {
 				_particles_process(particles, frame_time);
 				todo -= frame_time;
-				updated = true;
 			}
 		}
 
@@ -1452,10 +1450,9 @@ void ParticlesStorage::update_particles() {
 			}
 			double todo = particles->frame_remainder + delta;
 
-			while (todo >= frame_time || (particles->clear && !updated)) {
+			while (todo >= frame_time || particles->clear) {
 				_particles_process(particles, frame_time);
 				todo -= decr;
-				updated = true;
 			}
 
 			particles->frame_remainder = todo;
@@ -1463,16 +1460,16 @@ void ParticlesStorage::update_particles() {
 		} else {
 			if (zero_time_scale) {
 				_particles_process(particles, 0.0);
-				updated = true;
 			} else {
 				_particles_process(particles, RendererCompositorRD::singleton->get_frame_delta_time());
-				updated = true;
 			}
 		}
 
-		//copy particles to instance buffer
+		// Ensure that memory is initialized (the code above should ensure that _particles_process is always called at least once upon clearing).
+		DEV_ASSERT(!particles->clear);
 
-		if (updated && particles->draw_order != RS::PARTICLES_DRAW_ORDER_VIEW_DEPTH && particles->transform_align != RS::PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD && particles->transform_align != RS::PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD_Y_TO_VELOCITY) {
+		// Copy particles to instance buffer.
+		if (particles->draw_order != RS::PARTICLES_DRAW_ORDER_VIEW_DEPTH && particles->transform_align != RS::PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD && particles->transform_align != RS::PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD_Y_TO_VELOCITY) {
 			//does not need view dependent operation, do copy here
 			ParticlesShader::CopyPushConstant copy_push_constant;