X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_replay.c;h=5f57d9f0337da280e7c4deb6cdf8ba93d9a94a9d;hb=09be4380a98386d6494946fbd3369458f8e7f267;hp=f0487f4b36d99a7694d60dcddf69f46d84adbe36;hpb=9eb3de757a997becb8406417a4bf613f4cb04900;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_replay.c b/player_replay.c index f0487f4..5f57d9f 100644 --- a/player_replay.c +++ b/player_replay.c @@ -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,