+ scaled_time = (vg_time-world.sim_start)*2.0f;
+ frame_lerp = scaled_time - (float)world.sim_frame;
+ }
+
+ v4f const colour_default = {1.0f, 1.0f, 1.0f, 1.0f};
+ v4f const colour_selected = {0.90f, 0.92f, 1.0f, 1.0f};
+
+ v2f const curve_3[] = {{0.5f,1.0f},{0.5f,0.625f},{0.625f,0.5f},{1.0f,0.5f}};
+ v2f const curve_6[] = {{0.5f,1.0f},{0.5f,0.625f},{0.375f,0.5f},{0.0f,0.5f}};
+ v2f const curve_9[] = {{1.0f,0.5f},{0.625f,0.5f},{0.5f,0.375f},{0.5f,0.0f}};
+ v2f const curve_12[]= {{0.0f,0.5f},{0.375f,0.5f},{0.5f,0.375f},{0.5f,0.0f}};
+
+ v2f const curve_7[] = {{0.5f,0.8438f},{0.875f,0.8438f},{0.625f,0.5f},{1.0f,0.5f}};
+ v2f const curve_7_1[] = {{0.5f,0.8438f},{1.0f-0.875f,0.8438f},{1.0-0.625f,0.5f},{0.0f,0.5f}};
+
+ float const curve_7_linear_section = 0.1562f;
+
+ // TILE SET RENDERING
+ // todo: just slam everything into a mesh...
+ // when user modifies a tile the neighbours can be easily uploaded to gpu mem
+ // in ~3 subBuffers
+ // Currently we're uploading a fair amount of data every frame anyway.
+ // NOTE: this is for final optimisations ONLY!
+ // ======================================================================
+
+ use_mesh( &world.tile );
+
+ SHADER_USE( shader_tile_main );
+
+ m2x2f subtransform;
+ m2x2_identity( subtransform );
+ glUniformMatrix2fv( SHADER_UNIFORM( shader_tile_main, "uSubTransform" ), 1, GL_FALSE, (float *)subtransform );
+ glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_main, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
+ glUniform1f( SHADER_UNIFORM( shader_tile_main, "uGhost" ), 0.0f );
+
+ // Bind textures
+ vg_tex2d_bind( &tex_tile_data, 0 );
+ glUniform1i( SHADER_UNIFORM( shader_tile_main, "uTexGlyphs" ), 0 );
+
+ vg_tex2d_bind( &tex_wood, 1 );
+ glUniform1i( SHADER_UNIFORM( shader_tile_main, "uTexWood" ), 1 );
+
+ render_tiles( NULL, NULL, colour_default, colour_default );
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBlendEquation(GL_FUNC_ADD);
+
+ SHADER_USE( shader_ball );
+ glUniformMatrix3fv( SHADER_UNIFORM( shader_ball, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
+
+ vg_tex2d_bind( &tex_ball, 0 );
+ glUniform1i( SHADER_UNIFORM( shader_ball, "uTexMain" ), 0 );
+
+ // Draw 'fish'
+ if( world.simulating )
+ {
+ for( int i = 0; i < world.num_fishes; i ++ )