From 61a5aae6073a29671f979ad07290514e90bc1882 Mon Sep 17 00:00:00 2001 From: _ <> Date: Mon, 9 Mar 2020 00:53:08 +0000 Subject: [PATCH] Swap in airplane model and do other fun stuff --- airplane.iqm | Bin 0 -> 18576 bytes src/bin/pumpkin.rs | 89 +++++++++++++++++++++++++++++---------------- 2 files changed, 58 insertions(+), 31 deletions(-) create mode 100644 airplane.iqm diff --git a/airplane.iqm b/airplane.iqm new file mode 100644 index 0000000000000000000000000000000000000000..bc0883531d33a1a656d8fe6df40b2bfb02f5e3ce GIT binary patch literal 18576 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 sx%I^<&EZ1oBVd zIG}z)*`GrG8GHt)|3%qj~`!wVi;BSEX8D;++@=I_QP(P>a^N<(7SAhCO zK>HH-8vH})-zfVsKV%B!#)eh3aAGtI~!znkONT9sq8?=Tp%}~9;EC%ka* zgCPrmf`EDLrw260#I14XB4Hy9{JmP!3QpuWafSluf;& zvZ?crDYU6qR(2K0a8MOcucmD3)s;=XhO(*GR5tZm%7(DtEx91$Kx@EH0H_XzgH9kD z$O^K93V`h$z%0PFoFD}Rf~p`2Vt4F z2N<9ns0eBRu6Y$u5Ab?a2Gszs-+1s0s07%beP)7Wz#QzySY9)J7#9h6-I)6&z-!IC z5rF%k7MKm{f~H_8s0nI=ae)0;OEh4gI)JephqbT|$DnU6;Mla8gL{Q@WiHlQ4m1GF z_bgy8&TlMe1emWOXad-eYqJ8dPh-#wu-|B~3b2m}*oW(y1eOE#V~#O^W3&HC5Dl1v zbLQCW&-ro=F@XD*Ysod84w{3OAQ4Ojvp_4*0>lEgbp(AuB48V@(=adsaQ(A@=RjL9 z5)1(YK|jz2veQj z)5q(;wV=&dxlYWJ6^sXr84l=UPS#7C@vN77ihFS!hz8t;+>f-mH(vq~fIjYP+LZzK zLv=tO$C(Jqf=Qq_SOg|0I|!2V2v$DMgX_q3<@K2d;sMv3`;u$U>o6U(0CF9u^V+bD zzC&u?gVzAt76YzP39tlkt++<7f>6MA#)bj5zYds-?WF*7vYqwT h0?oj3!1*i%D*)%k_LZO^VEZc21hAdgnb(``{|3OLlD7Z= literal 0 HcmV?d00001 diff --git a/src/bin/pumpkin.rs b/src/bin/pumpkin.rs index 4467469..8896625 100644 --- a/src/bin/pumpkin.rs +++ b/src/bin/pumpkin.rs @@ -77,13 +77,13 @@ impl Default for EulerAngles { impl EulerAngles { pub fn to_vec3 (&self) -> Vec3 { - let alt = self.altitude * std::f32::consts::PI / 180.0; - let azi = self.azimuth * std::f32::consts::PI / 180.0; + let alt = self.altitude.to_radians (); + let azi = self.azimuth.to_radians (); let z = alt.sin (); let xy_len = alt.cos (); - let x = xy_len * azi.sin (); + let x = xy_len * -azi.sin (); let y = xy_len * azi.cos (); (x, y, z).into () @@ -93,6 +93,8 @@ impl EulerAngles { struct WorldState { camera: EulerAngles, wind: EulerAngles, + airplane: EulerAngles, + sunlight: EulerAngles, spin_speed: i32, } @@ -101,6 +103,11 @@ impl WorldState { Self { camera: Default::default (), wind: Default::default (), + airplane: Default::default (), + sunlight: EulerAngles { + altitude: 90.0, + azimuth: 0.0, + }, spin_speed: 0, } } @@ -117,6 +124,8 @@ impl WorldState { let controlled_angle = match user_control { UserControl::Camera => &mut self.camera, UserControl::Wind => &mut self.wind, + UserControl::Airplane => &mut self.airplane, + UserControl::Sunlight => &mut self.sunlight, }; if controller.is_pressed (KEY_LEFT) { @@ -537,7 +546,7 @@ struct GameGraphics { shaders: Vec , shader_lookup: HashMap , - mesh_pumpkin: RenderableModel, + mesh_airplane: RenderableModel, mesh_sky: RenderableModel, mesh_pitch: RenderableModel, mesh_arrow: RenderableModel, @@ -600,7 +609,7 @@ impl GameGraphics { glezz::enable_vertex_attrib_array (attrs [NORMAL]); }); - let mesh_pumpkin = renderable_from_iqm_file ("pumpking.iqm"); + let mesh_airplane = renderable_from_iqm_file ("airplane.iqm"); let mesh_sky = renderable_from_iqm_file ("sky-sphere.iqm"); let mesh_pitch = renderable_from_iqm_file ("pitch.iqm"); let mesh_arrow = renderable_from_iqm_file ("arrow.iqm"); @@ -825,7 +834,7 @@ impl GameGraphics { shaders, shader_lookup, - mesh_pumpkin, + mesh_airplane, mesh_sky, mesh_pitch, mesh_arrow, @@ -862,9 +871,11 @@ impl GameGraphics { let proj_mat = Mat4::perspective_rh_gl (30.0f32.to_radians (), 1280.0 / 720.0, 0.5, 500.0); + let light = state.sunlight.to_vec3 (); + let shadow_mat = { let mut mat = Mat4::identity (); - mat.set_z_axis ((-0.25, 0.125, 0.0, 0.0).into ()); + mat.set_z_axis ((-light.x () / light.z (), -light.y () / light.z (), 0.0, 0.0).into ()); mat }; @@ -877,8 +888,6 @@ impl GameGraphics { let sky_mvp_mat = view_mat * Mat4::from_scale ((16.0, 16.0, 16.0).into ()); - let light = Vec3::from ((0.25, -0.125, 1.0)).normalize (); - //println! ("Started frame"); let mut passes = self.passes.iter (); @@ -888,14 +897,15 @@ impl GameGraphics { glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT); }); - let pumpkin_model_mat = + let airplane_model_mat = Mat4::from_translation ((0.0, 0.0, 2.7 * 0.5).into ()) * Mat4::from_scale ((0.125, 0.125, 0.125).into ()) * - Mat4::from_translation ((0.0, 0.0, -2.7 * 0.5).into ()) + Mat4::from_rotation_z (state.airplane.azimuth.to_radians ()) * + Mat4::from_rotation_x (state.airplane.altitude.to_radians ()) ; let world_model_mat = Mat4::identity (); - let inverse_pumpkin = pumpkin_model_mat.inverse (); + let inverse_pumpkin = airplane_model_mat.inverse (); use uniforms::*; @@ -905,7 +915,7 @@ impl GameGraphics { let unis = shader_vars.unis; let attrs = shader_vars.attrs; - let mvp = view_mat * pumpkin_model_mat; + let mvp = view_mat * airplane_model_mat; glezz::uniform_matrix_4fv (unis [&MVP], &mvp); let object_space_light = make_object_space_vec (&inverse_pumpkin, &light); @@ -917,13 +927,17 @@ impl GameGraphics { glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &object_space_light); glezz::uniform_3fv (unis [&OBJECT_SPACE_SKY], &object_space_sky); - self.mesh_pumpkin.draw_all (attrs, |i| { - glezz::uniform_3fv (unis [&ALBEDO], &pumpkin_colors [i]); + let gunmetal_grey = color_from_255 ((133.0, 149.0, 161.0)); + glezz::uniform_3fv (unis [&ALBEDO], &gunmetal_grey); + + self.mesh_airplane.draw_all (attrs, |i| { true }); let mvp = view_mat * world_model_mat; glezz::uniform_matrix_4fv (unis [&MVP], &mvp); + glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &light); + glezz::uniform_3fv (unis [&OBJECT_SPACE_SKY], &Vec3::from ((0.0, 0.0, 1.0))); self.mesh_pitch.draw_all (attrs, |i| { glezz::uniform_3fv (unis [&ALBEDO], &self.pitch_colors [i]); @@ -951,10 +965,10 @@ impl GameGraphics { let view_mat = view_mat * shadow_mat; - let mvp = view_mat * pumpkin_model_mat; + let mvp = view_mat * airplane_model_mat; glezz::uniform_matrix_4fv (unis [&MVP], &mvp); - self.mesh_pumpkin.draw_all (attrs, |_| true); + self.mesh_airplane.draw_all (attrs, |_| true); let mvp = view_mat * world_model_mat; glezz::uniform_matrix_4fv (unis [&MVP], &mvp); @@ -969,21 +983,16 @@ impl GameGraphics { } }); - let object_space_light = make_object_space_vec (&inverse_pumpkin, &light); - // Draw unlit ground passes.next ().unwrap ().with_shader (gl_state, self, |shader_vars| { let unis = shader_vars.unis; let attrs = shader_vars.attrs; - let inverse_pumpkin = pumpkin_model_mat.inverse (); - - let object_space_sky = make_object_space_vec (&inverse_pumpkin, &Vec3::from ((0.0, 0.0, 1.0))); - glezz::uniform_3fv (unis [&MIN_BRIGHT], &black); glezz::uniform_3fv (unis [&MIN_ALBEDO], &white); - glezz::uniform_3fv (unis [&OBJECT_SPACE_SKY], &object_space_sky); + glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &light); + glezz::uniform_3fv (unis [&OBJECT_SPACE_SKY], &Vec3::from ((0.0, 0.0, 1.0))); let mvp = view_mat * world_model_mat; glezz::uniform_matrix_4fv (unis [&MVP], &mvp); @@ -1000,7 +1009,8 @@ impl GameGraphics { let unis = shader_vars.unis; let attrs = shader_vars.attrs; - glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &object_space_light); + glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &light); + glezz::uniform_3fv (unis [&OBJECT_SPACE_SKY], &Vec3::from ((0.0, 0.0, 1.0))); self.mesh_pitch.draw (attrs, self.grass_index); }); @@ -1038,6 +1048,8 @@ impl GameGraphics { enum UserControl { Camera, Wind, + Airplane, + Sunlight, } fn main () { @@ -1087,6 +1099,12 @@ fn main () { Event::KeyDown { keycode: Some (Keycode::W), .. } => { user_control = UserControl::Wind; }, + Event::KeyDown { keycode: Some (Keycode::P), .. } => { + user_control = UserControl::Airplane; + }, + Event::KeyDown { keycode: Some (Keycode::L), .. } => { + user_control = UserControl::Sunlight; + }, _ => (), } } @@ -1113,6 +1131,15 @@ fn main () { (1.0, 0.0, 0.0).into () }; + let get_flash = |control_type, default_color| { + if user_control == control_type { + control_flash + } + else { + default_color + } + }; + let arrows = vec![ Arrow { origin: (0.0, 0.0, 1.35).into (), @@ -1122,18 +1149,18 @@ fn main () { Arrow { origin: origin + wind * -2.0, direction: wind, - color: if user_control == UserControl::Wind { - control_flash - } - else { - purple - }, + color: get_flash (UserControl::Wind, purple), }, Arrow { origin: origin, direction: wind_force, color: purple, }, + Arrow { + origin: origin, + direction: state.airplane.to_vec3 () * 0.5, + color: get_flash (UserControl::Airplane, (0.0, 0.0, 0.0).into ()), + } ]; let renderable_arrows: Vec <_> = arrows.iter ().map (|arrow| {