seperation of body initialization, glider model
[carveJwlIkooP6JGAAIwe30JlM.git] / player_ragdoll.h
1 #ifndef PLAYER_RAGDOLL_H
2 #define PLAYER_RAGDOLL_H
3
4 #include "player_api.h"
5 #include "skeleton.h"
6 #include "rigidbody.h"
7 #include "player_render.h"
8
9 struct player_ragdoll{
10 struct ragdoll_part{
11 u32 bone_id;
12
13 /* Collider transform relative to bone */
14 m4x3f collider_mtx,
15 inv_collider_mtx;
16
17 v4f prev_q;
18 v3f prev_co;
19
20 u32 use_limits;
21 v3f limits[2];
22
23 u32 parent;
24 u32 colour;
25
26 rigidbody rb;
27 enum bone_collider type;
28
29 union {
30 rb_capsule capsule;
31 boxf box;
32 }
33 inf;
34 }
35 parts[32];
36 u32 part_count;
37
38 rb_constr_pos position_constraints[32];
39 u32 position_constraints_count;
40
41 rb_constr_swingtwist cone_constraints[32];
42 u32 cone_constraints_count;
43
44 /* TODO: Fix duplicated data */
45 u32 constraint_associations[32][2];
46 int shoes[2];
47 };
48
49 static float k_ragdoll_floatyiness = 20.0f,
50 k_ragdoll_floatydrag = 1.0f,
51 k_ragdoll_limit_scale = 1.0f,
52 k_ragdoll_spring = 127.0f,
53 k_ragdoll_dampening = 15.0f,
54 k_ragdoll_correction = 0.5f,
55 k_ragdoll_angular_drag = 0.08f,
56 k_ragdoll_active_threshold = 5.0f;
57
58 static int k_ragdoll_div = 1,
59 ragdoll_frame = 0,
60 k_ragdoll_debug_collider = 1,
61 k_ragdoll_debug_constraints = 0;
62
63 enum player_die_type {
64 k_player_die_type_generic,
65 k_player_die_type_head,
66 k_player_die_type_feet
67 };
68
69 static void player_ragdoll_init(void);
70 static void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
71 struct ragdoll_part *rp );
72 static u32 ragdoll_bone_parent( struct player_ragdoll *rd, u32 bone_id );
73 static void setup_ragdoll_from_skeleton( struct skeleton *sk,
74 struct player_ragdoll *rd );
75 static void copy_ragdoll_pose_to_localplayer( struct player_ragdoll *rd );
76 static void copy_localplayer_to_ragdoll( struct player_ragdoll *rd,
77 enum player_die_type type );
78
79 static void player_debug_ragdoll(void);
80 static void player_ragdoll_iter( struct player_ragdoll *rd );
81
82 #endif /* PLAYER_RAGDOLL_H */