From de8dca35363f493273a0b5ff56831d40e10f0e63 Mon Sep 17 00:00:00 2001 From: Verox001 Date: Mon, 5 May 2025 00:23:05 +0200 Subject: [PATCH] Added timewarp to Simulator --- simulator/src/main.rs | 23 +++++++++++++++-------- solar_engine/src/simulator.rs | 27 ++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/simulator/src/main.rs b/simulator/src/main.rs index 6eaf0a0..571e915 100644 --- a/simulator/src/main.rs +++ b/simulator/src/main.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use std::sync::{Arc, RwLock}; use std::thread; use std::time::{Duration, Instant}; -use cgmath::num_traits::ToPrimitive; +use cgmath::num_traits::{pow, ToPrimitive}; use cgmath::Rotation3; use pollster::FutureExt; use wgpu::util::DeviceExt; @@ -287,7 +287,7 @@ impl<'a> State<'a> { index_count: circle_indices.len() as u32, }); - let mut sim = Simulator::new(5000.0); + let mut sim = Simulator::new(); sim.add_body(Body { name: "Sun".to_string(), position: [0.0, 0.0], @@ -335,10 +335,11 @@ impl<'a> State<'a> { let now = Instant::now(); let dt = now.duration_since(last).as_secs_f64(); last = now; - + { let mut sim = simulator_clone.write().unwrap(); - sim.step(dt * 50000.0); + let timewarp = sim.get_timewarp(); + sim.step(dt * timewarp as f64); } thread::sleep(Duration::from_millis(1)); @@ -371,15 +372,21 @@ impl<'a> State<'a> { if event.state == ElementState::Pressed { return match event.key_without_modifiers().as_ref() { Key::Character(".") => { - /*let mut sim = self.simulator.write().unwrap(); + let mut sim = self.simulator.write().unwrap(); sim.increase_timewarp(); - println!("Timewarp: {}", sim.get_timewarp());*/ + println!("Timewarp: {}", sim.get_timewarp()); true } Key::Character(",") => { - /*let mut sim = self.simulator.write().unwrap(); + let mut sim = self.simulator.write().unwrap(); sim.decrease_timewarp(); - println!("Timewarp: {}", sim.get_timewarp());*/ + println!("Timewarp: {}", sim.get_timewarp()); + true + } + Key::Character("-") => { + let mut sim = self.simulator.write().unwrap(); + sim.reset_timewarp(); + println!("Timewarp: {}", sim.get_timewarp()); true } _ => { diff --git a/solar_engine/src/simulator.rs b/solar_engine/src/simulator.rs index 2690587..32b1b9b 100644 --- a/solar_engine/src/simulator.rs +++ b/solar_engine/src/simulator.rs @@ -1,3 +1,4 @@ +use std::sync::atomic::AtomicUsize; use std::sync::Mutex; use crate::body::Body; use rayon::prelude::*; @@ -7,7 +8,7 @@ const G: f64 = 6.67430e-11; pub struct Simulator { pub bodies: Vec, pub time: f64, - pub timestep: f64, + timewarp: AtomicUsize } pub fn distance_squared(a: [f64; 2], b: [f64; 2]) -> f64 { @@ -17,11 +18,11 @@ pub fn distance_squared(a: [f64; 2], b: [f64; 2]) -> f64 { } impl Simulator { - pub fn new(timestep: f64) -> Self { + pub fn new() -> Self { Self { bodies: Vec::new(), time: 0.0, - timestep, + timewarp: AtomicUsize::new(1), } } @@ -144,4 +145,24 @@ impl Simulator { self.time += dt; } + + pub fn increase_timewarp(&self) { + let current_timewarp = self.timewarp.load(std::sync::atomic::Ordering::SeqCst); + self.timewarp.store(current_timewarp * 2, std::sync::atomic::Ordering::SeqCst); + } + + pub fn decrease_timewarp(&self) { + let current_timewarp = self.timewarp.load(std::sync::atomic::Ordering::SeqCst); + if current_timewarp > 1 { + self.timewarp.store(current_timewarp / 2, std::sync::atomic::Ordering::SeqCst); + } + } + + pub fn reset_timewarp(&self) { + self.timewarp.store(1, std::sync::atomic::Ordering::SeqCst); + } + + pub fn get_timewarp(&self) -> usize { + self.timewarp.load(std::sync::atomic::Ordering::SeqCst) + } }