build system revision
[vg.git] / vg_rigidbody.h
1 #pragma once
2 /*
3 * Copyright (C) 2021-2024 Mt.ZERO Software - All Rights Reserved
4 *
5 * Rigidbody main file, related:
6 * vg_rigidbody_collision.h
7 * vg_rigidbody_constraints.h
8 */
9
10 #define k_friction 0.4f
11 #define k_damp_linear 0.1f /* scale velocity 1/(1+x) */
12 #define k_damp_angular 0.1f /* scale angular 1/(1+x) */
13 #define k_penetration_slop 0.01f
14 #define k_rb_inertia_scale 4.0f
15 #define k_phys_baumgarte 0.2f
16 #define k_gravity 9.6f
17 #define k_rb_density 8.0f
18
19 enum rb_shape {
20 k_rb_shape_none = 0,
21 k_rb_shape_box = 1,
22 k_rb_shape_sphere = 2,
23 k_rb_shape_capsule = 3,
24 };
25
26 typedef struct rigidbody rigidbody;
27 typedef struct rb_capsule rb_capsule;
28
29 struct rb_capsule
30 {
31 f32 h, r;
32 };
33
34 struct rigidbody
35 {
36 v3f co, v, w;
37 v4f q;
38
39 f32 inv_mass;
40
41 m3x3f iI, iIw; /* inertia model and inverse world tensor */
42 m4x3f to_world, to_local;
43 };
44
45 /*
46 * Initialize rigidbody inverse mass and inertia tensor with some common shapes
47 */
48 void rb_setbody_capsule( rigidbody *rb, f32 r, f32 h,
49 f32 density, f32 inertia_scale );
50 void rb_setbody_box( rigidbody *rb, boxf box, f32 density, f32 inertia_scale );
51 void rb_setbody_sphere( rigidbody *rb, f32 r, f32 density, f32 inertia_scale );
52
53 /*
54 * Update ALL matrices and tensors on rigidbody
55 */
56 void rb_update_matrices( rigidbody *rb );
57
58 /*
59 * Extrapolate rigidbody into a transform based on vg accumulator.
60 * Useful for rendering
61 */
62 void rb_extrapolate( rigidbody *rb, v3f co, v4f q );
63 void rb_iter( rigidbody *rb );
64 void rb_solve_gyroscopic( rigidbody *rb, m3x3f I, f32 h );
65
66 /*
67 * Creates relative contact velocity vector
68 */
69 void rb_rcv( rigidbody *rba, rigidbody *rbb, v3f ra, v3f rb, v3f rv );
70
71 /*
72 * Apply impulse to object
73 */
74 void rb_linear_impulse( rigidbody *rb, v3f delta, v3f impulse );
75
76 /*
77 * Effectors
78 */
79 void rb_effect_simple_bouyency( rigidbody *ra, v4f plane, f32 amt, f32 drag );
80 void rb_effect_spring_target_vector( rigidbody *rba, v3f ra, v3f rt,
81 f32 spring, f32 dampening, f32 timestep );