2025-05-06 17:12:22 +02:00
|
|
|
use cgmath::{Rotation3, Vector3};
|
|
|
|
|
use solar_engine::{Application, Body, Key, KeyState, Light, LightType, Simulator};
|
2025-05-04 12:12:09 +02:00
|
|
|
use std::sync::{Arc, RwLock};
|
|
|
|
|
use std::thread;
|
2025-05-04 01:04:46 +02:00
|
|
|
|
|
|
|
|
pub async fn run() {
|
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 20:07:20 +02:00
|
|
|
thread::sleep(Duration::from_nanos(1));
|
2025-05-04 01:04:46 +02:00
|
|
|
}
|
2025-05-05 15:33:22 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let simulator_clone = simulator.clone();
|
|
|
|
|
|
2025-05-05 17:34:45 +02:00
|
|
|
Application::new()
|
|
|
|
|
.on_update(move |state| {
|
|
|
|
|
let sim = simulator_clone.read().unwrap();
|
|
|
|
|
let bodies = &sim.bodies;
|
2025-05-05 15:33:22 +02:00
|
|
|
|
2025-05-06 17:12:22 +02:00
|
|
|
let sun_pos = Vector3::new(
|
|
|
|
|
(bodies[0].position[0] / 1.496e11) as f32,
|
|
|
|
|
(bodies[0].position[1] / 1.496e11) as f32,
|
|
|
|
|
0.0,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let light_offset = Vector3::new(0.0, 0.0, 0.1);
|
|
|
|
|
|
|
|
|
|
state.light_manager.clear();
|
|
|
|
|
state.light_manager.add_light(Light {
|
|
|
|
|
position: sun_pos + light_offset,
|
|
|
|
|
direction: Vector3::new(0.0, 0.0, 0.0),
|
|
|
|
|
color: Vector3::from([1.0, 1.0, 0.8]),
|
|
|
|
|
intensity: 5.0,
|
|
|
|
|
range: 0.0,
|
|
|
|
|
inner_cutoff: 0.0,
|
|
|
|
|
light_type: LightType::Directional,
|
|
|
|
|
outer_cutoff: 0.0,
|
|
|
|
|
});
|
|
|
|
|
|
2025-05-05 17:34:45 +02:00
|
|
|
let instances = bodies
|
|
|
|
|
.iter()
|
|
|
|
|
.enumerate()
|
|
|
|
|
.map(|(i, b)| {
|
|
|
|
|
solar_engine::RenderInstance {
|
2025-05-06 17:12:22 +02:00
|
|
|
position: Vector3::new(
|
|
|
|
|
((b.position[0] / 1.496e11) as f32) - sun_pos.x,
|
|
|
|
|
((b.position[1] / 1.496e11) as f32) - sun_pos.y,
|
2025-05-05 17:34:45 +02:00
|
|
|
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,
|
2025-05-05 21:52:42 +02:00
|
|
|
shape: solar_engine::Shape::Sphere,
|
2025-05-06 18:13:42 +02:00
|
|
|
always_lit: i == 0, // Sun
|
|
|
|
|
is_transparent: false
|
2025-05-05 17:34:45 +02:00
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.collect();
|
2025-05-05 01:25:23 +02:00
|
|
|
|
2025-05-05 17:34:45 +02:00
|
|
|
state.set_instances(instances);
|
|
|
|
|
})
|
2025-05-05 21:29:51 +02:00
|
|
|
.on_input(move |state, event| {
|
2025-05-05 17:34:45 +02:00
|
|
|
if event.state == KeyState::Pressed {
|
|
|
|
|
return match event.key {
|
|
|
|
|
Key::Period => {
|
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
|
|
|
}
|
2025-05-05 17:34:45 +02:00
|
|
|
Key::Comma => {
|
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());
|
|
|
|
|
}
|
2025-05-05 17:34:45 +02:00
|
|
|
Key::Minus => {
|
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 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-05 15:33:22 +02:00
|
|
|
_ => {}
|
2025-05-05 17:34:45 +02:00
|
|
|
};
|
2025-05-04 14:39:39 +02:00
|
|
|
}
|
2025-05-05 17:34:45 +02:00
|
|
|
})
|
|
|
|
|
.run();
|
2025-05-04 01:04:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
pollster::block_on(run());
|
2025-05-05 15:33:22 +02:00
|
|
|
}
|