refactor rewind tape 1
[carveJwlIkooP6JGAAIwe30JlM.git] / player_replay.c
index f0487f4b36d99a7694d60dcddf69f46d84adbe36..5f57d9f0337da280e7c4deb6cdf8ba93d9a94a9d 100644 (file)
@@ -3,11 +3,19 @@
 
 #include "player_replay.h"
 
+VG_STATIC void replay_clear( replay_buffer *replay ){
+   replay->head = NULL;
+   replay->tail = NULL;
+   replay->cursor_frame = NULL;
+   replay->statehead = NULL;
+   replay->cursor = -99999.9;
+   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;
-   localplayer.replay.cursor = -9999.9;
-   vg_console_reg_var( "k_replay_test", &k_replay_test, k_var_dtype_i32, 0 );
+   replay_clear( &localplayer.replay );
 }
 
 replay_gamestate *replay_frame_gamestate( replay_frame *frame, u16 index ){
@@ -117,8 +125,8 @@ VG_STATIC void replay_seek( replay_buffer *replay, f64 t ){
    if( dir == 0.0 ) return;
    dir = vg_signf( dir );
    
-   u32 i=0;
-   for( ; i<1024; i++ ){
+   u32 i=4096;
+   while( i --> 0 ){
       if( dir < 0.0 )
          if( t > replay->cursor_frame->time ) break;
 
@@ -134,7 +142,7 @@ VG_STATIC void replay_seek( replay_buffer *replay, f64 t ){
       replay->cursor_frame = next;
       replay->cursor = next->time;
 
-      if( i == 1023 ) return;
+      if( !i ) return;
    }
 
    replay->cursor = t;
@@ -143,8 +151,8 @@ VG_STATIC void replay_seek( replay_buffer *replay, f64 t ){
 VG_STATIC replay_frame *replay_find_recent_stateframe( replay_buffer *replay ){
    replay_frame *frame = replay->cursor_frame;
 
-   u32 i=0;
-   for( ; i<4096; i++ ){
+   u32 i=4096;
+   while( i --> 0 ){
       if( !frame ) return frame;
       if( frame->gamestate_count ) return frame;
       frame = frame->l;
@@ -153,6 +161,67 @@ VG_STATIC replay_frame *replay_find_recent_stateframe( replay_buffer *replay ){
    return NULL;
 }
 
+VG_STATIC void player_replay_control_update( player_instance *player ){
+   f64 speed = 1.0;
+   f64 target = player->replay.cursor;
+
+   if( vg_getkey( SDLK_9 ) ){
+      target -= vg.time_frame_delta * speed;
+      player->replay.control = k_replay_control_scrub;
+      replay_seek( &player->replay, target );
+   }
+   if( vg_getkey( SDLK_0 ) ){
+      target += vg.time_frame_delta * speed;
+      player->replay.control = k_replay_control_scrub;
+      replay_seek( &player->replay, target );
+   }
+
+   if( vg_getkey( SDLK_7 ) )
+      player->replay.control = k_replay_control_play;
+
+   if( player->replay.control == k_replay_control_play ){
+      target += vg.time_frame_delta;
+      replay_seek( &player->replay, target );
+   }
+
+   if( vg_getkey( SDLK_8 ) ){
+      replay_frame *prev = replay_find_recent_stateframe( &player->replay );
+
+      if( prev ){
+         /* TODO: Make gamestate_apply function / swap ... */
+         replay_gamestate *gs = replay_frame_gamestate( prev, 0 );
+
+         if( gs->system == k_player_subsystem_walk ){
+            memcpy( &player->_walk.state, &gs->walk, 
+                     sizeof(struct player_walk_state) );
+         }
+         else if( gs->system == k_player_subsystem_skate ){
+            memcpy( &player->_skate.state, &gs->skate, 
+                     sizeof(struct player_skate_state) );
+         }
+         player->subsystem = gs->system;
+
+         memcpy( &player->rb, &gs->rb, sizeof(rigidbody) );
+         v3_copy( gs->angles, player->angles );
+         v3_copy( prev->cam_pos, player->cam.pos );
+         v3_copy( prev->cam_angles, player->cam_override_angles );
+         player->cam.fov = prev->cam_fov;
+         memcpy( &player->cam_control, &gs->cam_control, 
+                  sizeof(struct player_cam_controller) );
+
+         /* chop end off replay */
+         prev->r = NULL;
+         player->replay.statehead = prev;
+         player->replay.head = prev;
+         player->replay.cursor_frame = prev;
+         player->replay.cursor = prev->time;
+         player->replay.control = k_replay_control_none;
+         vg.time = prev->time;
+         return;
+      }
+   }
+}
+
 VG_STATIC void replay_debug_info( player_instance *player ){
    player__debugtext( 2, "replay info" );
 
@@ -184,7 +253,7 @@ VG_STATIC void replay_debug_info( player_instance *player ){
 }
 
 VG_STATIC void replay_imgui( player_instance *player ){
-   if( !k_replay_test ) return;
+   if( player->replay.control == k_replay_control_none ) return;
 
    replay_buffer *replay = &player->replay;
    f64 start = replay->cursor,