seperate gamestate and animator memory (BREAKS: SMOOTHED UPPER YAW)
[carveJwlIkooP6JGAAIwe30JlM.git] / player_render.c
index ba50fc1402b0e55ce11a491865c321a824d5c398..283b2510e4f0db097d20cfc3ed343775e71b6c9a 100644 (file)
@@ -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 );