move everything to animator based
[carveJwlIkooP6JGAAIwe30JlM.git] / player_dead.c
1 #ifndef PLAYER_DEAD_C
2 #define PLAYER_DEAD_C
3
4 #include "player.h"
5
6 VG_STATIC void player__dead_update ( player_instance *player )
7 {
8 player_ragdoll_iter( &player->ragdoll );
9 }
10
11 VG_STATIC void player__dead_post_update( player_instance *player ){
12 struct player_dead *d = &player->_dead;
13 struct player_avatar *av = player->playeravatar;
14 struct ragdoll_part *part = &player->ragdoll.parts[ av->id_hip-1 ];
15
16 v3f ext_co;
17 v4f ext_q;
18 rb_extrapolate( &part->obj.rb, ext_co, ext_q );
19
20 v3_lerp( d->co_lpf, ext_co, vg.time_frame_delta*4.0f, d->co_lpf );
21 v3_lerp( d->v_lpf, part->obj.rb.v, vg.time_frame_delta*4.0f, d->v_lpf );
22 v3_lerp( d->w_lpf, part->obj.rb.w, vg.time_frame_delta*4.0f, d->w_lpf );
23
24 v3_copy( d->co_lpf, player->rb.co );
25 v3_zero( player->rb.v );
26 v3_zero( player->rb.w );
27 }
28
29 VG_STATIC void player__dead_animate( player_instance *player ){
30 struct player_dead *d = &player->_dead;
31 struct player_dead_animator *animator = &d->animator;
32 struct player_ragdoll *rd = &player->ragdoll;
33 struct player_avatar *av = player->playeravatar;
34 struct skeleton *sk = &av->sk;
35
36 m4x3f transforms[ 32 ];
37
38 /* root transform */
39 q_m3x3( player->rb.q, transforms[0] );
40 v3_copy( player->rb.co, transforms[0][3] );
41
42 v4_copy( player->rb.q, animator->transforms[0].q );
43 v3_copy( player->rb.co, animator->transforms[0].co );
44
45 /* colliders with bones transforms */
46 for( int i=0; i<rd->part_count; i++ ){
47 struct ragdoll_part *part = &rd->parts[i];
48
49 m4x3f mtx;
50
51 v4f q_int;
52 v3f co_int;
53
54 float substep = vg.time_fixed_extrapolate;
55 v3_lerp( part->prev_co, part->obj.rb.co, substep, co_int );
56 q_nlerp( part->prev_q, part->obj.rb.q, substep, q_int );
57 v4_copy( part->obj.rb.q, q_int );
58
59 q_m3x3( q_int, mtx );
60 v3_copy( co_int, mtx[3] );
61
62 m4x3_mul( mtx, part->inv_collider_mtx, transforms[part->bone_id] );
63 }
64
65 /* bones without colliders transforms */
66 for( u32 i=1; i<sk->bone_count; i++ ){
67 struct skeleton_bone *sb = &sk->bones[i];
68
69 if( sb->parent && !sb->collider ){
70 v3f delta;
71 v3_sub( sk->bones[i].co, sk->bones[sb->parent].co, delta );
72
73 m4x3f posemtx;
74 m3x3_identity( posemtx );
75 v3_copy( delta, posemtx[3] );
76
77 /* final matrix */
78 m4x3_mul( transforms[sb->parent], posemtx, transforms[i] );
79 }
80 }
81
82 /* measurements */
83 for( u32 i=1; i<sk->bone_count; i++ ){
84 struct skeleton_bone *sb = &sk->bones[i];
85
86 v3_zero( animator->transforms[i].co );
87 q_identity( animator->transforms[i].q );
88
89 m4x3f parent, inverse, local;
90 m3x3_identity( parent );
91 v3_sub( sk->bones[i].co, sk->bones[sb->parent].co, parent[3] );
92 m4x3_mul( transforms[ sb->parent ], parent, parent );
93 m4x3_invert_affine( parent, inverse );
94
95 v3f _s;
96 m4x3_mul( inverse, transforms[i], local );
97 m4x3_decompose( local, animator->transforms[i].co,
98 animator->transforms[i].q, _s );
99 }
100 }
101
102 VG_STATIC void player__dead_pose( player_instance *player, player_pose *pose ){
103 struct player_dead *d = &player->_dead;
104 struct player_dead_animator *animator = &d->animator;
105 struct player_ragdoll *rd = &player->ragdoll;
106 struct player_avatar *av = player->playeravatar;
107 struct skeleton *sk = &av->sk;
108
109 pose->type = k_player_pose_type_fk_2;
110 pose->board.lean = 0.0f;
111
112 v3_copy( animator->transforms[0].co, pose->root_co );
113 v4_copy( animator->transforms[0].q, pose->root_q );
114
115 for( u32 i=1; i<sk->bone_count; i++ ){
116 v3_copy( animator->transforms[i].co, pose->keyframes[i-1].co );
117 v4_copy( animator->transforms[i].q, pose->keyframes[i-1].q );
118 v3_fill( pose->keyframes[i-1].s, 1.0f );
119 }
120 }
121
122 VG_STATIC void player__dead_post_animate( player_instance *player ){
123 player->cam_velocity_influence = 1.0f;
124 }
125
126 VG_STATIC void player__dead_im_gui ( player_instance *player ){
127
128 }
129
130 VG_STATIC void player__dead_transition ( player_instance *player ){
131 player->subsystem = k_player_subsystem_dead;
132 copy_avatar_pose_to_ragdoll( player->playeravatar, &player->ragdoll,
133 player->rb.v );
134
135 struct player_avatar *av = player->playeravatar;
136 struct ragdoll_part *part = &player->ragdoll.parts[ av->id_hip-1 ];
137 struct player_dead *d = &player->_dead;
138 v3_copy( part->obj.rb.co, d->co_lpf );
139 v3_copy( part->obj.rb.v, d->v_lpf );
140 v3_copy( part->obj.rb.w, d->w_lpf );
141 }
142
143 #endif /* PLAYER_DEAD_C */