// 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;"
"}",
" 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[] )
{
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;
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 );
}