- struct skeleton *sk = &player->playeravatar->sk;
- skeleton_lerp_pose(sk, frame->anim.pose, next->anim.pose, t, res.pose);
- v3_lerp( frame->anim.root_co, next->anim.root_co, t, res.root_co );
- q_nlerp( frame->anim.root_q, next->anim.root_q, t, res.root_q );
- res.type = k_player_animation_type_absolute;
- player->board_pose.lean = vg_lerpf( frame->board_pose.lean,
- next->board_pose.lean, t );
+ player_pose pose0, pose1;
+
+ 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 );
+
+ v3_lerp( pose0.root_co, pose1.root_co, t, localplayer.pose.root_co );
+ q_nlerp( pose0.root_q, pose1.root_q, t, localplayer.pose.root_q );
+ localplayer.pose.type = pose0.type;
+ localplayer.pose.board.lean = vg_lerpf( pose0.board.lean,
+ pose1.board.lean, t );
+
+ struct skeleton *sk = &localplayer.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,
+ localplayer.pose.keyframes );
+ }
+ else {
+ skeleton_lerp_pose( sk, pose0.keyframes, pose1.keyframes,
+ t, localplayer.pose.keyframes );
+ }