}
VG_STATIC void player__animate( player_instance *player ){
- if( _player_animate[ player->subsystem ] ){
- player_animation res;
- res.type = k_player_animation_type_fk;
+ if( _player_animate[ player->subsystem ] &&
+ _player_pose[ player->subsystem ] ){
+ _player_animate[ player->subsystem ]( player );
+ _player_pose[ player->subsystem ]( player );
- _player_animate[ player->subsystem ]( player, &res );
+ player_pose *pose = &player->pose;
m4x3f transform;
- q_m3x3( res.root_q, transform );
- v3_copy( res.root_co, transform[3] );
+ q_m3x3( pose->root_q, transform );
+ v3_copy( pose->root_co, transform[3] );
struct skeleton *sk = &player->playeravatar->sk;
if( player->holdout_time > 0.0f ){
- skeleton_lerp_pose( sk, res.pose, player->holdout_pose,
- player->holdout_time, res.pose );
+ skeleton_lerp_pose( sk,
+ pose->keyframes, player->holdout_pose.keyframes,
+ player->holdout_time, pose->keyframes );
player->holdout_time -= vg.time_frame_delta * 2.0f;
}
- if( res.type == k_player_animation_type_fk ){
- skeleton_apply_pose( sk, res.pose, k_anim_apply_defer_ik );
+ if( pose->type == k_player_pose_type_fk ){
+ skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_defer_ik );
skeleton_apply_ik_pass( sk );
- skeleton_apply_pose( sk, res.pose, k_anim_apply_deffered_only );
+ skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_deffered_only );
skeleton_apply_inverses( sk );
skeleton_apply_transform( sk, transform );
}
else {
- skeleton_apply_pose( sk, res.pose, k_anim_apply_absolute );
+ skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_absolute );
}
skeleton_debug( sk );
VG_STATIC void player__animate_from_replay( player_instance *player,
replay_buffer *replay ){
/* TODO: holdout blending (from when the game has to slow down) */
-
- player_animation res;
replay_frame *frame = replay->cursor_frame,
*next = NULL;
+ player_pose *pose = &player->pose;
+
if( frame ){
next = frame->r;
f32 t = replay_subframe_time( replay );
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 );
- }
- else {
- memcpy( &res, &frame->anim, sizeof(frame->anim) );
- memcpy( &frame->board_pose, &player->board_pose,
- sizeof(player->board_pose) );
+ 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 );
}
+ else
+ memcpy( pose, &frame->pose, sizeof(frame->pose) );
}
else return;
struct skeleton *sk = &player->playeravatar->sk;
- skeleton_apply_pose( sk, res.pose, k_anim_apply_absolute );
+ skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_absolute );
}
VG_STATIC void player__pre_render( player_instance *player ){
VG_STATIC void render_board( camera *cam, world_instance *world,
struct player_board *board, m4x3f root,
- struct board_pose *pose,
+ struct player_board_pose *pose,
enum board_shader shader )
{
if( !board ) return;
render_board( cam, world, board, player->playeravatar->sk.final_mtx[
player->playeravatar->id_board],
- &player->board_pose,
+ &player->pose.board,
k_board_shader_player );
SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );