- 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) );
- }
- else if( player->subsystem == k_player_subsystem_skate ){
- memcpy( &gs->skate, &player->_skate.state,
- sizeof(struct player_skate_state) );
- }
-
- memcpy( &gs->rb, &player->rb, sizeof(rigidbody) );
- memcpy( &gs->cam_control, &player->cam_control,
- sizeof(struct player_cam_controller) );
- v3_copy( player->angles, gs->angles );
- }
+ v3_lerp( pose0->root_co, pose1->root_co, t, posed->root_co );
+ q_nlerp( pose0->root_q, pose1->root_q, t, posed->root_q );
+ posed->type = pose0->type;
+ posed->board.lean = vg_lerpf( pose0->board.lean, pose1->board.lean, t );
+
+ if( pose0->type != pose1->type ){
+ /* it would be nice to apply IK pass in-keyframes. TOO BAD! */
+ skeleton_copy_pose( sk, pose0->keyframes, posed->keyframes );
+ }
+ else {
+ skeleton_lerp_pose( sk, pose0->keyframes, pose1->keyframes, t,
+ posed->keyframes );