memcpy( &localplayer.cam_control, &gs->cam_control,
sizeof(struct player_cam_controller) );
+
+ /* chop end off replay */
+ frame->r = NULL;
+ skaterift.replay.statehead = frame;
+ skaterift.replay.head = frame;
+ skaterift.replay.cursor_frame = frame;
+ skaterift.replay.cursor = frame->time;
+ skaterift.replay_control = k_replay_control_scrub;
+ skaterift.activity = k_skaterift_default;
+ vg.time = frame->time;
}
VG_STATIC void skaterift_replay_pre_update(void){
if( skaterift.activity != k_skaterift_replay ) return;
- f64 speed = 1.0;
+ f64 speed = vg.time_frame_delta * 1.0;
f64 target = skaterift.replay.cursor;
- if( vg_getkey( SDLK_9 ) ){
- target -= vg.time_frame_delta * speed;
- skaterift.replay_control = k_replay_control_scrub;
- replay_seek( &skaterift.replay, target );
- }
- if( vg_getkey( SDLK_0 ) ){
- target += vg.time_frame_delta * speed;
- skaterift.replay_control = k_replay_control_scrub;
- replay_seek( &skaterift.replay, target );
+ if( skaterift.replay_control == k_replay_control_resume ){
+ if( skaterift.replay.cursor_frame == skaterift.resume_target ||
+ skaterift.replay.cursor_frame == NULL ){
+ skaterift_restore_frame( skaterift.resume_target );
+ }
+ else {
+ vg_slewf( &skaterift.resume_transition, 1.0f,
+ vg.time_frame_delta * (1.0f/1.0f) );
+
+ if( skaterift.resume_transition >= 1.0f )
+ skaterift_restore_frame( skaterift.resume_target );
+ else {
+ target = vg_lerp( skaterift.resume_begin,
+ skaterift.resume_target->time,
+ vg_smoothstepf( skaterift.resume_transition ) );
+ replay_seek( &skaterift.replay, target );
+ }
+ }
}
+ else {
+ if( vg_getkey( SDLK_9 ) ){
+ target -= speed;
+ skaterift.replay_control = k_replay_control_scrub;
+ replay_seek( &skaterift.replay, target );
+ }
+ if( vg_getkey( SDLK_0 ) ){
+ target += speed;
+ skaterift.replay_control = k_replay_control_scrub;
+ replay_seek( &skaterift.replay, target );
+ }
- if( vg_getkey( SDLK_7 ) )
- skaterift.replay_control = k_replay_control_play;
-
- if( skaterift.replay_control == k_replay_control_play ){
- target += vg.time_frame_delta;
- replay_seek( &skaterift.replay, target );
- }
+ if( vg_getkey( SDLK_7 ) )
+ skaterift.replay_control = k_replay_control_play;
- if( vg_getkey( SDLK_8 ) ){
- replay_frame *prev = replay_find_recent_stateframe( &skaterift.replay );
+ if( skaterift.replay_control == k_replay_control_play ){
+ target += vg.time_frame_delta;
+ replay_seek( &skaterift.replay, target );
+ }
- if( prev ){
- skaterift_restore_frame( prev );
+ if( vg_getkey( SDLK_8 ) ){
+ replay_frame *prev = replay_find_recent_stateframe(&skaterift.replay);
- /* chop end off replay */
- prev->r = NULL;
- skaterift.replay.statehead = prev;
- skaterift.replay.head = prev;
- skaterift.replay.cursor_frame = prev;
- skaterift.replay.cursor = prev->time;
- skaterift.replay_control = k_replay_control_scrub;
- skaterift.activity = k_skaterift_default;
- vg.time = prev->time;
- return;
+ if( prev ){
+ skaterift.replay_control = k_replay_control_resume;
+ skaterift.resume_target = prev;
+ skaterift.resume_begin = skaterift.replay.cursor;
+ skaterift.resume_transition = 0.0f;
+ }
}
}
}