X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_replay.c;h=f5a2ab9327ab03c9b7c0705c89596316d758d4ba;hb=888e62fcd8f9777cee774fbb8fab2e52660303a7;hp=f3b4a51c0347d69c6ae07d40a0cb0063faec7bfb;hpb=171b279a489f1b906265759b33249f61d48d3d5f;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_replay.c b/player_replay.c index f3b4a51..f5a2ab9 100644 --- a/player_replay.c +++ b/player_replay.c @@ -16,14 +16,18 @@ static void replay_clear( replay_buffer *replay ){ static void * replay_frame_data( replay_frame *frame, enum replay_framedata type ){ + if( frame->data_table[type][1] == 0 ) + return NULL; + void *baseptr = frame; return baseptr + frame->data_table[type][0]; } -static u16 -replay_frame_calculate_data_offsets( u16 data_table[4][2] ){ +static u16 replay_frame_calculate_data_offsets( + u16 data_table[k_replay_framedata_rows][2] ){ + u32 total = vg_align8( sizeof(replay_frame) ); - for( u32 i=0; i<4; i++ ){ + for( u32 i=0; idata; - for( u32 i=0; i<4; i++ ){ + for( u32 i=0; idata_table[i][0] = data_table[i][0]; frame->data_table[i][1] = data_table[i][1]; } @@ -256,13 +267,19 @@ static void skaterift_record_frame( replay_buffer *replay, k_gamestate_rate = 0.5; int save_frame = 0, - save_state = 0; + save_state = 0, + save_glider = 0; if( force_gamestate ) save_state = 1; if( statedelta > k_gamestate_rate ) save_state = 1; if( delta > k_replay_rate ) save_frame = 1; if( save_state ) save_frame = 1; + if( localplayer.have_glider || localplayer.glider_orphan || + localplayer.subsystem == k_player_subsystem_glide ){ + save_glider = 1; + } + if( !save_frame ) return; u16 gamestate_size = 0; @@ -274,7 +291,7 @@ static void skaterift_record_frame( replay_buffer *replay, [k_player_subsystem_skate] = sizeof(struct player_skate_state), [k_player_subsystem_dead ] = localplayer.ragdoll.part_count * sizeof(struct replay_rb), - [k_player_subsystem_glide] = 0, + [k_player_subsystem_glide] = sizeof(struct replay_rb), }[ localplayer.subsystem ]; } @@ -282,7 +299,8 @@ static void skaterift_record_frame( replay_buffer *replay, replay_frame *frame = replay_newframe( replay, animator_size, gamestate_size, - localplayer.local_sfx_buffer_count ); + localplayer.local_sfx_buffer_count, + save_glider ); frame->system = localplayer.subsystem; if( save_state ){ @@ -291,6 +309,7 @@ static void skaterift_record_frame( replay_buffer *replay, /* permanent block */ memcpy( &gs->rb, &localplayer.rb, sizeof(rigidbody) ); + memcpy( &gs->glider_rb, &player_glide.rb, sizeof(rigidbody) ); memcpy( &gs->cam_control, &localplayer.cam_control, sizeof(struct player_cam_controller) ); v3_copy( localplayer.angles, gs->angles ); @@ -312,6 +331,25 @@ static void skaterift_record_frame( replay_buffer *replay, v4_copy( rb->q, arr[i].q ); } } + else if( localplayer.subsystem == k_player_subsystem_glide ){ + struct replay_rb *arr = dst; + rigidbody *rb = &player_glide.rb; + v3_copy( rb->co, arr[0].co ); + v3_copy( rb->w, arr[0].w ); + v3_copy( rb->v, arr[0].v ); + v4_copy( rb->q, arr[0].q ); + } + } + + if( save_glider ){ + struct replay_glider_data *inf = + replay_frame_data( frame, k_replay_framedata_glider ); + + inf->have_glider = localplayer.have_glider; + inf->glider_orphan = localplayer.glider_orphan; + inf->t = player_glide.t; + v3_copy( player_glide.rb.co, inf->co ); + v4_copy( player_glide.rb.q, inf->q ); } replay->cursor = vg.time; @@ -335,18 +373,9 @@ static void skaterift_record_frame( replay_buffer *replay, frame->cam_fov = localplayer.cam.fov; /* animator */ - void *dst = replay_frame_data( frame, k_replay_framedata_animator ); - - if( localplayer.subsystem == k_player_subsystem_walk ) - memcpy( dst, &player_walk.animator, animator_size ); - else if( localplayer.subsystem == k_player_subsystem_skate ) - memcpy( dst, &player_skate.animator, animator_size ); - else if( localplayer.subsystem == k_player_subsystem_dead ){ - memcpy( dst, &player_dead.animator, animator_size ); - } - else if( localplayer.subsystem == k_player_subsystem_glide ){ - memcpy( dst, &player_glide.animator, animator_size ); - } + void *dst = replay_frame_data( frame, k_replay_framedata_animator ), + *src = player_subsystems[localplayer.subsystem]->animator_data; + memcpy( dst, src, animator_size ); /* sound effects */ memcpy( replay_frame_data( frame, k_replay_framedata_sfx ), @@ -385,12 +414,38 @@ void skaterift_restore_frame( replay_frame *frame ){ v3_copy( arr[i].co, part->prev_co ); v4_copy( arr[i].q, part->prev_q ); + rb_update_matrices( rb ); } } + else if( frame->system == k_player_subsystem_glide ){ + struct replay_rb *arr = src; + rigidbody *rb = &player_glide.rb; + v3_copy( arr[0].co, rb->co ); + v3_copy( arr[0].w, rb->w ); + v3_copy( arr[0].v, rb->v ); + v4_copy( arr[0].q, rb->q ); + rb_update_matrices( rb ); + } localplayer.subsystem = frame->system; + /* restore the seperated glider data if we have it */ + if( frame->data_table[ k_replay_framedata_glider ][1] ){ + struct replay_glider_data *inf = + replay_frame_data( frame, k_replay_framedata_glider ); + + localplayer.have_glider = inf->have_glider; + localplayer.glider_orphan = inf->glider_orphan; + player_glide.t = inf->t; + } + else { + localplayer.have_glider = 0; + localplayer.glider_orphan = 0; + player_glide.t = 0.0f; + } + memcpy( &localplayer.rb, &gs->rb, sizeof(rigidbody) ); + memcpy( &player_glide.rb, &gs->glider_rb, sizeof(rigidbody) ); v3_copy( gs->angles, localplayer.angles ); v3_copy( frame->cam_pos, localplayer.cam.pos ); @@ -514,8 +569,10 @@ static void skaterift_replay_update_helpers(void){ } static void skaterift_replay_post_render(void){ +#ifndef SR_ALLOW_REWIND_HUB if( world_static.active_instance != k_world_purpose_client ) return; +#endif /* capture the current resume frame at the very last point */ if( button_down( k_srbind_reset ) ){ @@ -550,21 +607,6 @@ static void skaterift_replay_post_render(void){ } } -#if 0 -static void skaterift_get_replay_camera( camera *cam ){ - if( skaterift.freecam ){ - cam->nearz = 0.1f; - cam->farz = 100.0f; - v3_copy( skaterift.replay_freecam.pos, cam->pos ); - v3_copy( skaterift.replay_freecam.angles, cam->angles ); - cam->fov = skaterift.replay_freecam.fov; - } - else{ - replay_get_camera( &skaterift.replay, &skaterift.cam ); - } -} -#endif - static void skaterift_replay_debug_info(void){ player__debugtext( 2, "replay info" ); @@ -578,7 +620,7 @@ static void skaterift_replay_debug_info(void){ player__debugtext( 1, "head @%u | tail @%u\n", head, tail ); if( replay->statehead ){ - for( u32 i=0; i<4; i++ ){ + for( u32 i=0; istatehead->data_table[i][0], replay->statehead->data_table[i][1] );