Prepare to add a flight mode
parent
61a5aae607
commit
d39276d93f
|
@ -90,7 +90,22 @@ impl EulerAngles {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct WorldState {
|
enum PlayMode {
|
||||||
|
WindTunnel,
|
||||||
|
FreeFlight,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive (Copy, Clone, PartialEq, Eq)]
|
||||||
|
enum UserControl {
|
||||||
|
Camera,
|
||||||
|
Wind,
|
||||||
|
Airplane,
|
||||||
|
Sunlight,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WindTunnelState {
|
||||||
|
user_control: UserControl,
|
||||||
|
|
||||||
camera: EulerAngles,
|
camera: EulerAngles,
|
||||||
wind: EulerAngles,
|
wind: EulerAngles,
|
||||||
airplane: EulerAngles,
|
airplane: EulerAngles,
|
||||||
|
@ -98,30 +113,39 @@ struct WorldState {
|
||||||
spin_speed: i32,
|
spin_speed: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WorldState {
|
struct WorldState {
|
||||||
pub fn new () -> Self {
|
play_mode: PlayMode,
|
||||||
Self {
|
wind_tunnel: WindTunnelState,
|
||||||
camera: Default::default (),
|
}
|
||||||
wind: Default::default (),
|
|
||||||
airplane: Default::default (),
|
impl WindTunnelState {
|
||||||
sunlight: EulerAngles {
|
pub fn handle_event (&mut self, event: &sdl2::event::Event) {
|
||||||
altitude: 90.0,
|
match event {
|
||||||
azimuth: 0.0,
|
Event::KeyDown { keycode: Some (Keycode::C), .. } => {
|
||||||
|
self.user_control = UserControl::Camera;
|
||||||
},
|
},
|
||||||
spin_speed: 0,
|
Event::KeyDown { keycode: Some (Keycode::W), .. } => {
|
||||||
|
self.user_control = UserControl::Wind;
|
||||||
|
},
|
||||||
|
Event::KeyDown { keycode: Some (Keycode::P), .. } => {
|
||||||
|
self.user_control = UserControl::Airplane;
|
||||||
|
},
|
||||||
|
Event::KeyDown { keycode: Some (Keycode::L), .. } => {
|
||||||
|
self.user_control = UserControl::Sunlight;
|
||||||
|
},
|
||||||
|
_ => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn step (
|
pub fn step (
|
||||||
&mut self,
|
&mut self,
|
||||||
controller: &ControllerState,
|
controller: &ControllerState
|
||||||
user_control: &UserControl
|
|
||||||
) {
|
) {
|
||||||
const SPIN_RAMP_TIME: i32 = 30;
|
const SPIN_RAMP_TIME: i32 = 30;
|
||||||
|
|
||||||
let spin_f = 4.0 * self.spin_speed as f32 / SPIN_RAMP_TIME as f32;
|
let spin_f = 4.0 * self.spin_speed as f32 / SPIN_RAMP_TIME as f32;
|
||||||
|
|
||||||
let controlled_angle = match 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,
|
||||||
UserControl::Airplane => &mut self.airplane,
|
UserControl::Airplane => &mut self.airplane,
|
||||||
|
@ -150,6 +174,47 @@ impl WorldState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl WorldState {
|
||||||
|
pub fn new () -> Self {
|
||||||
|
Self {
|
||||||
|
play_mode: PlayMode::WindTunnel,
|
||||||
|
wind_tunnel: WindTunnelState {
|
||||||
|
user_control: UserControl::Camera,
|
||||||
|
camera: Default::default (),
|
||||||
|
wind: Default::default (),
|
||||||
|
airplane: Default::default (),
|
||||||
|
sunlight: EulerAngles {
|
||||||
|
altitude: 90.0,
|
||||||
|
azimuth: 0.0,
|
||||||
|
},
|
||||||
|
spin_speed: 0,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn handle_event (&mut self, event: &sdl2::event::Event) {
|
||||||
|
match event {
|
||||||
|
Event::KeyDown { keycode: Some (Keycode::T), .. } => {
|
||||||
|
self.play_mode = PlayMode::WindTunnel;
|
||||||
|
},
|
||||||
|
_ => match self.play_mode {
|
||||||
|
PlayMode::WindTunnel => self.wind_tunnel.handle_event (event),
|
||||||
|
_ => (),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn step (
|
||||||
|
&mut self,
|
||||||
|
controller: &ControllerState
|
||||||
|
) {
|
||||||
|
match self.play_mode {
|
||||||
|
PlayMode::WindTunnel => self.wind_tunnel.step (controller),
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mod uniforms {
|
mod uniforms {
|
||||||
use iota::iota;
|
use iota::iota;
|
||||||
iota! {
|
iota! {
|
||||||
|
@ -866,12 +931,25 @@ impl GameGraphics {
|
||||||
green,
|
green,
|
||||||
];
|
];
|
||||||
|
|
||||||
let longitude = state.camera.azimuth.to_radians ();
|
|
||||||
let latitude = (state.camera.altitude - 90.0).to_radians ();
|
|
||||||
|
|
||||||
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 light = state.sunlight.to_vec3 ();
|
let view_mat = match state.play_mode {
|
||||||
|
PlayMode::WindTunnel => {
|
||||||
|
let state = &state.wind_tunnel;
|
||||||
|
|
||||||
|
let longitude = state.camera.azimuth.to_radians ();
|
||||||
|
let latitude = (state.camera.altitude - 90.0).to_radians ();
|
||||||
|
|
||||||
|
proj_mat *
|
||||||
|
Mat4::from_translation (Vec3::from ((0.0, 0.0, -8.0))) *
|
||||||
|
Mat4::from_rotation_x (latitude) *
|
||||||
|
Mat4::from_rotation_z (longitude) *
|
||||||
|
Mat4::from_translation ((0.0, 0.0, -2.7 * 0.5).into ())
|
||||||
|
},
|
||||||
|
_ => proj_mat,
|
||||||
|
};
|
||||||
|
|
||||||
|
let light = state.wind_tunnel.sunlight.to_vec3 ();
|
||||||
|
|
||||||
let shadow_mat = {
|
let shadow_mat = {
|
||||||
let mut mat = Mat4::identity ();
|
let mut mat = Mat4::identity ();
|
||||||
|
@ -879,12 +957,7 @@ impl GameGraphics {
|
||||||
mat
|
mat
|
||||||
};
|
};
|
||||||
|
|
||||||
let view_mat = proj_mat *
|
|
||||||
Mat4::from_translation (Vec3::from ((0.0, 0.0, -8.0))) *
|
|
||||||
Mat4::from_rotation_x (latitude) *
|
|
||||||
Mat4::from_rotation_z (longitude) *
|
|
||||||
Mat4::from_translation ((0.0, 0.0, -2.7 * 0.5).into ())
|
|
||||||
;
|
|
||||||
|
|
||||||
let sky_mvp_mat = view_mat * Mat4::from_scale ((16.0, 16.0, 16.0).into ());
|
let sky_mvp_mat = view_mat * Mat4::from_scale ((16.0, 16.0, 16.0).into ());
|
||||||
|
|
||||||
|
@ -897,12 +970,16 @@ impl GameGraphics {
|
||||||
glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT);
|
glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT);
|
||||||
});
|
});
|
||||||
|
|
||||||
let airplane_model_mat =
|
let airplane_model_mat = match state.play_mode {
|
||||||
Mat4::from_translation ((0.0, 0.0, 2.7 * 0.5).into ()) *
|
PlayMode::WindTunnel => {
|
||||||
Mat4::from_scale ((0.125, 0.125, 0.125).into ()) *
|
let state = &state.wind_tunnel;
|
||||||
Mat4::from_rotation_z (state.airplane.azimuth.to_radians ()) *
|
Mat4::from_translation ((0.0, 0.0, 2.7 * 0.5).into ()) *
|
||||||
Mat4::from_rotation_x (state.airplane.altitude.to_radians ())
|
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 world_model_mat = Mat4::identity ();
|
let world_model_mat = Mat4::identity ();
|
||||||
let inverse_pumpkin = airplane_model_mat.inverse ();
|
let inverse_pumpkin = airplane_model_mat.inverse ();
|
||||||
|
@ -1044,14 +1121,6 @@ impl GameGraphics {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive (Copy, Clone, PartialEq, Eq)]
|
|
||||||
enum UserControl {
|
|
||||||
Camera,
|
|
||||||
Wind,
|
|
||||||
Airplane,
|
|
||||||
Sunlight,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main () {
|
fn main () {
|
||||||
let sdl_context = sdl2::init ().unwrap ();
|
let sdl_context = sdl2::init ().unwrap ();
|
||||||
let video_subsystem = sdl_context.video ().unwrap ();
|
let video_subsystem = sdl_context.video ().unwrap ();
|
||||||
|
@ -1078,7 +1147,6 @@ fn main () {
|
||||||
let graphics = GameGraphics::new ();
|
let graphics = GameGraphics::new ();
|
||||||
let mut gl_state = Default::default ();
|
let mut gl_state = Default::default ();
|
||||||
|
|
||||||
let mut user_control = UserControl::Camera;
|
|
||||||
let mut graphics_frames = 0;
|
let mut graphics_frames = 0;
|
||||||
|
|
||||||
let mut event_pump = sdl_context.event_pump ().unwrap ();
|
let mut event_pump = sdl_context.event_pump ().unwrap ();
|
||||||
|
@ -1093,37 +1161,16 @@ fn main () {
|
||||||
Event::KeyDown { keycode: Some (Keycode::Escape), .. } => {
|
Event::KeyDown { keycode: Some (Keycode::Escape), .. } => {
|
||||||
break 'running
|
break 'running
|
||||||
},
|
},
|
||||||
Event::KeyDown { keycode: Some (Keycode::C), .. } => {
|
_ => state.handle_event (&event),
|
||||||
user_control = UserControl::Camera;
|
|
||||||
},
|
|
||||||
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;
|
|
||||||
},
|
|
||||||
_ => (),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let controller = ControllerState::from_sdl_keyboard (&event_pump.keyboard_state ());
|
let controller = ControllerState::from_sdl_keyboard (&event_pump.keyboard_state ());
|
||||||
|
|
||||||
for _ in 0..frames_to_do {
|
for _ in 0..frames_to_do {
|
||||||
state.step (&controller, &user_control);
|
state.step (&controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
let purple = (1.0, 0.5, 1.0).into ();
|
|
||||||
|
|
||||||
let origin: Vec3 = (0.0, 0.0, 1.35).into ();
|
|
||||||
let gravity = (0.0, 0.0, -1.0).into ();
|
|
||||||
|
|
||||||
let wind = state.wind.to_vec3 () * -1.0;
|
|
||||||
let wind_force = (wind.x (), 0.125 * wind.y (), wind.z ()).into ();
|
|
||||||
|
|
||||||
|
|
||||||
let control_flash = if graphics_frames % 16 >= 8 {
|
let control_flash = if graphics_frames % 16 >= 8 {
|
||||||
(1.0, 1.0, 1.0).into ()
|
(1.0, 1.0, 1.0).into ()
|
||||||
}
|
}
|
||||||
|
@ -1131,37 +1178,51 @@ fn main () {
|
||||||
(1.0, 0.0, 0.0).into ()
|
(1.0, 0.0, 0.0).into ()
|
||||||
};
|
};
|
||||||
|
|
||||||
let get_flash = |control_type, default_color| {
|
let arrows = match state.play_mode {
|
||||||
if user_control == control_type {
|
PlayMode::WindTunnel => {
|
||||||
control_flash
|
let state = &state.wind_tunnel;
|
||||||
}
|
let purple = (1.0, 0.5, 1.0).into ();
|
||||||
else {
|
|
||||||
default_color
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let arrows = vec![
|
let origin: Vec3 = (0.0, 0.0, 1.35).into ();
|
||||||
Arrow {
|
let gravity = (0.0, 0.0, -1.0).into ();
|
||||||
origin: (0.0, 0.0, 1.35).into (),
|
|
||||||
direction: gravity,
|
let wind = state.wind.to_vec3 () * -1.0;
|
||||||
color: (1.0, 0.5, 0.5).into (),
|
let wind_force = (wind.x (), 0.125 * wind.y (), wind.z ()).into ();
|
||||||
|
|
||||||
|
let get_flash = |control_type, default_color| {
|
||||||
|
if state.user_control == control_type {
|
||||||
|
control_flash
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
default_color
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
vec![
|
||||||
|
Arrow {
|
||||||
|
origin: (0.0, 0.0, 1.35).into (),
|
||||||
|
direction: gravity,
|
||||||
|
color: (1.0, 0.5, 0.5).into (),
|
||||||
|
},
|
||||||
|
Arrow {
|
||||||
|
origin: origin + wind * -2.0,
|
||||||
|
direction: wind,
|
||||||
|
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 ()),
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
Arrow {
|
_ => vec![],
|
||||||
origin: origin + wind * -2.0,
|
};
|
||||||
direction: wind,
|
|
||||||
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| {
|
let renderable_arrows: Vec <_> = arrows.iter ().map (|arrow| {
|
||||||
let dir_len = arrow.direction.length ();
|
let dir_len = arrow.direction.length ();
|
||||||
|
|
Loading…
Reference in New Issue