diff --git a/include/window.h b/include/window.h index 71a55ec..fb4cca5 100644 --- a/include/window.h +++ b/include/window.h @@ -8,6 +8,7 @@ #include typedef struct point point; +typedef point vec2; typedef struct line line; typedef struct triangle triangle; typedef struct quad quad; @@ -67,13 +68,15 @@ bool init_window(window *wnd, const char *title, u32 width, u32 height, i32 x, void cleanup_window(window *wnd); void clear_window(const window *wnd, colour colour); void swap_buffers(const window *wnd); + void draw_point(const window *wnd, point p, colour colour); void draw_line(const window *wnd, const line *ln, colour colour); void draw_triangle(const window *wnd, triangle triangle, colour colour); -void fill_triangle(const window *wnd, triangle triangle, colour colour); void draw_quad(const window *wnd, quad qd, colour colour); -void fill_quad(const window *wnd, quad qd, colour colour); void draw_rect(const window *wnd, rect rec, colour colour); + +void fill_triangle(const window *wnd, triangle triangle, colour colour); +void fill_quad(const window *wnd, quad qd, colour colour); void fill_rect(const window *wnd, rect rec, colour colour); #endif // !WINDOW_H diff --git a/src/window.c b/src/window.c index 49acefd..f843ec7 100644 --- a/src/window.c +++ b/src/window.c @@ -6,6 +6,8 @@ #include #include +INTERNAL inline bool inside_triangle(triangle tri, point p); + bool init_window(window *wnd, const char *title, u32 width, u32 height, i32 x, i32 y) { i32 pos_x = x >= 0 ? x : SDL_WINDOWPOS_CENTERED; @@ -90,21 +92,24 @@ void draw_triangle(const window *wnd, triangle triangle, colour colour) { draw_line(wnd, &ln2, colour); } -INTERNAL inline bool inside_triangle(triangle tri, point p) { - // Based on the following video: - // https://www.youtube.com/watch?v=HYAgJN3x4GA - f32 cy_min_ay = tri.p2.y - tri.p0.y; - f32 cx_min_ax = tri.p2.x - tri.p0.x; - f32 by_min_ay = tri.p1.y - tri.p0.y; - f32 bx_min_ax = tri.p1.x - tri.p0.x; +void draw_rect(const window *wnd, rect rec, colour colour) { + set_colour(wnd, colour); - f32 w1 = - (tri.p0.x * cy_min_ay + (p.y - tri.p0.y) * cx_min_ax - p.x * cy_min_ay) / - (by_min_ay * cx_min_ax - bx_min_ax * cy_min_ay); + SDL_Rect dst = {rec.topleft.x, rec.topleft.y, rec.w, rec.h}; - f32 w2 = (p.y - tri.p0.y - w1 * by_min_ay) / cy_min_ay; + SDL_RenderDrawRect(wnd->renderer, &dst); +} - return w1 >= 0.0f && w2 >= 0.0f && (w1 + w2) <= 1.0f; +void draw_quad(const window *wnd, quad qd, colour colour) { + line l0 = (line){qd.p0, qd.p1}; + line l1 = (line){qd.p1, qd.p3}; + line l2 = (line){qd.p3, qd.p2}; + line l3 = (line){qd.p2, qd.p0}; + + draw_line(wnd, &l0, colour); + draw_line(wnd, &l1, colour); + draw_line(wnd, &l2, colour); + draw_line(wnd, &l3, colour); } void fill_triangle(const window *wnd, triangle tri, colour colour) { @@ -134,16 +139,12 @@ void fill_triangle(const window *wnd, triangle tri, colour colour) { } } -void draw_quad(const window *wnd, quad qd, colour colour) { - line l0 = (line){qd.p0, qd.p1}; - line l1 = (line){qd.p1, qd.p3}; - line l2 = (line){qd.p3, qd.p2}; - line l3 = (line){qd.p2, qd.p0}; +void fill_rect(const window *wnd, rect rec, colour colour) { + set_colour(wnd, colour); - draw_line(wnd, &l0, colour); - draw_line(wnd, &l1, colour); - draw_line(wnd, &l2, colour); - draw_line(wnd, &l3, colour); + SDL_Rect dst = {rec.topleft.x, rec.topleft.y, rec.w, rec.h}; + + SDL_RenderFillRect(wnd->renderer, &dst); } void fill_quad(const window *wnd, quad qd, colour colour) { @@ -154,18 +155,19 @@ void fill_quad(const window *wnd, quad qd, colour colour) { fill_triangle(wnd, t1, colour); } -void draw_rect(const window *wnd, rect rec, colour colour) { - set_colour(wnd, colour); +INTERNAL inline bool inside_triangle(triangle tri, point p) { + // Based on the following video: + // https://www.youtube.com/watch?v=HYAgJN3x4GA + f32 cy_min_ay = tri.p2.y - tri.p0.y; + f32 cx_min_ax = tri.p2.x - tri.p0.x; + f32 by_min_ay = tri.p1.y - tri.p0.y; + f32 bx_min_ax = tri.p1.x - tri.p0.x; - SDL_Rect dst = {rec.topleft.x, rec.topleft.y, rec.w, rec.h}; + f32 w1 = + (tri.p0.x * cy_min_ay + (p.y - tri.p0.y) * cx_min_ax - p.x * cy_min_ay) / + (by_min_ay * cx_min_ax - bx_min_ax * cy_min_ay); - SDL_RenderDrawRect(wnd->renderer, &dst); -} - -void fill_rect(const window *wnd, rect rec, colour colour) { - set_colour(wnd, colour); - - SDL_Rect dst = {rec.topleft.x, rec.topleft.y, rec.w, rec.h}; - - SDL_RenderFillRect(wnd->renderer, &dst); + f32 w2 = (p.y - tri.p0.y - w1 * by_min_ay) / cy_min_ay; + + return w1 >= 0.0f && w2 >= 0.0f && (w1 + w2) <= 1.0f; }