+int rigid_bodies_collide(RigidBodies *rigid_bodies,
+ const Platforms *platforms)
+{
+ memset(rigid_bodies->grounded, 0, sizeof(bool) * rigid_bodies->count);
+
+ if (rigid_bodies->count == 0) {
+ return 0;
+ }
+
+ int sides[RECT_SIDE_N] = { 0, 0, 0, 0 };
+
+
+ int t = 100;
+ int the_variable_that_gets_set_when_a_collision_happens_xd = 1;
+ while (t-- > 0 && the_variable_that_gets_set_when_a_collision_happens_xd) {
+ the_variable_that_gets_set_when_a_collision_happens_xd = 0;
+
+ for (size_t i1 = 0; i1 < rigid_bodies->count; ++i1) {
+ if (rigid_bodies->deleted[i1] || rigid_bodies->disabled[i1]) {
+ continue;
+ }
+
+ // Platforms
+ memset(sides, 0, sizeof(int) * RECT_SIDE_N);
+
+ platforms_touches_rect_sides(platforms, rigid_bodies->bodies[i1], sides);
+
+ for (int i = 0; i < RECT_SIDE_N; ++i) {
+ if (sides[i]) {
+ the_variable_that_gets_set_when_a_collision_happens_xd = 1;
+ }
+ }
+
+ if (sides[RECT_SIDE_BOTTOM]) {
+ rigid_bodies->grounded[i1] = true;
+ }
+
+ Vec2f v = platforms_snap_rect(platforms, &rigid_bodies->bodies[i1]);
+ rigid_bodies->velocities[i1] = vec_entry_mult(rigid_bodies->velocities[i1], v);
+ rigid_bodies->movements[i1] = vec_entry_mult(rigid_bodies->movements[i1], v);
+ rigid_bodies_damper(rigid_bodies, i1, vec_entry_mult(v, vec(-16.0f, 0.0f)));
+
+ if (i1 >= rigid_bodies->count - 1) {
+ continue;
+ }
+
+ // Self-collision
+ for (size_t i2 = i1 + 1; i2 < rigid_bodies->count; ++i2) {
+ if (rigid_bodies->deleted[i2] || rigid_bodies->disabled[i1]) {
+ continue;
+ }
+
+ if (!rects_overlap(rigid_bodies->bodies[i1], rigid_bodies->bodies[i2])) {
+ continue;
+ }
+
+ the_variable_that_gets_set_when_a_collision_happens_xd = 1;
+
+ Vec2f orient = rect_impulse(&rigid_bodies->bodies[i1], &rigid_bodies->bodies[i2]);
+
+ if (orient.x > orient.y) {
+ if (rigid_bodies->bodies[i1].y < rigid_bodies->bodies[i2].y) {
+ rigid_bodies->grounded[i1] = true;
+ } else {
+ rigid_bodies->grounded[i2] = true;
+ }
+ }
+
+ rigid_bodies->velocities[i1] = vec(rigid_bodies->velocities[i1].x * orient.x, rigid_bodies->velocities[i1].y * orient.y);
+ rigid_bodies->velocities[i2] = vec(rigid_bodies->velocities[i2].x * orient.x, rigid_bodies->velocities[i2].y * orient.y);
+ rigid_bodies->movements[i1] = vec(rigid_bodies->movements[i1].x * orient.x, rigid_bodies->movements[i1].y * orient.y);
+ rigid_bodies->movements[i2] = vec(rigid_bodies->movements[i2].x * orient.x, rigid_bodies->movements[i2].y * orient.y);
+ }
+ }
+ }
+
+ return 0;
+}
+