+static void render_main_game(void){
+ if( skaterift.activity == k_skaterift_replay ){
+ player__animate_from_replay( &skaterift.replay );
+ }
+ else{
+ player__animate();
+ skaterift_record_frame( &skaterift.replay, 0 );
+ }
+ animate_remote_players();
+ player__pre_render();
+
+ skaterift_composite_maincamera();
+
+ /* --------------------------------------------------------------------- */
+ if( skaterift.activity != k_skaterift_respawning )
+ render_world_cubemaps( world_current_instance() );
+
+ /* 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 */
+ if( !global_miniworld.transition &&
+ (skaterift.activity != k_skaterift_respawning) ){
+ render_fb_bind( gpipeline.fb_main, 1 );
+ render_world_gates( world_current_instance(), &skaterift.cam );
+ }
+
+ /* composite */
+ present_view_with_post_processing();
+
+ skaterift_replay_post_render();
+}
+
+static void vg_render(void){
+ if( k_tools_mode ){
+ glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+ glViewport( 0,0, vg.window_x, vg.window_y );
+ glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
+ glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
+ return;
+ }
+
+ 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 );