diff --git a/include/rasteriser/rasteriser.h b/include/rasteriser/rasteriser.h new file mode 100644 index 0000000..7c6a071 --- /dev/null +++ b/include/rasteriser/rasteriser.h @@ -0,0 +1,9 @@ +#ifndef RASTERISER_H +#define RASTERISER_H + +#include "vector/vec.h" +#include "window/window.h" + +void draw_line(window_t *wnd, vec2i_t p0, vec2i_t p1, colour_t colour); + +#endif // !RASTERISER_H diff --git a/src/rasteriser/main.c b/src/rasteriser/main.c index 11ffbed..ccccd5b 100644 --- a/src/rasteriser/main.c +++ b/src/rasteriser/main.c @@ -1,7 +1,47 @@ -#include +#include "rasteriser/rasteriser.h" +#include "vector/vec.h" +#include "window/window.h" +#include +#include #include int main(void) { - printf("RASTERISER\n"); + colour_t bg = + (colour_t){.rgba.r = 27, .rgba.g = 38, .rgba.b = 79, .rgba.a = 255}; + window_t window = {0}; + + if (!init_window(&window, 800, 800, "CG From Scratch Rasteriser")) { + return EXIT_FAILURE; + } + + bool running = true; + SDL_Event event = {0}; + + // i32 w_min = ((i32)window.half_width) * -1; + // i32 w_max = (i32)window.half_width; + // i32 h_min = ((i32)window.half_height) * -1; + // i32 h_max = (i32)window.half_height; + + vec2i_t a = {.x = -300, .y = 0}; + vec2i_t b = {.x = 300, .y = 250}; + + while (running) { + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_QUIT: + running = false; + break; + } + } + + clear_window(&window, bg); + + draw_line(&window, a, b, (colour_t){.colour = 0xffffffff}); + + swap_buffers(&window); + } + + close_window(&window); + return EXIT_SUCCESS; } diff --git a/src/rasteriser/rasteriser.c b/src/rasteriser/rasteriser.c new file mode 100644 index 0000000..acfe74b --- /dev/null +++ b/src/rasteriser/rasteriser.c @@ -0,0 +1,22 @@ +#include "c_cpp_aliases/aliases.h" +#include "vector/vec.h" +#include "window/window.h" + +void draw_line(window_t *wnd, vec2i_t p0, vec2i_t p1, colour_t colour) { + if (p1.x < p0.x) { + vec_swap(vec2i_t, p0, p1); + } + + i32 x0 = p0.x; + i32 y0 = p0.y; + i32 x1 = p1.x; + i32 y1 = p1.y; + + f32 a = ((f32)y1 - y0) / ((f32)x1 - x0); + f32 y = y0; + + for (i32 x = x0; x <= x1; ++x) { + set_pixel(wnd, x, (i32)y, colour); + y += a; + } +}