Fixing aspect ratio

This commit is contained in:
Your Name 2026-02-08 22:30:21 +01:00
parent 48a0606734
commit 056c7d1f5f
24 changed files with 154 additions and 112 deletions

View File

@ -32,6 +32,8 @@ WEB_OUTPUT_JS := $(WEB_OUTPUT).js
WEB_OUTPUT_WASM := $(WEB_OUTPUT).wasm WEB_OUTPUT_WASM := $(WEB_OUTPUT).wasm
WEB_OUTPUT_DATA := $(WEB_OUTPUT).data WEB_OUTPUT_DATA := $(WEB_OUTPUT).data
OBJDIR_BASE := obj
ifeq ($(PLATFORM), PLATFORM_WEB) ifeq ($(PLATFORM), PLATFORM_WEB)
LIBRAYLIB := libraylib.web.a LIBRAYLIB := libraylib.web.a
NAME := $(NAME).html NAME := $(NAME).html
@ -47,8 +49,13 @@ LDFLAGS += -s USE_GLFW=3 \
--shell-file raylib/src/shell.html \ --shell-file raylib/src/shell.html \
-DPLATFORM_WEB \ -DPLATFORM_WEB \
-s INITIAL_MEMORY=2147483648 -s INITIAL_MEMORY=2147483648
OBJDIR := $(OBJDIR_BASE)/web
else else
CFLAGS += -DROOT_DIRECTORY=\"$(PWD)\" CFLAGS += -DROOT_DIRECTORY=\"$(PWD)\"
OBJDIR := $(OBJDIR_BASE)/native
endif endif
VNC_SCRIPT := ./script/run_vnc.sh VNC_SCRIPT := ./script/run_vnc.sh
@ -82,8 +89,6 @@ SRCUTIL := $(addprefix $(UTILDIR)/, $(addsuffix .c,\
LIBS := libft/libft.a memory/memory.a raylib/src/$(LIBRAYLIB) LIBS := libft/libft.a memory/memory.a raylib/src/$(LIBRAYLIB)
MAP := mapgen MAP := mapgen
OBJDIR := obj
OBJ := $(SRC:%.c=$(OBJDIR)/%.o) OBJ := $(SRC:%.c=$(OBJDIR)/%.o)
OBJRENDER := $(SRCRENDER:%.c=$(OBJDIR)/%.o) OBJRENDER := $(SRCRENDER:%.c=$(OBJDIR)/%.o)
OBJSCENE := $(SRCSCENE:%.c=$(OBJDIR)/%.o) OBJSCENE := $(SRCSCENE:%.c=$(OBJDIR)/%.o)
@ -134,7 +139,7 @@ vnc: all
$(VNC_SCRIPT) $(VNC_SCRIPT)
clean: clean:
rm -rf $(OBJDIR) rm -rf $(OBJDIR_BASE)
make clean -C libft make clean -C libft
make clean -C memory make clean -C memory
make clean -C libft/printf make clean -C libft/printf

BIN
miniRT Executable file

Binary file not shown.

View File

@ -40,14 +40,6 @@
# define SCENE_START_RESOLUTION_Y 9 # define SCENE_START_RESOLUTION_Y 9
# endif // __EMSCRIPTEN__ # endif // __EMSCRIPTEN__
# ifndef WI
# define WI 1920
# endif
# ifndef HI
# define HI 1080
# endif
# define MAX_BODY_INIT 16 # define MAX_BODY_INIT 16
# define READ_BUFFER_SIZE 1000 # define READ_BUFFER_SIZE 1000
@ -57,14 +49,6 @@
# define ROOT_DIRECTORY "/" # define ROOT_DIRECTORY "/"
# endif # endif
# ifndef __EMSCRIPTEN__
# define SCENE_MAX_RESOLUTION_X 1
# define SCENE_MAX_RESOLUTION_Y 1
# else
# define SCENE_MAX_RESOLUTION_X 16
# define SCENE_MAX_RESOLUTION_Y 9
# endif
# ifndef __EMSCRIPTEN__ # ifndef __EMSCRIPTEN__
# ifdef VALGRIND # ifdef VALGRIND
# define SCENE_START_RESOLUTION_X 16 # define SCENE_START_RESOLUTION_X 16
@ -76,11 +60,11 @@
# endif // !__EMSCRIPTEN # endif // !__EMSCRIPTEN
// //
#ifndef __EMSCRIPTEN__ #ifndef __EMSCRIPTEN__
# define RESOLUTION_SCALE_X 16 # define RESOLUTION_SCALE_X ratio_x
# define RESOLUTION_SCALE_Y 9 # define RESOLUTION_SCALE_Y ratio_y
#else #else
# define RESOLUTION_SCALE_X SCENE_MAX_RESOLUTION_X * 2 # define RESOLUTION_SCALE_X ratio_x * 2
# define RESOLUTION_SCALE_Y SCENE_MAX_RESOLUTION_Y * 2 # define RESOLUTION_SCALE_Y ratio_y * 2
#endif // !__EMSCRIPTEN__ #endif // !__EMSCRIPTEN__
# define SCENE_START_RESOLUTION_CAP 4 # define SCENE_START_RESOLUTION_CAP 4
@ -89,12 +73,10 @@
#ifndef __EMSCRIPTEN__ #ifndef __EMSCRIPTEN__
# define THREAD_COUNT 30 # define THREAD_COUNT 30
# define THREAD_HEIGHT HI / THREAD_COUNT
#else #else
# define THREAD_COUNT 1 # define THREAD_COUNT 1
# define THREAD_HEIGHT HI / THREAD_COUNT
#endif // !__EMSCRIPTEN__ #endif // !__EMSCRIPTEN__
@ -390,7 +372,7 @@ typedef struct s_cone
# endif # endif
# define ASSETS_PATH ROOT_DIRECTORY"/assets" # define ASSETS_PATH ROOT_DIRECTORY"/assets"
# define SCENES_PATH ROOT_DIRECTORY"/scenes" # define SCENES_PATH ASSETS_PATH"/scenes"
typedef struct s_texture typedef struct s_texture
{ {
@ -463,6 +445,8 @@ typedef struct s_camera
typedef struct s_scene typedef struct s_scene
{ {
uint w;
uint h;
uint current_body_max; uint current_body_max;
uint body_cursor; uint body_cursor;
uint resolution_x; uint resolution_x;
@ -530,6 +514,12 @@ typedef struct s_thread
} t_thread; } t_thread;
#endif // !__EMSCRIPTEN__ #endif // !__EMSCRIPTEN__
extern t_data data;
extern uint ratio_x;
extern uint ratio_y;
extern uint max_res_x;
extern uint max_res_y;
/* ft_atod.c */ /* ft_atod.c */
void item_double_inc(void *value, void *null); void item_double_inc(void *value, void *null);
void item_double_dec(void *value, void *null); void item_double_dec(void *value, void *null);
@ -812,9 +802,9 @@ void item_bool_toggle(void *null, void *value);
/* Mouse */ /* Mouse */
int mouse_press(int x, int y, t_data *data); int mouse_press(uint x, uint y, t_data *data);
int mouse_release(int x, int y, t_data *data); int mouse_release(uint x, uint y, t_data *data);
int mouse_move(int x, int y, t_data *data); int mouse_move(uint x, uint y, t_data *data);
void mouse_grab(t_mouse *mouse, t_body *body); void mouse_grab(t_mouse *mouse, t_body *body);
/* Parsing */ /* Parsing */

View File

@ -95,10 +95,10 @@ t_container container_create(const char *title, t_rect *attr, uint format)
container.attr = *attr; container.attr = *attr;
else else
{ {
container.attr.width = WI / 3; container.attr.width = data.scene.w / 3;
container.attr.x = 0; container.attr.x = 0;
container.attr.height = HI - CONTAINER_PADDING * 2; container.attr.height = data.scene.h - CONTAINER_PADDING * 2;
container.attr.y = HI / 2 - container.attr.height / 2; container.attr.y = data.scene.h / 2 - container.attr.height / 2;
} }
container.format = format; container.format = format;
container.id = id_set(ID_GROUP_MENU_MAIN, container_id_count); container.id = id_set(ID_GROUP_MENU_MAIN, container_id_count);

View File

@ -50,20 +50,20 @@ static void glyph_draw( t_pixel *pixel, \
size_t j; size_t j;
i = 0; i = 0;
if (x + 1 < WI) if (x + 1 < data.scene.w)
{ {
while (i / 2 < GLYPH_ROW) while (i / 2 < GLYPH_ROW)
{ {
j = 0; j = 0;
while (j / 2 < GLYPH_COL) while (j / 2 < GLYPH_COL)
{ {
if (x + j + 1 < WI && y + i + 1 < HI \ if (x + j + 1 < data.scene.w && y + i + 1 < data.scene.w \
&& glyph[i / 2][j / 2] == '1') && glyph[i / 2][j / 2] == '1')
{ {
*pixel[(y + i) * WI + (x + j)].color = RAYWHITE; *pixel[(y + i) * data.scene.w + (x + j)].color = RAYWHITE;
*pixel[(y + i + 1) * WI + (x + j)].color = RAYWHITE; *pixel[(y + i + 1) * data.scene.w + (x + j)].color = RAYWHITE;
*pixel[(y + i) * WI + (x + j + 1)].color = RAYWHITE; *pixel[(y + i) * data.scene.w + (x + j + 1)].color = RAYWHITE;
*pixel[(y + i + 1) * WI + (x + j + 1)].color = RAYWHITE; *pixel[(y + i + 1) * data.scene.w + (x + j + 1)].color = RAYWHITE;
} }
j += 2; j += 2;
} }

View File

@ -41,11 +41,11 @@ void help_menu_draw(void *data_ptr, void *pixel)
t_rect background; t_rect background;
t_data *data; t_data *data;
uint x = WI / 4;
uint y = HI / 4;
data = data_ptr; data = data_ptr;
background = (t_rect){x, y, .width = WI / 2, .height = HI / 2, }; uint x = data->scene.w / 4;
uint y = data->scene.h / 4;
background = (t_rect){x, y, .width = data->scene.w / 2, .height = data->scene.h / 2, };
(void)pixel; (void)pixel;
rt_draw_rect_blend(background, data->pixel, 0, HELP_MENU_BG); rt_draw_rect_blend(background, data->pixel, 0, HELP_MENU_BG);
glyph_print(x + 2, y + 2, \ glyph_print(x + 2, y + 2, \

View File

@ -70,8 +70,8 @@ void mouse_move_body(Vector2 mouse_delta, int id_group, t_mouse *mouse)
void decrease_resolution(t_scene *scene) void decrease_resolution(t_scene *scene)
{ {
if (scene->resolution_x == SCENE_MAX_RESOLUTION_X if (scene->resolution_x == max_res_x
&& scene->resolution_y == SCENE_MAX_RESOLUTION_Y) && scene->resolution_y == max_res_y)
{ {
scene->anti_aliasing = false; scene->anti_aliasing = false;
scene->resolution_x = RESOLUTION_SCALE_X; scene->resolution_x = RESOLUTION_SCALE_X;
@ -102,7 +102,7 @@ void mouse_left_move(int x, t_mouse *mouse, t_scene *scene)
} }
} }
int mouse_move(int x, int y, t_data *data) int mouse_move(uint x, uint y, t_data *data)
{ {
if (data->mouse.left_is_pressed) if (data->mouse.left_is_pressed)
{ {

View File

@ -22,16 +22,16 @@ void mouse_click_left(int x, int y, t_scene *scene, t_mouse *mouse)
mouse->left_is_pressed = true; mouse->left_is_pressed = true;
mouse->data->scene.body_focus = NULL; mouse->data->scene.body_focus = NULL;
mouse->data->should_rerender = true; mouse->data->should_rerender = true;
id_group = id_group_get(scene->pixel[y * WI + x].id); id_group = id_group_get(scene->pixel[y * data.scene.w + x].id);
mouse->data->func_ptr = NULL; mouse->data->func_ptr = NULL;
if (id_group == ID_GROUP_ITEM && mouse->data->current_menu) if (id_group == ID_GROUP_ITEM && mouse->data->current_menu)
{ {
container_item_get_by_id(mouse->data->current_menu, \ container_item_get_by_id(mouse->data->current_menu, \
scene->pixel[y * WI + x].id, x, y); scene->pixel[y * data.scene.w + x].id, x, y);
} }
else if (id_group > 0 && id_group < ID_GROUP_ITEM) else if (id_group > 0 && id_group < ID_GROUP_ITEM)
{ {
body = body_get_by_id(scene->pixel[y * WI + x].id, scene); body = body_get_by_id(scene->pixel[y * data.scene.w + x].id, scene);
scene->body_focus = NULL; scene->body_focus = NULL;
mouse_grab(mouse, body); mouse_grab(mouse, body);
} else { } else {
@ -44,13 +44,13 @@ void mouse_click_right(int x, int y, t_data *data, t_mouse *mouse)
uint id_group; uint id_group;
t_body *body; t_body *body;
id_group = id_group_get(data->pixel[y * WI + x].id); id_group = id_group_get(data->pixel[y * data->scene.w + x].id);
data->scene.body_focus = NULL; data->scene.body_focus = NULL;
mouse->right_is_pressed = true; mouse->right_is_pressed = true;
data->should_rerender = true; data->should_rerender = true;
if (id_group >= ID_GROUP_SPHERE && id_group <= ID_GROUP_CONE) if (id_group >= ID_GROUP_SPHERE && id_group <= ID_GROUP_CONE)
{ {
body = body_get_by_id(data->pixel[y * WI + x].id, &data->scene); body = body_get_by_id(data->pixel[y * data->scene.w + x].id, &data->scene);
data->scene.body_focus = body; data->scene.body_focus = body;
if (id_group == ID_GROUP_PLANE) if (id_group == ID_GROUP_PLANE)
plane_menu_map(&data->menu[ID_GROUP_PLANE], body, &body->color); plane_menu_map(&data->menu[ID_GROUP_PLANE], body, &body->color);
@ -81,13 +81,13 @@ void menu_scroll_items(t_container *param, uint scaler)
} }
} }
int mouse_press(int x, int y, t_data *data) int mouse_press(uint x, uint y, t_data *data)
{ {
uint id_group; uint id_group;
if (x < 0 || x >= WI || y < 0 || y >= HI) if (x > INT_MAX || x >= data->scene.w || y > INT_MAX || y >= data->scene.h)
return (0); return (0);
id_group = id_group_get(data->scene.pixel[y * WI + x].id); id_group = id_group_get(data->scene.pixel[y * data->scene.w + x].id);
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && !data->mouse.left_is_pressed) if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && !data->mouse.left_is_pressed)
mouse_click_left(x, y, &data->scene, &data->mouse); mouse_click_left(x, y, &data->scene, &data->mouse);
else if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT) && !data->mouse.right_is_pressed) else if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT) && !data->mouse.right_is_pressed)
@ -114,12 +114,12 @@ int mouse_press(int x, int y, t_data *data)
return (0); return (0);
} }
int mouse_release(int x, int y, t_data *data) int mouse_release(uint x, uint y, t_data *data)
{ {
if (data->mouse.left_is_pressed && !IsMouseButtonDown(MOUSE_BUTTON_LEFT)) if (data->mouse.left_is_pressed && !IsMouseButtonDown(MOUSE_BUTTON_LEFT))
{ {
data->mouse.left_is_pressed = false; data->mouse.left_is_pressed = false;
data->scene.resolution_x = SCENE_MAX_RESOLUTION_X, data->scene.resolution_y = SCENE_MAX_RESOLUTION_Y; data->scene.resolution_x = max_res_x, data->scene.resolution_y = max_res_y;
if (data->mouse.grabbed) if (data->mouse.grabbed)
{ {
(void)x; (void)x;

View File

@ -13,10 +13,22 @@
#include "../minirt.h" #include "../minirt.h"
#include <stdio.h> #include <stdio.h>
t_data data; t_data data = { 0 };
uint ratio_x = 0;
uint ratio_y = 0;
uint max_res_x = 1;
uint max_res_y = 1;
void create_display() { void create_display() {
InitWindow(WI, HI, "miniRT in Raylib!!"); InitWindow(800, 600, "miniRT");
int monitor = GetCurrentMonitor();
int w = GetMonitorWidth(monitor);
int h = GetMonitorHeight(monitor);
SetWindowSize(w, h);
data.scene.w = w;
data.scene.h = h;
SetTargetFPS(60); SetTargetFPS(60);
} }
@ -86,7 +98,6 @@ t_container *menus_create(t_data *data)
void initialize_data(t_data *data, char *path) void initialize_data(t_data *data, char *path)
{ {
ft_bzero(data, sizeof(*data));
scene_create(path, &data->scene); scene_create(path, &data->scene);
create_display(); create_display();
data->pixel = pixel_plane_create(); data->pixel = pixel_plane_create();
@ -94,7 +105,7 @@ void initialize_data(t_data *data, char *path)
data->mouse.data = data; data->mouse.data = data;
data->scene.pixel = data->pixel; data->scene.pixel = data->pixel;
data->menu = menus_create(data); data->menu = menus_create(data);
Image img = GenImageColor(WI, HI, BLACK); Image img = GenImageColor(data->scene.w, data->scene.h, BLACK);
data->pixel_colors = img.data; data->pixel_colors = img.data;
data->texture = LoadTextureFromImage(img); data->texture = LoadTextureFromImage(img);
data->should_rerender = true; data->should_rerender = true;
@ -217,7 +228,6 @@ bool key_was_pressed = false;
void main_loop() { void main_loop() {
int keys[3] = { 0 }; int keys[3] = { 0 };
Vector2 mouse_pos = GetMousePosition(); Vector2 mouse_pos = GetMousePosition();
if (data.mouse.left_is_pressed || data.mouse.right_is_pressed) if (data.mouse.left_is_pressed || data.mouse.right_is_pressed)
{ {
@ -234,45 +244,69 @@ void main_loop() {
{ {
key_was_pressed = true; key_was_pressed = true;
data.should_rerender = true; data.should_rerender = true;
data.scene.resolution_x = RESOLUTION_SCALE_X; #ifdef __EMSCRIPTEN__
data.scene.resolution_y = RESOLUTION_SCALE_Y; data.scene.resolution_x = ratio_x * 2;
data.scene.resolution_y = ratio_y * 2;
#else
data.scene.resolution_x = ratio_x;
data.scene.resolution_y = ratio_y;
#endif /* ifdef __EMSCRIPTEN__ */
key_press(keys[i], &data); key_press(keys[i], &data);
} }
} }
rendering_loop(&data); rendering_loop(&data);
if (keys[0] && keys[0] != KEY_EQUAL) { data.scene.resolution_x = max_res_x;
data.scene.resolution_x = SCENE_MAX_RESOLUTION_X; data.scene.resolution_y = max_res_y;
data.scene.resolution_y = SCENE_MAX_RESOLUTION_Y;
} if (key_was_pressed) {
if (key_was_pressed) key_was_pressed = false; key_was_pressed = false;
else { } else {
data.should_rerender = false; data.should_rerender = false;
data.func_ptr = NULL; data.func_ptr = NULL;
} }
} }
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char *path; char *path;
#ifndef __EMSCRIPTEN__ #ifndef __EMSCRIPTEN__
t_thread thread[THREAD_COUNT]; t_thread thread[THREAD_COUNT];
#endif /* ifndef __EMSCRIPTEN__ */ #endif /* ifndef __EMSCRIPTEN__ */
if (argc == 1) if (argc == 1) {
path = SCENES_PATH"/multilight.rt"; path = SCENES_PATH"/multilight.rt";
}
else else
path = validate_file_extension(argc, argv); path = validate_file_extension(argc, argv);
initialize_data(&data, path); initialize_data(&data, path);
lst_memory(&data, data_destroy_func, ADD); lst_memory(&data, data_destroy_func, ADD);
int divisor = gcd(data.scene.w, data.scene.h);
ratio_x = data.scene.w / divisor;
ratio_y = data.scene.h / divisor;
#ifndef __EMSCRIPTEN__ #ifndef __EMSCRIPTEN__
threads_init(thread, &data); threads_init(thread, &data);
data.threads = thread; data.threads = thread;
#endif #endif
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
max_res_y = ratio_y;
max_res_x = ratio_x;
emscripten_set_main_loop(main_loop, 0, 1); emscripten_set_main_loop(main_loop, 0, 1);
#else #else
while(!WindowShouldClose()) { while(!WindowShouldClose()) {

View File

@ -18,13 +18,13 @@ void rt_draw_rect(t_rect rect, t_pixel *pixel, uint id, uint color)
uint y; uint y;
y = 0; y = 0;
while (y < rect.height && rect.y + y < HI) while (y < rect.height && rect.y + y < data.scene.h)
{ {
x = 0; x = 0;
while (x < rect.width && rect.x + x < WI) while (x < rect.width && rect.x + x < data.scene.w)
{ {
*pixel[(rect.y + y) * WI + (rect.x + x)].color = uint_to_color(color); *pixel[(rect.y + y) * data.scene.w + (rect.x + x)].color = uint_to_color(color);
pixel[(rect.y + y) * WI + (rect.x + x)].id = id; pixel[(rect.y + y) * data.scene.w + (rect.x + x)].id = id;
x++; x++;
} }
y++; y++;
@ -37,15 +37,15 @@ void rt_draw_rect_blend(t_rect rect, t_pixel *pixel, uint id, uint color)
uint y; uint y;
y = 0; y = 0;
while (y < rect.height && rect.y + y < HI) while (y < rect.height && rect.y + y < data.scene.h)
{ {
x = 0; x = 0;
while (x < rect.width && rect.x + x < WI) while (x < rect.width && rect.x + x < data.scene.w)
{ {
*pixel[(rect.y + y) * WI + (rect.x + x)].color = \ *pixel[(rect.y + y) * data.scene.w + (rect.x + x)].color = \
uint_to_color(color_blend(*(int *)pixel[(rect.y + y) \ uint_to_color(color_blend(*(int *)pixel[(rect.y + y) \
* WI + (rect.x + x)].color, color)); * data.scene.w + (rect.x + x)].color, color));
pixel[(rect.y + y) * WI + (rect.x + x)].id = id; pixel[(rect.y + y) * data.scene.w + (rect.x + x)].id = id;
x++; x++;
} }
y++; y++;

View File

@ -18,12 +18,12 @@ void pixels_image_syncronize(Color *image, t_pixel *pixel)
uint y; uint y;
y = 0; y = 0;
while (y < HI) while (y < data.scene.h)
{ {
x = 0; x = 0;
while (x < WI) while (x < data.scene.w)
{ {
pixel[y * WI + x].color = &image[y * WI + x]; pixel[y * data.scene.w + x].color = &image[y * data.scene.w + x];
x++; x++;
} }
y++; y++;

View File

@ -35,9 +35,9 @@ void pixels_clear(t_pixel *pixel, uint wi, uint hi)
x = 0; x = 0;
while (x < wi) while (x < wi)
{ {
pixel[y * WI + x].id = 0; pixel[y * data.scene.w + x].id = 0;
*pixel[y * WI + x].color = uint_to_color(0x0); *pixel[y * data.scene.w + x].color = uint_to_color(0x0);
pixel[y * WI + x].dist = -1; pixel[y * data.scene.w + x].dist = -1;
x++; x++;
} }
y++; y++;
@ -48,9 +48,9 @@ t_pixel *pixel_plane_create(void)
{ {
t_pixel *pixels; t_pixel *pixels;
pixels = ft_calloc(HI * WI, sizeof(*pixels)); pixels = ft_calloc(data.scene.h * data.scene.w, sizeof(*pixels));
lst_memory(pixels, free, ADD); lst_memory(pixels, free, ADD);
set_pixel_distances(pixels, WI * HI, -1); set_pixel_distances(pixels, data.scene.w * data.scene.h, -1);
return (pixels); return (pixels);
} }
@ -67,9 +67,9 @@ void pixel_fill(t_pixel *pixel, t_scene *scene)
j = 0; j = 0;
while (j < scene->resolution_x) while (j < scene->resolution_x)
{ {
*pixel[i * WI + j].color = *pixel_new.color; *pixel[i * data.scene.w + j].color = *pixel_new.color;
pixel[i * WI + j].id = pixel_new.id; pixel[i * data.scene.w + j].id = pixel_new.id;
pixel[i * WI + j].dist = pixel_new.dist; pixel[i * data.scene.w + j].dist = pixel_new.dist;
j++; j++;
} }
i++; i++;

View File

@ -109,6 +109,10 @@ uint rendering_loop(t_data *data)
BeginDrawing(); BeginDrawing();
DrawTexture(data->texture, 0, 0, RAYWHITE); DrawTexture(data->texture, 0, 0, RAYWHITE);
#ifdef __EMSCRIPTEN__
Vector2 pos = GetMousePosition();
DrawCircleV(pos, (float)data->scene.w / 100, RED);
#endif
EndDrawing(); EndDrawing();
return (0); return (0);
} }

View File

@ -40,10 +40,10 @@ void threads_init(t_thread thread[], t_data *data)
i = 0; i = 0;
while (i < THREAD_COUNT) while (i < THREAD_COUNT)
{ {
thread[i].width = WI; thread[i].width = data->scene.w;
thread[i].data = data; thread[i].data = data;
thread[i].id = i; thread[i].id = i;
thread[i].starty = i * THREAD_HEIGHT; thread[i].starty = i * data->scene.h / THREAD_COUNT;
thread[i].pixel = data->pixel; thread[i].pixel = data->pixel;
thread[i].scene = &data->scene; thread[i].scene = &data->scene;
thread[i].rwlock = &data->rwlock; thread[i].rwlock = &data->rwlock;

View File

@ -46,8 +46,8 @@ t_vector set_ray(float x, float y, t_scene *scene, t_camera *camera)
{ {
t_vector ray; t_vector ray;
ray.x = ((2 * x / WI - 1) * camera->fov_f * ASPECT_RATIO); ray.x = ((2 * x / data.scene.w - 1) * camera->fov_f * ASPECT_RATIO);
ray.y = ((1 - 2 * y / HI) * camera->fov_f); ray.y = ((1 - 2 * y / data.scene.h) * camera->fov_f);
ray.z = 1; ray.z = 1;
ray_to_world(&ray, camera); ray_to_world(&ray, camera);
scene->depth = 0; scene->depth = 0;

View File

@ -57,8 +57,8 @@ bool requires_supersampling(uint x, uint y, t_pixel *pixel, bool aa_on)
if (x == 0 && y == 0) //top left pixel in thread if (x == 0 && y == 0) //top left pixel in thread
return true; return true;
color = *(uint *)pixel->color; color = *(uint *)pixel->color;
color_above = (y != 0) ? *(uint *)pixel[(y - 1) * WI + x].color : color; color_above = (y != 0) ? *(uint *)pixel[(y - 1) * data.scene.w + x].color : color;
color_left = (x != 0) ? *(uint *)pixel[y * WI + (x - 1)].color : color; color_left = (x != 0) ? *(uint *)pixel[y * data.scene.w + (x - 1)].color : color;
if (!color_above || !color_left) if (!color_above || !color_left)
return true; return true;
@ -82,12 +82,12 @@ void anti_aliasing_loop(t_scene *scene, uint x, uint y, t_pixel *pixel)
while (i < scene->anti_aliasing + 1) while (i < scene->anti_aliasing + 1)
{ {
ray = set_ray(aa_x(x, i), aa_y(y, i), scene, &scene->camera); ray = set_ray(aa_x(x, i), aa_y(y, i), scene, &scene->camera);
pixels_clear(&pixel[y * WI + x], scene->resolution_x, \ pixels_clear(&pixel[y * data.scene.w + x], scene->resolution_x, \
scene->resolution_y); scene->resolution_y);
ray_check_bodys(&pixel[y * WI + x], ray, scene); ray_check_bodys(&pixel[y * data.scene.w + x], ray, scene);
color[i++] = color_to_uint(*pixel[y * WI + x].color); color[i++] = color_to_uint(*pixel[y * data.scene.w + x].color);
} }
average_color(&pixel[y * WI + x], color, scene->anti_aliasing); average_color(&pixel[y * data.scene.w + x], color, scene->anti_aliasing);
} }
#ifndef __EMSCRIPTEN__ #ifndef __EMSCRIPTEN__
@ -98,18 +98,24 @@ void thread_define_camera_rays(t_thread *thread, t_pixel *pixel, \
uint x; uint x;
uint y; uint y;
uint max_y; uint max_y;
uint thread_height = scene->h / THREAD_COUNT;
uint w = thread->data->scene.w;
uint h = thread->data->scene.h;
y = thread->starty; y = thread->starty;
set_world_matrix(camera); set_world_matrix(camera);
max_y = thread->starty + THREAD_HEIGHT; max_y = thread->starty + thread_height;
if (max_y > HI) if (max_y > h)
max_y = HI; max_y = h;
while (y + scene->resolution_y <= max_y) while (y < max_y)
{ {
x = 0; x = 0;
while (x + scene->resolution_x <= WI) while (x < w)
{ {
anti_aliasing_loop(scene, x, y, pixel); uint safe_x = (x + scene->resolution_x > w) ? w - scene->resolution_x : x;
uint safe_y = (y + scene->resolution_y > h) ? h - scene->resolution_y : y;
anti_aliasing_loop(scene, safe_x, safe_y, pixel);
x += scene->resolution_x; x += scene->resolution_x;
} }
y += scene->resolution_y; y += scene->resolution_y;
@ -120,15 +126,15 @@ void thread_define_camera_rays(t_thread *thread, t_pixel *pixel, \
void define_camera_rays(t_pixel *pixel, t_camera *camera, t_scene *scene) void define_camera_rays(t_pixel *pixel, t_camera *camera, t_scene *scene)
{ {
uint x; int x;
uint y; int y;
y = 0; y = 0;
set_world_matrix(camera); set_world_matrix(camera);
while (y + scene->resolution_y <= HI) while (y + scene->resolution_y <= scene->h)
{ {
x = 0; x = 0;
while (x + scene->resolution_x <= WI) while (x + scene->resolution_x <= scene->w)
{ {
anti_aliasing_loop(scene, x, y, pixel); anti_aliasing_loop(scene, x, y, pixel);
x += scene->resolution_x; x += scene->resolution_x;

View File

@ -141,7 +141,10 @@ EM_ASM(
); );
#endif /* ifndef __EMSCRIPTEN__ */ #endif /* ifndef __EMSCRIPTEN__ */
ft_bzero(scene, sizeof(*scene)); int monitor = GetCurrentMonitor();
scene->w = GetMonitorWidth(monitor);
scene->h = GetMonitorHeight(monitor);
printf("monitor: %d:%s %u x %u\n", monitor, GetMonitorName(monitor), scene->w, scene->h);
ft_bzero(&line, sizeof(line)); ft_bzero(&line, sizeof(line));
scene->texture = ft_calloc(MAPS_MAX, sizeof(t_texture)); scene->texture = ft_calloc(MAPS_MAX, sizeof(t_texture));
lst_memory(scene->texture, free, ADD); lst_memory(scene->texture, free, ADD);