Added timewarp to Simulator

This commit is contained in:
Verox001 2025-05-05 00:23:05 +02:00
parent ba0e668616
commit de8dca3536
2 changed files with 39 additions and 11 deletions

View File

@ -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
}
_ => {

View File

@ -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<Body>,
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)
}
}