From 0d4ba9455ed5043a18bc0d157a0f1f04fd5476ea Mon Sep 17 00:00:00 2001 From: _ <_@_> Date: Fri, 25 Dec 2020 11:41:26 -0600 Subject: [PATCH] update: finally drawing a heightmap --- src/bin/terrain.rs | 56 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/src/bin/terrain.rs b/src/bin/terrain.rs index 97f996e..64e43ff 100644 --- a/src/bin/terrain.rs +++ b/src/bin/terrain.rs @@ -28,6 +28,10 @@ use opengl_rust::{ timestep::TimeStep, }; +struct GameState { + logic_frames: u64, +} + struct GraphicsContext { window: sdl2::video::Window, gl_ctx: sdl2::video::GLContext, @@ -59,14 +63,18 @@ impl ShaderLocations { } } -#[instrument (level = "trace", skip (ctx))] -fn draw_graphics (ctx: &GraphicsContext) { +#[instrument (level = "trace", skip (ctx, state))] +fn draw_graphics (ctx: &GraphicsContext, state: &GameState) +{ let shader_locs = &ctx.shader_locations; let attr_pos = shader_locs.attr_pos; let attr_color = shader_locs.attr_color; let uni_mvp = shader_locs.uni_mvp; ctx.window.gl_make_current (&ctx.gl_ctx).unwrap (); + + glezz::enable (gl::DEPTH_TEST); + glezz::clear_color (0.392f32, 0.710f32, 0.965f32, 1.0f32); glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT); @@ -74,8 +82,13 @@ fn draw_graphics (ctx: &GraphicsContext) { let proj_mat = Mat4::perspective_rh_gl (30.0f32.to_radians (), screen_size.0 / screen_size.1, 0.125, 200.0); + let spin_period = 360 * 4; + let view_mat = proj_mat * - Mat4::from_translation (Vec3::from ((0.0, 0.0, -20.0))); + Mat4::from_translation (Vec3::from ((0.0, 0.0, -80.0))) * + Mat4::from_rotation_x (-60.0 * 3.14159 / 180.0) * + Mat4::from_rotation_z ((state.logic_frames % spin_period) as f32 * 3.1415926535 * 2.0 / spin_period as f32) * + Mat4::from_translation (Vec3::from ((-32.0, -32.0, -5.0))); let mvp = view_mat; @@ -141,6 +154,15 @@ fn main () -> anyhow::Result <()> { let mut indexes = vec![]; let mut start_index = 0; + let height_fn = |x, y| { + let x = x - 32.0; + let y = y - 32.0; + + let d = x * x + y * y; + + f32::max (0.0, 5.0 - d * 0.125) + }; + for y in 0..64 { for x in 0..64 { let (r, g, b) = if (x + y) % 2 == 0 { @@ -154,12 +176,20 @@ fn main () -> anyhow::Result <()> { let y = y as f32; let i = start_index; - vertexes.extend (&[ - x + 0.0, y + 0.0, 0.0, r, g, b, - x + 1.0, y + 0.0, 0.0, r, g, b, - x + 1.0, y + 1.0, 0.0, r, g, b, - x + 0.0, y + 1.0, 0.0, r, g, b, - ]); + let xys = [ + (x + 0.0, y + 0.0), + (x + 1.0, y + 0.0), + (x + 1.0, y + 1.0), + (x + 0.0, y + 1.0), + ]; + + for (x, y) in &xys { + vertexes.extend (&[ + *x, *y, height_fn (*x, *y), + r, g, b, + ]) + } + indexes.extend (&[ i + 0, i + 1, i + 2, i + 0, i + 2, i + 3, @@ -182,6 +212,10 @@ fn main () -> anyhow::Result <()> { shader_locations, }; + let mut game_state = GameState { + logic_frames: 0, + }; + 'running: loop { let frames_to_do = time_step.step (); @@ -198,10 +232,10 @@ fn main () -> anyhow::Result <()> { } for _ in 0..frames_to_do { - + game_state.logic_frames += 1; } - draw_graphics (&graphics_ctx); + draw_graphics (&graphics_ctx, &game_state); graphics_frames += 1; std::thread::sleep (Duration::from_millis (15));