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 }