aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-18 09:21:25 +0300
committerValentin Popov <valentin@popov.link>2026-10-18 09:21:25 +0300
commit0195960de3f5922ce6422442aec858e1c451d550 (patch)
tree3a78e44df7ca24c1a2390906113fad1b6c69c9ea /crates
parent1148cdc6316535e450c9c1e990a6db614105a9b6 (diff)
downloadfparkan-0195960de3f5922ce6422442aec858e1c451d550.tar.xz
fparkan-0195960de3f5922ce6422442aec858e1c451d550.zip
fix(fx): preserve rain tails on zero-time framescodex/precipitation-duplicate-clock
Diffstat (limited to 'crates')
-rw-r--r--crates/fparkan-fx/src/environment.rs27
1 files changed, 26 insertions, 1 deletions
diff --git a/crates/fparkan-fx/src/environment.rs b/crates/fparkan-fx/src/environment.rs
index a298f24..a1f6c13 100644
--- a/crates/fparkan-fx/src/environment.rs
+++ b/crates/fparkan-fx/src/environment.rs
@@ -1695,7 +1695,9 @@ impl PrecipitationEmitter {
let size = camera.precipitation_size_scalar() * size_factor;
for index in 0..desired {
let particle = &mut self.particles[index];
- particle.previous_position = particle.position;
+ if dt_seconds > 0.0 {
+ particle.previous_position = particle.position;
+ }
particle.position[0] += velocity[0] * dt_seconds;
particle.position[1] += velocity[1] * dt_seconds;
particle.position[2] += velocity[2] * dt_seconds;
@@ -2470,6 +2472,29 @@ mod tests {
}
#[test]
+ fn duplicate_zero_delta_keeps_rain_frame_and_tail_unchanged() {
+ let mut system = EnvironmentSystem::new(3);
+ let camera = Camera::new([10.0, 20.0, 30.0]);
+ let weather = WeatherInput {
+ rain: WeatherState::with_resources(true, 0.01, [1.0; 4], ["atm_rain1.wav"]),
+ ..WeatherInput::clear()
+ };
+ let _ = system.update(0.0, weather.clone(), camera);
+ let advanced = system.update(0.001, weather.clone(), camera);
+ let time_seconds = system.time_seconds();
+ let repeated = system.update(0.0, weather, camera);
+
+ assert_eq!(system.time_seconds(), time_seconds);
+ assert_eq!(advanced, repeated);
+ assert!(advanced.primitives.iter().any(|primitive| match primitive {
+ EnvironmentPrimitive::Particle { screen, .. } => {
+ screen.world_head != screen.world_tail
+ }
+ EnvironmentPrimitive::Lightning(_) => false,
+ }));
+ }
+
+ #[test]
fn precipitation_uses_native_volume_ratio_and_nearest_even_count() {
let reference = PrecipitationVolume::native();
assert_eq!(reference.particle_count_for(reference, 1.0, 0.5004), 500);