9 rect_t rect(float x, float y, float w, float h)
11 const rect_t result = {
21 rect_t rect_from_vecs(point_t position, vec_t size)
23 return rect(position.x, position.y, size.x, size.y);
26 rect_t rect_from_sdl(const SDL_Rect *rect)
28 const rect_t result = {
38 rect_t rects_overlap_area(rect_t rect1, rect_t rect2)
40 float x1 = fmaxf(rect1.x, rect2.x);
41 float y1 = fmaxf(rect1.y, rect2.y);
42 float x2 = fminf(rect1.x + rect1.w, rect2.x + rect2.w);
43 float y2 = fminf(rect1.y + rect1.h, rect2.y + rect2.h);
48 .w = fmaxf(0.0f, x2 - x1),
49 .h = fmaxf(0.0f, y2 - y1)
54 int rects_overlap(rect_t rect1, rect_t rect2)
56 return rect1.x + rect1.w >= rect2.x
57 && rect2.x + rect2.w >= rect1.x
58 && rect2.y + rect2.h >= rect1.y
59 && rect1.y + rect1.h >= rect2.y;
62 float line_length(line_t line)
64 float dx = line.p1.x - line.p2.x;
65 float dy = line.p1.y - line.p2.y;
66 return sqrtf(dx * dx + dy * dy);
69 void rect_object_impact(const rect_t *object,
70 const rect_t *obstacle,
77 rect_t int_area = rects_overlap_area(*object, *obstacle);
79 if (int_area.w * int_area.h > 0.0f) {
80 for (int side = 0; side < RECT_SIDE_N; ++side) {
81 line_t object_side = rect_side(*object, side);
82 line_t int_side = rect_side(int_area, side);
84 if (line_length(int_side) > 10.0f) {
85 sides[side] = sides[side] ||
86 (fabs(object_side.p1.x - object_side.p2.x) < 1e-6
87 && fabs(object_side.p1.x - int_side.p1.x) < 1e-6
88 && fabs(object_side.p1.x - int_side.p2.x) < 1e-6)
89 || (fabs(object_side.p1.y - object_side.p2.y) < 1e-6
90 && fabs(object_side.p1.y - int_side.p1.y) < 1e-6
91 && fabs(object_side.p1.y - int_side.p2.y) < 1e-6);
97 line_t rect_side(rect_t rect, rect_side_t side)
99 const float x1 = rect.x;
100 const float y1 = rect.y;
101 const float x2 = rect.x + rect.w;
102 const float y2 = rect.y + rect.h;
113 case RECT_SIDE_RIGHT:
125 case RECT_SIDE_BOTTOM:
137 rect_t rect_from_point(point_t p, float w, float h)
149 int rect_contains_point(rect_t rect, point_t p)
151 return rect.x <= p.x && p.x <= rect.x + rect.w
152 && rect.y <= p.y && p.y <= rect.y + rect.h;
155 SDL_Rect rect_for_sdl(rect_t rect)
157 const SDL_Rect result = {
158 .x = (int) roundf(rect.x),
159 .y = (int) roundf(rect.y),
160 .w = (int) roundf(rect.w),
161 .h = (int) roundf(rect.h)