use macroquad::prelude as mq; use rapier3d::prelude::*; mod engine; use engine::*; mod camera; mod drone; mod rendering; mod config; 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() { /* World Setup */ let mut world = World::new(600.0); world.register_free_collider( ColliderBuilder::cuboid(30.0, 1.0, 30.0) .translation(vector![0.0, -2.0, 0.0]) .restitution(0.5) .build(), None, ); let mut drone_controller = drone::pidcontroller::PIDController::default(); drone_controller.set_input(JoystickInput { throttle_input: 0.2, yaw_input: 0.2, roll_input: 0.2, pitch_input: 0.0, }); let mut drone_obj = drone::Drone::new( &mut world, Box::new(drone_controller), drone::MotorCharacteristics { max_thrust: 2.6, max_torque: 0.5, ..Default::default() }, 0.350, ); /* Renderer Setup */ let camera = camera::AttachedCamera::new( drone_obj.rb_handle, vector![1.0, 0.0, 0.0], vector![0.5, 0.0, 0.0], ); let mut renderer = Renderer::new(Box::new(camera)); renderer.light.set_location( vector![70.0, 150.0, -90.0].into(), vector![-0.4, -0.7, 0.6].into(), ); renderer.update_light(&world); loop { renderer.update_camera(&world); if mq::is_key_pressed(mq::KeyCode::Q) { break; } // Physics world.step(); let _ = clearscreen::clear(); drone_obj.process_tick(&mut world); // Rendering renderer.draw(&mut world); if world.tick % (10) == 0 { // renderer.update_light(&world); // world.clear_ofb(); mq::next_frame().await; } } }