small updates and api changes
[carveJwlIkooP6JGAAIwe30JlM.git] / skaterift.c
index c2fc2664d0263c16d33f66e4c40d9452da4f2652..983ca9ba99c5fddc1b7d112fa7d36b5053ecf259 100644 (file)
@@ -50,6 +50,7 @@
 #include "addon.c"
 #include "highscores.c"
 #include "save.c"
+#include "respawn.c"
 
 static struct player_avatar localplayer_avatar;
 
@@ -297,8 +298,10 @@ VG_STATIC void vg_pre_update(void){
 
    /* time rate */
    f32 target = 1;
-   if( skaterift.activity & (k_skaterift_replay|k_skaterift_menu) ) 
+   if( skaterift.activity & (k_skaterift_replay|k_skaterift_menu|
+                             k_skaterift_respawning) ) {
       target = 0;
+   }
 
    vg_slewf( &skaterift.time_rate, target, vg.time_frame_delta * (1.0f/0.3f) );
    vg.time_rate = vg_smoothstepf( skaterift.time_rate );
@@ -309,6 +312,7 @@ VG_STATIC void vg_pre_update(void){
 
    world_update( world_current_instance(), localplayer.rb.co );
    audio_ambient_sprites_update( world_current_instance(), localplayer.rb.co );
+   respawn_chooser_pre_update();
 }
 
 VG_STATIC void vg_fixed_update(void){
@@ -456,17 +460,28 @@ VG_STATIC void render_scene(void){
       }
    }
 
-   render_world( view_world, &skaterift.cam, 0 );
-
-   render_water_texture( view_world, &skaterift.cam, 0 );
-   render_fb_bind( gpipeline.fb_main, 1 );
-   render_water_surface( view_world, &skaterift.cam );
+   if( skaterift.activity == k_skaterift_respawning ){
+      glDrawBuffers( 1, (GLenum[]){ GL_COLOR_ATTACHMENT0 } );
+      glClearColor( 0.624f, 0.659f, 0.769f, 0.0f );
+      glClear( GL_COLOR_BUFFER_BIT );
+      glDrawBuffers( 2, (GLenum[]){ GL_COLOR_ATTACHMENT0, 
+                                    GL_COLOR_ATTACHMENT1 } );
+      view_world = &world_static.instances[respawn_chooser.world_id];
+      render_world_override( view_world );
+   }
+   else{
+      render_world( view_world, &skaterift.cam, 0 );
+      render_water_texture( view_world, &skaterift.cam, 0 );
+      render_fb_bind( gpipeline.fb_main, 1 );
+      render_water_surface( view_world, &skaterift.cam );
+   }
 }
 
 VG_STATIC void render_scene_gate_subview(void){
    render_fb_bind( gpipeline.fb_main, 1 );
    world_instance *view_world = localplayer.viewable_world;
    if( !view_world ) return; /* ??? */
+   if( skaterift.activity == k_skaterift_respawning ) return;
 
    int depth = 1;
    if( localplayer.gate_waiting ) depth = 0;
@@ -484,15 +499,23 @@ VG_STATIC void skaterift_composite_maincamera(void){
    skaterift.cam.nearz = 0.1f;
    skaterift.cam.farz  = 2100.0f;
 
+   if( skaterift.activity == k_skaterift_respawning ){
+      camera_copy( &respawn_chooser.cam, &skaterift.cam );
+      skaterift.cam.nearz = 4.0f;
+      skaterift.cam.farz  = 3100.0f;
+   }
+
    camera_update_transform( &skaterift.cam );
 
-   if( localplayer.gate_waiting ){
-      m3x3_mul( localplayer.basis_gate, skaterift.cam.transform, 
-                skaterift.cam.transform );
-   }
-   else{
-      m3x3_mul( localplayer.basis, skaterift.cam.transform, 
-                skaterift.cam.transform );
+   if( skaterift.activity != k_skaterift_respawning ){
+      if( localplayer.gate_waiting ){
+         m3x3_mul( localplayer.basis_gate, skaterift.cam.transform, 
+                   skaterift.cam.transform );
+      }
+      else{
+         m3x3_mul( localplayer.basis, skaterift.cam.transform, 
+                   skaterift.cam.transform );
+      }
    }
    
    camera_update_view( &skaterift.cam );