Update colour_t to use a union
This commit is contained in:
parent
0345f90405
commit
9b22ce61d5
@ -7,10 +7,17 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
u8 r;
|
|
||||||
u8 g;
|
|
||||||
u8 b;
|
|
||||||
u8 a;
|
u8 a;
|
||||||
|
u8 b;
|
||||||
|
u8 g;
|
||||||
|
u8 r;
|
||||||
|
} rgba_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
union {
|
||||||
|
rgba_t rgba;
|
||||||
|
u32 colour;
|
||||||
|
};
|
||||||
} colour_t;
|
} colour_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -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);
|
const scene_t *scene, colour_t default_colour);
|
||||||
|
|
||||||
i32 main(i32 argc, char *argv[]) {
|
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 camera = {.x = 0.0f, .y = 0.0f, .z = 0.0f};
|
||||||
vec3f_t viewport = {.x = 1.0f, .y = 1.0f, .z = 1.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){
|
(sphere_t){
|
||||||
.radius = 1.0f,
|
.radius = 1.0f,
|
||||||
.centre = (vec3f_t){.x = 0.0f, .y = -1.0f, .z = 3.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){
|
(sphere_t){
|
||||||
.radius = 1.0f,
|
.radius = 1.0f,
|
||||||
.centre = (vec3f_t){.x = -2.0f, .y = 0.0f, .z = 4.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){
|
(sphere_t){
|
||||||
.radius = 1.0f,
|
.radius = 1.0f,
|
||||||
.centre = (vec3f_t){.x = 2.0f, .y = 0.0f, .z = 4.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},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
u32 colour_to_u32(colour_t colour);
|
|
||||||
u32 index_from_coordinates(window_t *wnd, u32 x, u32 y);
|
u32 index_from_coordinates(window_t *wnd, u32 x, u32 y);
|
||||||
i32 denormalise(i32 value, u32 max, u32 abs_half);
|
i32 denormalise(i32 value, u32 max, u32 abs_half);
|
||||||
vec2i_t denormalised_coords(const window_t *wnd, i32 x, i32 y);
|
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) {
|
void clear_window(window_t *wnd, colour_t colour) {
|
||||||
SDL_LockSurface(wnd->back_buffer);
|
SDL_LockSurface(wnd->back_buffer);
|
||||||
|
|
||||||
u32 c = colour_to_u32(colour);
|
|
||||||
|
|
||||||
u32 *pixels = (u32 *)(wnd->back_buffer->pixels);
|
u32 *pixels = (u32 *)(wnd->back_buffer->pixels);
|
||||||
u32 count = wnd->back_buffer->w * wnd->back_buffer->h;
|
u32 count = wnd->back_buffer->w * wnd->back_buffer->h;
|
||||||
|
|
||||||
for (u32 i = 0; i < count; ++i) {
|
for (u32 i = 0; i < count; ++i) {
|
||||||
pixels[i] = c;
|
pixels[i] = colour.colour;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_UnlockSurface(wnd->back_buffer);
|
SDL_UnlockSurface(wnd->back_buffer);
|
||||||
@ -124,11 +121,6 @@ void swap_buffers(window_t *wnd) {
|
|||||||
SDL_UpdateWindowSurface(wnd->window);
|
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) {
|
u32 index_from_coordinates(window_t *wnd, u32 x, u32 y) {
|
||||||
return y * wnd->width + x;
|
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) {
|
void set_screen_pixel(window_t *wnd, u32 x, u32 y, colour_t colour) {
|
||||||
u32 index = index_from_coordinates(wnd, x, y);
|
u32 index = index_from_coordinates(wnd, x, y);
|
||||||
u32 c = colour_to_u32(colour);
|
|
||||||
|
|
||||||
u32 *pixels = (u32 *)(wnd->back_buffer->pixels);
|
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) {
|
vec3f_t window_to_viewport(window_t *wnd, i32 x, i32 y, vec3f_t viewport) {
|
||||||
|
Loading…
Reference in New Issue
Block a user