Reorganise window functions
This commit is contained in:
parent
afd09d7742
commit
bdb4a52771
@ -8,6 +8,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef struct point point;
|
typedef struct point point;
|
||||||
|
typedef point vec2;
|
||||||
typedef struct line line;
|
typedef struct line line;
|
||||||
typedef struct triangle triangle;
|
typedef struct triangle triangle;
|
||||||
typedef struct quad quad;
|
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 cleanup_window(window *wnd);
|
||||||
void clear_window(const window *wnd, colour colour);
|
void clear_window(const window *wnd, colour colour);
|
||||||
void swap_buffers(const window *wnd);
|
void swap_buffers(const window *wnd);
|
||||||
|
|
||||||
void draw_point(const window *wnd, point p, colour colour);
|
void draw_point(const window *wnd, point p, colour colour);
|
||||||
void draw_line(const window *wnd, const line *ln, colour colour);
|
void draw_line(const window *wnd, const line *ln, colour colour);
|
||||||
void draw_triangle(const window *wnd, triangle triangle, 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 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 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);
|
void fill_rect(const window *wnd, rect rec, colour colour);
|
||||||
|
|
||||||
#endif // !WINDOW_H
|
#endif // !WINDOW_H
|
||||||
|
68
src/window.c
68
src/window.c
@ -6,6 +6,8 @@
|
|||||||
#include <SDL2/SDL_video.h>
|
#include <SDL2/SDL_video.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
INTERNAL inline bool inside_triangle(triangle tri, point p);
|
||||||
|
|
||||||
bool init_window(window *wnd, const char *title, u32 width, u32 height, i32 x,
|
bool init_window(window *wnd, const char *title, u32 width, u32 height, i32 x,
|
||||||
i32 y) {
|
i32 y) {
|
||||||
i32 pos_x = x >= 0 ? x : SDL_WINDOWPOS_CENTERED;
|
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);
|
draw_line(wnd, &ln2, colour);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERNAL inline bool inside_triangle(triangle tri, point p) {
|
void draw_rect(const window *wnd, rect rec, colour colour) {
|
||||||
// Based on the following video:
|
set_colour(wnd, colour);
|
||||||
// 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;
|
|
||||||
|
|
||||||
f32 w1 =
|
SDL_Rect dst = {rec.topleft.x, rec.topleft.y, rec.w, rec.h};
|
||||||
(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);
|
|
||||||
|
|
||||||
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) {
|
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) {
|
void fill_rect(const window *wnd, rect rec, colour colour) {
|
||||||
line l0 = (line){qd.p0, qd.p1};
|
set_colour(wnd, colour);
|
||||||
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);
|
SDL_Rect dst = {rec.topleft.x, rec.topleft.y, rec.w, rec.h};
|
||||||
draw_line(wnd, &l1, colour);
|
|
||||||
draw_line(wnd, &l2, colour);
|
SDL_RenderFillRect(wnd->renderer, &dst);
|
||||||
draw_line(wnd, &l3, colour);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_quad(const window *wnd, quad qd, colour colour) {
|
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);
|
fill_triangle(wnd, t1, colour);
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_rect(const window *wnd, rect rec, colour colour) {
|
INTERNAL inline bool inside_triangle(triangle tri, point p) {
|
||||||
set_colour(wnd, colour);
|
// 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);
|
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;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user