- player_copy_frame_animator( player, frame );
- _player_pose[ frame->system ]( player, &pose0 );
-
- player_copy_frame_animator( player, next );
- _player_pose[ next->system ]( player, &pose1 );
-
- v3_lerp( pose0.root_co, pose1.root_co, t, player->pose.root_co );
- q_nlerp( pose0.root_q, pose1.root_q, t, player->pose.root_q );
- player->pose.type = pose0.type;
- player->pose.board.lean = vg_lerpf( pose0.board.lean,
- pose1.board.lean, t );
-
- struct skeleton *sk = &player->playeravatar->sk;
- if( pose0.type != pose1.type ){
- /* it would be nice to apply IK pass in-keyframes. TOO BAD! */
- skeleton_copy_pose( sk, pose0.keyframes, player->pose.keyframes );
- }
- else {
- skeleton_lerp_pose( sk, pose0.keyframes, pose1.keyframes,
- t, player->pose.keyframes );
- }
+ struct player_subsystem_interface
+ *sys0 = player_subsystems[frame->system],
+ *sys1 = player_subsystems[next->system];
+
+ void *a0 = replay_frame_data( frame, k_replay_framedata_animator ),
+ *a1 = replay_frame_data( next, k_replay_framedata_animator );
+
+ sys0->pose( a0, &pose0 );
+ sys1->pose( a1, &pose1 );
+
+ lerp_player_pose( &pose0, &pose1, t, &localplayer.pose );