Update colour_t to use a union

This commit is contained in:
Abdelrahman Said 2023-12-27 22:03:14 +00:00
parent 0345f90405
commit 9b22ce61d5
3 changed files with 23 additions and 19 deletions

View File

@ -7,10 +7,17 @@
#include <stdbool.h>
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 {

View File

@ -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},
},
};

View File

@ -8,7 +8,6 @@
#include <stdbool.h>
#include <stdio.h>
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) {