- u16 gamestates = 0;
- if( statedelta > k_gamestate_rate || force_gamestate /* or switching */ ){
- gamestates = 1;
- }
-
- if( (delta > k_replay_rate) || gamestates ){
- replay_frame *frame = replay_newframe( replay, gamestates, 0 );
- replay->cursor = vg.time;
- replay->cursor_frame = frame;
-
- player_animation *res = &frame->anim;
- v3_zero( res->root_co );
- q_identity( res->root_q );
- res->type = k_player_animation_type_absolute;
-
- struct skeleton *sk = &player->playeravatar->sk;
- skeleton_decompose_mtx_absolute( sk, res->pose );
-
- memcpy( &frame->board_pose, &player->board_pose,
- sizeof(player->board_pose) );
- frame->time = vg.time;
- v3_copy( player->cam.pos, frame->cam_pos );
- v3_copy( player->cam.angles, frame->cam_angles );
- frame->cam_fov = player->cam.fov;
-
- if( gamestates ){
- replay_gamestate *gs = replay_frame_gamestate( frame, 0 );
- gs->system = player->subsystem;
-
- if( player->subsystem == k_player_subsystem_walk ){
- memcpy( &gs->walk, &player->_walk.state,
- sizeof(struct player_walk_state) );
+ 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 );