110 lines
3.5 KiB
Rust
Raw Normal View History

use cgmath::Rotation3;
use solar_engine::{Application, Body, Simulator};
use std::sync::{Arc, RwLock};
use std::thread;
use winit::event::ElementState;
2025-05-04 14:39:39 +02:00
use winit::event::WindowEvent::KeyboardInput;
use winit::event_loop::EventLoop;
2025-05-04 14:39:39 +02:00
use winit::keyboard::Key;
use winit::platform::modifier_supplement::KeyEventExtModifierSupplement;
2025-05-04 01:04:46 +02:00
pub async fn run() {
let event_loop = EventLoop::new().unwrap();
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
thread::sleep(Duration::from_millis(1));
2025-05-04 01:04:46 +02:00
}
});
let simulator_clone = simulator.clone();
let mut window_state = 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);
}).on_input(move |state, event| {
2025-05-04 14:39:39 +02:00
if let KeyboardInput { event, .. } = event {
if event.state == ElementState::Pressed {
return match event.key_without_modifiers().as_ref() {
Key::Character(".") => {
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::Character(",") => {
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::Character("-") => {
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-04 14:39:39 +02:00
}
}
}
});
2025-05-04 01:37:26 +02:00
let _ = event_loop.run_app(&mut window_state);
2025-05-04 01:04:46 +02:00
}
fn main() {
pollster::block_on(run());
}