Fixing aspect ratio
This commit is contained in:
parent
48a0606734
commit
056c7d1f5f
13
Makefile
13
Makefile
@ -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
|
||||||
|
|||||||
42
minirt.h
42
minirt.h
@ -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 */
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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, \
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
64
src/minirt.c
64
src/minirt.c
@ -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()) {
|
||||||
|
|||||||
@ -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++;
|
||||||
|
|||||||
@ -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++;
|
||||||
|
|||||||
@ -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++;
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user