]> git.lizzy.rs Git - nothing.git/blob - src/math/rect.h
Merge pull request #1089 from tsoding/vec
[nothing.git] / src / math / rect.h
1 #ifndef RECT_H_
2 #define RECT_H_
3
4 #include <SDL.h>
5 #include <math.h>
6
7 #include "math/vec.h"
8
9 typedef enum Rect_side {
10     RECT_SIDE_LEFT = 0,
11     RECT_SIDE_RIGHT,
12     RECT_SIDE_TOP,
13     RECT_SIDE_BOTTOM,
14
15     RECT_SIDE_N
16 } Rect_side;
17
18 typedef struct Rect {
19     float x, y, w, h;
20 } Rect;
21
22 typedef struct Line {
23     Vec2f p1;
24     Vec2f p2;
25 } Line;
26
27 Rect horizontal_thicc_line(float x1, float x2, float y, float thiccness);
28 Rect vertical_thicc_line(float y1, float y2, float x, float thiccness);
29
30 Rect rect(float x, float y, float w, float h);
31 Rect rect_from_vecs(Vec2f position, Vec2f size);
32 Rect rect_from_points(Vec2f p1, Vec2f p2);
33 Rect rect_from_sdl(const SDL_Rect *rect);
34
35 Rect rects_overlap_area(Rect rect1, Rect rect2);
36
37 static inline
38 Rect rect_boundary2(Rect rect1, Rect rect2)
39 {
40     return rect_from_points(
41         vec(
42             fminf(rect1.x, rect2.x),
43             fminf(rect1.y, rect2.y)),
44         vec(
45             fmaxf(rect1.x + rect1.w, rect2.x + rect2.w),
46             fmaxf(rect1.y + rect1.h, rect2.y + rect2.h)));
47 }
48
49 static inline Vec2f rect_position(Rect rect)
50 {
51     return vec(rect.x, rect.y);
52 }
53
54 static inline Rect rect_scale(Rect rect, float d)
55 {
56     rect.x -= d;
57     rect.y -= d;
58     rect.w += d * 2.0f;
59     rect.h += d * 2.0f;
60     return rect;
61 }
62
63 int rect_contains_point(Rect rect, Vec2f p);
64
65 int rects_overlap(Rect rect1, Rect rect2);
66
67 void rect_object_impact(Rect object,
68                         Rect obstacle,
69                         int *sides);
70
71 Line rect_side(Rect rect, Rect_side side);
72
73 Rect rect_from_point(Vec2f p, float w, float h);
74
75 float line_length(Line line);
76
77 SDL_Rect rect_for_sdl(Rect rect);
78
79 Vec2f rect_center(Rect rect);
80
81 Vec2f rect_snap(Rect pivot, Rect *rect);
82 Vec2f rect_impulse(Rect *r1, Rect *r2);
83
84 #endif  // RECT_H_