From 8e7101dccd045f7d9877b36903eceaebf2c168e1 Mon Sep 17 00:00:00 2001 From: _ <_@_> Date: Sat, 18 Dec 2021 23:03:02 +0000 Subject: [PATCH] physics are hooked up but edge collisions are not working --- .gitignore | 1 + cube.iqm | Bin 0 -> 1672 bytes sphere.iqm | Bin 0 -> 40264 bytes src/bin/platformer.rs | 88 +++++++++++++++++++++++++++++++++++++----- src/physics.rs | 28 +++++++------- 5 files changed, 93 insertions(+), 24 deletions(-) create mode 100644 cube.iqm create mode 100644 sphere.iqm diff --git a/.gitignore b/.gitignore index 1eeeee3..08272ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/quic_server.crt /target **/*.rs.bk diff --git a/cube.iqm b/cube.iqm new file mode 100644 index 0000000000000000000000000000000000000000..e923f4fff47cfc9a40ec828977c75a09a9dac44b GIT binary patch literal 1672 zcmchXOHRW;5JZPx2%kXsbDIbWFCsn>2=2fkSY*i&xD8v5k|VH#dUh9atQdKuh?dG# zUGAA_kEI^pKNXJ;&sR6a-Q>EsP3tM8x1Jt~P2p8o6Q%`y_9ocd zu`RJ7%mn%%@aVIz2TZu`QwH?}9zD-WV>;4TdF&2)n_1p_z>X;UM@h^iX^x90#9-J{6w{=fM}D d+4nmm=*{KyhNgFzo?(Z-#d(wY7Q#Ng`~WIZ6aD}I literal 0 HcmV?d00001 diff --git a/sphere.iqm b/sphere.iqm new file mode 100644 index 0000000000000000000000000000000000000000..2a9c7a1349346a3c28301b41801b9f429ba1fd4e GIT binary patch literal 40264 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, @@ -38,6 +44,7 @@ struct GameGraphics { mesh_cube: RenderableModel, mesh_sky: RenderableModel, + mesh_sphere: RenderableModel, text_stream: TriangleStream, @@ -53,6 +60,7 @@ impl ShaderLookup for GameGraphics { impl GameGraphics { fn draw ( &self, + state: &GameState, gl_state: &mut GlState, ) { use uniforms as u; @@ -71,7 +79,7 @@ impl GameGraphics { let world_model_mat = Mat4::IDENTITY; self.passes [0].with (gl_state, || { - glezz::clear_color (1.0f32, 0.0f32, 1.0f32, 1.0f32); + glezz::clear_color (0.5f32, 0.5f32, 0.5f32, 1.0f32); glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT); }); @@ -80,14 +88,21 @@ impl GameGraphics { let unis = shader_vars.unis; { - let mvp = view_mat * Mat4::IDENTITY; + let mvp = view_mat * + Mat4::from_translation (state.player.pos) * + Mat4::from_scale ((0.5, 0.5, 0.5).into ()); glezz::uniform_matrix_4fv (unis [&u::MVP], &mvp); - //let object_space_light = make_object_space_vec (&inverse_truck, &light); - //let object_space_sky = make_object_space_vec (&inverse_truck, &Vec3::from ((0.0, 0.0, 1.0))); - - //glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &object_space_light); - //glezz::uniform_3fv (unis [&OBJECT_SPACE_SKY], &object_space_sky); + self.mesh_sphere.draw_all (attrs, |_| { + true + }); + } + + { + let mvp = view_mat * + Mat4::from_scale ((4.0, 4.0, 1.0).into ()) * + Mat4::from_translation ((0.0, 0.0, -2.0).into ()); + glezz::uniform_matrix_4fv (unis [&u::MVP], &mvp); self.mesh_cube.draw_all (attrs, |_| { true @@ -104,7 +119,7 @@ impl GameGraphics { glezz::uniform_3fv (unis [&u::MIN_ALBEDO], &black); glezz::uniform_1i (unis [&u::TEXTURE], 0); - self.mesh_sky.draw_all (attrs, |_| true); + // self.mesh_sky.draw_all (attrs, |_| true); } }); } @@ -169,6 +184,7 @@ async fn main () -> Result <()> { let mesh_cube = renderable_from_iqm_file ("cube.iqm"); let mesh_sky = renderable_from_iqm_file ("sky-sphere.iqm"); + let mesh_sphere = renderable_from_iqm_file ("sphere.iqm"); let passes = vec![ // Clear everything @@ -185,7 +201,7 @@ async fn main () -> Result <()> { (gl::TEXTURE_2D, true), (gl::STENCIL_TEST, false), ].into_iter ()) - .front_face (FrontFace::Cw) + .front_face (FrontFace::Ccw) .color_mask ([1, 1, 1, 1]) .depth_mask (1) .clone (), @@ -221,6 +237,7 @@ async fn main () -> Result <()> { let graphics = GameGraphics { mesh_cube, mesh_sky, + mesh_sphere, passes, shader_lookup, shaders, @@ -229,6 +246,35 @@ async fn main () -> Result <()> { }; let mut gl_state = Default::default (); + let mut game_state = GameState::default (); + let phys_params = opengl_rust::physics::Params { + dt: 1.0 / 60.0, + gravity: (0.0, 0.0, -0.25).into (), + margin: 0.00125, + }; + let phys_world: Vec <_> = vec! [ + ( + (-4.0, -4.0, -1.0), + (-4.0, 4.0, -1.0), + (4.0, -4.0, -1.0), + ), + ( + (4.0, 4.0, -1.0), + (4.0, -4.0, -1.0), + (-4.0, 4.0, -1.0), + ), + ].into_iter () + .map (|(v0, v1, v2)| { + opengl_rust::physics::Triangle { + verts: [ + v0.into (), + v1.into (), + v2.into (), + ], + } + }) + .collect (); + let player_speed = 2.0; 'running: loop { let _frames_to_do = time_step.step (); @@ -239,13 +285,35 @@ async fn main () -> Result <()> { Event::KeyDown { keycode: Some (Keycode::Escape), .. } => { break 'running }, + Event::KeyDown { keycode: Some (Keycode::R), .. } => { + game_state = Default::default (); + }, + _ => (), } } + let kb_state = event_pump.keyboard_state (); + game_state.player.vel.x = 0.0; + game_state.player.vel.y = 0.0; + if kb_state.is_scancode_pressed (Scancode::Left) { + game_state.player.vel.x -= player_speed; + } + if kb_state.is_scancode_pressed (Scancode::Right) { + game_state.player.vel.x += player_speed; + } + if kb_state.is_scancode_pressed (Scancode::Up) { + game_state.player.vel.y += player_speed; + } + if kb_state.is_scancode_pressed (Scancode::Down) { + game_state.player.vel.y -= player_speed; + } + + game_state.player = opengl_rust::physics::step (&phys_params, &phys_world, 0.5, &game_state.player).body; + window.gl_make_current (&gl_ctx).unwrap (); - graphics.draw (&mut gl_state); + graphics.draw (&game_state, &mut gl_state); window.gl_swap_window (); graphics_frames += 1; diff --git a/src/physics.rs b/src/physics.rs index 886abc9..706c91b 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -1,10 +1,10 @@ use glam::{Vec2, Vec3}; use partial_min_max::{min, max}; -#[derive (Debug, PartialEq)] +#[derive (Debug, Default, PartialEq)] pub struct PhysicsBody { - pos: Vec3, - vel: Vec3, + pub pos: Vec3, + pub vel: Vec3, } #[derive (Debug, PartialEq)] @@ -16,7 +16,7 @@ pub struct PhysicsResult { #[derive (Copy, Clone)] pub struct Triangle { - verts: [Vec3; 3], + pub verts: [Vec3; 3], } fn vec_min (a: &Vec3, b: &Vec3) -> Vec3 { @@ -193,6 +193,7 @@ pub fn get_candidate (world: &[Triangle], p0: Vec3, p1: Vec3, radius: f32) let denom = (p1 - p0).length (); let t_times_denom = a_ray.x - discriminant.sqrt (); + let t = t_times_denom / denom; if t_times_denom < 0.0 || t_times_denom > denom { // The cylinder is along the line, @@ -204,11 +205,10 @@ pub fn get_candidate (world: &[Triangle], p0: Vec3, p1: Vec3, radius: f32) let p_impact_times_denom = p0 * (denom - t_times_denom) + p1 * (t_times_denom); let p_impact = p_impact_times_denom / denom; - let impact_along_cylinder_times_denom = Vec3::dot (cylinder_axis, p_impact_times_denom); - let impact_along_cylinder = impact_along_cylinder_times_denom / denom; + let impact_along_cylinder = Vec3::dot (cylinder_axis, p_impact); let a_along_cylinder = Vec3::dot (cylinder_axis, a); - if impact_along_cylinder_times_denom < a_along_cylinder * denom || impact_along_cylinder_times_denom > Vec3::dot (cylinder_axis, b) * denom + if impact_along_cylinder < a_along_cylinder || impact_along_cylinder > Vec3::dot (cylinder_axis, b) { // The infinite cylinder is on the line segment, // but the finite cylinder is not. @@ -279,12 +279,12 @@ pub fn get_candidate (world: &[Triangle], p0: Vec3, p1: Vec3, radius: f32) } pub struct Params { - dt: f32, - gravity: Vec3, - margin: f32, + pub dt: f32, + pub gravity: Vec3, + pub margin: f32, } -pub fn physics_step ( +pub fn step ( params: &Params, world: &[Triangle], radius: f32, input: &PhysicsBody, ) -> PhysicsResult @@ -447,7 +447,7 @@ mod test { }, ), ] { - let a = physics_step (¶ms, &world, radius, &body_before); + let a = step (¶ms, &world, radius, &body_before); assert! (a.body.pos.distance_squared (e.body.pos) <= 0.00125); assert! (a.body.vel.distance_squared (e.body.vel) <= 0.00125); @@ -480,7 +480,7 @@ mod test { }, ); - let a = physics_step (¶ms, &world, radius, &body_before); + let a = step (¶ms, &world, radius, &body_before); let e = PhysicsResult { body: PhysicsBody { @@ -503,7 +503,7 @@ mod test { vel: (0.0, 0.0, 0.0).into (), }; - let a = physics_step (¶ms, &world, radius, &body_before); + let a = step (¶ms, &world, radius, &body_before); let e = PhysicsResult { body: PhysicsBody {