RustPhysicsMQ/src/main.rs

114 lines
3.1 KiB
Rust
Raw Normal View History

2025-11-23 18:40:48 +00:00
use macroquad::prelude as mq;
use rapier3d::prelude::*;
mod engine;
use engine::*;
2025-11-23 23:43:48 +00:00
mod camera;
2025-12-07 00:41:00 +00:00
mod drone;
2025-11-28 20:39:09 +00:00
mod rendering;
2025-11-23 23:43:48 +00:00
2025-11-23 18:40:48 +00:00
mod graphics_util;
2025-11-28 20:39:09 +00:00
use crate::rendering::Renderer;
2025-11-23 18:40:48 +00:00
#[macroquad::main("3D")]
async fn main() {
2025-11-28 20:39:09 +00:00
let mut world = World::default();
let mut renderer = Renderer::new();
2025-11-23 18:40:48 +00:00
2025-12-06 15:38:01 +00:00
renderer.light.set_location(
vector![70.0, 150.0, -90.0].into(),
vector![-0.4, -0.7, 0.6].into(),
);
2025-11-23 18:40:48 +00:00
// Physics Initialization
world.register_free_collider(
2025-12-07 00:41:00 +00:00
ColliderBuilder::cuboid(250.0, 5.0, 250.0)
2025-12-03 21:28:27 +00:00
.restitution(0.5)
2025-11-23 18:40:48 +00:00
.build(),
None,
);
2025-12-06 15:38:01 +00:00
// add_objects(&mut world);
//
renderer.update_light(&world);
2025-11-28 20:39:09 +00:00
2025-12-08 21:18:04 +00:00
let mut tick: u64 = 0;
2025-12-07 00:41:00 +00:00
2025-11-28 20:39:09 +00:00
loop {
renderer.update_camera();
if mq::is_key_pressed(mq::KeyCode::L) {
renderer
.light
.set_location(renderer.camera.position, renderer.camera.front);
2025-12-03 21:28:27 +00:00
renderer.update_light(&world);
2025-11-28 20:39:09 +00:00
println!(
"Light Pos: {}, Light Front Vec{}",
renderer.light.position, renderer.light.front
);
}
2025-11-23 18:40:48 +00:00
2025-11-28 20:39:09 +00:00
if mq::is_key_pressed(mq::KeyCode::C) {
add_objects(&mut world);
}
2025-11-29 23:22:17 +00:00
if mq::is_key_pressed(mq::KeyCode::M) {
renderer.apply_config();
}
2025-11-28 20:39:09 +00:00
// Physics Simulation
2025-12-08 21:18:04 +00:00
// {
// let drone_rb = world.bodies.get_mut(drone_rb_handle).unwrap();
// drone_rb.reset_forces(true);
// drone_rb.reset_torques(true);
// for (i, pos) in motor_positions.iter().enumerate() {
// // Thrust is applied upward at motor position
// let mut force = nalgebra::Vector3::new(0.0, drone_rb.mass() * 2.8, 0.0);
//
// // drone_rb.reset_forces(true);
//
// force = drone_rb.rotation().transform_vector(&force);
// drone_rb.add_force_at_point(force, drone_rb.position().transform_point(&pos), true);
// // drone_rb.apply_force_at_point(force, *pos, true);
//
// // let torque = if i % 2 == 0 {
// // vector![0.0, 0.5, 0.0]
// // } else {
// // vector![0.0, 0.5, 0.0]
// // };
// // drone_rb.add_torque(torque, true);
// // println!("{:}", drone_rb.translation());
// }
// }
2025-12-03 21:28:27 +00:00
2025-12-07 00:41:00 +00:00
world.step();
2025-12-06 15:38:01 +00:00
renderer.draw(&mut world);
2025-12-08 21:18:04 +00:00
if tick % 30 == 0 {
2025-12-03 21:28:27 +00:00
world.clear_ofb();
renderer.update_light(&world);
}
2025-12-06 15:38:01 +00:00
tick += 1;
mq::next_frame().await;
2025-11-28 20:39:09 +00:00
}
}
fn add_objects(world: &mut World) {
for i in 0..1 {
2025-11-23 23:43:48 +00:00
let body = world.register_body(
RigidBodyBuilder::dynamic()
2025-11-28 20:39:09 +00:00
.translation(vector![0.0, 50.0 + i as f32, 0.0])
2025-11-23 23:43:48 +00:00
.rotation(vector![std::f32::consts::PI / 4.2, i as f32, i as f32])
.build(),
);
world.register_collider(
2025-12-03 21:28:27 +00:00
ColliderBuilder::cuboid(5.0, 5.0, 5.0)
.restitution(0.3)
2025-11-23 23:43:48 +00:00
.build(),
body,
None,
);
}
2025-11-23 18:40:48 +00:00
}