review activity switching
authorhgn <hgodden00@gmail.com>
Sat, 8 Jul 2023 23:59:30 +0000 (00:59 +0100)
committerhgn <hgodden00@gmail.com>
Sat, 8 Jul 2023 23:59:30 +0000 (00:59 +0100)
16 files changed:
camera.h
ent_skateshop.c
ent_skateshop.h
input.h
menu.h
player.c
player.h
player_common.c
player_render.c
player_replay.c
skaterift.c
skaterift.h
vehicle.c
workshop.c
world_gate.c
world_gate.h

index 314eafe08b65e532239c66c30ae1a6313ef93818..7d720f7ca0f18214cb2735af044dbb72cd7f323b 100644 (file)
--- a/camera.h
+++ b/camera.h
@@ -4,9 +4,7 @@
 #include "skaterift.h"
 
 typedef struct camera camera;
-
-struct camera
-{
+struct camera{
    /* Input */
    v3f angles;
    v3f pos;
@@ -23,8 +21,7 @@ struct camera
    }
    mtx,
    mtx_prev;
-}
-static main_camera, gate_camera;
+};
 
 VG_STATIC void camera_lerp_angles( v3f a, v3f b, float t, v3f d )
 {
index 4c55bb939477117aac5c1cb36ae900aa50830ed9..7cb0e9aa1e414ac369c7f951e5f0aaeb2430895a 100644 (file)
@@ -163,14 +163,18 @@ VG_STATIC void skateshop_load_world_preview( addon_reg *reg ){
  * VG event preupdate 
  */
 void temp_update_playermodel(void);
-VG_STATIC void global_skateshop_preupdate(void)
-{
+VG_STATIC void global_skateshop_preupdate(void){
    float rate = vg_minf( 1.0f, vg.time_frame_delta * 2.0f );
-   global_skateshop.factive = vg_lerpf( global_skateshop.factive, 
-                                        global_skateshop.active, rate );
+   int active = 0;
+   if( skaterift.activity == k_skaterift_skateshop )
+      active = 1;
+
+   vg_slewf( &global_skateshop.factive, active, 
+             vg.time_frame_delta * (1.0f/0.5f) );
 
-   if( !global_skateshop.active ) return;
+   if( !active ) return;
 
+   /* input filter */
    world_instance *world = world_current_instance();
    ent_skateshop *shop = global_skateshop.ptr_ent;
 
@@ -181,30 +185,25 @@ VG_STATIC void global_skateshop_preupdate(void)
    v3f dir = {0.0f,-1.0f,0.0f};
    mdl_transform_vector( &ref->transform, dir, dir );
    m3x3_mulv( localplayer.invbasis, dir, dir );
-   player_vector_angles( localplayer.cam_override_angles, dir, 1.0f, 0.0f );
+   player_vector_angles( global_skateshop.cam.angles, dir, 1.0f, 0.0f );
 
    v3f lookat;
    if( shop->type == k_skateshop_type_boardshop ||
        shop->type == k_skateshop_type_worldshop ){
       ent_marker *display = mdl_arritm( &world->ent_marker,
                                     mdl_entity_id_id(shop->boards.id_display) );
-      
       v3_sub( display->transform.co, localplayer.rb.co, lookat );
-      
    }
-   else if( shop->type == k_skateshop_type_charshop ){
+   else if( shop->type == k_skateshop_type_charshop )
       v3_sub( ref->transform.co, localplayer.rb.co, lookat );
-   }
-   else{
+   else
       vg_fatal_error( "Unknown store (%u)\n", shop->type );
-   }
 
    q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f}, 
                  atan2f(lookat[0],lookat[2]) );
 
-   v3_copy( ref->transform.co, localplayer.cam_override_pos );
-   localplayer.cam_override_fov = ref->fov;
-   localplayer.cam_override_strength = global_skateshop.factive;
+   v3_copy( ref->transform.co, global_skateshop.cam.pos );
+   global_skateshop.cam.fov = ref->fov;
 
    /* input */
    if( shop->type == k_skateshop_type_boardshop ){
@@ -385,8 +384,7 @@ VG_STATIC void global_skateshop_preupdate(void)
    }
 }
 
-VG_STATIC void skateshop_render_boardshop(void)
-{
+VG_STATIC void skateshop_render_boardshop(void){
    world_instance *world = world_current_instance();
    ent_skateshop *shop = global_skateshop.ptr_ent;
 
@@ -435,7 +433,7 @@ VG_STATIC void skateshop_render_boardshop(void)
       struct board_pose pose = {0};
       m4x3f mmdl;
       mdl_transform_m4x3( &xform, mmdl );
-      render_board( &main_camera, world, board, mmdl, 
+      render_board( &skaterift.cam, world, board, mmdl, 
                     &pose, k_board_shader_entity );
 
 fade_out:;
@@ -460,7 +458,7 @@ fade_out:;
    float scale = 0.2f,
          thickness = 0.03f;
 
-   font3d_bind( &gui.font, &main_camera );
+   font3d_bind( &gui.font, &skaterift.cam );
    shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} );
 
    /* Selection counter
@@ -481,11 +479,11 @@ fade_out:;
       i+=highscore_intl( buf+i, addon_count(k_addon_type_board), 3 );
       buf[i++] = '\0';
 
-      font3d_simple_draw( &gui.font, 0, buf, &main_camera, mmdl );
+      font3d_simple_draw( &gui.font, 0, buf, &skaterift.cam, mmdl );
    }
    else{
       font3d_simple_draw( &gui.font, 0, 
-                          "Nothing installed", &main_camera, mmdl );
+                          "Nothing installed", &skaterift.cam, mmdl );
    }
 
    u16 cache_id = skateshop_selected_cache_id();
@@ -532,7 +530,7 @@ fade_out:;
    mlocal[3][2] = 0.0f;
    m4x3_mul( mtext, mlocal, mmdl );
    font3d_simple_draw( &gui.font, 0, global_skateshop.render.item_title, 
-                       &main_camera, mmdl );
+                       &skaterift.cam, mmdl );
 
    /* Author name
     * ----------------------------------------------------------------- */
@@ -545,7 +543,7 @@ fade_out:;
    mlocal[3][2] = 0.0f;
    m4x3_mul( mtext, mlocal, mmdl );
    font3d_simple_draw( &gui.font, 0, global_skateshop.render.item_desc, 
-                       &main_camera, mmdl );
+                       &skaterift.cam, mmdl );
 
    SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
 }
@@ -622,7 +620,7 @@ VG_STATIC void skateshop_render_worldshop(void)
    m4x3f mtext,mlocal,mtextmdl;
    mdl_transform_m4x3( &mark_info->transform, mtext );
 
-   font3d_bind( &gui.font, &main_camera );
+   font3d_bind( &gui.font, &skaterift.cam );
    shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} );
 
    float scale = 0.2f, thickness = 0.015f, scale1 = 0.08f;
@@ -633,14 +631,14 @@ VG_STATIC void skateshop_render_worldshop(void)
    mlocal[3][1] = 0.1f;
    mlocal[3][2] = 0.0f;
    m4x3_mul( mtext, mlocal, mtextmdl );
-   font3d_simple_draw( &gui.font, 0, buftext, &main_camera, mtextmdl );
+   font3d_simple_draw( &gui.font, 0, buftext, &skaterift.cam, mtextmdl );
 
    m3x3_setdiagonalv3( mlocal, (v3f){ scale1, scale1, thickness } );
    mlocal[3][0] = -font3d_string_width( &gui.font, 0, bufsubtext );
    mlocal[3][0] *= scale1*0.5f;
    mlocal[3][1] = -scale1*0.3f;
    m4x3_mul( mtext, mlocal, mtextmdl );
-   font3d_simple_draw( &gui.font, 0, bufsubtext, &main_camera, mtextmdl );
+   font3d_simple_draw( &gui.font, 0, bufsubtext, &skaterift.cam, mtextmdl );
 
    /* pointcloud */
    m4x3f mmdl;
@@ -650,7 +648,7 @@ VG_STATIC void skateshop_render_worldshop(void)
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE);
    glDisable(GL_DEPTH_TEST);
-   pointcloud_render( world, &main_camera, mmdl );
+   pointcloud_render( world, &skaterift.cam, mmdl );
    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);
 }
@@ -658,9 +656,8 @@ VG_STATIC void skateshop_render_worldshop(void)
 /*
  * World: render event
  */
-VG_STATIC void skateshop_render(void)
-{
-   if( !global_skateshop.active ) return;
+VG_STATIC void skateshop_render(void){
+   if( skaterift.activity != k_skaterift_skateshop ) return;
       
    ent_skateshop *shop = global_skateshop.ptr_ent;
 
@@ -687,19 +684,17 @@ VG_STATIC void ent_skateshop_call( world_instance *world, ent_call *call )
    ent_skateshop *shop = mdl_arritm( &world->ent_skateshop, index );
    vg_info( "skateshop_call\n" );
 
-   if( menu.active ) return;
+   if( skaterift.activity != k_skaterift_default ) return;
    if( !vg_loader_availible() ) return;
 
    if( call->function == k_ent_function_trigger ){
-      if( localplayer.subsystem != k_player_subsystem_walk ){
-         return;
-      }
+      if( localplayer.subsystem != k_player_subsystem_walk ) return;
       
       vg_info( "Entering skateshop\n" );
 
       localplayer.immobile = 1;
       menu.disable_open = 1;
-      global_skateshop.active = 1;
+      skaterift.activity = k_skaterift_skateshop;
 
       v3_zero( localplayer.rb.v );
       v3_zero( localplayer.rb.w );
@@ -723,13 +718,12 @@ VG_STATIC void ent_skateshop_call( world_instance *world, ent_call *call )
 /*
  * Entity logic: exit event
  */
-VG_STATIC void global_skateshop_exit(void)
-{
+VG_STATIC void global_skateshop_exit(void){
    vg_info( "exit skateshop\n" );
    localplayer.immobile = 0;
-   global_skateshop.active = 0;
+   skaterift.activity = k_skaterift_default;
    menu.disable_open = 0;
-   srinput.ignore_input_frames = 2;
+   srinput.enabled = 0;
 }
 
 #endif /* ENT_SKATESHOP_C */
index 9f76251246f31620a1ce2139f4795edf065ac272..1d0699a58b97edef1e690e5580e3633732646abf 100644 (file)
@@ -13,8 +13,6 @@
 struct{
    v3f look_target;
    ent_skateshop *ptr_ent;
-
-   int active;
    float factive;
 
    struct shop_view_slot{
@@ -36,6 +34,8 @@ struct{
       u32 world_reg;
    }
    render;
+
+   camera cam;
 }
 static global_skateshop={.render={.reg_id=0xffffffff,.world_reg=0xffffffff}};
 
diff --git a/input.h b/input.h
index b4262bc0f0ef9a08e460e7338d8266a330c8a30e..fe387ccdd47a4d0d59bf903a7a07170ef0b41bb6 100644 (file)
--- a/input.h
+++ b/input.h
@@ -46,7 +46,7 @@ struct {
    float axis_states[ k_sraxis_max ][2];
    v2f joystick_states[ k_srjoystick_max ][2];
    u8 button_states[ k_srbind_max ][2];
-   u32 ignore_input_frames;
+   u32 enabled;
 }
 static srinput;
 
@@ -182,7 +182,7 @@ static const char *joystick_display_string( enum sr_joystick joystick,
 
 static int buttons_filter_fixed(void)
 {
-   if( srinput.ignore_input_frames ) return 1;
+   if( !srinput.enabled ) return 1;
    if( vg_ui.wants_mouse ) return 1;
 
    if( vg.engine_stage == k_engine_stage_update_fixed )
@@ -244,9 +244,6 @@ static void setbtn( enum sr_bind button, u8 value )
 
 static void skaterift_preupdate_inputs(void)
 {
-   if( srinput.ignore_input_frames )
-      srinput.ignore_input_frames --;
-
    for( u32 i=0; i<k_srbind_max; i++ ){
       srinput.button_states[i][1] = srinput.button_states[i][0];
       srinput.button_states[i][0] = 0;
diff --git a/menu.h b/menu.h
index 9f62242cc42de8589ea94d679bcca2260de0a7f3..d51fde599a9f427c74baa8bd4fbabf89d6e66994 100644 (file)
--- a/menu.h
+++ b/menu.h
@@ -13,7 +13,7 @@
 #define MENU_STACK_SIZE 8
 
 struct {
-   int active, credits_open;
+   int credits_open;
    int disable_open;
 
    u32 page, /* current page index */
@@ -95,8 +95,14 @@ static void menu_link(void)
    }
 }
 
-static void menu_init(void)
-{
+static void menu_close(void){
+   skaterift.activity = k_skaterift_default;
+   menu.page_depth = 0;
+   menu.page = 0xffffffff;
+   srinput.enabled = 0;
+}
+
+static void menu_init(void){
    void *alloc = vg_mem.rtmemory;
 
    mdl_open( &menu.model, "models/rs_menu.mdl", alloc );
@@ -134,8 +140,7 @@ static void menu_back_page(void)
    vg_info( "menu_back_page()\n" );
    menu.page_depth --;
    if( menu.page_depth == 0 ){
-      menu.active = 0;
-      menu.page = 0xffffffff;
+      menu_close();
    }
    else{
       menu.page = menu.page_stack[ menu.page_depth ].page;
@@ -207,20 +212,14 @@ static void menu_trigger_item( ent_menuitem *item )
       }
       else if( MDL_CONST_PSTREQ( &menu.model, q, "reset_nearest" ) ){
          localplayer_cmd_respawn( 0, NULL );
-         
-         menu.page_depth = 0;
-         menu.active = 0;
-         menu.page = 0xffffffff;
+         menu_close();
       }
       else if( MDL_CONST_PSTREQ( &menu.model, q, "reset_home" ) ){
          world_static.active_world = 0;
          world_static.active_trigger_volume_count = 0;
          localplayer.viewable_world = world_current_instance();
          localplayer_cmd_respawn( 1, (const char *[]){"start"} );
-
-         menu.page_depth = 0;
-         menu.active = 0;
-         menu.page = 0xffffffff;
+         menu_close();
       }
       else if( MDL_CONST_PSTREQ( &menu.model, q, "credits" ) ){
          menu.credits_open = 1;
@@ -259,8 +258,7 @@ static f32 menu_slider_snap( f32 value, f32 old, f32 notch )
 /* 
  * Run from vg_gui every frame
  */
-static void menu_update(void)
-{
+static void menu_update(void){
    if( workshop_form.page != k_workshop_form_hidden ){
       return;
    }
@@ -274,16 +272,15 @@ static void menu_update(void)
    }
 
    if( button_down( k_srbind_mopen ) ){
-      if( !menu.active && !menu.disable_open ){
-         menu.active = 1;
+      if( skaterift.activity == k_skaterift_default ){
+         skaterift.activity = k_skaterift_menu;
          menu.page = 0xffffffff;
          menu_open_page( "Main Menu" );
          return;
       }
    }
 
-   if( !menu.active ) return;
-
+   if( skaterift.activity != k_skaterift_menu ) return;
    enum menu_input_mode prev_mode = menu.input_mode;
 
    /* get buttons inputs
@@ -511,8 +508,7 @@ static void menu_update(void)
 /*
  * Run from vg_gui when active
  */
-VG_STATIC void menu_render(void)
-{
+VG_STATIC void menu_render(void){
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
index cb2a174ea4531005224ea4c33044e47324a9957d..4746e4fb4c774e0777cc46cc7911dd98f20d2fee 100644 (file)
--- a/player.c
+++ b/player.c
@@ -175,7 +175,7 @@ void player__pass_gate( player_instance *player, ent_gate *gate )
 
 VG_STATIC void player_apply_transport_to_cam( m4x3f transport )
 {
-   /* FIXME: Applies to main_camera directly! */
+   /* FIXME: Applies to skaterift.cam directly! */
 
    /* Pre-emptively edit the camera matrices so that the motion vectors 
     * are correct */
@@ -183,13 +183,13 @@ VG_STATIC void player_apply_transport_to_cam( m4x3f transport )
    m4x4f transport_4;
    m4x3_invert_affine( transport, transport_i );
    m4x3_expand( transport_i, transport_4 );
-   m4x4_mul( main_camera.mtx.pv, transport_4, main_camera.mtx.pv );
-   m4x4_mul( main_camera.mtx.v,  transport_4, main_camera.mtx.v );
+   m4x4_mul( skaterift.cam.mtx.pv, transport_4, skaterift.cam.mtx.pv );
+   m4x4_mul( skaterift.cam.mtx.v,  transport_4, skaterift.cam.mtx.v );
 
    /* we want the regular transform here no the inversion */
    m4x3_expand( transport, transport_4 );
-   m4x4_mul( gate_camera.mtx.pv, transport_4, gate_camera.mtx.pv );
-   m4x4_mul( gate_camera.mtx.v,  transport_4, gate_camera.mtx.v );
+   m4x4_mul( world_gates.cam.mtx.pv, transport_4, world_gates.cam.mtx.pv );
+   m4x4_mul( world_gates.cam.mtx.v,  transport_4, world_gates.cam.mtx.v );
 }
 
 __attribute__ ((deprecated))
@@ -224,6 +224,16 @@ PLAYER_API void player__im_gui( player_instance *player ){
    g_player_debugger[2] = 300;
    g_player_debugger[3] = 16;
 
+   player__debugtext( 2, "director" );
+   player__debugtext( 1, "activity: %s", 
+                     (const char *[]){ [k_skaterift_menu]      = "menu",
+                                       [k_skaterift_replay]    = "replay",
+                                       [k_skaterift_skateshop] = "shop",
+                                       [k_skaterift_default]   = "default" 
+                     } [skaterift.activity] );
+   player__debugtext( 1, "time_rate: %.4f", skaterift.time_rate );
+
+   player__debugtext( 2, "player_instance[%p]", player );
    player__debugtext( 1, "angles: " PRINTF_v3f( player->cam.angles ) );
    player__debugtext( 1, "basis:  " PRINTF_v4f( player->qbasis ) );
 
index ecf595d42c51a731daecfef6b4e99bdbaf43fd5c..6315e1a219c9dadb4b53cae73bdb73bb293585dd 100644 (file)
--- a/player.h
+++ b/player.h
@@ -61,11 +61,6 @@ struct player_instance{
     */
    camera cam;
    struct player_cam_controller cam_control;
-
-   v3f cam_override_pos;
-   v3f cam_override_angles;
-   float cam_override_fov;
-   float cam_override_strength;
    f32 cam_trackshake;
 
    float cam_velocity_influence,
@@ -96,12 +91,6 @@ struct player_instance{
 
    struct board_pose      board_pose;
 
-   /* 
-    * Replay
-    * -------------------------------------------------
-    */
-   replay_buffer replay;
-
    /*
     * Subsystems
     * -------------------------------------------------
index 2ebec6c07c34c857abd3321044048c0710110ff6..8314048fa3ec953cd79d72ffcb260ebc0132807e 100644 (file)
@@ -232,19 +232,6 @@ VG_STATIC void player__cam_iterate( player_instance *player ){
                player->cam_land_punch_v );
    v3_add( player->cam_land_punch, player->cam.pos, player->cam.pos );
 
-   /* override camera */
-   player->cam.angles[0] = 
-      vg_alerpf(  player->cam.angles[0], player->cam_override_angles[0], 
-                  player->cam_override_strength );
-   player->cam.angles[1] = 
-      vg_lerpf ( player->cam.angles[1], player->cam_override_angles[1], 
-                 player->cam_override_strength );
-   v3_lerp( player->cam.pos, player->cam_override_pos, 
-            player->cam_override_strength, player->cam.pos );
-   player->cam.fov = vg_lerpf( player->cam.fov, player->cam_override_fov, 
-                               player->cam_override_strength );
-
-
    if( k_cinema >= 0.0001f ){
       ent_camera *cam = NULL;
       f32 min_dist = k_cinema;
index 49a67c1ce2244eebe5e583888025900478c3fe36..3fe93369c09226e7eb2fde5344af36b4edd4f977 100644 (file)
@@ -175,20 +175,16 @@ VG_STATIC void player_animate( player_instance *player ){
       _player_post_animate[ player->subsystem ]( player );
 }
 
-VG_STATIC void player_animate_from_replay( player_instance *player ){
+VG_STATIC void player_animate_from_replay( player_instance *player,
+                                           replay_buffer *replay ){
    /* TODO: frame blending */
-
    player_animation res;
-   replay_frame *frame = player->replay.cursor_frame;
+   replay_frame *frame = replay->cursor_frame;
 
    if( frame ){
       memcpy( &res, &frame->anim, sizeof(frame->anim) );
       memcpy( &frame->board_pose, &player->board_pose, 
               sizeof(player->board_pose) );
-      v3_copy( frame->cam_pos, player->cam_override_pos );
-      v3_copy( frame->cam_angles, player->cam_override_angles );
-      player->cam_override_fov = frame->cam_fov;
-      player->cam_override_strength = 1.0f;
    }
    else return;
 
@@ -196,10 +192,9 @@ VG_STATIC void player_animate_from_replay( player_instance *player ){
    skeleton_apply_pose( sk, res.pose, k_anim_apply_absolute );
 }
 
-VG_STATIC void player_record_replay( player_instance *player, int force ){
-   /* replay recorder */
-   replay_buffer *replay = &player->replay;
-
+VG_STATIC 
+void player_record_replay_frame( player_instance *player, 
+                                 replay_buffer *replay, int force_gamestate ){
    f64 delta      = 9999999.9,
        statedelta = 9999999.9;
 
@@ -213,7 +208,7 @@ VG_STATIC void player_record_replay( player_instance *player, int force ){
              k_gamestate_rate = 0.5;
 
    u16 gamestates = 0;
-   if( statedelta > k_gamestate_rate || force /* or switching */ ){
+   if( statedelta > k_gamestate_rate || force_gamestate /* or switching */ ){
       gamestates = 1;
    }
    
@@ -259,27 +254,7 @@ VG_STATIC void player_record_replay( player_instance *player, int force ){
 }
 
 VG_STATIC void player__pre_render( player_instance *player ){
-   if( player->replay.control == k_replay_control_none ){
-      player->cam_override_strength = 0.0f;
-      player_animate( player );
-
-      if( button_down( k_srbind_reset ) && !player->immobile ){
-         audio_lock();
-         audio_oneshot( &audio_rewind[4], 1.0f, 0.0f );
-         audio_unlock();
-
-         player_record_replay( player, 1 );
-         player->replay.control = k_replay_control_scrub;
-      }
-      else
-         player_record_replay( player, 0 );
-   }
-   else {
-      player->cam_override_strength = 1.0f-skaterift.time_rate;
-      player_replay_control_update( player );
-      player_animate_from_replay( player );
-   }
-
+   player_animate( player );
    player__cam_iterate( player );
 
    /* shadowing/ao info */
@@ -324,7 +299,7 @@ VG_STATIC void render_board( camera *cam, world_instance *world,
 
       render_fb_inverse_ratio( gpipeline.fb_main, inverse );
 
-      inverse[2] = main_camera.farz-main_camera.nearz;
+      inverse[2] = skaterift.cam.farz-skaterift.cam.nearz;
 
       shader_model_board_view_uInverseRatioDepth( inverse );
       render_fb_inverse_ratio( NULL, inverse );
@@ -449,7 +424,7 @@ VG_STATIC void render_playermodel( camera *cam, world_instance *world,
    render_fb_bind_texture( gpipeline.fb_main, 2, 1 );
    v3f inverse;
    render_fb_inverse_ratio( gpipeline.fb_main, inverse );
-   inverse[2] = main_camera.farz-main_camera.nearz;
+   inverse[2] = skaterift.cam.farz-skaterift.cam.nearz;
 
    shader_model_character_view_uInverseRatioDepth( inverse );
    render_fb_inverse_ratio( NULL, inverse );
index 5f57d9f0337da280e7c4deb6cdf8ba93d9a94a9d..38c21921aa387af1f9dfe04cde497ad0b8abd38b 100644 (file)
@@ -12,12 +12,6 @@ VG_STATIC void replay_clear( replay_buffer *replay ){
    replay->control = k_replay_control_none;
 }
 
-VG_STATIC void local_replay_init( u32 bytes ){
-   localplayer.replay.data = vg_linear_alloc( vg_mem.rtmemory, bytes );
-   localplayer.replay.size = bytes;
-   replay_clear( &localplayer.replay );
-}
-
 replay_gamestate *replay_frame_gamestate( replay_frame *frame, u16 index ){
    void *baseptr = frame;
    
@@ -162,6 +156,7 @@ VG_STATIC replay_frame *replay_find_recent_stateframe( replay_buffer *replay ){
 }
 
 VG_STATIC void player_replay_control_update( player_instance *player ){
+#if 0
    f64 speed = 1.0;
    f64 target = player->replay.cursor;
 
@@ -220,9 +215,11 @@ VG_STATIC void player_replay_control_update( player_instance *player ){
          return;
       }
    }
+#endif
 }
 
 VG_STATIC void replay_debug_info( player_instance *player ){
+#if 0
    player__debugtext( 2, "replay info" );
 
    replay_buffer *replay = &player->replay;
@@ -250,9 +247,11 @@ VG_STATIC void replay_debug_info( player_instance *player ){
        len = end - start;
 
    player__debugtext( 1, "cursor: %.2fs / %.2fs\n", cur, len );
+#endif
 }
 
 VG_STATIC void replay_imgui( player_instance *player ){
+#if 0
    if( player->replay.control == k_replay_control_none ) return;
 
    replay_buffer *replay = &player->replay;
@@ -310,6 +309,7 @@ VG_STATIC void replay_imgui( player_instance *player ){
    snprintf( buffer, 128, "-%.2fs\n", len );
    ui_text( bar, buffer, 1, k_ui_align_middle_left, 0 );
    ui_text( bar, "0s", 1, k_ui_align_middle_right, 0 );
+#endif
 }
 
 #endif /* PLAYER_REPLAY_C */
index 5d86c94e9dc0a6db201f2d5e3d7b241cce7de5a9..8df2f8a098ef0a6f93f67cda440154cd10483696 100644 (file)
 
 static struct player_avatar localplayer_avatar;
 
-int main( int argc, char *argv[] )
-{
+int main( int argc, char *argv[] ){
    vg_mem.use_libc_malloc = 0;
    vg_set_mem_quota( 160*1024*1024 );
    vg_enter( argc, argv, "Voyager Game Engine" ); 
    return 0;
 }
 
-VG_STATIC void vg_launch_opt(void)
-{
-}
+VG_STATIC void vg_launch_opt(void){}
 
-VG_STATIC void vg_preload(void)
-{
+VG_STATIC void vg_preload(void){
    skaterift_read_savedata();
 
 vg_info(" Copyright  .        . .       -----, ,----- ,---.   .---.  \n" );
@@ -79,8 +75,7 @@ vg_info("            '        ' '--' [] '----- '----- '     ' '---'  "
    vg_loader_step( network_init, network_end );
 }
 
-VG_STATIC void load_playermodels(void)
-{
+VG_STATIC void load_playermodels(void){
    /* FIXME: hack */
    shader_model_character_view_register();
    shader_model_board_view_register();
@@ -151,8 +146,7 @@ static void skaterift_restore_state(void){
    }
 }
 
-VG_STATIC void vg_load(void)
-{
+VG_STATIC void vg_load(void){
    vg_console_reg_cmd( "changeworld", skaterift_change_world_command, NULL );
 
    vg_loader_step( render_init, NULL );
@@ -175,7 +169,11 @@ VG_STATIC void vg_load(void)
    vg_loader_step( load_playermodels, NULL );
   
    /* player setup */
-   local_replay_init( (1024*1024*1)/2 );
+   u32 bytes = (1024*1024*1)/2;
+   skaterift.replay.data = vg_linear_alloc( vg_mem.rtmemory, bytes );
+   skaterift.replay.size = bytes;
+   replay_clear( &skaterift.replay );
+
    player__create( &localplayer );
    player_avatar_load( &localplayer_avatar, "models/ch_none.mdl" );
    player__use_avatar( &localplayer, &localplayer_avatar );
@@ -256,37 +254,51 @@ VG_STATIC void vg_load(void)
    vg_async_call( async_call_ready, NULL, 0 );
 }
 
-VG_STATIC void draw_origin_axis(void)
-{
+VG_STATIC void draw_origin_axis(void){
    vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 1.0f, 0.0f, 0.0f }, 0xffff0000 );
    vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 1.0f, 0.0f }, 0xff00ff00 );
    vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 0.0f, 1.0f }, 0xff0000ff );
 }
-
 static void skaterift_change_world_preupdate(void);
-VG_STATIC void vg_update(void)
-{
+
+/* 
+ * UPDATE LOOP
+ * ---------------------------------------------------------------------------*/
+
+VG_STATIC void vg_pre_update(void){
+   srinput.enabled = 1;
+
    steam_update();
    skaterift_preupdate_inputs();
    if( skaterift.op == k_async_op_clientloading ) return;
-
-   if( world_loader.state == k_world_loader_preload ){
+   if( world_loader.state == k_world_loader_preload )
       skaterift_change_world_preupdate();
-   }
 
    draw_origin_axis();
    network_update();
+
+   /* time rate */
+   f32 target = 1;
+   if( skaterift.activity & (k_skaterift_replay|k_skaterift_menu) ) 
+      target = 0;
+
+   vg_slewf( &skaterift.time_rate, target, vg.time_frame_delta * 6.0f );
+   vg.time_rate = vg_smoothstepf( skaterift.time_rate );
+
+   if( button_down( k_srbind_reset ) ){
+      if( skaterift.activity == k_skaterift_default ){
+         skaterift.activity = k_skaterift_replay;
+      }
+   }
    
    player__pre_update( &localplayer );
    global_skateshop_preupdate();
 
    world_update( world_current_instance(), localplayer.rb.co );
    audio_ambient_sprites_update( world_current_instance(), localplayer.rb.co );
-   //gui_helper_action( localplayer.input_use, "\x7f Hello \x1f""A \x1e\x84" );
 }
 
-VG_STATIC void vg_update_fixed(void)
-{
+VG_STATIC void vg_fixed_update(void){
    if( skaterift.op == k_async_op_clientloading ) return;
 
    world_routes_fixedupdate( world_current_instance() );
@@ -294,7 +306,7 @@ VG_STATIC void vg_update_fixed(void)
    vehicle_update_fixed();
 }
 
-VG_STATIC void vg_update_post(void){
+VG_STATIC void vg_post_update(void){
    if( skaterift.op == k_async_op_clientloading ) return;
 
    player__post_update( &localplayer );
@@ -307,9 +319,9 @@ VG_STATIC void vg_update_post(void){
    vg_dsp.echo_distances[sample_index] = dist;
 
    v3f ears = { 1.0f,0.0f,0.0f };
-   m3x3_mulv( main_camera.transform, ears, ears );
+   m3x3_mulv( skaterift.cam.transform, ears, ears );
    v3_copy( ears, vg_audio.external_listener_ears );
-   v3_copy( main_camera.transform[3], vg_audio.external_listener_pos );
+   v3_copy( skaterift.cam.transform[3], vg_audio.external_listener_pos );
 
    if( localplayer.gate_waiting ){
       m4x3_mulv( localplayer.gate_waiting->transport,
@@ -320,22 +332,18 @@ VG_STATIC void vg_update_post(void){
    v3_copy( localplayer.rb.v, vg_audio.external_lister_velocity );
    audio_unlock();
 
-   int replay_open = localplayer.replay.control != k_replay_control_none?1:0;
-
-   f32 target = (1-(menu.active||replay_open));
-   vg_slewf( &skaterift.time_rate, target, vg.time_frame_delta * 6.0f );
-
-   vg.time_rate = skaterift.time_rate;
    vehicle_update_post();
 }
 
-VG_STATIC void vg_framebuffer_resize( int w, int h )
-{
+/*
+ * RENDERING
+ * ---------------------------------------------------------------------------*/
+
+VG_STATIC void vg_framebuffer_resize( int w, int h ){
    render_fb_resize();
 }
 
-VG_STATIC void present_view_with_post_processing(void)
-{
+VG_STATIC void present_view_with_post_processing(void){
    glBindFramebuffer( GL_FRAMEBUFFER, 0 );
    glViewport( 0,0, vg.window_x, vg.window_y );
 
@@ -356,7 +364,7 @@ VG_STATIC void present_view_with_post_processing(void)
       shader_blitblur_uInverseRatio( inverse );
 
       v2f override;
-      if( menu.active )
+      if( skaterift.activity == k_skaterift_menu )
          v2_muls( (v2f){ 0.04f, 0.001f }, 1.0f-skaterift.time_rate, override );
       else 
          v2_zero( override );
@@ -375,14 +383,13 @@ VG_STATIC void present_view_with_post_processing(void)
    render_fsquad();
 }
 
-VG_STATIC void render_player_transparent(void)
-{
+VG_STATIC void render_player_transparent(void){
    static camera small_cam;      /* DOES NOT NEED TO BE STATIC BUT MINGW 
                                     SAIS OTHERWISE */
 
-   m4x3_copy( main_camera.transform, small_cam.transform );
+   m4x3_copy( skaterift.cam.transform, small_cam.transform );
 
-   small_cam.fov = main_camera.fov;
+   small_cam.fov = skaterift.cam.fov;
    small_cam.nearz = 0.05f;
    small_cam.farz  = 60.0f;
 
@@ -396,8 +403,7 @@ VG_STATIC void render_player_transparent(void)
    player__render( &small_cam, &localplayer );
 }
 
-VG_STATIC void render_scene(void)
-{
+VG_STATIC void render_scene(void){
    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 );
@@ -419,50 +425,49 @@ VG_STATIC void render_scene(void)
       }
    }
 
-   render_world( view_world, &main_camera, 0 );
+   render_world( view_world, &skaterift.cam, 0 );
 
-   render_water_texture( view_world, &main_camera, 0 );
+   render_water_texture( view_world, &skaterift.cam, 0 );
    render_fb_bind( gpipeline.fb_main, 1 );
-   render_water_surface( view_world, &main_camera );
+   render_water_surface( view_world, &skaterift.cam );
 }
 
-VG_STATIC void render_scene_gate_subview(void)
-{
+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; /* ??? */
 
    int depth = 1;
    if( localplayer.gate_waiting ) depth = 0;
-   render_world_gates( view_world, &main_camera, depth );
+   render_world_gates( view_world, &skaterift.cam, depth );
 }
 
-VG_STATIC void render_main_game(void)
-{
-   player__pre_render( &localplayer );
-   main_camera.fov = localplayer.cam.fov;
-   v3_copy( localplayer.cam.pos, main_camera.pos );
-   v3_copy( localplayer.cam.angles, main_camera.angles );
+VG_STATIC void skaterift_composite_maincamera(void){
+   camera_lerp( &localplayer.cam, &global_skateshop.cam, 
+                vg_smoothstepf(global_skateshop.factive), &skaterift.cam );
 
-   main_camera.nearz = 0.1f;
-   main_camera.farz  = 2100.0f;
+   skaterift.cam.nearz = 0.1f;
+   skaterift.cam.farz  = 2100.0f;
 
-   camera_update_transform( &main_camera );
+   camera_update_transform( &skaterift.cam );
 
    if( localplayer.gate_waiting ){
-      m3x3_mul( localplayer.basis_gate, main_camera.transform, 
-                main_camera.transform );
+      m3x3_mul( localplayer.basis_gate, skaterift.cam.transform, 
+                skaterift.cam.transform );
    }
    else{
-      m3x3_mul( localplayer.basis, main_camera.transform, 
-                main_camera.transform );
+      m3x3_mul( localplayer.basis, skaterift.cam.transform, 
+                skaterift.cam.transform );
    }
    
-   camera_update_view( &main_camera );
-   camera_update_projection( &main_camera );
-   camera_finalize( &main_camera );
+   camera_update_view( &skaterift.cam );
+   camera_update_projection( &skaterift.cam );
+   camera_finalize( &skaterift.cam );
+}
 
-   /* ========== Begin Frame ========== */
+VG_STATIC void render_main_game(void){
+   player__pre_render( &localplayer );
+   skaterift_composite_maincamera();
 
    render_scene();
 
@@ -472,11 +477,9 @@ VG_STATIC void render_main_game(void)
    render_scene_gate_subview();
 
    present_view_with_post_processing();
-   /* =========== End Frame =========== */
 }
 
-VG_STATIC void vg_render(void)
-{
+VG_STATIC void vg_render(void){
    if( skaterift.op == k_async_op_clientloading ){
       _vg_loader_render();
       return;
@@ -492,8 +495,7 @@ VG_STATIC void vg_render(void)
    glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
 
    render_main_game();
-
-   m4x4_copy( main_camera.mtx.pv, vg.pv );
+   m4x4_copy( skaterift.cam.mtx.pv, vg.pv );
    
    /* Other shite */
    glDisable(GL_BLEND);
@@ -503,12 +505,11 @@ VG_STATIC void vg_render(void)
    gui_draw();
 }
 
-VG_STATIC void vg_gui(void)
-{
+VG_STATIC void vg_gui(void){
    if( skaterift.op == k_async_op_clientloading ) return;
 
    menu_update();
-   if( menu.active ){
+   if( skaterift.activity == k_skaterift_menu ){
       glClear( GL_DEPTH_BUFFER_BIT );
       menu_render();
    }
index aee794e05a5553d1a2d282b050612d1aa4ef0870..e78df2f40864ee4bb9be25b1a900e201c7973062 100644 (file)
@@ -26,6 +26,16 @@ struct{
    op;
 
    f32 time_rate;
+   camera cam;
+   replay_buffer replay;
+
+   enum skaterift_activity {
+      k_skaterift_default    = 0x00,
+      k_skaterift_replay     = 0x01,
+      k_skaterift_skateshop  = 0x02,
+      k_skaterift_menu       = 0x04
+   }
+   activity;
 }
 static skaterift = { .op = k_async_op_clientloading, .time_rate = 1.0f };
 
index e988d616971b06c8c73b297aaf9c4f466359830f..a171a8d846c6d5ef2686beae59979fd9e883860b 100644 (file)
--- a/vehicle.c
+++ b/vehicle.c
@@ -3,11 +3,10 @@
 
 #include "vehicle.h"
 
-VG_STATIC int spawn_car( int argc, const char *argv[] )
-{
+VG_STATIC int spawn_car( int argc, const char *argv[] ){
    v3f ra, rb, rx;
-   v3_copy( main_camera.pos, ra );
-   v3_muladds( ra, main_camera.transform[2], -10.0f, rb );
+   v3_copy( skaterift.cam.pos, ra );
+   v3_muladds( ra, skaterift.cam.transform[2], -10.0f, rb );
 
    float t;
    if( spherecast_world( world_current_instance(), ra, rb, 
index 30ddb5647528410b5cfdbf8debd7c982480fbea0..1efc4287ffac47a746dcf3d3a0e7f0a190e56659 100644 (file)
@@ -908,7 +908,7 @@ VG_STATIC void workshop_render_world_preview(void){
    glEnable( GL_DEPTH_TEST );
    glDisable( GL_BLEND );
 
-   render_world( localplayer.viewable_world, &main_camera, 1 );
+   render_world( localplayer.viewable_world, &skaterift.cam, 1 );
 
    glBindFramebuffer( GL_FRAMEBUFFER, 0 );
    glViewport( 0,0, vg.window_x, vg.window_y );
index 876007d901fe61fa4c1736511aed5115f3ec897c..a61bc162811e9462572201cef0488a396240934c 100644 (file)
@@ -105,29 +105,29 @@ VG_STATIC int render_gate( world_instance *world_inside,
    }
 
    /* update gate camera */
-   gate_camera.fov = cam->fov;
-   gate_camera.nearz = 0.1f;
-   gate_camera.farz  = 2000.0f;
+   world_gates.cam.fov = cam->fov;
+   world_gates.cam.nearz = 0.1f;
+   world_gates.cam.farz  = 2000.0f;
 
-   m4x3_mul( gate->transport, cam->transform, gate_camera.transform );
-   camera_update_view( &gate_camera );
-   camera_update_projection( &gate_camera );
+   m4x3_mul( gate->transport, cam->transform, world_gates.cam.transform );
+   camera_update_view( &world_gates.cam );
+   camera_update_projection( &world_gates.cam );
 
    /* Add special clipping plane to projection */
    v4f surface;
    q_mulv( gate->q[1], (v3f){0.0f,0.0f,-1.0f}, surface );
    surface[3] = v3_dot( surface, gate->co[1] );
    
-   m4x3_mulp( gate_camera.transform_inverse, surface, surface );
+   m4x3_mulp( world_gates.cam.transform_inverse, surface, surface );
    surface[3] = -fabsf(surface[3]);
 
    if( dist < -0.5f )
-      m4x4_clip_projection( gate_camera.mtx.p, surface );
+      m4x4_clip_projection( world_gates.cam.mtx.p, surface );
 
    /* Ready to draw with new camrea */
-   camera_finalize( &gate_camera );
+   camera_finalize( &world_gates.cam );
 
-   vg_line_point( gate_camera.transform[3], 0.3f, 0xff00ff00 );
+   vg_line_point( world_gates.cam.transform[3], 0.3f, 0xff00ff00 );
    {
       shader_model_gate_use();
       shader_model_gate_uPv( cam->mtx.pv );
@@ -152,17 +152,17 @@ VG_STATIC int render_gate( world_instance *world_inside,
       glStencilMask( 0x00 ); 
    }
 
-   render_world( world_inside, &gate_camera, layer_depth );
+   render_world( world_inside, &world_gates.cam, layer_depth );
 
    {
       glDisable( GL_STENCIL_TEST );
 
-      render_water_texture( world_inside, &gate_camera, layer_depth );
+      render_water_texture( world_inside, &world_gates.cam, layer_depth );
       render_fb_bind( gpipeline.fb_main, 1 );
 
       glEnable( GL_STENCIL_TEST );
 
-      render_water_surface( world_inside, &gate_camera );
+      render_water_surface( world_inside, &world_gates.cam );
 
       glStencilMask( 0xFF );
       glStencilFunc( GL_ALWAYS, 1, 0xFF );
index 4defb75ac198ee07d5fe398d75af61a6f6292f4e..b45c70d86c0f1ce3efb3896d1fa11dd79a3a97cc 100644 (file)
@@ -5,12 +5,14 @@
 #ifndef WORLD_GATE_H
 #define WORLD_GATE_H
 
+#include "camera.h"
 #include "world.h"
 #include "shaders/model_gate.h"
 
 struct world_gates{
    glmesh mesh;
    mdl_submesh sm_surface, sm_marker[4];
+   camera cam;
 }
 static world_gates;