At this point I need to hook up a gamepad
parent
8c32e3674d
commit
7f15b34591
|
@ -58,6 +58,11 @@ dependencies = [
|
|||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "float-ord"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "fuchsia-cprng"
|
||||
version = "0.1.1"
|
||||
|
@ -201,6 +206,7 @@ name = "opengl_rust"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"float-ord 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gl 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"glam 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"iota 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -418,6 +424,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
|
||||
"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
|
||||
"checksum deflate 0.7.20 (registry+https://github.com/rust-lang/crates.io-index)" = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4"
|
||||
"checksum float-ord 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e"
|
||||
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
||||
"checksum gl 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404"
|
||||
"checksum gl_generator 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
|
||||
|
|
|
@ -9,7 +9,7 @@ edition = "2018"
|
|||
[dependencies]
|
||||
|
||||
byteorder = "1.3.2"
|
||||
|
||||
float-ord = "0.2.0"
|
||||
gl = "0.14.0"
|
||||
glam = "0.8.5"
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#[macro_use]
|
||||
extern crate maplit;
|
||||
|
||||
use float_ord::FloatOrd;
|
||||
use glam::{Mat4, Quat, Vec3, Vec4};
|
||||
|
||||
use sdl2::event::Event;
|
||||
|
@ -124,7 +125,7 @@ impl ControllerState {
|
|||
) -> i32
|
||||
{
|
||||
const SPIN_RAMP_TIME: i32 = 30;
|
||||
let spin_f = 4.0 * (spin_speed + 1) as f32 / SPIN_RAMP_TIME as f32;
|
||||
let spin_f = 2.0 * (spin_speed + 1) as f32 / SPIN_RAMP_TIME as f32;
|
||||
let spin_f = spin_f.to_radians ();
|
||||
|
||||
let mut delta = Quat::default ();
|
||||
|
@ -178,6 +179,7 @@ struct WindTunnelState {
|
|||
}
|
||||
|
||||
struct Airplane {
|
||||
vel: Vec3,
|
||||
pos: Vec3,
|
||||
ori: Quat,
|
||||
}
|
||||
|
@ -195,7 +197,45 @@ impl FlightState {
|
|||
pub fn step (&mut self, controller: &ControllerState) {
|
||||
self.spin_speed = controller.control_quat (&mut self.airplane.ori, self.spin_speed);
|
||||
|
||||
self.airplane.pos += self.airplane.ori.mul_vec3 ((0.0, 1.0 / 30.0, 0.0).into ());
|
||||
let airplane = &mut self.airplane;
|
||||
// Info
|
||||
let nose = airplane.ori.mul_vec3 ((0.0, 1.0, 0.0).into ());
|
||||
let speed = airplane.vel.length ();
|
||||
// Different from nose since planes are always drifting
|
||||
let direction = match speed {
|
||||
0.0 => Vec3::from ((0.0, 0.0, 0.0)),
|
||||
_ => airplane.vel * (1.0 / speed),
|
||||
};
|
||||
let object_space_dir = airplane.ori.conjugate ().mul_vec3 (direction);
|
||||
|
||||
// Forces
|
||||
let gravity = Vec3::from ((0.0, 0.0, -0.25));
|
||||
let thrust = nose;
|
||||
let laminar_drag = 0.5 * speed * -object_space_dir.y () * nose;
|
||||
|
||||
let turbulent_dir = Vec3::from ((0.5 * object_space_dir.x (), 0.0, object_space_dir.z ()));
|
||||
let turbulent_drag = -speed * speed * airplane.ori.mul_vec3 (turbulent_dir);
|
||||
|
||||
let air_drag = laminar_drag + turbulent_drag;
|
||||
|
||||
// Accumulate forces and run an Euler integration step
|
||||
let dt = 1.0 / 60.0;
|
||||
airplane.vel += dt * (thrust + gravity + air_drag);
|
||||
airplane.pos += dt * airplane.vel;
|
||||
|
||||
if airplane.pos.z () < 0.0 {
|
||||
airplane.vel.set_z (0.0);
|
||||
airplane.pos.set_z (0.0);
|
||||
}
|
||||
|
||||
// Gauges
|
||||
let alti = airplane.pos.z () * 100.0;
|
||||
let airspeed = speed * 100.0;
|
||||
|
||||
println! ("Alti: {}, Airspeed: {}",
|
||||
alti as i32,
|
||||
airspeed as i32
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -242,7 +282,7 @@ impl WindTunnelState {
|
|||
impl WorldState {
|
||||
pub fn new () -> Self {
|
||||
Self {
|
||||
play_mode: PlayMode::WindTunnel,
|
||||
play_mode: PlayMode::FreeFlight,
|
||||
wind_tunnel: WindTunnelState {
|
||||
user_control: UserControl::Camera,
|
||||
camera: Default::default (),
|
||||
|
@ -257,6 +297,7 @@ impl WorldState {
|
|||
flight: FlightState {
|
||||
airplane: Airplane {
|
||||
pos: (0.0, -0.5, 0.125).into (),
|
||||
vel: (0.0, 0.0, 0.0).into (),
|
||||
ori: Default::default (),
|
||||
},
|
||||
spin_speed: 0,
|
||||
|
@ -691,7 +732,8 @@ struct GameGraphics {
|
|||
mesh_pitch: RenderableModel,
|
||||
mesh_arrow: RenderableModel,
|
||||
|
||||
texture: Texture,
|
||||
texture_sky: Texture,
|
||||
texture_grass: Texture,
|
||||
|
||||
pitch_colors: Vec <Vec3>,
|
||||
grass_index: usize,
|
||||
|
@ -754,8 +796,8 @@ impl GameGraphics {
|
|||
let mesh_pitch = renderable_from_iqm_file ("pitch.iqm");
|
||||
let mesh_arrow = renderable_from_iqm_file ("arrow.iqm");
|
||||
|
||||
let texture = Texture::from_file ("sky.png");
|
||||
texture.bind ();
|
||||
let texture_sky = Texture::from_file ("sky.png");
|
||||
let texture_grass = Texture::from_file ("grass.png");
|
||||
|
||||
let (pitch_colors, grass_index) = {
|
||||
let silver = (255.0, 255.0, 255.0);
|
||||
|
@ -846,6 +888,7 @@ impl GameGraphics {
|
|||
flags: hashmap! {
|
||||
gl::CULL_FACE => true,
|
||||
gl::DEPTH_TEST => true,
|
||||
gl::TEXTURE_2D => false,
|
||||
gl::STENCIL_TEST => true,
|
||||
},
|
||||
front_face: Some (FrontFace::Ccw),
|
||||
|
@ -979,7 +1022,8 @@ impl GameGraphics {
|
|||
mesh_pitch,
|
||||
mesh_arrow,
|
||||
|
||||
texture,
|
||||
texture_sky,
|
||||
texture_grass,
|
||||
|
||||
pitch_colors,
|
||||
grass_index,
|
||||
|
@ -1037,7 +1081,9 @@ impl GameGraphics {
|
|||
};
|
||||
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.125, 200.0);
|
||||
|
||||
let airplane_scale = 1.0 / 128.0;
|
||||
|
||||
let view_mat = match state.play_mode {
|
||||
PlayMode::WindTunnel => {
|
||||
|
@ -1054,14 +1100,14 @@ impl GameGraphics {
|
|||
},
|
||||
PlayMode::FreeFlight => {
|
||||
proj_mat *
|
||||
Mat4::from_translation ((0.0, -0.6, -4.0).into ()) *
|
||||
Mat4::from_translation (Vec3::from ((0.0, -4.8, -32.0)) * airplane_scale) *
|
||||
Mat4::from_rotation_x (-90.0f32.to_radians ()) *
|
||||
inverse_airplane
|
||||
},
|
||||
};
|
||||
|
||||
let airplane_model_mat = airplane_model_mat *
|
||||
Mat4::from_scale ((0.125, 0.125, 0.125).into ());
|
||||
Mat4::from_scale ((airplane_scale, airplane_scale, airplane_scale).into ());
|
||||
|
||||
let world_model_mat = Mat4::identity ();
|
||||
|
||||
|
@ -1103,9 +1149,9 @@ impl GameGraphics {
|
|||
|
||||
let draw_sky = true;
|
||||
if draw_sky {
|
||||
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 ((64.0, 64.0, 64.0).into ());
|
||||
|
||||
self.texture.bind ();
|
||||
self.texture_sky.bind ();
|
||||
glezz::uniform_matrix_4fv (unis [&MVP], &sky_mvp_mat);
|
||||
glezz::uniform_3fv (unis [&ALBEDO], &white);
|
||||
glezz::uniform_3fv (unis [&MIN_BRIGHT], &white);
|
||||
|
@ -1149,7 +1195,7 @@ impl GameGraphics {
|
|||
let attrs = shader_vars.attrs;
|
||||
|
||||
glezz::uniform_3fv (unis [&MIN_BRIGHT], &black);
|
||||
glezz::uniform_3fv (unis [&MIN_ALBEDO], &white);
|
||||
glezz::uniform_3fv (unis [&MIN_ALBEDO], &black);
|
||||
glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &light);
|
||||
glezz::uniform_3fv (unis [&OBJECT_SPACE_SKY], &Vec3::from ((0.0, 0.0, 1.0)));
|
||||
|
||||
|
@ -1162,6 +1208,8 @@ impl GameGraphics {
|
|||
self.mesh_pitch.draw (attrs, self.grass_index);
|
||||
});
|
||||
|
||||
self.texture_grass.bind ();
|
||||
|
||||
// Draw lit ground
|
||||
passes.next ().unwrap ().with_shader (gl_state, self,
|
||||
|shader_vars| {
|
||||
|
@ -1184,7 +1232,7 @@ impl GameGraphics {
|
|||
let unis = &shader_vars.unis;
|
||||
|
||||
glezz::uniform_3fv (unis [&MIN_BRIGHT], &black);
|
||||
glezz::uniform_3fv (unis [&MIN_ALBEDO], &white);
|
||||
glezz::uniform_3fv (unis [&MIN_ALBEDO], &black);
|
||||
|
||||
for arrow in arrows.iter () {
|
||||
let mvp = view_mat * arrow.model_mat;
|
||||
|
|
Loading…
Reference in New Issue