1 module nudge;
2 
3 extern (C++,nudge) {
4     struct Arena {
5         void* data;
6         size_t size;
7     }
8 
9     struct Transform {
10         float[3] position;
11         uint body;
12         float[4] rotation;
13     }
14 
15     struct BodyProperties {
16         float[3] inertia_inverse;
17         float mass_inverse;
18     }
19 
20     struct BodyMomentum {
21         float[3] velocity;
22         float unused0;
23         float[3] angular_velocity;
24         float unused1;
25     }
26 
27     struct SphereCollider {
28         float radius;
29     }
30 
31     struct BoxCollider {
32         float[3] size;
33         float unused;
34     }
35 
36     struct Contact {
37         float[3] position;
38         float penetration;
39         float[3] normal;
40         float friction;
41     }
42 
43     struct BodyPair {
44         ushort a;
45         ushort b;
46     }
47 
48     struct ContactData {
49         Contact* data;
50         BodyPair* bodies;
51         ulong* tags;
52         uint capacity;
53         uint count;
54 
55         uint* sleeping_pairs;
56         uint sleeping_count;
57     }
58 
59     struct ColliderDataBoxes {
60         uint* tags;
61         BoxCollider* data;
62         Transform* transforms;
63         uint count;
64     }
65 
66     struct ColliderDataSpheres {
67         uint* tags;
68         SphereCollider* data;
69         Transform* transforms;
70         uint count;
71     }
72 
73     struct ColliderData {
74         ColliderDataBoxes boxes;
75         ColliderDataSpheres spheres;
76     }
77 
78     struct BodyData {
79         Transform* transforms;
80         BodyProperties* properties;
81         BodyMomentum* momentum;
82         ubyte* idle_counters;
83         uint count;
84     }
85 
86     struct BodyConnections {
87         BodyPair* data;
88         uint count;
89     }
90 
91     struct CachedContactImpulse {
92         float[3] impulse;
93         float unused;
94     }
95 
96     struct ContactCache {
97         ulong* tags;
98         CachedContactImpulse* data;
99         uint capacity;
100         uint count;
101     }
102 
103     struct ActiveBodies {
104         ushort* indices;
105         uint capacity;
106         uint count;
107     }
108 
109     struct ContactImpulseData;
110     struct ContactConstraintData;
111 
112     void collide(ActiveBodies* active_bodies, ContactData* contacts, BodyData bodies,
113             ColliderData colliders, BodyConnections body_connections, Arena temporary);
114 
115     ContactImpulseData* read_cached_impulses(ContactCache contact_cache,
116             ContactData contacts, Arena* memory);
117 
118     void write_cached_impulses(ContactCache* contact_cache,
119             ContactData contacts, ContactImpulseData* contact_impulses);
120 
121     ContactConstraintData* setup_contact_constraints(ActiveBodies active_bodies,
122             ContactData contacts, BodyData bodies,
123             ContactImpulseData* contact_impulses, Arena* memory);
124 
125     void apply_impulses(ContactConstraintData* data, BodyData bodies);
126 
127     void update_cached_impulses(ContactConstraintData* data, ContactImpulseData* contact_impulses);
128 
129     void advance(ActiveBodies active_bodies, BodyData bodies, float time_step);
130 }