7fff465d8766ebd61858bc33fd3061c564b6d61c
1 #ifndef PLAYER_RAGDOLL_H
2 #define PLAYER_RAGDOLL_H
6 static float k_ragdoll_floatyiness
= 10.0f
,
7 k_ragdoll_floatydrag
= 1.0f
;
10 * Setup ragdoll colliders
12 static void player_init_ragdoll( mdl_header
*src
)
14 struct player_model
*mdl
= &player
.mdl
;
16 if( !mdl
->sk
.collider_count
)
18 mdl
->ragdoll_count
= 0;
22 mdl
->ragdoll
= vg_alloc(sizeof(struct ragdoll_part
)*mdl
->sk
.collider_count
);
23 mdl
->ragdoll_count
= 0;
25 for( u32 i
=0; i
<mdl
->sk
.bone_count
; i
++ )
27 struct skeleton_bone
*bone
= &mdl
->sk
.bones
[i
];
31 struct ragdoll_part
*rp
= &mdl
->ragdoll
[ mdl
->ragdoll_count
++ ];
35 v3_sub( bone
->hitbox
[1], bone
->hitbox
[0], delta
);
36 v3_muls( delta
, 0.5f
, delta
);
38 v3_add( bone
->hitbox
[0], delta
, rp
->offset
);
40 v3_copy( delta
, rp
->rb
.bbx
[1] );
41 v3_muls( delta
, -1.0f
, rp
->rb
.bbx
[0] );
43 q_identity( rp
->rb
.q
);
44 v3_add( bone
->co
, rp
->offset
, rp
->rb
.co
);
45 rp
->rb
.type
= k_rb_shape_box
;
47 rp
->parent
= 0xffffffff;
51 for( u32 j
=0; j
<mdl
->ragdoll_count
; j
++ )
53 if( mdl
->ragdoll
[ j
].bone_id
== bone
->parent
)
61 /* TODO: refactor to use this style elswhere */
62 struct mdl_node
*pnode
= mdl_node_from_id( src
, bone
->orig_node
);
63 struct classtype_bone
*bone_inf
= mdl_get_entdata( src
, pnode
);
65 rp
->use_limits
= bone_inf
->use_limits
;
66 v3_copy( bone_inf
->angle_limits
[0], rp
->limits
[0] );
67 v3_copy( bone_inf
->angle_limits
[1], rp
->limits
[1] );
75 * Make the player model copy the ragdoll
77 static void player_model_copy_ragdoll(void)
79 struct player_model
*mdl
= &player
.mdl
;
81 for( int i
=0; i
<mdl
->ragdoll_count
; i
++ )
83 struct ragdoll_part
*part
= &mdl
->ragdoll
[i
];
85 m3x3_identity(offset
);
86 v3_negate( part
->offset
, offset
[3] );
87 m4x3_mul( part
->rb
.to_world
, offset
, mdl
->sk
.final_mtx
[part
->bone_id
] );
90 skeleton_apply_inverses( &mdl
->sk
);
94 * Make the ragdoll copy the player model
96 static void player_ragdoll_copy_model( v3f v
)
98 struct player_model
*mdl
= &player
.mdl
;
100 for( int i
=0; i
<mdl
->ragdoll_count
; i
++ )
102 struct ragdoll_part
*part
= &mdl
->ragdoll
[i
];
105 u32 bone
= part
->bone_id
;
107 m4x3_mulv( mdl
->sk
.final_mtx
[bone
], mdl
->sk
.bones
[bone
].co
, pos
);
108 m3x3_mulv( mdl
->sk
.final_mtx
[bone
], part
->offset
, offset
);
109 v3_add( pos
, offset
, part
->rb
.co
);
110 m3x3_q( mdl
->sk
.final_mtx
[bone
], part
->rb
.q
);
111 v3_copy( v
, part
->rb
.v
);
112 v3_zero( part
->rb
.w
);
114 rb_update_transform( &part
->rb
);
119 * Draw rigidbody colliders for ragdoll
121 static void player_debug_ragdoll(void)
123 struct player_model
*mdl
= &player
.mdl
;
125 for( u32 i
=0; i
<mdl
->ragdoll_count
; i
++ )
126 rb_debug( &mdl
->ragdoll
[i
].rb
, 0xff00ff00 );
130 * Ragdoll physics step
132 static void player_ragdoll_iter(void)
134 struct player_model
*mdl
= &player
.mdl
;
137 for( int i
=0; i
<mdl
->ragdoll_count
; i
++ )
138 rb_collide( &mdl
->ragdoll
[i
].rb
, &world
.rb_geo
);
140 rb_presolve_contacts( rb_contact_buffer
, rb_contact_count
);
145 float shoe_vel
[2] = {0.0f
,0.0f
};
146 for( int i
=0; i
<2; i
++ )
148 shoe_vel
[i
] = v3_length( mdl
->ragdoll
[i
].rb
.v
);
151 for( int j
=0; j
<mdl
->ragdoll_count
; j
++ )
153 struct ragdoll_part
*pj
= &mdl
->ragdoll
[j
];
154 struct skeleton_bone
*bj
= &mdl
->sk
.bones
[pj
->bone_id
];
156 if( pj
->parent
!= 0xffffffff )
158 struct ragdoll_part
*pp
= &mdl
->ragdoll
[pj
->parent
];
159 struct skeleton_bone
*bp
= &mdl
->sk
.bones
[pp
->bone_id
];
162 v3_negate( pj
->offset
, lca
);
163 v3_add( bp
->co
, pp
->offset
, lcb
);
164 v3_sub( bj
->co
, lcb
, lcb
);
166 rb_debug_constraint_position( &pj
->rb
, lca
, &pp
->rb
, lcb
);
170 rb_debug_constraint_limits( &pj
->rb
, &pp
->rb
, lca
, pj
->limits
);
174 v4f plane
= {0.0f
,1.0f
,0.0f
,0.0f
};
175 rb_effect_simple_bouyency( &pj
->rb
, plane
, k_ragdoll_floatyiness
,
176 k_ragdoll_floatydrag
);
180 for( int i
=0; i
<10; i
++ )
182 rb_solve_contacts( rb_contact_buffer
, rb_contact_count
);
184 for( int j
=0; j
<mdl
->ragdoll_count
; j
++ )
186 struct ragdoll_part
*pj
= &mdl
->ragdoll
[j
];
187 struct skeleton_bone
*bj
= &mdl
->sk
.bones
[pj
->bone_id
];
189 if( (pj
->parent
!= 0xffffffff) && pj
->use_limits
)
191 struct ragdoll_part
*pp
= &mdl
->ragdoll
[pj
->parent
];
192 struct skeleton_bone
*bp
= &mdl
->sk
.bones
[pp
->bone_id
];
195 v3_negate( pj
->offset
, lca
);
196 v3_add( bp
->co
, pp
->offset
, lcb
);
197 v3_sub( bj
->co
, lcb
, lcb
);
199 rb_constraint_position( &pj
->rb
, lca
, &pp
->rb
, lcb
);
201 rb_constraint_limits( &pj
->rb
, lca
, &pp
->rb
, lcb
, pj
->limits
);
207 for( int i
=0; i
<mdl
->ragdoll_count
; i
++ )
208 rb_iter( &mdl
->ragdoll
[i
].rb
);
211 for( int i
=0; i
<mdl
->ragdoll_count
; i
++ )
212 rb_update_transform( &mdl
->ragdoll
[i
].rb
);
215 #endif /* PLAYER_RAGDOLL_H */