+
+ /* variable res target */
+ render_fb_bind( gpipeline.fb_main, 1 );
+ glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
+ glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT );
+
+ render_scene();
+ glEnable( GL_DEPTH_TEST );
+
+ /* full res target */
+ glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+ glViewport( 0,0, vg.window_x, vg.window_y );
+
+ render_player_transparent(); /* needs to read the depth buffer before we fuck
+ it up with the oblique rendering inside the
+ portals */
+
+ /* continue with variable rate */
+ render_scene_gate_subview();
+
+ /* composite */
+ present_view_with_post_processing();
+
+ /* --------------------------------------------------------------------- */
+
+ /* capture the current resume frame at the very last point */
+ if( button_down( k_srbind_reset ) ){
+ if( skaterift.activity == k_skaterift_default ){
+ skaterift.activity = k_skaterift_replay;
+ skaterift_record_frame( &skaterift.replay, 1 );
+ if( skaterift.replay.head ){
+ skaterift.replay.cursor = skaterift.replay.head->time;
+ skaterift.replay.cursor_frame = skaterift.replay.head;
+ }
+ skaterift.replay_control = k_replay_control_scrub;
+ }
+ }
+}
+
+static void vg_render(void){
+ if( skaterift.op == k_async_op_clientloading ){
+ _vg_loader_render();
+ return;
+ }
+
+ glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+
+ glViewport( 0,0, vg.window_x, vg.window_y );
+ glDisable( GL_DEPTH_TEST );
+ glDisable( GL_BLEND );
+
+ glClearColor( 1.0f, 0.0f, 0.0f, 0.0f );
+ glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
+
+ render_main_game();
+ m4x4_copy( skaterift.cam.mtx.pv, vg.pv );
+
+ /* Other shite */
+ glDisable(GL_BLEND);
+ glDisable(GL_DEPTH_TEST);
+ vg_lines_drawall();
+ glViewport( 0,0, vg.window_x, vg.window_y );
+ gui_draw();
+}
+
+static void vg_gui(void){
+ if( skaterift.op == k_async_op_clientloading ) return;
+
+ menu_update();
+ if( skaterift.activity == k_skaterift_menu ){
+ glClear( GL_DEPTH_BUFFER_BIT );
+ menu_render();