diff --git a/include/rasteriser/rasteriser.h b/include/rasteriser/rasteriser.h index f3054e5..3cf639c 100644 --- a/include/rasteriser/rasteriser.h +++ b/include/rasteriser/rasteriser.h @@ -13,6 +13,14 @@ typedef struct { vec2i_t p1; } line_t; +typedef struct { + vec2i_t p0; + vec2i_t p1; + vec2i_t p2; +} triangle_t; + +void draw_wireframe_triangle(window_t *wnd, triangle_t triangle, + colour_t colour); void draw_line(window_t *wnd, line_t line, colour_t colour); #endif // !RASTERISER_H diff --git a/src/rasteriser/main.c b/src/rasteriser/main.c index 617b579..0d9738d 100644 --- a/src/rasteriser/main.c +++ b/src/rasteriser/main.c @@ -23,23 +23,12 @@ int main(void) { // i32 h_min = ((i32)window.half_height) * -1; // i32 h_max = (i32)window.half_height; - line_t lines[] = { - (line_t){ - (vec2i_t){.x = -300, .y = 0}, - (vec2i_t){.x = 300, .y = 250}, - }, - (line_t){ - (vec2i_t){.x = -200, .y = -100}, - (vec2i_t){.x = 240, .y = 120}, - }, - (line_t){ - (vec2i_t){.x = -50, .y = -200}, - (vec2i_t){.x = 60, .y = 240}, - }, + triangle_t triangle = { + .p0 = {-200, -250}, + .p1 = {200, 50}, + .p2 = {20, 250}, }; - u32 count = ARR_LEN(lines); - while (running) { while (SDL_PollEvent(&event)) { switch (event.type) { @@ -51,9 +40,8 @@ int main(void) { clear_window(&window, bg); - for (u32 i = 0; i < count; ++i) { - draw_line(&window, lines[i], (colour_t){.colour = 0xffffffff}); - } + draw_wireframe_triangle(&window, triangle, + (colour_t){.colour = 0xffffffff}); swap_buffers(&window); } diff --git a/src/rasteriser/rasteriser.c b/src/rasteriser/rasteriser.c index 2b5aaa3..da68e02 100644 --- a/src/rasteriser/rasteriser.c +++ b/src/rasteriser/rasteriser.c @@ -9,19 +9,26 @@ internal list_float_t *interpolate(i32 i0, f32 d0, i32 i1, f32 d1); -void draw_line(window_t *wnd, line_t line, colour_t colour) { - i32 x0 = line.p0.x; - i32 y0 = line.p0.y; - i32 x1 = line.p1.x; - i32 y1 = line.p1.y; +void draw_wireframe_triangle(window_t *wnd, triangle_t triangle, + colour_t colour) { + draw_line(wnd, (line_t){triangle.p0, triangle.p1}, colour); + draw_line(wnd, (line_t){triangle.p1, triangle.p2}, colour); + draw_line(wnd, (line_t){triangle.p2, triangle.p0}, colour); +} +void draw_line(window_t *wnd, line_t line, colour_t colour) { list_float_t *values = NULL; - if (abs(x1 - x0) > abs(y1 - y0)) { + if (abs(line.p1.x - line.p0.x) > abs(line.p1.y - line.p0.y)) { if (line.p1.x < line.p0.x) { vec_swap(vec2i_t, line.p0, line.p1); } + i32 x0 = line.p0.x; + i32 y0 = line.p0.y; + i32 x1 = line.p1.x; + i32 y1 = line.p1.y; + values = interpolate(x0, y0, x1, y1); if (!values) { return; @@ -35,6 +42,11 @@ void draw_line(window_t *wnd, line_t line, colour_t colour) { vec_swap(vec2i_t, line.p0, line.p1); } + i32 x0 = line.p0.x; + i32 y0 = line.p0.y; + i32 x1 = line.p1.x; + i32 y1 = line.p1.y; + values = interpolate(y0, x0, y1, x1); if (!values) { return;