+ }
+ }
+ else {
+ if( button_down( k_srbind_replay_play ) )
+ skaterift.replay_control = k_replay_control_play;
+ if( button_down( k_srbind_replay_freecam ) ){
+ skaterift.freecam = skaterift.freecam ^ 0x1;
+
+ 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;
+ if( button_press( k_srbind_reset ) )
+ target_speed += -2.0;
+
+ if( fabsf(target_speed) > 0.01f )
+ skaterift.replay_control = k_replay_control_scrub;
+
+ if( skaterift.replay_control == k_replay_control_play )
+ target_speed = 1.0;
+
+ vg_slewf( &skaterift.track_velocity, target_speed,
+ 18.0f*vg.time_frame_delta );
+
+ if( fabsf( skaterift.track_velocity ) > 0.0001f ){
+ f64 target = skaterift.replay.cursor;
+ target += skaterift.track_velocity * vg.time_frame_delta;
+
+ replay_seek( &skaterift.replay, target );
+ }
+
+ if( button_down( k_srbind_mback ) ){
+ if( skaterift.replay.statehead )
+ skaterift_restore_frame( skaterift.replay.statehead );
+ else
+ skaterift.activity = k_skaterift_default;
+ srinput.state = k_input_state_resume;
+ gui_helper_clear();
+ }
+
+ if( skaterift.freecam ){
+ camera *cam = &skaterift.replay_freecam;
+ v3f angles;
+ v3_copy( cam->angles, angles );
+ player_look( angles, 1.0f );
+
+ f32 decay = vg_maxf(0.0f,1.0f-vg.time_frame_delta*10.0f);
+
+ v3f d;
+ v3_sub( angles, cam->angles, d );
+ v3_muladds( skaterift.freecam_w, d, 20.0f, skaterift.freecam_w );
+ v3_muls( skaterift.freecam_w, decay, skaterift.freecam_w );
+ v3_muladds( cam->angles, skaterift.freecam_w, vg.time_frame_delta,
+ cam->angles );
+ cam->angles[1] = vg_clampf( cam->angles[1], -VG_PIf*0.5f,VG_PIf*0.5f);
+
+ camera_update_transform( cam );
+
+ v3f lookdir = { 0.0f, 0.0f, -1.0f },
+ sidedir = { 1.0f, 0.0f, 0.0f };
+
+ m3x3_mulv( cam->transform, lookdir, lookdir );
+ m3x3_mulv( cam->transform, sidedir, sidedir );
+
+ v2f input;
+ joystick_state( k_srjoystick_steer, input );
+ v2_muls( input, vg.time_frame_delta*6.0f*20.0f, input );
+
+ v3_muladds( skaterift.freecam_v, lookdir, -input[1],
+ skaterift.freecam_v );
+ v3_muladds( skaterift.freecam_v, sidedir, input[0],
+ skaterift.freecam_v );
+
+ v3_muls( skaterift.freecam_v, decay, skaterift.freecam_v );
+ v3_muladds( cam->pos,
+ skaterift.freecam_v, vg.time_frame_delta, cam->pos );
+ }
+ else {
+ if( button_down( k_srbind_replay_resume ) ){
+ skaterift_replay_resume();