The two modes are working okay
							parent
							
								
									d39276d93f
								
							
						
					
					
						commit
						3d9f8e1a13
					
				|  | @ -1,7 +1,7 @@ | ||||||
| #[macro_use] 
 | #[macro_use] 
 | ||||||
| extern crate maplit; | extern crate maplit; | ||||||
| 
 | 
 | ||||||
| use glam::{Mat4, Vec3, Vec4}; | use glam::{Mat4, Quat, Vec3, Vec4}; | ||||||
| 
 | 
 | ||||||
| use sdl2::event::Event; | use sdl2::event::Event; | ||||||
| use sdl2::keyboard::{Keycode, Scancode}; | use sdl2::keyboard::{Keycode, Scancode}; | ||||||
|  | @ -59,6 +59,36 @@ impl ControllerState { | ||||||
| 	pub fn is_pressed (&self, code: usize) -> bool { | 	pub fn is_pressed (&self, code: usize) -> bool { | ||||||
| 		self.keys [code] | 		self.keys [code] | ||||||
| 	} | 	} | ||||||
|  | 	
 | ||||||
|  | 	pub fn control_eulers ( | ||||||
|  | 		&self, 
 | ||||||
|  | 		controlled_angle: &mut EulerAngles, 
 | ||||||
|  | 		spin_speed: i32 | ||||||
|  | 	) -> i32  | ||||||
|  | 	{ | ||||||
|  | 		const SPIN_RAMP_TIME: i32 = 30; | ||||||
|  | 		let spin_f = 4.0 * spin_speed as f32 / SPIN_RAMP_TIME as f32; | ||||||
|  | 		
 | ||||||
|  | 		if self.is_pressed (KEY_LEFT) { | ||||||
|  | 			controlled_angle.azimuth += spin_f; | ||||||
|  | 			std::cmp::min (spin_speed + 1, SPIN_RAMP_TIME) | ||||||
|  | 		} | ||||||
|  | 		else if self.is_pressed (KEY_RIGHT) { | ||||||
|  | 			controlled_angle.azimuth -= spin_f; | ||||||
|  | 			std::cmp::min (spin_speed + 1, SPIN_RAMP_TIME) | ||||||
|  | 		} | ||||||
|  | 		else if self.is_pressed (KEY_UP) { | ||||||
|  | 			controlled_angle.altitude = f32::min (90.0, controlled_angle.altitude + spin_f); | ||||||
|  | 			std::cmp::min (spin_speed + 1, SPIN_RAMP_TIME) | ||||||
|  | 		} | ||||||
|  | 		else if self.is_pressed (KEY_DOWN) { | ||||||
|  | 			controlled_angle.altitude = f32::max (-90.0, controlled_angle.altitude - spin_f); | ||||||
|  | 			std::cmp::min (spin_speed + 1, SPIN_RAMP_TIME) | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			0 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct EulerAngles { | struct EulerAngles { | ||||||
|  | @ -113,9 +143,25 @@ struct WindTunnelState { | ||||||
| 	spin_speed: i32, | 	spin_speed: i32, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | struct FlightState { | ||||||
|  | 	airplane: EulerAngles, | ||||||
|  | 	spin_speed: i32, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl FlightState { | ||||||
|  | 	pub fn handle_event (&mut self, event: &sdl2::event::Event) { | ||||||
|  | 		
 | ||||||
|  | 	} | ||||||
|  | 	
 | ||||||
|  | 	pub fn step (&mut self, controller: &ControllerState) { | ||||||
|  | 		self.spin_speed = controller.control_eulers (&mut self.airplane, self.spin_speed); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| struct WorldState { | struct WorldState { | ||||||
| 	play_mode: PlayMode, | 	play_mode: PlayMode, | ||||||
| 	wind_tunnel: WindTunnelState, | 	wind_tunnel: WindTunnelState, | ||||||
|  | 	flight: FlightState, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl WindTunnelState { | impl WindTunnelState { | ||||||
|  | @ -141,10 +187,6 @@ impl WindTunnelState { | ||||||
| 		&mut self, 
 | 		&mut self, 
 | ||||||
| 		controller: &ControllerState | 		controller: &ControllerState | ||||||
| 	) { | 	) { | ||||||
| 		const SPIN_RAMP_TIME: i32 = 30; |  | ||||||
| 		
 |  | ||||||
| 		let spin_f = 4.0 * self.spin_speed as f32 / SPIN_RAMP_TIME as f32; |  | ||||||
| 		
 |  | ||||||
| 		let controlled_angle = match self.user_control { | 		let controlled_angle = match self.user_control { | ||||||
| 			UserControl::Camera => &mut self.camera, | 			UserControl::Camera => &mut self.camera, | ||||||
| 			UserControl::Wind => &mut self.wind, | 			UserControl::Wind => &mut self.wind, | ||||||
|  | @ -152,25 +194,7 @@ impl WindTunnelState { | ||||||
| 			UserControl::Sunlight => &mut self.sunlight, | 			UserControl::Sunlight => &mut self.sunlight, | ||||||
| 		}; | 		}; | ||||||
| 		
 | 		
 | ||||||
| 		if controller.is_pressed (KEY_LEFT) { | 		self.spin_speed = controller.control_eulers (controlled_angle, self.spin_speed); | ||||||
| 			self.spin_speed = std::cmp::min (self.spin_speed + 1, SPIN_RAMP_TIME); |  | ||||||
| 			controlled_angle.azimuth += spin_f; |  | ||||||
| 		} |  | ||||||
| 		else if controller.is_pressed (KEY_RIGHT) { |  | ||||||
| 			self.spin_speed = std::cmp::min (self.spin_speed + 1, SPIN_RAMP_TIME); |  | ||||||
| 			controlled_angle.azimuth -= spin_f; |  | ||||||
| 		} |  | ||||||
| 		else if controller.is_pressed (KEY_UP) { |  | ||||||
| 			self.spin_speed = std::cmp::min (self.spin_speed + 1, SPIN_RAMP_TIME); |  | ||||||
| 			controlled_angle.altitude = f32::min (90.0, controlled_angle.altitude + spin_f); |  | ||||||
| 		} |  | ||||||
| 		else if controller.is_pressed (KEY_DOWN) { |  | ||||||
| 			self.spin_speed = std::cmp::min (self.spin_speed + 1, SPIN_RAMP_TIME); |  | ||||||
| 			controlled_angle.altitude = f32::max (-90.0, controlled_angle.altitude - spin_f); |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			self.spin_speed = 0; |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -189,6 +213,10 @@ impl WorldState { | ||||||
| 				}, | 				}, | ||||||
| 				spin_speed: 0, | 				spin_speed: 0, | ||||||
| 			}, | 			}, | ||||||
|  | 			flight: FlightState { | ||||||
|  | 				airplane: Default::default (), | ||||||
|  | 				spin_speed: 0, | ||||||
|  | 			}, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	
 | 	
 | ||||||
|  | @ -197,9 +225,12 @@ impl WorldState { | ||||||
| 			Event::KeyDown { keycode: Some (Keycode::T), .. } => { | 			Event::KeyDown { keycode: Some (Keycode::T), .. } => { | ||||||
| 				self.play_mode = PlayMode::WindTunnel; | 				self.play_mode = PlayMode::WindTunnel; | ||||||
| 			}, | 			}, | ||||||
|  | 			Event::KeyDown { keycode: Some (Keycode::F), .. } => { | ||||||
|  | 				self.play_mode = PlayMode::FreeFlight; | ||||||
|  | 			}, | ||||||
| 			_ => match self.play_mode { | 			_ => match self.play_mode { | ||||||
| 				PlayMode::WindTunnel => self.wind_tunnel.handle_event (event), | 				PlayMode::WindTunnel => self.wind_tunnel.handle_event (event), | ||||||
| 				_ => (), | 				PlayMode::FreeFlight => self.flight.handle_event (event), | ||||||
| 			}, | 			}, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -210,7 +241,7 @@ impl WorldState { | ||||||
| 	) { | 	) { | ||||||
| 		match self.play_mode { | 		match self.play_mode { | ||||||
| 			PlayMode::WindTunnel => self.wind_tunnel.step (controller), | 			PlayMode::WindTunnel => self.wind_tunnel.step (controller), | ||||||
| 			_ => (), | 			PlayMode::FreeFlight => self.flight.step (controller), | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -931,6 +962,38 @@ impl GameGraphics { | ||||||
| 			green, | 			green, | ||||||
| 		]; | 		]; | ||||||
| 		
 | 		
 | ||||||
|  | 		let light = state.wind_tunnel.sunlight.to_vec3 (); | ||||||
|  | 		
 | ||||||
|  | 		let shadow_mat = { | ||||||
|  | 			let mut mat = Mat4::identity (); | ||||||
|  | 			mat.set_z_axis ((-light.x () / light.z (), -light.y () / light.z (), 0.0, 0.0).into ()); | ||||||
|  | 			mat | ||||||
|  | 		}; | ||||||
|  | 		
 | ||||||
|  | 		let mut passes = self.passes.iter (); | ||||||
|  | 		//println! ("Started frame");
 | ||||||
|  | 		
 | ||||||
|  | 		passes.next ().unwrap ().with (gl_state, || { | ||||||
|  | 			glezz::clear_color (1.0f32, 0.0f32, 1.0f32, 1.0f32); | ||||||
|  | 			glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT); | ||||||
|  | 		}); | ||||||
|  | 		
 | ||||||
|  | 		let airplane_model_mat = match state.play_mode { | ||||||
|  | 			PlayMode::WindTunnel => { | ||||||
|  | 				let euler = &state.wind_tunnel.airplane; | ||||||
|  | 				Mat4::from_translation ((0.0, 0.0, 2.7 * 0.5).into ()) * | ||||||
|  | 				Mat4::from_rotation_z (euler.azimuth.to_radians ()) * | ||||||
|  | 				Mat4::from_rotation_x (euler.altitude.to_radians ()) | ||||||
|  | 			}, | ||||||
|  | 			PlayMode::FreeFlight => { | ||||||
|  | 				let euler = &state.flight.airplane; | ||||||
|  | 				Mat4::from_translation ((0.0, 0.0, 2.7 * 0.5).into ()) * | ||||||
|  | 				Mat4::from_rotation_z (euler.azimuth.to_radians ()) * | ||||||
|  | 				Mat4::from_rotation_x (euler.altitude.to_radians ()) | ||||||
|  | 			}, | ||||||
|  | 		}; | ||||||
|  | 		let inverse_airplane = airplane_model_mat.inverse (); | ||||||
|  | 		
 | ||||||
| 		let proj_mat = Mat4::perspective_rh_gl (30.0f32.to_radians (), 1280.0 / 720.0, 0.5, 500.0); | 		let proj_mat = Mat4::perspective_rh_gl (30.0f32.to_radians (), 1280.0 / 720.0, 0.5, 500.0); | ||||||
| 		
 | 		
 | ||||||
| 		let view_mat = match state.play_mode { | 		let view_mat = match state.play_mode { | ||||||
|  | @ -946,43 +1009,18 @@ impl GameGraphics { | ||||||
| 				Mat4::from_rotation_z (longitude) * | 				Mat4::from_rotation_z (longitude) * | ||||||
| 				Mat4::from_translation ((0.0, 0.0, -2.7 * 0.5).into ()) | 				Mat4::from_translation ((0.0, 0.0, -2.7 * 0.5).into ()) | ||||||
| 			}, | 			}, | ||||||
| 			_ => proj_mat, | 			PlayMode::FreeFlight => { | ||||||
| 		}; | 				proj_mat * | ||||||
| 		
 | 				Mat4::from_translation ((0.0, -0.6, -4.0).into ()) * | ||||||
| 		let light = state.wind_tunnel.sunlight.to_vec3 (); | 				Mat4::from_rotation_x (-90.0f32.to_radians ()) * | ||||||
| 		
 | 				inverse_airplane | ||||||
| 		let shadow_mat = { |  | ||||||
| 			let mut mat = Mat4::identity (); |  | ||||||
| 			mat.set_z_axis ((-light.x () / light.z (), -light.y () / light.z (), 0.0, 0.0).into ()); |  | ||||||
| 			mat |  | ||||||
| 		}; |  | ||||||
| 		
 |  | ||||||
| 		
 |  | ||||||
| 		
 |  | ||||||
| 		let sky_mvp_mat = view_mat * Mat4::from_scale ((16.0, 16.0, 16.0).into ()); |  | ||||||
| 		
 |  | ||||||
| 		//println! ("Started frame");
 |  | ||||||
| 		
 |  | ||||||
| 		let mut passes = self.passes.iter (); |  | ||||||
| 		
 |  | ||||||
| 		passes.next ().unwrap ().with (gl_state, || { |  | ||||||
| 			glezz::clear_color (1.0f32, 0.0f32, 1.0f32, 1.0f32); |  | ||||||
| 			glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT); |  | ||||||
| 		}); |  | ||||||
| 		
 |  | ||||||
| 		let airplane_model_mat = match state.play_mode { |  | ||||||
| 			PlayMode::WindTunnel => { |  | ||||||
| 				let state = &state.wind_tunnel; |  | ||||||
| 				Mat4::from_translation ((0.0, 0.0, 2.7 * 0.5).into ()) * |  | ||||||
| 				Mat4::from_scale ((0.125, 0.125, 0.125).into ()) * |  | ||||||
| 				Mat4::from_rotation_z (state.airplane.azimuth.to_radians ()) * |  | ||||||
| 				Mat4::from_rotation_x (state.airplane.altitude.to_radians ()) |  | ||||||
| 			}, | 			}, | ||||||
| 			_ => Mat4::identity (), |  | ||||||
| 		}; | 		}; | ||||||
| 		
 | 		
 | ||||||
|  | 		let airplane_model_mat = airplane_model_mat * 
 | ||||||
|  | 		Mat4::from_scale ((0.125, 0.125, 0.125).into ()); | ||||||
|  | 		
 | ||||||
| 		let world_model_mat = Mat4::identity (); | 		let world_model_mat = Mat4::identity (); | ||||||
| 		let inverse_pumpkin = airplane_model_mat.inverse (); |  | ||||||
| 		
 | 		
 | ||||||
| 		use uniforms::*; | 		use uniforms::*; | ||||||
| 		
 | 		
 | ||||||
|  | @ -995,9 +1033,8 @@ impl GameGraphics { | ||||||
| 			let mvp = view_mat * airplane_model_mat; | 			let mvp = view_mat * airplane_model_mat; | ||||||
| 			glezz::uniform_matrix_4fv (unis [&MVP], &mvp); | 			glezz::uniform_matrix_4fv (unis [&MVP], &mvp); | ||||||
| 			
 | 			
 | ||||||
| 			let object_space_light = make_object_space_vec (&inverse_pumpkin, &light); | 			let object_space_light = make_object_space_vec (&inverse_airplane, &light); | ||||||
| 			
 | 			let object_space_sky = make_object_space_vec (&inverse_airplane, &Vec3::from ((0.0, 0.0, 1.0))); | ||||||
| 			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_BRIGHT], &black); | ||||||
| 			glezz::uniform_3fv (unis [&MIN_ALBEDO], &white); | 			glezz::uniform_3fv (unis [&MIN_ALBEDO], &white); | ||||||
|  | @ -1023,6 +1060,8 @@ impl GameGraphics { | ||||||
| 			
 | 			
 | ||||||
| 			let draw_sky = true; | 			let draw_sky = true; | ||||||
| 			if draw_sky { | 			if draw_sky { | ||||||
|  | 				let sky_mvp_mat = view_mat * Mat4::from_scale ((16.0, 16.0, 16.0).into ()); | ||||||
|  | 				
 | ||||||
| 				self.texture.bind (); | 				self.texture.bind (); | ||||||
| 				glezz::uniform_matrix_4fv (unis [&MVP], &sky_mvp_mat); | 				glezz::uniform_matrix_4fv (unis [&MVP], &sky_mvp_mat); | ||||||
| 				glezz::uniform_3fv (unis [&ALBEDO], &white); | 				glezz::uniform_3fv (unis [&ALBEDO], &white); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 _
						_