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
/target
**/*.rs.bk
/videos
*.blend*
*.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,
texture_crate: Texture,
texture_earth: Texture,
texture_sky: Texture,
frames: u64,
}
impl ShaderLookup for GameGraphics {
@ -92,8 +95,9 @@ impl GameGraphics {
let white = color_from_255 ((255.0, 255.0, 255.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;
@ -114,13 +118,14 @@ impl GameGraphics {
let attrs = shader_vars.attrs;
let unis = shader_vars.unis;
self.texture_sky.bind ();
self.texture_earth.bind ();
{
let mvp = view_mat *
Mat4::from_translation (state.player.pos) *
Mat4::from_scale ((0.5, 0.5, 0.5).into ());
glezz::uniform_matrix_4fv (unis [&u::MVP], &mvp);
glezz::uniform_3fv (unis [&u::ALBEDO], &white);
self.mesh_sphere.draw_all (attrs, |_| {
true
@ -128,6 +133,7 @@ impl GameGraphics {
}
self.texture_crate.bind ();
glezz::uniform_3fv (unis [&u::ALBEDO], &white);
for aabb in &state.aabbs {
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 ());
@ -170,7 +225,7 @@ async fn main () -> Result <()> {
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 window = video_subsystem.window ("3D platformer", 1280, 720)
let window = video_subsystem.window ("3D platformer", 320, 240)
.position_centered ()
.opengl ()
.build ()
@ -275,7 +330,7 @@ async fn main () -> Result <()> {
glezz::enable_vertex_attrib_array (attrs [attributes::NORMAL]);
});
let graphics = GameGraphics {
let mut graphics = GameGraphics {
mesh_cube,
mesh_sky,
mesh_sphere,
@ -284,7 +339,9 @@ async fn main () -> Result <()> {
shaders,
text_stream,
texture_crate: Texture::from_file ("crate.png"),
texture_earth: Texture::from_file ("earth.png"),
texture_sky: Texture::from_file ("sky.png"),
frames: 0,
};
let mut gl_state = Default::default ();
@ -374,9 +431,9 @@ async fn main () -> Result <()> {
window.gl_make_current (&gl_ctx).unwrap ();
graphics.draw (&game_state, &mut gl_state);
graphics.frames += 1;
window.gl_swap_window ();
graphics_frames += 1;
tokio::time::sleep (Duration::from_millis (15)).await;
}

View File

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

View File

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