X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_render.c;h=283b2510e4f0db097d20cfc3ed343775e71b6c9a;hb=09fc72b08113fa157a3abb2ded6086babedd10cf;hp=ba50fc1402b0e55ce11a491865c321a824d5c398;hpb=f1fe55f957a3dbdb6ca20a696f0c1171e2d5e7ca;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_render.c b/player_render.c index ba50fc1..283b251 100644 --- a/player_render.c +++ b/player_render.c @@ -139,33 +139,35 @@ VG_STATIC void player_model_unload( struct player_model *board ){ } 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 ); @@ -180,11 +182,11 @@ VG_STATIC void player__animate( player_instance *player ){ 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; @@ -192,23 +194,21 @@ VG_STATIC void player__animate_from_replay( player_instance *player, 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 ){ @@ -234,7 +234,7 @@ 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; @@ -425,7 +425,7 @@ PLAYER_API void player__render( camera *cam, player_instance *player ){ 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 );