From 3bdf6f791dacc522f4b7022668f776a7285ce977 Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 18 Jul 2021 21:41:03 +0100 Subject: [PATCH] tile selection --- fishladder.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/fishladder.c b/fishladder.c index 7f49563..20bb051 100644 --- a/fishladder.c +++ b/fishladder.c @@ -7,11 +7,12 @@ SHADER_DEFINE( colour_shader, // VERTEX "layout (location=0) in vec3 a_co;" - "uniform mat4 uPvm;" + "uniform mat4 uPv;" + "uniform mat4 uMdl;" "" "void main()" "{" - " vec4 vert_pos = uPvm * vec4( a_co, 1.0 );" + " vec4 vert_pos = uPv * uMdl * vec4( a_co, 1.0 );" " gl_Position = vert_pos;" "}", @@ -24,12 +25,13 @@ SHADER_DEFINE( colour_shader, " FragColor = uColour;" "}" , - UNIFORMS({ "uPvm", "uColour" }) + UNIFORMS({ "uPv", "uMdl", "uColour" }) ) mat4 m_projection; mat4 m_view; mat4 m_pv; +mat4 m_mdl; int main( int argc, char *argv[] ) { @@ -48,6 +50,30 @@ void vg_update(void) glm_rotate_x( m_view, -1.0f, m_view ); glm_mat4_mul( m_projection, m_view, m_pv ); + + // Get mouse ray + vec3 ray_origin; + vec3 ray_dir; + + mat4 pv_inverse; + vec4 vp = { 0.f, 0.f, vg_window_x, vg_window_y }; + glm_mat4_inv( m_pv, pv_inverse ); + glm_unprojecti( (vec3){ vg_mouse_x, vg_window_y-vg_mouse_y, -1.f }, pv_inverse, vp, ray_dir ); + glm_unprojecti( (vec3){ vg_mouse_x, vg_window_y-vg_mouse_y, 0.f }, pv_inverse, vp, ray_origin ); + glm_vec3_sub( ray_dir, ray_origin, ray_dir ); + + // Get floor tile intersection + float ray_t = -ray_origin[1] / ray_dir[1]; + + vec3 tile_pos; + glm_vec3_copy( ray_origin, tile_pos ); + glm_vec3_muladds( ray_dir, ray_t, tile_pos ); + + tile_pos[0] = floorf( tile_pos[0] + 0.5f ); + tile_pos[2] = floorf( tile_pos[2] + 0.5f ); + + glm_mat4_identity( m_mdl ); + glm_translate( m_mdl, tile_pos ); } GLuint tile_vao; @@ -55,14 +81,18 @@ GLuint tile_vbo; void vg_render(void) { + glViewport( 0,0, vg_window_x, vg_window_y ); + glEnable( GL_DEPTH_TEST ); glClearColor( 0.94f, 0.94f, 0.94f, 1.0f ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); SHADER_USE( colour_shader ); - glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uPvm" ), 1, GL_FALSE, (float *)m_pv ); + glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uPv" ), 1, GL_FALSE, (float *)m_pv ); glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.5f, 0.5f, 0.5f, 1.0f ); + glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uMdl" ), 1, GL_FALSE, (float *)m_mdl ); + glBindVertexArray( tile_vao ); glDrawArrays( GL_TRIANGLES, 0, 6 ); } -- 2.25.1