106 lines
3.5 KiB
Rust
Raw Normal View History

use cgmath::Rotation3;
use solar_engine::{Application, Body, Key, KeyState, Simulator};
use std::sync::{Arc, RwLock};
use std::thread;
2025-05-04 01:04:46 +02:00
pub async fn run() {
let simulator = Arc::new(RwLock::new(Simulator::new()));
{
let mut sim = simulator.write().unwrap();
sim.add_body(Body {
name: "Sun".into(),
position: [0.0, 0.0],
velocity: [0.0, 0.0],
mass: 1.989e30,
});
sim.add_body(Body {
name: "Earth".into(),
position: [1.496e11, 0.0],
velocity: [0.0, 29780.0],
mass: 5.972e24,
});
}
2025-05-04 12:51:41 +02:00
let sim_clone = simulator.clone();
thread::spawn(move || {
use std::time::{Duration, Instant};
let mut last = Instant::now();
loop {
let now = Instant::now();
let dt = now.duration_since(last).as_secs_f64();
last = now;
{
let mut sim = sim_clone.write().unwrap();
let timewarp = sim.get_timewarp();
sim.step(dt * timewarp as f64);
}
2025-05-04 12:03:18 +02:00
2025-05-05 20:07:20 +02:00
thread::sleep(Duration::from_nanos(1));
2025-05-04 01:04:46 +02:00
}
});
let simulator_clone = simulator.clone();
Application::new()
.on_update(move |state| {
let sim = simulator_clone.read().unwrap();
let bodies = &sim.bodies;
let instances = bodies
.iter()
.enumerate()
.map(|(i, b)| {
solar_engine::RenderInstance {
position: cgmath::Vector3::new(
(b.position[0] / 1.496e11) as f32,
(b.position[1] / 1.496e11) as f32,
0.0,
),
rotation: cgmath::Quaternion::from_angle_z(cgmath::Deg(0.0)),
color: match i {
0 => [1.0, 1.0, 0.0], // Sun
1 => [0.0, 0.0, 1.0], // Earth
_ => [0.5, 0.5, 0.5],
},
scale: 0.05,
shape: solar_engine::Shape::Circle,
}
})
.collect();
state.set_instances(instances);
})
2025-05-05 21:29:51 +02:00
.on_input(move |state, event| {
if event.state == KeyState::Pressed {
return match event.key {
Key::Period => {
let mut sim = simulator.write().unwrap();
2025-05-04 14:39:39 +02:00
sim.increase_timewarp();
2025-05-05 00:23:05 +02:00
println!("Timewarp: {}", sim.get_timewarp());
2025-05-04 14:39:39 +02:00
}
Key::Comma => {
let mut sim = simulator.write().unwrap();
2025-05-04 14:39:39 +02:00
sim.decrease_timewarp();
2025-05-05 00:23:05 +02:00
println!("Timewarp: {}", sim.get_timewarp());
}
Key::Minus => {
let mut sim = simulator.write().unwrap();
2025-05-05 00:23:05 +02:00
sim.reset_timewarp();
println!("Timewarp: {}", sim.get_timewarp());
2025-05-04 14:39:39 +02:00
}
2025-05-05 21:29:51 +02:00
Key::ArrowLeft => state.camera_mut().rotate_yaw_pitch(-5.0, 0.0),
Key::ArrowRight => state.camera_mut().rotate_yaw_pitch(5.0, 0.0),
Key::ArrowUp => state.camera_mut().zoom(-0.2),
Key::ArrowDown => state.camera_mut().zoom(0.2),
_ => {}
};
2025-05-04 14:39:39 +02:00
}
})
.run();
2025-05-04 01:04:46 +02:00
}
fn main() {
pollster::block_on(run());
}