2025-05-05 15:33:22 +02:00
|
|
|
use cgmath::Rotation3;
|
|
|
|
|
use solar_engine::{Application, Body, Simulator};
|
2025-05-04 12:12:09 +02:00
|
|
|
use std::sync::{Arc, RwLock};
|
|
|
|
|
use std::thread;
|
2025-05-05 15:33:22 +02:00
|
|
|
use winit::event::ElementState;
|
2025-05-04 14:39:39 +02:00
|
|
|
use winit::event::WindowEvent::KeyboardInput;
|
2025-05-05 15:33:22 +02:00
|
|
|
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();
|
|
|
|
|
|
2025-05-05 15:33:22 +02:00
|
|
|
let simulator = Arc::new(RwLock::new(Simulator::new()));
|
|
|
|
|
{
|
|
|
|
|
let mut sim = simulator.write().unwrap();
|
2025-05-04 12:12:09 +02:00
|
|
|
sim.add_body(Body {
|
2025-05-05 15:33:22 +02:00
|
|
|
name: "Sun".into(),
|
2025-05-04 12:12:09 +02:00
|
|
|
position: [0.0, 0.0],
|
|
|
|
|
velocity: [0.0, 0.0],
|
|
|
|
|
mass: 1.989e30,
|
|
|
|
|
});
|
|
|
|
|
sim.add_body(Body {
|
2025-05-05 15:33:22 +02:00
|
|
|
name: "Earth".into(),
|
2025-05-04 12:12:09 +02:00
|
|
|
position: [1.496e11, 0.0],
|
|
|
|
|
velocity: [0.0, 29780.0],
|
|
|
|
|
mass: 5.972e24,
|
|
|
|
|
});
|
2025-05-05 15:33:22 +02:00
|
|
|
}
|
2025-05-04 12:51:41 +02:00
|
|
|
|
2025-05-05 15:33:22 +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;
|
2025-05-05 01:25:23 +02:00
|
|
|
|
2025-05-05 15:33:22 +02:00
|
|
|
{
|
|
|
|
|
let mut sim = sim_clone.write().unwrap();
|
|
|
|
|
let timewarp = sim.get_timewarp();
|
|
|
|
|
sim.step(dt * timewarp as f64);
|
2025-05-04 23:14:46 +02:00
|
|
|
}
|
2025-05-04 12:03:18 +02:00
|
|
|
|
2025-05-05 15:33:22 +02:00
|
|
|
thread::sleep(Duration::from_millis(1));
|
2025-05-04 01:04:46 +02:00
|
|
|
}
|
2025-05-05 15:33:22 +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],
|
2025-05-05 13:54:29 +02:00
|
|
|
},
|
2025-05-05 15:33:22 +02:00
|
|
|
scale: 0.05,
|
|
|
|
|
shape: solar_engine::Shape::Circle,
|
2025-05-05 13:54:29 +02:00
|
|
|
}
|
2025-05-05 15:33:22 +02:00
|
|
|
})
|
|
|
|
|
.collect();
|
2025-05-05 01:25:23 +02:00
|
|
|
|
2025-05-05 15:33:22 +02:00
|
|
|
state.set_instances(instances);
|
2025-05-05 15:42:37 +02:00
|
|
|
}).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(".") => {
|
2025-05-05 15:33:22 +02:00
|
|
|
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(",") => {
|
2025-05-05 15:33:22 +02:00
|
|
|
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("-") => {
|
2025-05-05 15:33:22 +02:00
|
|
|
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 15:33:22 +02:00
|
|
|
_ => {}
|
2025-05-04 14:39:39 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-05-05 15:33:22 +02:00
|
|
|
});
|
2025-05-04 01:37:26 +02:00
|
|
|
|
2025-05-05 15:33:22 +02:00
|
|
|
let _ = event_loop.run_app(&mut window_state);
|
2025-05-04 01:04:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
pollster::block_on(run());
|
2025-05-05 15:33:22 +02:00
|
|
|
}
|