shadows are working idk

main
_ 2021-12-19 03:47:57 +00:00
parent c61f734a5b
commit 174061feb1
7 changed files with 66 additions and 8 deletions

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
/quic_server.crt /quic_server.crt
/target /target
**/*.rs.bk **/*.rs.bk
/videos
*.blend* *.blend*
*.trace *.trace

BIN
crate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
earth.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

View File

@ -73,7 +73,10 @@ struct GameGraphics {
text_stream: TriangleStream, text_stream: TriangleStream,
texture_crate: Texture, texture_crate: Texture,
texture_earth: Texture,
texture_sky: Texture, texture_sky: Texture,
frames: u64,
} }
impl ShaderLookup for GameGraphics { impl ShaderLookup for GameGraphics {
@ -92,8 +95,9 @@ impl GameGraphics {
let white = color_from_255 ((255.0, 255.0, 255.0)); let white = color_from_255 ((255.0, 255.0, 255.0));
let black = color_from_255 ((0.0, 0.0, 0.0)); let black = color_from_255 ((0.0, 0.0, 0.0));
let shadow_blue = color_from_255 ((0.0, 0.0, 0.25));
let screen_size = (1280.0, 720.0); let screen_size = (320.0, 240.0);
let fov = 30.0f32; let fov = 30.0f32;
@ -114,13 +118,14 @@ impl GameGraphics {
let attrs = shader_vars.attrs; let attrs = shader_vars.attrs;
let unis = shader_vars.unis; let unis = shader_vars.unis;
self.texture_sky.bind (); self.texture_earth.bind ();
{ {
let mvp = view_mat * let mvp = view_mat *
Mat4::from_translation (state.player.pos) * Mat4::from_translation (state.player.pos) *
Mat4::from_scale ((0.5, 0.5, 0.5).into ()); Mat4::from_scale ((0.5, 0.5, 0.5).into ());
glezz::uniform_matrix_4fv (unis [&u::MVP], &mvp); glezz::uniform_matrix_4fv (unis [&u::MVP], &mvp);
glezz::uniform_3fv (unis [&u::ALBEDO], &white);
self.mesh_sphere.draw_all (attrs, |_| { self.mesh_sphere.draw_all (attrs, |_| {
true true
@ -128,6 +133,7 @@ impl GameGraphics {
} }
self.texture_crate.bind (); self.texture_crate.bind ();
glezz::uniform_3fv (unis [&u::ALBEDO], &white);
for aabb in &state.aabbs { for aabb in &state.aabbs {
let min = aabb.min; let min = aabb.min;
@ -145,6 +151,55 @@ impl GameGraphics {
}); });
} }
glezz::uniform_3fv (unis [&u::ALBEDO], &shadow_blue);
if true {
// Raycast for player shadow
let coll = opengl_rust::physics::get_candidate (
&[], &state.aabbs,
state.player.pos,
state.player.pos + Vec3::new (0.0, 0.0, -100.0),
0.0
);
if coll.t <= 1.0 {
let mvp = view_mat *
Mat4::from_translation (coll.p_impact + Vec3::new (0.0, 0.0, 0.0625)) *
Mat4::from_scale ((0.5, 0.5, 0.0).into ());
glezz::uniform_matrix_4fv (unis [&u::MVP], &mvp);
self.mesh_sphere.draw_all (attrs, |_| {
true
});
}
for aabb in &state.aabbs {
// Raycast for box shadows
let min = aabb.min;
let max = aabb.max;
let center = (min + max) / 2.0;
let scale = (max - min) / 2.0;
let coll = opengl_rust::physics::get_candidate (
&[], &state.aabbs,
center,
center + Vec3::new (0.0, 0.0, -100.0),
0.0
);
if coll.t <= 1.0 {
let mvp = view_mat *
Mat4::from_translation (coll.p_impact + Vec3::new (0.0, 0.0, 0.0625)) *
Mat4::from_scale ((scale.x, scale.y, 0.0).into ());
glezz::uniform_matrix_4fv (unis [&u::MVP], &mvp);
self.mesh_cube.draw_all (attrs, |_| {
true
});
}
}
}
{ {
let sky_mvp_mat = view_mat * Mat4::from_scale ((64.0, 64.0, 64.0).into ()); let sky_mvp_mat = view_mat * Mat4::from_scale ((64.0, 64.0, 64.0).into ());
@ -170,7 +225,7 @@ async fn main () -> Result <()> {
let sdl_context = sdl2::init ().map_err (|e| anyhow! ("Can't init SDL: {}", e))?; let sdl_context = sdl2::init ().map_err (|e| anyhow! ("Can't init SDL: {}", e))?;
let video_subsystem = sdl_context.video ().map_err (|e| anyhow! ("Can't get SDL video subsystem: {}", e))?; let video_subsystem = sdl_context.video ().map_err (|e| anyhow! ("Can't get SDL video subsystem: {}", e))?;
let window = video_subsystem.window ("3D platformer", 1280, 720) let window = video_subsystem.window ("3D platformer", 320, 240)
.position_centered () .position_centered ()
.opengl () .opengl ()
.build () .build ()
@ -275,7 +330,7 @@ async fn main () -> Result <()> {
glezz::enable_vertex_attrib_array (attrs [attributes::NORMAL]); glezz::enable_vertex_attrib_array (attrs [attributes::NORMAL]);
}); });
let graphics = GameGraphics { let mut graphics = GameGraphics {
mesh_cube, mesh_cube,
mesh_sky, mesh_sky,
mesh_sphere, mesh_sphere,
@ -284,7 +339,9 @@ async fn main () -> Result <()> {
shaders, shaders,
text_stream, text_stream,
texture_crate: Texture::from_file ("crate.png"), texture_crate: Texture::from_file ("crate.png"),
texture_earth: Texture::from_file ("earth.png"),
texture_sky: Texture::from_file ("sky.png"), texture_sky: Texture::from_file ("sky.png"),
frames: 0,
}; };
let mut gl_state = Default::default (); let mut gl_state = Default::default ();
@ -374,9 +431,9 @@ async fn main () -> Result <()> {
window.gl_make_current (&gl_ctx).unwrap (); window.gl_make_current (&gl_ctx).unwrap ();
graphics.draw (&game_state, &mut gl_state); graphics.draw (&game_state, &mut gl_state);
graphics.frames += 1;
window.gl_swap_window (); window.gl_swap_window ();
graphics_frames += 1;
tokio::time::sleep (Duration::from_millis (15)).await; tokio::time::sleep (Duration::from_millis (15)).await;
} }

View File

@ -59,8 +59,8 @@ impl Triangle {
#[derive (Clone, Copy, Debug, PartialEq)] #[derive (Clone, Copy, Debug, PartialEq)]
pub struct Collision { pub struct Collision {
t: f32, pub t: f32,
p_impact: Vec3, pub p_impact: Vec3,
normal: Vec3, normal: Vec3,
i: usize, i: usize,
c_type: CollisionType, c_type: CollisionType,

View File

@ -12,7 +12,7 @@ impl TimeStep {
pub fn new (fps_num: u16, fps_den: u16) -> Self { pub fn new (fps_num: u16, fps_den: u16) -> Self {
Self { Self {
last_frame_time: Instant::now (), last_frame_time: Instant::now (),
accum: 0, accum: (fps_den / 2).into (),
fps_num, fps_num,
fps_den, fps_den,
} }