X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_replay.c;h=1b339474dd593b61f95a46ce56cd2a6e56f4573f;hb=fbc68c65e01838feb77f47b30994b45fcc39ebaf;hp=5237e5f5b5d3451019c83061c3e82e9e976985a5;hpb=3494503be52ee50b21e78c8ada30620210db6511;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_replay.c b/player_replay.c index 5237e5f..1b33947 100644 --- a/player_replay.c +++ b/player_replay.c @@ -5,7 +5,7 @@ #include "input.h" #include "gui.h" -VG_STATIC void replay_clear( replay_buffer *replay ){ +static void replay_clear( replay_buffer *replay ){ replay->head = NULL; replay->tail = NULL; replay->cursor_frame = NULL; @@ -13,13 +13,13 @@ VG_STATIC void replay_clear( replay_buffer *replay ){ replay->cursor = -99999.9; } -VG_STATIC void * -replay_frame_data( replay_frame *frame, enum replay_framedata type ){ +static +void * replay_frame_data( replay_frame *frame, enum replay_framedata type ){ void *baseptr = frame; return baseptr + frame->data_table[type][0]; } -VG_STATIC u16 +static u16 replay_frame_calculate_data_offsets( u16 data_table[4][2] ){ u32 total = vg_align8( sizeof(replay_frame) ); for( u32 i=0; i<4; i++ ){ @@ -32,7 +32,7 @@ replay_frame_calculate_data_offsets( u16 data_table[4][2] ){ return total; } -VG_STATIC void replay_tailpop( replay_buffer *replay ){ +static void replay_tailpop( replay_buffer *replay ){ if( replay->cursor_frame == replay->tail ) replay->cursor_frame = NULL; if( replay->statehead == replay->tail ) @@ -46,7 +46,7 @@ VG_STATIC void replay_tailpop( replay_buffer *replay ){ replay->head = NULL; } -VG_STATIC replay_frame *replay_newframe( replay_buffer *replay, +static replay_frame *replay_newframe( replay_buffer *replay, u16 animator_size, u16 gamestate_size, u16 sfx_count ){ @@ -64,16 +64,9 @@ VG_STATIC replay_frame *replay_newframe( replay_buffer *replay, replay_frame *frame = NULL; if( replay->head ){ - assert( replay->head ); - u32 headsize = replay->head->total_size, nextpos = ((void *)replay->head - replay->data) + headsize; - if( nextsize > replay->size ){ - vg_error( "Keyframe too big\n" ); - return NULL; - } - if( nextpos + nextsize > replay->size ){ nextpos = 0; @@ -120,7 +113,7 @@ check_again:; return frame; } -VG_STATIC void replay_seek( replay_buffer *replay, f64 t ){ +static void replay_seek( replay_buffer *replay, f64 t ){ if( !replay->head ) return; assert( replay->tail ); @@ -164,7 +157,7 @@ VG_STATIC void replay_seek( replay_buffer *replay, f64 t ){ replay->cursor = t; } -VG_STATIC replay_frame *replay_find_recent_stateframe( replay_buffer *replay ){ +static replay_frame *replay_find_recent_stateframe( replay_buffer *replay ){ replay_frame *frame = replay->cursor_frame; u32 i=4096; while( i --> 0 ){ @@ -176,7 +169,7 @@ VG_STATIC replay_frame *replay_find_recent_stateframe( replay_buffer *replay ){ return NULL; } -VG_STATIC f32 replay_subframe_time( replay_buffer *replay ){ +static f32 replay_subframe_time( replay_buffer *replay ){ replay_frame *frame = replay->cursor_frame; if( !frame ) return 0.0f; replay_frame *next = frame->r; @@ -189,13 +182,13 @@ VG_STATIC f32 replay_subframe_time( replay_buffer *replay ){ return 0.0f; } -VG_STATIC void replay_get_frame_camera( replay_frame *frame, camera *cam ){ +static void replay_get_frame_camera( replay_frame *frame, camera *cam ){ cam->fov = frame->cam_fov; v3_copy( frame->cam_pos, cam->pos ); v3_copy( frame->cam_angles, cam->angles ); } -VG_STATIC void replay_get_camera( replay_buffer *replay, camera *cam ){ +static void replay_get_camera( replay_buffer *replay, camera *cam ){ cam->nearz = 0.1f; cam->farz = 100.0f; if( replay->cursor_frame ){ @@ -224,7 +217,7 @@ struct replay_rb{ v4f q; }; -VG_STATIC +static void skaterift_record_frame( replay_buffer *replay, int force_gamestate ){ f64 delta = 9999999.9, statedelta = 9999999.9; @@ -284,9 +277,9 @@ void skaterift_record_frame( replay_buffer *replay, int force_gamestate ){ /* subsytem/dynamic block */ if( localplayer.subsystem == k_player_subsystem_walk ) - memcpy( dst, &localplayer._walk.state, gamestate_size ); + memcpy( dst, &player_walk.state, gamestate_size ); else if( localplayer.subsystem == k_player_subsystem_skate ) - memcpy( dst, &localplayer._skate.state, gamestate_size ); + memcpy( dst, &player_skate.state, gamestate_size ); else if( localplayer.subsystem == k_player_subsystem_dead ){ struct replay_rb *arr = dst; for( u32 i=0; isystem == k_player_subsystem_walk ){ - memcpy( &localplayer._walk.state, src, src_size ); + memcpy( &player_walk.state, src, src_size ); } else if( frame->system == k_player_subsystem_skate ){ - memcpy( &localplayer._skate.state, src, src_size ); + memcpy( &player_skate.state, src, src_size ); } else if( frame->system == k_player_subsystem_dead ){ - player__dead_transition( &localplayer ); + player__dead_transition(); struct replay_rb *arr = src; for( u32 i=0; itime; } -VG_STATIC void skaterift_replay_resume(void){ +static void skaterift_replay_resume(void){ replay_frame *prev = replay_find_recent_stateframe(&skaterift.replay); if( prev ){ @@ -388,9 +381,13 @@ VG_STATIC void skaterift_replay_resume(void){ skaterift.resume_begin = skaterift.replay.cursor; skaterift.resume_transition = 0.0f; } + + gui_helper_clear(); } -VG_STATIC void skaterift_replay_pre_update(void){ +static void skaterift_replay_update_helpers(void); + +static void skaterift_replay_pre_update(void){ if( skaterift.activity != k_skaterift_replay ) return; if( skaterift.replay_control == k_replay_control_resume ){ @@ -420,6 +417,8 @@ VG_STATIC void skaterift_replay_pre_update(void){ if( skaterift.freecam ) replay_get_camera( &skaterift.replay, &skaterift.replay_freecam ); + + skaterift_replay_update_helpers(); } f32 target_speed = axis_state( k_sraxis_replay_h ) * 5.0; @@ -447,15 +446,11 @@ VG_STATIC void skaterift_replay_pre_update(void){ skaterift_restore_frame( skaterift.replay.statehead ); else skaterift.activity = k_skaterift_default; - srinput.enabled = 0; + srinput.state = k_input_state_resume; + gui_helper_clear(); } - gui_helper_action( button_display_string(k_srbind_replay_play), "play" ); - gui_helper_action( axis_display_string(k_sraxis_replay_h), "scrub" ); if( skaterift.freecam ){ - gui_helper_action( button_display_string(k_srbind_replay_freecam), - "exit freecam" ); - camera *cam = &skaterift.replay_freecam; v3f angles; v3_copy( cam->angles, angles ); @@ -475,12 +470,9 @@ VG_STATIC void skaterift_replay_pre_update(void){ v3f lookdir = { 0.0f, 0.0f, -1.0f }, sidedir = { 1.0f, 0.0f, 0.0f }; - - m3x3f mtx; - m3x3_mul( cam->transform, localplayer.basis, mtx ); - m3x3_mulv( mtx, lookdir, lookdir ); - m3x3_mulv( mtx, sidedir, sidedir ); + m3x3_mulv( cam->transform, lookdir, lookdir ); + m3x3_mulv( cam->transform, sidedir, sidedir ); v2f input; joystick_state( k_srjoystick_steer, input ); @@ -496,11 +488,6 @@ VG_STATIC void skaterift_replay_pre_update(void){ skaterift.freecam_v, vg.time_frame_delta, cam->pos ); } else { - gui_helper_action( button_display_string(k_srbind_replay_resume), - "resume" ); - gui_helper_action( button_display_string(k_srbind_replay_freecam), - "enter freecam" ); - if( button_down( k_srbind_replay_resume ) ){ skaterift_replay_resume(); } @@ -508,7 +495,53 @@ VG_STATIC void skaterift_replay_pre_update(void){ } } -VG_STATIC void skaterift_get_replay_camera( camera *cam ){ +static void skaterift_replay_update_helpers(void){ + skaterift.helper_resume->greyed = skaterift.freecam; + + vg_str freecam_text; + vg_strnull( &freecam_text, skaterift.helper_freecam->text, + GUI_HELPER_TEXT_LENGTH ); + vg_strcat( &freecam_text, skaterift.freecam? "exit freecam": "freecam" ); +} + +static void skaterift_replay_post_render(void){ + if( world_static.active_instance != k_world_purpose_client ) + return; + + /* capture the current resume frame at the very last point */ + if( button_down( k_srbind_reset ) ){ + if( skaterift.activity == k_skaterift_default ){ + localplayer.rewinded_since_last_gate = 1; + skaterift.activity = k_skaterift_replay; + skaterift_record_frame( &skaterift.replay, 1 ); + if( skaterift.replay.head ){ + skaterift.replay.cursor = skaterift.replay.head->time; + skaterift.replay.cursor_frame = skaterift.replay.head; + } + skaterift.replay_control = k_replay_control_scrub; + + gui_helper_clear(); + vg_str text; + + if( gui_new_helper( input_axis_list[k_sraxis_replay_h], &text ) ) + vg_strcat( &text, "scrub" ); + + if( (skaterift.helper_resume = gui_new_helper( + input_button_list[k_srbind_replay_resume], &text )) ) + vg_strcat( &text, "resume" ); + + if( gui_new_helper( input_button_list[k_srbind_replay_play], &text )) + vg_strcat( &text, "playback" ); + + skaterift.helper_freecam = gui_new_helper( + input_button_list[k_srbind_replay_freecam], &text ); + + skaterift_replay_update_helpers(); + } + } +} + +static void skaterift_get_replay_camera( camera *cam ){ if( skaterift.freecam ){ cam->nearz = 0.1f; cam->farz = 100.0f; @@ -521,7 +554,7 @@ VG_STATIC void skaterift_get_replay_camera( camera *cam ){ } } -VG_STATIC void skaterift_replay_debug_info(void){ +static void skaterift_replay_debug_info(void){ player__debugtext( 2, "replay info" ); replay_buffer *replay = &skaterift.replay; @@ -558,7 +591,7 @@ VG_STATIC void skaterift_replay_debug_info(void){ player__debugtext( 1, "cursor: %.2fs / %.2fs\n", cur, len ); } -VG_STATIC void skaterift_replay_imgui(void){ +static void skaterift_replay_imgui(void){ if( skaterift.activity != k_skaterift_replay ) return; replay_buffer *replay = &skaterift.replay; @@ -616,17 +649,6 @@ VG_STATIC void skaterift_replay_imgui(void){ 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 ); - -#if 0 - char buf[256]; - snprintf( buf, 256, "scrub: %s\nresume: %s\nplay: %s\n", - axis_display_string( k_sraxis_replay_h ), - button_display_string( k_srbind_replay_resume ), - button_display_string( k_srbind_replay_play ) ); - - ui_rect info = { 0, vg.window_y-bar[3]-128, 256, 128 }; - ui_text( info, buf, 2,0,0 ); -#endif } #endif /* PLAYER_REPLAY_C */