From f0b677125510560e64d6bea63e5ca2340bcbb6eb Mon Sep 17 00:00:00 2001 From: Abdelrahman Said Date: Wed, 20 Dec 2023 00:04:49 +0000 Subject: [PATCH] Add function to convert from window coordinates to viewport --- include/window/window.h | 3 +++ src/window/window.c | 24 ++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/include/window/window.h b/include/window/window.h index a1e6846..b769112 100644 --- a/include/window/window.h +++ b/include/window/window.h @@ -2,6 +2,7 @@ #define WINDOW_H #include "c_cpp_aliases/aliases.h" +#include "vector/vec.h" #include #include @@ -30,4 +31,6 @@ void clear_window(window_t *wnd, colour_t colour); void set_pixel(window_t *wnd, i32 x, i32 y, colour_t colour); void swap_buffers(window_t *wnd); +vec3f_t window_to_viewport(window_t *wnd, i32 x, i32 y, vec3f_t viewport); + #endif // !WINDOW_H diff --git a/src/window/window.c b/src/window/window.c index 746fcdb..035f1d0 100644 --- a/src/window/window.c +++ b/src/window/window.c @@ -1,5 +1,6 @@ #include "window/window.h" #include "c_cpp_aliases/aliases.h" +#include "vector/vec.h" #include #include #include @@ -10,6 +11,7 @@ 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); void set_screen_pixel(window_t *wnd, u32 x, u32 y, colour_t colour); bool init_window(window_t *wnd, u32 width, u32 height, const char *title) { @@ -103,16 +105,15 @@ void clear_window(window_t *wnd, colour_t colour) { } void set_pixel(window_t *wnd, i32 x, i32 y, colour_t colour) { - i32 screen_x = denormalise(x, wnd->width, wnd->half_width); - i32 screen_y = denormalise(-y, wnd->height, wnd->half_height); + vec2i_t coords = denormalised_coords(wnd, x, y); - if (screen_x < 0 || screen_y < 0) { + if (coords.x < 0 || coords.y < 0) { return; } SDL_LockSurface(wnd->back_buffer); - set_screen_pixel(wnd, (u32)screen_x, (u32)screen_y, colour); + set_screen_pixel(wnd, (u32)(coords.x), (u32)(coords.y), colour); SDL_UnlockSurface(wnd->back_buffer); } @@ -150,6 +151,13 @@ i32 denormalise(i32 value, u32 max, u32 abs_half) { return denormalised; } +vec2i_t denormalised_coords(const window_t *wnd, i32 x, i32 y) { + i32 screen_x = denormalise(x, wnd->width, wnd->half_width); + i32 screen_y = denormalise(-y, wnd->height, wnd->half_height); + + return (vec2i_t){.x = screen_x, .y = screen_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); @@ -158,3 +166,11 @@ void set_screen_pixel(window_t *wnd, u32 x, u32 y, colour_t colour) { pixels[index] = c; } + +vec3f_t window_to_viewport(window_t *wnd, i32 x, i32 y, vec3f_t viewport) { + return (vec3f_t){ + .x = x * viewport.x / wnd->width, + .y = y * viewport.y / wnd->height, + .z = viewport.z, + }; +}