9 #include "system/stacktrace.h"
11 typedef enum Rect_side {
29 Rect horizontal_thicc_line(float x1, float x2, float y, float thiccness);
30 Rect vertical_thicc_line(float y1, float y2, float x, float thiccness);
32 Rect rect(float x, float y, float w, float h);
33 Rect rect_from_vecs(Vec2f position, Vec2f size);
34 Rect rect_from_points(Vec2f p1, Vec2f p2);
35 Rect rect_from_sdl(const SDL_Rect *rect);
37 Rect rects_overlap_area(Rect rect1, Rect rect2);
40 Rect rect_boundary2(Rect rect1, Rect rect2)
42 return rect_from_points(
44 fminf(rect1.x, rect2.x),
45 fminf(rect1.y, rect2.y)),
47 fmaxf(rect1.x + rect1.w, rect2.x + rect2.w),
48 fmaxf(rect1.y + rect1.h, rect2.y + rect2.h)));
51 static inline Vec2f rect_position(Rect rect)
53 return vec(rect.x, rect.y);
56 static inline Vec2f rect_position2(Rect rect)
58 return vec(rect.x + rect.w, rect.y + rect.h);
61 static inline Rect rect_pad(Rect rect, float d)
70 int rect_contains_point(Rect rect, Vec2f p);
72 int rects_overlap(Rect rect1, Rect rect2);
74 void rect_object_impact(Rect object,
78 Line rect_side(Rect rect, Rect_side side);
80 Rect rect_from_point(Vec2f p, float w, float h);
82 float line_length(Line line);
84 SDL_Rect rect_for_sdl(Rect rect);
86 Vec2f rect_center(Rect rect);
88 Vec2f rect_snap(Rect pivot, Rect *rect);
89 Vec2f rect_impulse(Rect *r1, Rect *r2);
92 float rect_side_distance(Rect rect, Vec2f point, Rect_side side)
95 case RECT_SIDE_LEFT: {
96 return fabsf(rect.x - point.x);
99 case RECT_SIDE_RIGHT: {
100 return fabsf((rect.x + rect.w) - point.x);
103 case RECT_SIDE_TOP: {
104 return fabsf(rect.y - point.y);
107 case RECT_SIDE_BOTTOM: {
108 return fabsf((rect.y + rect.h) - point.y);
112 trace_assert(0 && "Incorrect rect side");
120 int segment_overlap(Vec2f a, Vec2f b)
134 return a.y >= b.x && b.y >= a.x;
138 int snap_var(float *x, // the value we are snapping
139 float y, // the target we are snapping x to
140 float xo, // x offset
141 float yo, // y offset
142 float st) // snap threshold
144 if (fabsf((*x + xo) - (y + yo)) < st) {
152 int snap_var2seg(float *x, float y,
156 // note: do not use || because we do *not* want short-circuiting, so use |.
157 return snap_var(x, y, xo, 0, st) | snap_var(x, y, xo, yo, st);
161 void snap_seg2seg(float *x, float y, float xo, float yo, float st)
163 snap_var(x, y, 0, 0, st);
164 snap_var(x, y, 0, yo, st);
165 snap_var(x, y, xo, 0, st);
166 snap_var(x, y, xo, yo, st);