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