diff --git a/include/window/window.h b/include/window/window.h index b769112..d0b2370 100644 --- a/include/window/window.h +++ b/include/window/window.h @@ -7,10 +7,17 @@ #include typedef struct { - u8 r; - u8 g; - u8 b; u8 a; + u8 b; + u8 g; + u8 r; +} rgba_t; + +typedef struct { + union { + rgba_t rgba; + u32 colour; + }; } colour_t; typedef struct { diff --git a/src/raytracer/main.c b/src/raytracer/main.c index 6dd409a..6cb6a77 100644 --- a/src/raytracer/main.c +++ b/src/raytracer/main.c @@ -31,7 +31,8 @@ colour_t trace_ray(vec3f_t origin, vec3f_t direction, f32 t_min, f32 t_max, const scene_t *scene, colour_t default_colour); i32 main(i32 argc, char *argv[]) { - colour_t bg = (colour_t){.r = 27, .g = 38, .b = 79, .a = 255}; + colour_t bg = + (colour_t){.rgba.r = 27, .rgba.g = 38, .rgba.b = 79, .rgba.a = 255}; vec3f_t camera = {.x = 0.0f, .y = 0.0f, .z = 0.0f}; vec3f_t viewport = {.x = 1.0f, .y = 1.0f, .z = 1.0f}; @@ -48,17 +49,23 @@ i32 main(i32 argc, char *argv[]) { (sphere_t){ .radius = 1.0f, .centre = (vec3f_t){.x = 0.0f, .y = -1.0f, .z = 3.0f}, - .colour = (colour_t){.r = 245, .g = 238, .b = 158, .a = 255}, + .colour = + (colour_t){ + .rgba.r = 245, .rgba.g = 238, .rgba.b = 158, .rgba.a = 255}, }, (sphere_t){ .radius = 1.0f, .centre = (vec3f_t){.x = -2.0f, .y = 0.0f, .z = 4.0f}, - .colour = (colour_t){.r = 59, .g = 142, .b = 165, .a = 255}, + .colour = + (colour_t){ + .rgba.r = 59, .rgba.g = 142, .rgba.b = 165, .rgba.a = 255}, }, (sphere_t){ .radius = 1.0f, .centre = (vec3f_t){.x = 2.0f, .y = 0.0f, .z = 4.0f}, - .colour = (colour_t){.r = 171, .g = 52, .b = 40, .a = 255}, + .colour = + (colour_t){ + .rgba.r = 171, .rgba.g = 52, .rgba.b = 40, .rgba.a = 255}, }, }; diff --git a/src/window/window.c b/src/window/window.c index 035f1d0..81308b3 100644 --- a/src/window/window.c +++ b/src/window/window.c @@ -8,7 +8,6 @@ #include #include -u32 colour_to_u32(colour_t colour); u32 index_from_coordinates(window_t *wnd, u32 x, u32 y); i32 denormalise(i32 value, u32 max, u32 abs_half); vec2i_t denormalised_coords(const window_t *wnd, i32 x, i32 y); @@ -92,13 +91,11 @@ void close_window(window_t *wnd) { void clear_window(window_t *wnd, colour_t colour) { SDL_LockSurface(wnd->back_buffer); - u32 c = colour_to_u32(colour); - u32 *pixels = (u32 *)(wnd->back_buffer->pixels); u32 count = wnd->back_buffer->w * wnd->back_buffer->h; for (u32 i = 0; i < count; ++i) { - pixels[i] = c; + pixels[i] = colour.colour; } SDL_UnlockSurface(wnd->back_buffer); @@ -124,11 +121,6 @@ void swap_buffers(window_t *wnd) { SDL_UpdateWindowSurface(wnd->window); } -u32 colour_to_u32(colour_t colour) { - return ((u32)(colour.r) << 24) | ((u32)(colour.g) << 16) | - ((u32)(colour.b) << 8) | (u32)(colour.a); -} - u32 index_from_coordinates(window_t *wnd, u32 x, u32 y) { return y * wnd->width + x; } @@ -160,11 +152,9 @@ vec2i_t denormalised_coords(const window_t *wnd, i32 x, i32 y) { void set_screen_pixel(window_t *wnd, u32 x, u32 y, colour_t colour) { u32 index = index_from_coordinates(wnd, x, y); - u32 c = colour_to_u32(colour); - u32 *pixels = (u32 *)(wnd->back_buffer->pixels); - pixels[index] = c; + pixels[index] = colour.colour; } vec3f_t window_to_viewport(window_t *wnd, i32 x, i32 y, vec3f_t viewport) {