diff --git a/src/main.rs b/src/main.rs index a9581b1..dccc323 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,18 @@ +use glam::Quat; use macroquad::prelude as mq; use rapier3d::prelude::*; mod engine; use engine::*; +mod camera; + mod graphics_util; use graphics_util::*; #[macroquad::main("3D")] async fn main() { // Graphics Initialization - let vertex = include_str!("shaders/shader.vert"); let fragment = include_str!("shaders/shader.frag"); @@ -35,41 +37,38 @@ async fn main() { // Physics Initialization let mut world = World::default(); world.register_free_collider( - ColliderBuilder::cuboid(5.0, 0.1, 5.0) + ColliderBuilder::cuboid(50.0, 0.1, 50.0) .restitution(0.5) .build(), None, ); - let body = world.register_body( - RigidBodyBuilder::dynamic() - .translation(vector![0.0, 10.0, 0.0]) - .rotation(vector![std::f32::consts::PI / 4.2, 0.0, 0.0]) - .build(), - ); + for i in 0..10 { + let body = world.register_body( + RigidBodyBuilder::dynamic() + .translation(vector![0.0, 10.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(0.5, 0.5, 0.5) + .restitution(0.5) + .build(), + body, + None, + ); + } - let coll = world.register_collider( - ColliderBuilder::cuboid(0.5, 0.5, 0.5) - .restitution(0.5) - .build(), - body, - None, - ); - - // Main Loop + let mut cam: camera::FirstPersonCamera = + camera::FirstPersonCamera::new(mq::vec3(0.0, 10.0, -5.0)); loop { // Physics Simulation world.step(); // Graphics Rendering mq::clear_background(mq::LIGHTGRAY); - - mq::set_camera(&mq::Camera3D { - position: mq::vec3(-20., 15., 0.), - up: mq::vec3(0., 1., 0.), - target: mq::vec3(0., 0., 0.), - ..Default::default() - }); + cam.update(mq::get_frame_time()); + cam.apply(); mq::draw_grid(20, 1., mq::BLACK, mq::GRAY); @@ -111,8 +110,6 @@ async fn main() { } } - // draw_sphere(world.position_of_rb(body).unwrap().into(), 0.5, None, BLUE); - mq::next_frame().await } } diff --git a/src/shaders/shader.frag b/src/shaders/shader.frag index a0045b2..cb6e50d 100644 --- a/src/shaders/shader.frag +++ b/src/shaders/shader.frag @@ -3,6 +3,7 @@ in vec4 v_normal; in vec4 color; +in vec3 light_direction; uniform int render_normals_bool; out vec4 FragColor; @@ -11,8 +12,7 @@ const float ambient_strenght = 0.3; const float diffuse_strenght = 0.7; void main() { - vec3 lightDir = vec3(1.0, 0.3, 0.2); - float diff = max(dot(normalize(vec3(v_normal.x, v_normal.y, v_normal.z)), normalize(lightDir)), 0) * diffuse_strenght; + float diff = max(dot(normalize(vec3(v_normal.x, v_normal.y, v_normal.z)), normalize(light_direction)), 0) * diffuse_strenght; if (render_normals_bool == 1) { FragColor = vec4(v_normal); } diff --git a/src/shaders/shader.vert b/src/shaders/shader.vert index fd4e234..a37a54c 100644 --- a/src/shaders/shader.vert +++ b/src/shaders/shader.vert @@ -10,7 +10,10 @@ uniform mat4 Projection; out vec4 v_normal; out vec4 color; +out vec3 light_direction; void main() { + vec4 light_dir = vec4(1.0, 1.0, 0.0, 0.0) * Model; + light_direction = vec3(light_dir.x, light_dir.y, light_dir.z); color = color0; v_normal = normal; gl_Position = Projection * Model * vec4(position, 1.0);