unlock rendering
[carveJwlIkooP6JGAAIwe30JlM.git] / player_dead.c
index acb434aba50fae7f72cce65c633bbc287dd7bfa4..78cce2fb76614b6698cf01ed03bcaf11c63e295e 100644 (file)
@@ -8,27 +8,9 @@ VG_STATIC void player__dead_update      ( player_instance *player )
    player_ragdoll_iter( &player->ragdoll );
 }
 
-VG_STATIC void player__dead_animate     ( player_instance *player, 
-                                          player_animation *anim )
-{
-   v3_zero( anim->root_co );
-   q_identity( anim->root_q );
-   
-   for( int i=0; i<vg_list_size( anim->pose ); i ++ ){
-      v3_zero( anim->pose[i].co );
-      v3_fill( anim->pose[i].s, 1.0f );
-      q_identity( anim->pose[i].q );
-   }
-}
-
-VG_STATIC void player__dead_post_animate( player_instance *player )
-{
+VG_STATIC void player__dead_post_update( player_instance *player ){
+   struct player_dead *d  = &player->_dead;
    struct player_avatar *av = player->playeravatar;
-   struct player_dead   *d  = &player->_dead;
-
-   copy_ragdoll_pose_to_avatar( &player->ragdoll, player->playeravatar );
-   player->cam_velocity_influence = 1.0f;
-
    struct ragdoll_part *part = &player->ragdoll.parts[ av->id_hip-1 ];
 
    v3f ext_co;
@@ -44,13 +26,108 @@ VG_STATIC void player__dead_post_animate( player_instance *player )
    v3_zero( player->rb.w );
 }
 
-VG_STATIC void player__dead_im_gui      ( player_instance *player )
-{
+VG_STATIC void player__dead_animate( player_instance *player ){
+   struct player_dead *d  = &player->_dead;
+   struct player_dead_animator *animator = &d->animator;
+   struct player_ragdoll *rd = &player->ragdoll;
+   struct player_avatar *av = player->playeravatar;
+   struct skeleton *sk = &av->sk;
+
+   m4x3f transforms[ 32 ];
+
+   /* root transform */
+   q_m3x3( player->rb.q, transforms[0] );
+   v3_copy( player->rb.co, transforms[0][3] );
+
+   v4_copy( player->rb.q, animator->transforms[0].q );
+   v3_copy( player->rb.co, animator->transforms[0].co );
+
+   /* colliders with bones transforms */
+   for( int i=0; i<rd->part_count; i++ ){
+      struct ragdoll_part *part = &rd->parts[i];
+
+      m4x3f mtx;
+
+      v4f q_int;
+      v3f co_int;
+
+      float substep = vg.time_fixed_extrapolate;
+      v3_lerp( part->prev_co, part->obj.rb.co, substep, co_int );
+      q_nlerp( part->prev_q, part->obj.rb.q, substep, q_int );
+      v4_copy( part->obj.rb.q, q_int );
+
+      q_m3x3( q_int, mtx );
+      v3_copy( co_int, mtx[3] );
+
+      m4x3_mul( mtx, part->inv_collider_mtx, transforms[part->bone_id] );
+   }
+
+   /* bones without colliders transforms */
+   for( u32 i=1; i<sk->bone_count; i++ ){
+      struct skeleton_bone *sb = &sk->bones[i];
 
+      if( sb->parent && !sb->collider ){
+         v3f delta;
+         v3_sub( sk->bones[i].co, sk->bones[sb->parent].co, delta );
+
+         m4x3f posemtx;
+         m3x3_identity( posemtx );
+         v3_copy( delta, posemtx[3] );
+
+         /* final matrix */
+         m4x3_mul( transforms[sb->parent], posemtx, transforms[i] );
+      }
+   }
+
+   /* measurements */
+   for( u32 i=1; i<sk->bone_count; i++ ){
+      struct skeleton_bone *sb = &sk->bones[i];
+
+      v3_zero( animator->transforms[i].co );
+      q_identity( animator->transforms[i].q );
+
+      m4x3f parent, inverse, local;
+      m3x3_identity( parent );
+      v3_sub( sk->bones[i].co, sk->bones[sb->parent].co, parent[3] );
+      m4x3_mul( transforms[ sb->parent ], parent, parent );
+      m4x3_invert_affine( parent, inverse );
+
+      v3f _s;
+      m4x3_mul( inverse, transforms[i], local );
+      m4x3_decompose( local, animator->transforms[i].co, 
+                             animator->transforms[i].q, _s );
+   }
 }
 
-VG_STATIC void player__dead_transition  ( player_instance *player )
-{
+VG_STATIC void player__dead_pose( player_instance *player, player_pose *pose ){
+   struct player_dead *d  = &player->_dead;
+   struct player_dead_animator *animator = &d->animator;
+   struct player_ragdoll *rd = &player->ragdoll;
+   struct player_avatar *av = player->playeravatar;
+   struct skeleton *sk = &av->sk;
+
+   pose->type = k_player_pose_type_fk_2;
+   pose->board.lean = 0.0f;
+
+   v3_copy( animator->transforms[0].co, pose->root_co );
+   v4_copy( animator->transforms[0].q, pose->root_q );
+
+   for( u32 i=1; i<sk->bone_count; i++ ){
+      v3_copy( animator->transforms[i].co, pose->keyframes[i-1].co );
+      v4_copy( animator->transforms[i].q, pose->keyframes[i-1].q );
+      v3_fill( pose->keyframes[i-1].s, 1.0f );
+   }
+}
+
+VG_STATIC void player__dead_post_animate( player_instance *player ){
+   player->cam_velocity_influence = 1.0f;
+}
+
+VG_STATIC void player__dead_im_gui      ( player_instance *player ){
+
+}
+
+VG_STATIC void player__dead_transition  ( player_instance *player ){
    player->subsystem = k_player_subsystem_dead;
    copy_avatar_pose_to_ragdoll( player->playeravatar, &player->ragdoll, 
                                 player->rb.v );