6 VG_STATIC
void player__dead_update ( player_instance
*player
)
8 player_ragdoll_iter( &player
->ragdoll
);
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 ];
18 rb_extrapolate( &part
->obj
.rb
, ext_co
, ext_q
);
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
);
24 v3_copy( d
->co_lpf
, player
->rb
.co
);
25 v3_zero( player
->rb
.v
);
26 v3_zero( player
->rb
.w
);
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
;
36 m4x3f transforms
[ 32 ];
39 q_m3x3( player
->rb
.q
, transforms
[0] );
40 v3_copy( player
->rb
.co
, transforms
[0][3] );
42 v4_copy( player
->rb
.q
, animator
->transforms
[0].q
);
43 v3_copy( player
->rb
.co
, animator
->transforms
[0].co
);
45 /* colliders with bones transforms */
46 for( int i
=0; i
<rd
->part_count
; i
++ ){
47 struct ragdoll_part
*part
= &rd
->parts
[i
];
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
);
60 v3_copy( co_int
, mtx
[3] );
62 m4x3_mul( mtx
, part
->inv_collider_mtx
, transforms
[part
->bone_id
] );
65 /* bones without colliders transforms */
66 for( u32 i
=1; i
<sk
->bone_count
; i
++ ){
67 struct skeleton_bone
*sb
= &sk
->bones
[i
];
69 if( sb
->parent
&& !sb
->collider
){
71 v3_sub( sk
->bones
[i
].co
, sk
->bones
[sb
->parent
].co
, delta
);
74 m3x3_identity( posemtx
);
75 v3_copy( delta
, posemtx
[3] );
78 m4x3_mul( transforms
[sb
->parent
], posemtx
, transforms
[i
] );
83 for( u32 i
=1; i
<sk
->bone_count
; i
++ ){
84 struct skeleton_bone
*sb
= &sk
->bones
[i
];
86 v3_zero( animator
->transforms
[i
].co
);
87 q_identity( animator
->transforms
[i
].q
);
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
);
96 m4x3_mul( inverse
, transforms
[i
], local
);
97 m4x3_decompose( local
, animator
->transforms
[i
].co
,
98 animator
->transforms
[i
].q
, _s
);
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
;
109 pose
->type
= k_player_pose_type_fk_2
;
110 pose
->board
.lean
= 0.0f
;
112 v3_copy( animator
->transforms
[0].co
, pose
->root_co
);
113 v4_copy( animator
->transforms
[0].q
, pose
->root_q
);
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
);
122 VG_STATIC
void player__dead_post_animate( player_instance
*player
){
123 player
->cam_velocity_influence
= 1.0f
;
126 VG_STATIC
void player__dead_im_gui ( player_instance
*player
){
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
,
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
);
143 #endif /* PLAYER_DEAD_C */