tile selection
authorhgn <hgodden00@gmail.com>
Sun, 18 Jul 2021 20:41:03 +0000 (21:41 +0100)
committerhgn <hgodden00@gmail.com>
Sun, 18 Jul 2021 20:41:03 +0000 (21:41 +0100)
fishladder.c

index 7f49563a4e819977c5524caf71acde04f267e5e5..20bb05111561a98602c2b2e4426ebd40140dea8f 100644 (file)
@@ -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 );
 }