+ /* 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_resume(void){
+ replay_frame *prev = replay_find_recent_stateframe(&skaterift.replay);
+
+ if( prev ){
+ skaterift.replay_control = k_replay_control_resume;
+ skaterift.resume_target = prev;
+ skaterift.resume_begin = skaterift.replay.cursor;
+ skaterift.resume_transition = 0.0f;
+ }
+}
+
+VG_STATIC void skaterift_replay_pre_update(void){
+ if( skaterift.activity != k_skaterift_replay ) return;
+
+ 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 {
+ f64 target = vg_lerp( skaterift.resume_begin,
+ skaterift.resume_target->time,
+ vg_smoothstepf( skaterift.resume_transition ) );
+ replay_seek( &skaterift.replay, target );
+ }
+ }
+ }
+ else {
+ if( button_down( k_srbind_replay_play ) )
+ skaterift.replay_control = k_replay_control_play;
+
+ f32 target_speed = axis_state( k_sraxis_replay_h ) * 5.0;
+ if( button_press( k_srbind_reset ) )
+ target_speed += -2.0;
+
+ if( fabsf(target_speed) > 0.01f )