-void rigid_rect_collide_with_rect(rigid_rect_t * rigid_rect,
- rect_t rect)
-{
- int sides[RECT_SIDE_N] = { 0, 0, 0, 0 };
-
- const rect_t object = rect_from_vecs(rigid_rect->position, rigid_rect->size);
- rect_object_impact(&object, &rect, sides);
-
- if (sides[RECT_SIDE_BOTTOM]) {
- rigid_rect->touches_ground = 1;
- }
-
- vec_t opposing_force = opposing_force_by_sides(sides);
-
- for (int i = 0; i < 1000 && vec_length(opposing_force) > 1e-6; ++i) {
- rigid_rect->position = vec_sum(
- rigid_rect->position,
- vec_scala_mult(
- opposing_force,
- 1e-2f));
-
- if (fabs(opposing_force.x) > 1e-6 && (opposing_force.x < 0.0f) != ((rigid_rect->velocity.x + rigid_rect->movement.x) < 0.0f)) {
- rigid_rect->velocity.x = 0.0f;
- rigid_rect->movement.x = 0.0f;
- }
-
- if (fabs(opposing_force.y) > 1e-6 && (opposing_force.y < 0.0f) != ((rigid_rect->velocity.y + rigid_rect->movement.y) < 0.0f)) {
- rigid_rect->velocity.y = 0.0f;
- rigid_rect->movement.y = 0.0f;
- }
-
- rect_object_impact(&object, &rect, sides);
- opposing_force = opposing_force_by_sides(sides);
- }
-}
-