RustPhysicsMQ/src/main.rs

135 lines
3.4 KiB
Rust

use macroquad::prelude as mq;
use rapier3d::prelude::*;
mod engine;
use engine::*;
mod camera;
mod drone;
mod rendering;
mod graphics_util;
use crate::{drone::fpvcontroller::JoystickInput, rendering::Renderer};
fn window_conf() -> mq::Conf {
mq::Conf {
window_title: "RustDroneSim".to_owned(),
window_resizable: true,
// fullscreen: true,
platform: mq::miniquad::conf::Platform {
// linux_backend: mq::miniquad::conf::LinuxBackend::WaylandOnly,
..Default::default()
},
..Default::default()
}
}
#[macroquad::main(window_conf)]
async fn main() {
let mut world = World::default();
let mut renderer = Renderer::new();
renderer.light.set_location(
vector![70.0, 150.0, -90.0].into(),
vector![-0.4, -0.7, 0.6].into(),
);
renderer.update_light(&world);
// Ground collider
world.register_free_collider(
ColliderBuilder::cuboid(250.0, 5.0, 250.0)
.restitution(0.5)
.build(),
None,
);
let mut controller = drone::pidcontroller::PIDController::default();
controller.set_input(JoystickInput {
throttle_input: 1.0,
yaw_input: 0.05,
roll_input: 0.0,
pitch_input: 0.0,
});
let mut drone = drone::Drone::new(
&mut world,
Box::new(controller),
drone::MotorCharacteristics {
max_thrust: 3.0,
max_torque: 2.0,
..Default::default()
},
0.350,
);
loop {
renderer.update_camera();
if mq::is_key_pressed(mq::KeyCode::L) {
renderer
.light
.set_location(renderer.camera.position, renderer.camera.front);
renderer.update_light(&world);
println!(
"Light Pos: {}, Light Front Vec{}",
renderer.light.position, renderer.light.front
);
}
if mq::is_key_pressed(mq::KeyCode::C) {
add_objects(&mut world);
}
if mq::is_key_pressed(mq::KeyCode::M) {
renderer.apply_config();
}
// Physics
world.step();
let _ = clearscreen::clear();
drone.process_tick(&mut world);
println!(
"Translation: {:}",
world.bodies.get(drone.rb_handle).unwrap().translation()
);
println!(
"Angular Velocity: {:}",
world.bodies.get(drone.rb_handle).unwrap().angvel()
);
println!(
"Velocity: {:}",
world.bodies.get(drone.rb_handle).unwrap().linvel()
);
println!(
"Motor Throttles: {:?}",
drone.controller.get_motor_throttles()
);
// Rendering
renderer.draw(&mut world);
if world.tick % 60 == 0 {
world.clear_ofb();
renderer.update_light(&world);
mq::next_frame().await;
}
}
}
fn add_objects(world: &mut World) {
for i in 0..1 {
let body = world.register_body(
RigidBodyBuilder::dynamic()
.translation(vector![0.0, 50.0 + i as f32, 0.0])
.rotation(vector![std::f32::consts::PI / 4.2, i as f32, i as f32])
.build(),
);
world.register_collider(
ColliderBuilder::cuboid(5.0, 5.0, 5.0)
.restitution(0.3)
.build(),
body,
None,
);
}
}