+ trace_assert(id < rigid_bodies->capacity);
+
+ rigid_bodies->deleted[id] = true;
+}
+
+Rect rigid_bodies_hitbox(const RigidBodies *rigid_bodies,
+ RigidBodyId id)
+{
+ trace_assert(rigid_bodies);
+ trace_assert(id < rigid_bodies->count);
+
+ return rigid_bodies->bodies[id];
+}
+
+void rigid_bodies_move(RigidBodies *rigid_bodies,
+ RigidBodyId id,
+ Vec2f movement)
+{
+ trace_assert(rigid_bodies);
+ trace_assert(id < rigid_bodies->count);
+
+ if (rigid_bodies->deleted[id] || rigid_bodies->disabled[id]) {
+ return;
+ }
+
+ rigid_bodies->movements[id] = movement;
+}
+
+int rigid_bodies_touches_ground(const RigidBodies *rigid_bodies,
+ RigidBodyId id)
+{
+ trace_assert(rigid_bodies);
+ trace_assert(id < rigid_bodies->count);
+
+ return rigid_bodies->grounded[id];
+}
+
+void rigid_bodies_apply_omniforce(RigidBodies *rigid_bodies,
+ Vec2f force)
+{
+ for (size_t i = 0; i < rigid_bodies->count; ++i) {
+ rigid_bodies_apply_force(rigid_bodies, i, force);
+ }
+}
+
+void rigid_bodies_apply_force(RigidBodies * rigid_bodies,
+ RigidBodyId id,
+ Vec2f force)
+{
+ trace_assert(rigid_bodies);
+ trace_assert(id < rigid_bodies->count);
+
+ if (rigid_bodies->deleted[id] || rigid_bodies->disabled[id]) {
+ return;
+ }
+
+ rigid_bodies->forces[id] = vec_sum(rigid_bodies->forces[id], force);
+}
+
+void rigid_bodies_transform_velocity(RigidBodies *rigid_bodies,
+ RigidBodyId id,
+ mat3x3 trans_mat)
+{
+ trace_assert(rigid_bodies);
+ trace_assert(id < rigid_bodies->count);
+
+ if (rigid_bodies->deleted[id] || rigid_bodies->disabled[id]) {
+ return;
+ }
+
+ rigid_bodies->velocities[id] = point_mat3x3_product(
+ rigid_bodies->velocities[id],
+ trans_mat);
+}
+
+void rigid_bodies_teleport_to(RigidBodies *rigid_bodies,
+ RigidBodyId id,
+ Vec2f position)
+{
+ trace_assert(rigid_bodies);
+ trace_assert(id < rigid_bodies->count);
+
+ if (rigid_bodies->deleted[id] || rigid_bodies->disabled[id]) {
+ return;
+ }
+
+ rigid_bodies->bodies[id].x = position.x;
+ rigid_bodies->bodies[id].y = position.y;
+}
+
+void rigid_bodies_damper(RigidBodies *rigid_bodies,
+ RigidBodyId id,
+ Vec2f v)
+{
+ trace_assert(rigid_bodies);
+ trace_assert(id < rigid_bodies->count);
+
+ if (rigid_bodies->deleted[id] || rigid_bodies->disabled[id]) {
+ return;
+ }
+
+ rigid_bodies_apply_force(
+ rigid_bodies, id,
+ vec(
+ rigid_bodies->velocities[id].x * v.x,
+ rigid_bodies->velocities[id].y * v.y));
+}
+
+void rigid_bodies_disable(RigidBodies *rigid_bodies,
+ RigidBodyId id,
+ bool disabled)
+{
+ trace_assert(rigid_bodies);
+ trace_assert(id < rigid_bodies->count);
+
+ rigid_bodies->disabled[id] = disabled;