8 Rect rect(float x, float y, float w, float h)
20 Rect rect_from_vecs(Point position, Vec size)
22 return rect(position.x, position.y, size.x, size.y);
25 Rect rect_from_sdl(const SDL_Rect *rect)
37 Rect rects_overlap_area(Rect rect1, Rect rect2)
39 float x1 = fmaxf(rect1.x, rect2.x);
40 float y1 = fmaxf(rect1.y, rect2.y);
41 float x2 = fminf(rect1.x + rect1.w, rect2.x + rect2.w);
42 float y2 = fminf(rect1.y + rect1.h, rect2.y + rect2.h);
47 .w = fmaxf(0.0f, x2 - x1),
48 .h = fmaxf(0.0f, y2 - y1)
53 int rects_overlap(Rect rect1, Rect rect2)
55 return rect1.x + rect1.w >= rect2.x
56 && rect2.x + rect2.w >= rect1.x
57 && rect2.y + rect2.h >= rect1.y
58 && rect1.y + rect1.h >= rect2.y;
61 float line_length(Line line)
63 float dx = line.p1.x - line.p2.x;
64 float dy = line.p1.y - line.p2.y;
65 return sqrtf(dx * dx + dy * dy);
68 void rect_object_impact(Rect object, Rect obstacle, int *sides)
72 Rect int_area = rects_overlap_area(object, obstacle);
74 if (int_area.w * int_area.h > 0.0f) {
75 for (int side = 0; side < RECT_SIDE_N; ++side) {
76 Line object_side = rect_side(object, side);
77 Line int_side = rect_side(int_area, side);
79 if (line_length(int_side) > 10.0f) {
80 sides[side] = sides[side] ||
81 (fabs(object_side.p1.x - object_side.p2.x) < 1e-6
82 && fabs(object_side.p1.x - int_side.p1.x) < 1e-6
83 && fabs(object_side.p1.x - int_side.p2.x) < 1e-6)
84 || (fabs(object_side.p1.y - object_side.p2.y) < 1e-6
85 && fabs(object_side.p1.y - int_side.p1.y) < 1e-6
86 && fabs(object_side.p1.y - int_side.p2.y) < 1e-6);
92 Line rect_side(Rect rect, Rect_side side)
94 const float x1 = rect.x;
95 const float y1 = rect.y;
96 const float x2 = rect.x + rect.w;
97 const float y2 = rect.y + rect.h;
108 case RECT_SIDE_RIGHT:
120 case RECT_SIDE_BOTTOM:
132 Rect rect_from_point(Point p, float w, float h)
144 int rect_contains_point(Rect rect, Point p)
146 return rect.x <= p.x && p.x <= rect.x + rect.w
147 && rect.y <= p.y && p.y <= rect.y + rect.h;
150 SDL_Rect rect_for_sdl(Rect rect)
152 const SDL_Rect result = {
153 .x = (int) roundf(rect.x),
154 .y = (int) roundf(rect.y),
155 .w = (int) roundf(rect.w),
156 .h = (int) roundf(rect.h)