From 7f0b5934984d4df8ebdb4c4ddc142af722e6b76f Mon Sep 17 00:00:00 2001 From: KikooDX Date: Fri, 26 Mar 2021 13:54:38 +0100 Subject: [PATCH] Replace compile time determined options with a struct This will allow to change these values at launch, or even runtime. --- CMakeLists.txt | 1 + include/conf.h | 35 ++++++++---------- include/editing_area/draw.h | 6 ++- include/editing_area/main.h | 3 +- include/options.h | 25 +++++++++++++ include/tile_picker/draw.h | 4 +- include/tile_picker/main.h | 3 +- src/editing_area/draw.c | 47 +++++++++++++++-------- src/editing_area/main.c | 39 +++++++++---------- src/main.c | 74 ++++++++++++++++++++++++++----------- src/options.c | 23 ++++++++++++ src/tile_picker/draw.c | 28 ++++++++------ src/tile_picker/main.c | 40 ++++++++++++-------- 13 files changed, 220 insertions(+), 108 deletions(-) create mode 100644 include/options.h create mode 100644 src/options.c diff --git a/CMakeLists.txt b/CMakeLists.txt index af94e46..5f72794 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories(include) set(SOURCES src/main.c + src/options.c src/mouse.c src/editing_area/main.c src/editing_area/level.c diff --git a/include/conf.h b/include/conf.h index d6787ac..9045c22 100644 --- a/include/conf.h +++ b/include/conf.h @@ -4,27 +4,24 @@ #include /* for the color struct */ -#define TILE_WIDTH 16 /* in pixels */ +#define TILE_WIDTH 16 #define TILE_HEIGHT 16 -#define TILESET_WIDTH 16 /* in tiles */ -#define TILESET_HEIGHT 16 -#define TILESET_MIN_WIDTH_PX (TILE_WIDTH * TILESET_WIDTH) -#define TILESET_MIN_HEIGHT_PX (TILE_HEIGHT * TILESET_HEIGHT) -static const int editor_target_fps = 60; -static const int picker_target_fps = 30; -static const Color unselected_tile_color = {80, 80, 80, 255}; -static const Color overring_tile_color = {255, 255, 255, 80}; +#define UNSELECTED_TILE_COLOR \ + (Color) { 80, 80, 80, 255 } +#define OVERRING_TILE_COLOR \ + (Color) { 255, 255, 255, 80 } -#define EDITOR_SCALE 1 /* don't change this yet! */ -static const int editor_window_width = 396 * EDITOR_SCALE; -static const int editor_window_height = 224 * EDITOR_SCALE; -static const int draw_offset_x = -2 * EDITOR_SCALE; -static const int draw_offset_y = -8 * EDITOR_SCALE; +#define EDITOR_WINDOW_WIDTH 396 +#define EDITOR_WINDOW_HEIGHT 224 +#define EDITOR_TARGET_FPS 60 +#define EDITOR_DRAW_OFFSET_X -2 +#define EDITOR_DRAW_OFFSET_Y -8 -#define PICKER_SCALE 1 /* don't change this yet! */ +#define PICKER_TARGET_FPS 30 #define PICKER_PADDING 4 -static const int picker_window_width = - (TILE_WIDTH + PICKER_PADDING) * TILESET_WIDTH + PICKER_PADDING; -static const int picker_window_height = - (TILE_HEIGHT + PICKER_PADDING) * TILESET_HEIGHT + PICKER_PADDING; +#define PICKER_WINDOW_WIDTH \ + ((TILE_WIDTH + PICKER_PADDING) * TILESET_WIDTH + PICKER_PADDING) +#define PICKER_WINDOW_HEIGHT \ + ((TILE_HEIGHT + PICKER_PADDING) * TILESET_HEIGHT + \ + PICKER_PADDING) diff --git a/include/editing_area/draw.h b/include/editing_area/draw.h index 61d882f..aba5d3b 100644 --- a/include/editing_area/draw.h +++ b/include/editing_area/draw.h @@ -3,7 +3,9 @@ #pragma once #include "level.h" +#include "options.h" #include -void level_draw(struct Level level, Texture2D tileset); -void editor_mouse_draw(int x, int y); +void level_draw(struct Level level, struct Options options, + Texture2D tileset); +void editor_mouse_draw(struct Options options, int x, int y); diff --git a/include/editing_area/main.h b/include/editing_area/main.h index af7661e..3857781 100644 --- a/include/editing_area/main.h +++ b/include/editing_area/main.h @@ -2,7 +2,8 @@ /* Copyright (C) 2021 KikooDX */ #pragma once +#include "options.h" #include "shared_data.h" -int editing_area_main(char *level_path, char *tileset_path, +int editing_area_main(struct Options options, struct SharedData *shared_data); diff --git a/include/options.h b/include/options.h new file mode 100644 index 0000000..c9ee047 --- /dev/null +++ b/include/options.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* Copyright (C) 2021 KikooDX */ +#pragma once + +#define BUFFER_SIZE 256 + +struct Options { + char tileset_path[BUFFER_SIZE]; + char level_path[BUFFER_SIZE]; + int tile_width; + int tile_height; + int tileset_width; + int tileset_height; + int editor_window_width; + int editor_window_height; + int editor_target_fps; + int editor_draw_offset_x; + int editor_draw_offset_y; + int picker_window_width; + int picker_window_height; + int picker_target_fps; + int picker_padding; +}; + +struct Options options_defaults(void); diff --git a/include/tile_picker/draw.h b/include/tile_picker/draw.h index 968d4d5..ddca01d 100644 --- a/include/tile_picker/draw.h +++ b/include/tile_picker/draw.h @@ -2,6 +2,8 @@ /* Copyright (C) 2021 KikooDX */ #pragma once +#include "options.h" #include -void tileset_draw(Texture2D tileset, int selected_tile); +void tileset_draw(Texture2D tileset, struct Options options, + int selected_tile); diff --git a/include/tile_picker/main.h b/include/tile_picker/main.h index c6190c6..ac75955 100644 --- a/include/tile_picker/main.h +++ b/include/tile_picker/main.h @@ -2,7 +2,8 @@ /* Copyright (C) 2021 KikooDX */ #pragma once +#include "options.h" #include "shared_data.h" -int tile_picker_main(char *tileset_path, +int tile_picker_main(struct Options options, struct SharedData *shared_data); diff --git a/src/editing_area/draw.c b/src/editing_area/draw.c index 7485c00..e3b1b24 100644 --- a/src/editing_area/draw.c +++ b/src/editing_area/draw.c @@ -3,35 +3,50 @@ #include "conf.h" #include "editing_area/level.h" +#include "options.h" #include #include -void level_draw(struct Level level, Texture2D tileset) +void level_draw(struct Level level, struct Options options, + Texture2D tileset) { int x; int y; for (x = 0; x < level.width; x += 1) { for (y = 0; y < level.height; y += 1) { - const int tile = - level.data[x + y * level.width]; - const Rectangle tile_rect = { - (int)(tile % TILESET_WIDTH) * TILE_WIDTH, - (int)(tile / TILESET_HEIGHT) * TILE_WIDTH, - TILE_WIDTH, TILE_HEIGHT}; - const Vector2 tile_pos = { - x * TILE_WIDTH + draw_offset_x, - y * TILE_HEIGHT + draw_offset_y}; - if (tile) + const int tile_index = x + y * level.width; + if (tile_index && + tile_index < options.tileset_width * + options.tileset_height) { + const int tile = + level.data[x + y * level.width]; + const Rectangle tile_rect = { + (int)(tile % + options.tileset_width) * + options.tile_width, + (int)(tile / + options.tileset_height) * + options.tile_height, + options.tile_width, + options.tile_height}; + const Vector2 tile_pos = { + x * options.tile_width + + options.editor_draw_offset_x, + y * options.tile_height + + options.editor_draw_offset_y}; DrawTextureRec(tileset, tile_rect, tile_pos, WHITE); + } } } } -void editor_mouse_draw(int x, int y) +void editor_mouse_draw(struct Options options, int x, int y) { - const int tx = x * TILE_WIDTH + draw_offset_x; - const int ty = y * TILE_HEIGHT + draw_offset_y; - DrawRectangle(tx, ty, TILE_WIDTH, TILE_HEIGHT, - overring_tile_color); + const int tx = + x * options.tile_width + options.editor_draw_offset_x; + const int ty = + y * options.tile_height + options.editor_draw_offset_y; + DrawRectangle(tx, ty, options.tile_width, options.tile_height, + OVERRING_TILE_COLOR); } diff --git a/src/editing_area/main.c b/src/editing_area/main.c index d27cbe0..ed4b6eb 100644 --- a/src/editing_area/main.c +++ b/src/editing_area/main.c @@ -1,10 +1,10 @@ /* SPDX-License-Identifier: GPL-3.0-or-later */ /* Copyright (C) 2021 KikooDX */ -#include "conf.h" #include "editing_area/draw.h" #include "editing_area/level.h" #include "mouse.h" +#include "options.h" #include "shared_data.h" #include #include @@ -12,11 +12,11 @@ #include #include -static void init_mouse(void); +static void init_mouse(struct Options options); static void update_mouse(int *mouse_x, int *mouse_y, struct Level level, struct SharedData *shared_data); -int editing_area_main(char *level_path, char *tileset_path, +int editing_area_main(struct Options options, struct SharedData *shared_data) { int mouse_x; @@ -27,26 +27,26 @@ int editing_area_main(char *level_path, char *tileset_path, Texture2D tileset; /* initialize raylib */ - InitWindow(editor_window_width, editor_window_height, - "SLE main window"); - SetTargetFPS(editor_target_fps); - init_mouse(); + InitWindow(options.editor_window_width, + options.editor_window_height, "SLE main window"); + SetTargetFPS(options.editor_target_fps); + init_mouse(options); /* load textures */ - tileset = LoadTexture(tileset_path); + tileset = LoadTexture(options.tileset_path); /* only proceed if tileset is large enough */ - if (tileset.width < TILESET_MIN_WIDTH_PX || - tileset.height < TILESET_MIN_HEIGHT_PX) { + if (tileset.width < options.tile_width || + tileset.height < options.tile_height) { fprintf(stderr, "ERROR: tileset size is invalid, expected at " "least [%d ; %d], got [%d ; %d]\n", - TILESET_MIN_WIDTH_PX, TILESET_MIN_HEIGHT_PX, + options.tile_width, options.tile_height, tileset.width, tileset.height); goto panic; } /* load level */ - if (level_read(&level, level_path)) + if (level_read(&level, options.level_path)) goto panic; while (!WindowShouldClose()) { @@ -57,14 +57,14 @@ int editing_area_main(char *level_path, char *tileset_path, BeginDrawing(); ClearBackground(BLACK); - level_draw(level, tileset); - editor_mouse_draw(mouse_x, mouse_y); + level_draw(level, options, tileset); + editor_mouse_draw(options, mouse_x, mouse_y); EndDrawing(); } /* save level */ - level_write(level, level_path); + level_write(level, options.level_path); panic: @@ -84,11 +84,12 @@ panic: return EXIT_SUCCESS; } -static void init_mouse(void) +static void init_mouse(struct Options options) { - SetMouseOffset(-draw_offset_x, -draw_offset_y); - SetMouseScale(1.0 / (TILE_WIDTH * EDITOR_SCALE), - 1.0 / (TILE_HEIGHT * EDITOR_SCALE)); + SetMouseOffset(-options.editor_draw_offset_x, + -options.editor_draw_offset_y); + SetMouseScale(1.0 / options.tile_width, + 1.0 / 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 fec26cf..131b29f 100644 --- a/src/main.c +++ b/src/main.c @@ -2,6 +2,7 @@ /* Copyright (C) 2021 KikooDX */ #include "editing_area/main.h" +#include "options.h" #include "shared_data.h" #include "tile_picker/main.h" #include @@ -14,33 +15,34 @@ #include #include -static const int buffer_size = 256; - static void *create_shared_memory(size_t size); static void overflow_prevention(void); /* work on optarg */ static void process_arguments(int argc, char **argv, - char tileset_path[buffer_size], - char level_path[buffer_size]); + struct Options *options); +static void set_tileset_dimensions(struct Options *options); /* The editor fork to create two windows. One will be the level editor * and the other the tile selection. This is done to allow the user to * organize these panels in the way they want to. */ int main(int argc, char **argv) { + int error; pid_t child_process; - char level_path[buffer_size] = ""; - char tileset_path[buffer_size] = ""; - struct SharedData *shared_data = - (struct SharedData *)create_shared_memory( - sizeof(struct SharedData)); + struct SharedData *shared_data; + struct Options options = options_defaults(); + + shared_data = (struct SharedData *)create_shared_memory( + sizeof(struct SharedData)); shared_data->end_child = false; - shared_data->selected_tile = 69; + shared_data->selected_tile = 1; /* set log level */ SetTraceLogLevel(LOG_ERROR); /* process arguments */ - process_arguments(argc, argv, tileset_path, level_path); + process_arguments(argc, argv, &options); + /* set non-user defined options */ + set_tileset_dimensions(&options); /* forking here */ child_process = fork(); @@ -49,11 +51,10 @@ int main(int argc, char **argv) return EXIT_FAILURE; } else if (child_process == 0) { /* child process, start the tile picker */ - return tile_picker_main(tileset_path, shared_data); + return tile_picker_main(options, shared_data); } else { /* main process, start the editing area */ - editing_area_main(level_path, tileset_path, - shared_data); + editing_area_main(options, shared_data); return EXIT_SUCCESS; } } @@ -71,18 +72,17 @@ static void *create_shared_memory(size_t size) static void overflow_prevention(void) { /* make sure arguments won't overflow */ - if (strlen(optarg) > buffer_size) { + if (strlen(optarg) > BUFFER_SIZE) { fprintf(stderr, "ERROR: option size %lu is " "bigger than maximum %d\n", - strlen(optarg), buffer_size); + strlen(optarg), BUFFER_SIZE); exit(EXIT_FAILURE); } } static void process_arguments(int argc, char **argv, - char tileset_path[buffer_size], - char level_path[buffer_size]) + struct Options *options) { int opt; while (1) { @@ -103,11 +103,11 @@ static void process_arguments(int argc, char **argv, switch (opt) { case 'l': overflow_prevention(); - strcpy(level_path, optarg); + strcpy(options->level_path, optarg); break; case 't': overflow_prevention(); - strcpy(tileset_path, optarg); + strcpy(options->tileset_path, optarg); break; case '?': /* getopt_long already printed an error message @@ -124,12 +124,12 @@ static void process_arguments(int argc, char **argv, /* missing arguments? */ { int error = 0; - if (level_path[0] == '\0') { + if (options->level_path[0] == '\0') { fprintf(stderr, "ERROR: no level path " "specified (-level )\n"); error = 1; } - if (tileset_path[0] == '\0') { + if (options->tileset_path[0] == '\0') { fprintf(stderr, "ERROR: no tileset path specified " "(-tileset )\n"); @@ -139,3 +139,33 @@ static void process_arguments(int argc, char **argv, exit(EXIT_FAILURE); } } + +static void set_tileset_dimensions(struct Options *options) +{ + const Image tileset = LoadImage(options->tileset_path); + + if (tileset.width < 0 || tileset.height < 0) { + fprintf(stderr, "ERROR: can't load tileset '%s'\n", + options->tileset_path); + exit(EXIT_FAILURE); + } + + /* set options */ + /* tileset_width */ + options->tileset_width = tileset.width / options->tile_width; + /* tileset_height */ + options->tileset_height = tileset.height / options->tile_height; + /* picker_window_width */ + options->picker_window_width = + (options->tile_width + options->picker_padding) * + options->tileset_width + + options->picker_padding; + /* picker_window_height */ + options->picker_window_height = + (options->tile_height + options->picker_padding) * + options->tileset_height + + options->picker_padding; + + /* free memory */ + UnloadImage(tileset); +} diff --git a/src/options.c b/src/options.c new file mode 100644 index 0000000..f8fd94d --- /dev/null +++ b/src/options.c @@ -0,0 +1,23 @@ +#include "options.h" +#include "conf.h" + +struct Options options_defaults(void) +{ + return (struct Options){ + .tileset_path = "", + .level_path = "", + .tile_width = TILE_WIDTH, + .tile_height = TILE_HEIGHT, + .tileset_width = 0, + .tileset_height = 0, + .editor_window_width = EDITOR_WINDOW_WIDTH, + .editor_window_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, + .picker_window_width = 0, + .picker_window_height = 0, + .picker_target_fps = PICKER_TARGET_FPS, + .picker_padding = PICKER_PADDING, + }; +} diff --git a/src/tile_picker/draw.c b/src/tile_picker/draw.c index f027377..907336b 100644 --- a/src/tile_picker/draw.c +++ b/src/tile_picker/draw.c @@ -3,26 +3,32 @@ #include "tile_picker/draw.h" #include "conf.h" +#include "options.h" #include -void tileset_draw(Texture2D tileset, int selected_tile) +void tileset_draw(Texture2D tileset, struct Options options, + int selected_tile) { int x; int y; /* draw tiles */ - for (x = 0; x < TILESET_WIDTH; x += 1) { - for (y = 0; y < TILESET_HEIGHT; y += 1) { + for (x = 0; x < options.tileset_width; x += 1) { + for (y = 0; y < options.tileset_height; y += 1) { const Rectangle tile_rect = { - x * TILE_WIDTH, y * TILE_HEIGHT, TILE_WIDTH, - TILE_HEIGHT}; + x * options.tile_width, + y * options.tile_height, options.tile_width, + options.tile_height}; const Vector2 tile_pos = { - x * (TILE_WIDTH + PICKER_PADDING) + - PICKER_PADDING, - y * (TILE_HEIGHT + PICKER_PADDING) + - PICKER_PADDING}; + x * (options.tile_width + + options.picker_padding) + + options.picker_padding, + y * (options.tile_height + + options.picker_padding) + + options.picker_padding}; /* apply tint if tile isn't selected */ - Color tint = unselected_tile_color; - if (x + y * TILESET_WIDTH == selected_tile) + Color tint = UNSELECTED_TILE_COLOR; + if (x + y * options.tileset_width == + selected_tile) tint = WHITE; /* draw the tile */ DrawTextureRec(tileset, tile_rect, tile_pos, diff --git a/src/tile_picker/main.c b/src/tile_picker/main.c index d75c333..843bee6 100644 --- a/src/tile_picker/main.c +++ b/src/tile_picker/main.c @@ -1,8 +1,8 @@ /* SPDX-License-Identifier: GPL-3.0-or-later */ /* Copyright (C) 2021 KikooDX */ -#include "conf.h" #include "mouse.h" +#include "options.h" #include "shared_data.h" #include "tile_picker/draw.h" #include @@ -10,35 +10,39 @@ #include #include -static void init_mouse(void); +static void init_mouse(struct Options options); static void update_mouse(int *mouse_x, int *mouse_y, + struct Options options, struct SharedData *shared_data); -int tile_picker_main(char *tileset_path, struct SharedData *shared_data) +int tile_picker_main(struct Options options, + struct SharedData *shared_data) { int mouse_x; int mouse_y; Texture2D tileset; /* initialize raylib */ - InitWindow(picker_window_width, picker_window_height, + InitWindow(options.picker_window_width, + options.picker_window_height, "SLE secondary window"); - SetTargetFPS(picker_target_fps); - init_mouse(); + SetTargetFPS(options.picker_target_fps); + init_mouse(options); /* load textures */ - tileset = LoadTexture(tileset_path); + tileset = LoadTexture(options.tileset_path); /* only proceed if tileset is well loaded */ if (tileset.width > 0) { while (!shared_data->end_child) { /* update */ - update_mouse(&mouse_x, &mouse_y, shared_data); + update_mouse(&mouse_x, &mouse_y, options, + shared_data); /* draw */ BeginDrawing(); ClearBackground(BLACK); - tileset_draw(tileset, + tileset_draw(tileset, options, shared_data->selected_tile); EndDrawing(); @@ -53,15 +57,17 @@ int tile_picker_main(char *tileset_path, struct SharedData *shared_data) return EXIT_SUCCESS; } -static void init_mouse(void) +static void init_mouse(struct Options options) { - SetMouseOffset(-PICKER_PADDING, -PICKER_PADDING); + SetMouseOffset(-options.picker_padding, + -options.picker_padding); SetMouseScale( - 1.0 / ((TILE_WIDTH + PICKER_PADDING) * PICKER_SCALE), - 1.0 / ((TILE_HEIGHT + PICKER_PADDING) * PICKER_SCALE)); + 1.0 / (options.tile_width + options.picker_padding), + 1.0 / (options.tile_height + options.picker_padding)); } static void update_mouse(int *mouse_x, int *mouse_y, + struct Options options, struct SharedData *shared_data) { const bool left_click = IsMouseButtonDown(0); @@ -69,11 +75,13 @@ static void update_mouse(int *mouse_x, int *mouse_y, update_mouse_position( mouse_x, mouse_y, - TILESET_MIN_WIDTH_PX + TILESET_WIDTH * PICKER_PADDING, - TILESET_MIN_HEIGHT_PX + TILESET_HEIGHT * PICKER_PADDING); + options.tileset_width * + (options.tileset_width + options.picker_padding), + options.tileset_height * + (options.tileset_height + options.picker_padding)); /* set left button tile */ if (left_click) shared_data->selected_tile = - *mouse_x + *mouse_y * TILESET_WIDTH; + *mouse_x + *mouse_y * options.tileset_width; }