diff --git a/CMakeLists.txt b/CMakeLists.txt index 154e418..709e154 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ set(SOURCES src/main.c src/options.c src/mouse.c + src/scale.c src/strtoint.c src/strtocolor.c src/editing_area/main.c diff --git a/README b/README index 16a8121..29a6643 100644 --- a/README +++ b/README @@ -67,9 +67,11 @@ These flags take integers as argument. -level-width : used by -create -level-height : used by -create -tile-first +-editor-scale -editor-width -editor-height -editor-target-fps +-editor-scale -editor-off-x -editor-off-y -picker-target-fps diff --git a/include/conf.h b/include/conf.h index 441d7fb..2c969c9 100644 --- a/include/conf.h +++ b/include/conf.h @@ -20,13 +20,15 @@ #define NEW_LEVEL_WIDTH 32 #define NEW_LEVEL_HEIGHT 18 +#define EDITOR_SCALE 2 #define EDITOR_WINDOW_WIDTH 512 #define EDITOR_WINDOW_HEIGHT 288 #define EDITOR_TARGET_FPS 60 #define EDITOR_DRAW_OFFSET_X 0 #define EDITOR_DRAW_OFFSET_Y 0 -#define PICKER_TARGET_FPS 30 +#define PICKER_SCALE 2 +#define PICKER_TARGET_FPS 60 #define PICKER_PADDING 4 #define PICKER_WINDOW_WIDTH \ diff --git a/include/options.h b/include/options.h index 25d0269..b070582 100644 --- a/include/options.h +++ b/include/options.h @@ -16,12 +16,14 @@ struct Options { int tile_first; int new_level_width; int new_level_height; + int editor_scale; int editor_width; int editor_height; int editor_target_fps; int editor_draw_offset_x; int editor_draw_offset_y; Color editor_bg_color; + int picker_scale; int picker_target_fps; int picker_padding; Color picker_bg_color; diff --git a/include/scale.h b/include/scale.h new file mode 100644 index 0000000..8fbfac7 --- /dev/null +++ b/include/scale.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* Copyright (C) 2021 KikooDX */ +#pragma once + +#include "options.h" +#include + +float scale_editor(struct Options options); +Vector2 offset_editor(struct Options options); +float scale_picker(struct Options options); +Vector2 offset_picker(struct Options options); diff --git a/src/editing_area/main.c b/src/editing_area/main.c index 7375fa4..c58e20f 100644 --- a/src/editing_area/main.c +++ b/src/editing_area/main.c @@ -7,6 +7,7 @@ #include "info.h" #include "mouse.h" #include "options.h" +#include "scale.h" #include "shared_data.h" #include #include @@ -29,13 +30,20 @@ int editing_area_main(struct Options options, Texture2D tileset; /* initialize raylib */ - InitWindow(options.editor_width, options.editor_height, + InitWindow(options.editor_width * options.editor_scale, + options.editor_height * options.editor_scale, "SLE main window"); + SetWindowState(FLAG_WINDOW_RESIZABLE); SetTargetFPS(options.editor_target_fps); - init_mouse(options); /* load textures */ tileset = LoadTexture(options.tileset_path); + /* render targets used for upscaling */ + const RenderTexture2D rend_target = LoadRenderTexture( + options.editor_width, options.editor_height); + const RenderTexture2D flip_target = LoadRenderTexture( + options.editor_width, options.editor_height); + /* only proceed if tileset is large enough */ if (tileset.width < options.tile_width || tileset.height < options.tile_height) { @@ -56,15 +64,29 @@ int editing_area_main(struct Options options, while (!WindowShouldClose()) { /* update */ + init_mouse(options); update_mouse(&mouse_x, &mouse_y, level, shared_data); /* draw */ BeginDrawing(); + BeginTextureMode(rend_target); ClearBackground(options.editor_bg_color); level_draw(level, options, tileset); editor_mouse_draw(options, mouse_x, mouse_y); + EndTextureMode(); + + /* flip texture */ + BeginTextureMode(flip_target); + DrawTexture(rend_target.texture, 0, 0, WHITE); + EndTextureMode(); + + /* draw upscaled render */ + ClearBackground(BLACK); + DrawTextureEx(flip_target.texture, + offset_editor(options), 0, + scale_editor(options), WHITE); EndDrawing(); } @@ -76,8 +98,10 @@ panic: /* deinit */ level_free(&level); - /* unload textures */ + /* unload raylib stuff */ UnloadTexture(tileset); + UnloadRenderTexture(rend_target); + UnloadRenderTexture(flip_target); CloseWindow(); /* tell to the child process it can end */ @@ -91,10 +115,12 @@ panic: static void init_mouse(struct Options options) { - SetMouseOffset(-options.editor_draw_offset_x, - -options.editor_draw_offset_y); - SetMouseScale(1.0 / options.tile_width, - 1.0 / options.tile_height); + const float scaling = scale_editor(options); + const Vector2 off = offset_editor(options); + SetMouseOffset(-options.editor_draw_offset_x - off.x, + -options.editor_draw_offset_y - off.y); + SetMouseScale(1.0 / scaling / options.tile_width, + 1.0 / scaling / options.tile_height); } static void update_mouse(int *mouse_x, int *mouse_y, struct Level level, diff --git a/src/main.c b/src/main.c index b2a3e3f..72577a7 100644 --- a/src/main.c +++ b/src/main.c @@ -102,12 +102,14 @@ static void process_arguments(int argc, char **argv, {"tile-first", required_argument, 0, 'I'}, {"level-width", required_argument, 0, 'i'}, {"level-height", required_argument, 0, 'e'}, + {"editor-scale", required_argument, 0, 's'}, {"editor-width", required_argument, 0, 'W'}, {"editor-height", required_argument, 0, 'H'}, {"editor-fps", required_argument, 0, 'f'}, {"editor-off-x", required_argument, 0, 'o'}, {"editor-off-y", required_argument, 0, 'O'}, {"editor-bg-color", required_argument, 0, 'b'}, + {"picker-scale", required_argument, 0, 'S'}, {"picker-fps", required_argument, 0, 'F'}, {"picker-padding", required_argument, 0, 'p'}, {"picker-bg-color", required_argument, 0, 'B'}, @@ -146,6 +148,9 @@ static void process_arguments(int argc, char **argv, case 'e': /* new level height */ options->new_level_height = int_arg_min(opt, 1); break; + case 's': /* editor scale */ + options->editor_scale = int_arg_min(opt, 1); + break; case 'W': /* editor width */ options->editor_width = int_arg_min(opt, 1); break; @@ -167,6 +172,9 @@ static void process_arguments(int argc, char **argv, case 'b': /* editor background color */ options->editor_bg_color = strtocolor(optarg); break; + case 'S': /* picker scale */ + options->picker_scale = int_arg_min(opt, 1); + break; case 'F': /* picker target FPS */ options->picker_target_fps = int_arg_min(opt, 1); diff --git a/src/options.c b/src/options.c index 5911d51..50bfbb8 100644 --- a/src/options.c +++ b/src/options.c @@ -13,12 +13,14 @@ struct Options options_defaults(void) .tileset_height = 0, .new_level_width = NEW_LEVEL_WIDTH, .new_level_height = NEW_LEVEL_HEIGHT, + .editor_scale = EDITOR_SCALE, .editor_width = EDITOR_WINDOW_WIDTH, .editor_height = EDITOR_WINDOW_HEIGHT, .editor_target_fps = EDITOR_TARGET_FPS, .editor_draw_offset_x = EDITOR_DRAW_OFFSET_X, .editor_draw_offset_y = EDITOR_DRAW_OFFSET_Y, .editor_bg_color = EDITOR_BACKGROUND_COLOR, + .picker_scale = PICKER_SCALE, .picker_window_width = 0, .picker_window_height = 0, .picker_target_fps = PICKER_TARGET_FPS, diff --git a/src/scale.c b/src/scale.c new file mode 100644 index 0000000..234d266 --- /dev/null +++ b/src/scale.c @@ -0,0 +1,46 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* Copyright (C) 2021 KikooDX */ + +#include "scale.h" +#include "options.h" +#include + +float scale_editor(struct Options options) +{ + const float w_ratio = + (float)GetScreenWidth() / options.editor_width; + const float h_ratio = + (float)GetScreenHeight() / options.editor_height; + return (w_ratio < h_ratio) ? w_ratio : h_ratio; +} + +Vector2 offset_editor(struct Options options) +{ + const float scaling = scale_editor(options); + return (Vector2){ + ((float)GetScreenWidth() - options.editor_width * scaling) / + 2, + ((float)GetScreenHeight() - + options.editor_height * scaling) / + 2}; +} + +float scale_picker(struct Options options) +{ + const float w_ratio = + (float)GetScreenWidth() / options.picker_window_width; + const float h_ratio = + (float)GetScreenHeight() / options.picker_window_height; + return (w_ratio < h_ratio) ? w_ratio : h_ratio; +} + +Vector2 offset_picker(struct Options options) +{ + const float scaling = scale_picker(options); + return (Vector2){((float)GetScreenWidth() - + options.picker_window_width * scaling) / + 2, + ((float)GetScreenHeight() - + options.picker_window_height * scaling) / + 2}; +} diff --git a/src/tile_picker/main.c b/src/tile_picker/main.c index a02a32a..6fb3199 100644 --- a/src/tile_picker/main.c +++ b/src/tile_picker/main.c @@ -4,6 +4,7 @@ #include "conf.h" #include "mouse.h" #include "options.h" +#include "scale.h" #include "shared_data.h" #include "tile_picker/draw.h" #include @@ -24,28 +25,48 @@ int tile_picker_main(struct Options options, Texture2D tileset; /* initialize raylib */ - InitWindow(options.picker_window_width, - options.picker_window_height, + InitWindow(options.picker_window_width * options.picker_scale, + options.picker_window_height * options.picker_scale, "SLE secondary window"); SetTargetFPS(options.picker_target_fps); init_mouse(options); /* load textures */ tileset = LoadTexture(options.tileset_path); + /* render targets used for upscaling */ + const RenderTexture2D rend_target = LoadRenderTexture( + options.picker_window_width, options.picker_window_height); + const RenderTexture2D flip_target = LoadRenderTexture( + options.picker_window_width, options.picker_window_height); + /* only proceed if tileset is well loaded */ if (tileset.width > 0) { while (!shared_data->end_child) { /* update */ + init_mouse(options); update_mouse(&mouse_x, &mouse_y, options, shared_data); /* draw */ BeginDrawing(); + BeginTextureMode(rend_target); ClearBackground(options.picker_bg_color); tileset_draw(tileset, options, shared_data->selected_tile); + EndTextureMode(); + + /* flip texture */ + BeginTextureMode(flip_target); + DrawTexture(rend_target.texture, 0, 0, WHITE); + EndTextureMode(); + + /* draw upscaled render */ + ClearBackground(BLACK); + DrawTextureEx(flip_target.texture, + offset_picker(options), 0, + scale_picker(options), WHITE); EndDrawing(); } } @@ -60,11 +81,15 @@ int tile_picker_main(struct Options options, static void init_mouse(struct Options options) { - SetMouseOffset(-options.picker_padding, - -options.picker_padding); + const float scaling = scale_picker(options); + const Vector2 off = offset_picker(options); + SetMouseOffset(-options.picker_padding - off.x, + -options.picker_padding - off.y); SetMouseScale( - 1.0 / (options.tile_width + options.picker_padding), - 1.0 / (options.tile_height + options.picker_padding)); + 1.0 / (options.tile_width + options.picker_padding) / + scaling, + 1.0 / (options.tile_height + options.picker_padding) / + scaling); } static void update_mouse(int *mouse_x, int *mouse_y,