+ int tile_x = floorf( tile_pos[0] );
+ int tile_y = floorf( tile_pos[1] );
+
+ if( tile_x >= 0 && tile_x < world.w && tile_y >= 0 && tile_y <= world.h )
+ world.selected = tile_y * world.h + tile_x;
+ else
+ world.selected = -1;
+}
+
+void vg_render(void)
+{
+ glViewport( 0,0, vg_window_x, vg_window_y );
+
+ glDisable( GL_DEPTH_TEST );
+ glClearColor( 0.01f, 0.01f, 0.01f, 1.0f );
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glBindVertexArray( world.tile_vao );
+ SHADER_USE( shader_tile_colour );
+ glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_colour, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
+
+ for( int y = 0; y < world.h; y ++ )
+ {
+ for( int x = 0; x < world.w; x ++ )
+ {
+ glUniform2f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), (float)x, (float)y );
+
+ v4f colour;
+
+ struct cell *cell = &world.data[y*world.h+x];
+
+ if( cell->state & FLAG_WALL ) { v4_copy( (v4f){ 0.4f, 0.4f, 0.4f, 1.0f }, colour ); }
+ else if( cell->state & FLAG_CANAL ) { v4_copy( (v4f){ 0.6f, 0.6f, 0.6f, 1.0f }, colour ); }
+ else if( cell->state & FLAG_INPUT ) { v4_copy( (v4f){ 0.2f, 0.3f, 0.7f, 1.0f }, colour ); }
+ else if( cell->state & FLAG_OUTPUT ) { v4_copy( (v4f){ 0.2f, 0.7f, 0.3f, 1.0f }, colour ); }
+ else v4_copy( (v4f){ 1.0f, 0.0f, 0.0f, 1.0f }, colour );
+
+ if( world.selected == y*world.h + x )
+ v3_muls( colour, sinf( vg_time )*0.25f + 0.5f, colour );
+
+ glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, colour );
+
+ glDrawArrays( GL_TRIANGLES, 0, 6 );
+ }
+ }