- struct skeleton *sk = &player->playeravatar->sk;
- skeleton_lerp_pose( sk, frame->pose.keyframes, next->pose.keyframes,
- t, pose->keyframes );
- v3_lerp( frame->pose.root_co, next->pose.root_co, t, pose->root_co );
- q_nlerp( frame->pose.root_q, next->pose.root_q, t, pose->root_q );
- pose->type = k_player_pose_type_absolute;
- pose->board.lean = vg_lerpf( frame->pose.board.lean,
- next->pose.board.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 );
+ }
+ }
+ else{
+ struct player_subsystem_interface
+ *sys = player_subsystems[frame->system];
+ sys->pose( replay_frame_data( frame, k_replay_framedata_animator ),
+ &localplayer.pose );