- skeleton_lerp_pose( sk, ground_pose, air_pose, player.ffly, apose );
-
- /* additive effects */
- apose[player.mdl.id_hip-1].co[0] += offset[0];
- apose[player.mdl.id_hip-1].co[2] += offset[2];
- apose[player.mdl.id_ik_hand_l-1].co[0] += offset[0];
- apose[player.mdl.id_ik_hand_l-1].co[2] += offset[2];
- apose[player.mdl.id_ik_hand_r-1].co[0] += offset[0];
- apose[player.mdl.id_ik_hand_r-1].co[2] += offset[2];
- apose[player.mdl.id_ik_elbow_l-1].co[0] += offset[0];
- apose[player.mdl.id_ik_elbow_l-1].co[2] += offset[2];
- apose[player.mdl.id_ik_elbow_r-1].co[0] += offset[0];
- apose[player.mdl.id_ik_elbow_r-1].co[2] += offset[2];
-
- skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_defer_ik );
- skeleton_apply_ik_pass( &player.mdl.sk );
- skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_deffered_only );
-
- v3_copy( player.mdl.sk.final_mtx[player.mdl.id_head-1][3],
- player.mdl.cam_pos );
- skeleton_apply_inverses( &player.mdl.sk );
- skeleton_apply_transform( &player.mdl.sk, player.rb.to_world );
-
- skeleton_debug( &player.mdl.sk );
-}
-
-static void player_camera_update(void)
-{
- /* Update camera matrices */
- m4x3_identity( player.camera );
- m4x3_rotate_y( player.camera, -player.angles[0] );
- m4x3_rotate_x( player.camera, -player.angles[1] );
- v3_copy( player.camera_pos, player.camera[3] );
- m4x3_invert_affine( player.camera, player.camera_inverse );
-}
-
-static void player_animate_death_cam(void)
-{
- v3f delta;
- v3f head_pos;
- v3_copy( player.mdl.ragdoll[0].rb.co, head_pos );
+ for( int i=0; (i<10)&&(player.rewind_time>0.0f)&&(budget>0.0f); i ++ )
+ {
+ /* Interpolate frames */
+ int i0 = floorf( player.rewind_time ),
+ i1 = VG_MIN( i0+1, player.rewind_length-1 );
+
+ struct rewind_frame *fr = &player.rewind_buffer[i0],
+ *fr1 = &player.rewind_buffer[i1];
+
+ float dist = vg_maxf( v3_dist( fr->pos, fr1->pos ), 0.001f ),
+ subl = vg_fractf( player.rewind_time ) + 0.001f,
+
+ sramp= 3.0f-(1.0f/(0.4f+0.4f*player.rewind_time)),
+ speed = sramp*28.0f + 0.5f*player.rewind_time,
+ mod = speed * (budget / dist),
+
+ advl = vg_minf( mod, subl ),
+ advt = (advl / mod) * budget;
+
+ player.dist_accum += speed * advt;
+ player.rewind_time -= advl;
+ budget -= advt;
+ }