+ for( int y = 0; y < map.y; y ++ )
+ {
+ for( int x = 0; x < map.x; x ++ )
+ {
+ glm_mat4_identity( m_mdl );
+ glm_translate( m_mdl,
+ (vec3){
+ map.origin[0] + (float)x + 0.5f,
+ 0.f,
+ map.origin[2] + (float)y + 0.5f
+ }
+ );
+ glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uMdl" ), 1, GL_FALSE, (float *)m_mdl );
+
+ struct cell *cell = &map.cells[ y*map.x+x ];
+
+ if( map.selected != cell )
+ {
+ if( cell->flags & CELL_FLAG_INPUT )
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.9f, 0.5f, 0.5f, 1.0f );
+ else if( cell->flags & CELL_FLAG_OUTPUT )
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.5f, 0.9f, 0.5f, 1.0f );
+ else if( cell->flags & CELL_FLAG_WALL )
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.1f, 0.1f, 0.1f, 1.0f );
+ else
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.7f, 0.7f, 0.7f, 1.0f );
+ }
+ else
+ {
+ float flash = sinf( vg_time*2.5f ) * 0.25f + 0.75f;
+ glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), flash,flash,flash, 1.0f );
+ }
+
+ glDrawArrays( GL_TRIANGLES, 0, 6 );
+ }
+ }
+}
+
+void vg_start(void)
+{
+ SHADER_INIT( colour_shader );
+
+ glGenVertexArrays( 1, &tile_vao );
+ glGenBuffers( 1, &tile_vbo );
+
+ float quad_mesh[] =
+ {
+ -0.5f, 0.f, -0.5f,
+ -0.5f, 0.f, 0.5f,
+ 0.5f, 0.f, 0.5f,
+ -0.5f, 0.f, -0.5f,
+ 0.5f, 0.f, 0.5f,
+ 0.5f, 0.f, -0.5f
+ };
+
+ glBindVertexArray( tile_vao );
+ glBindBuffer( GL_ARRAY_BUFFER, tile_vbo );
+ glBufferData
+ (
+ GL_ARRAY_BUFFER,
+ sizeof( quad_mesh ),
+ quad_mesh,
+ GL_STATIC_DRAW
+ );
+
+ glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0 );
+ glEnableVertexAttribArray( 0 );
+
+ VG_CHECK_GL();
+
+ map_load
+ (
+ "#####-#####;aa\n"
+ "# #;\n"
+ "# #;\n"
+ "# -;bb\n"
+ "# #;\n"
+ "# #;\n"
+ "#####+#####;abab\n"
+ );