From 56e308932f300c06da3611a7687de6882da60d6f Mon Sep 17 00:00:00 2001 From: rexim Date: Mon, 6 Jan 2020 05:17:03 +0700 Subject: [PATCH] Remove Lt from PointLayer --- src/game/level.c | 2 +- src/game/level/goals.h | 1 - src/game/level/level_editor.c | 19 +---- src/game/level/level_editor.h | 4 +- src/game/level/level_editor/point_layer.c | 94 ++++++----------------- src/game/level/level_editor/point_layer.h | 38 ++++++++- 6 files changed, 63 insertions(+), 95 deletions(-) diff --git a/src/game/level.c b/src/game/level.c index c1ffff77..e61d4e31 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -94,7 +94,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor) level->goals = PUSH_LT( lt, - create_goals_from_point_layer(level_editor->goals_layer), + create_goals_from_point_layer(&level_editor->goals_layer), destroy_goals); if (level->goals == NULL) { RETURN_LT(lt, NULL); diff --git a/src/game/level/goals.h b/src/game/level/goals.h index 013fbd41..a0374d3b 100644 --- a/src/game/level/goals.h +++ b/src/game/level/goals.h @@ -9,7 +9,6 @@ #include "config.h" typedef struct Goals Goals; -typedef struct PointLayer PointLayer; Goals *create_goals_from_point_layer(const PointLayer *point_layer); void destroy_goals(Goals *goals); diff --git a/src/game/level/level_editor.c b/src/game/level/level_editor.c index 021cdd56..5ee23793 100644 --- a/src/game/level/level_editor.c +++ b/src/game/level/level_editor.c @@ -51,20 +51,9 @@ LevelEditor *create_level_editor(Cursor *cursor) level_editor->edit_field_filename.font_color = LEVEL_EDITOR_EDIT_FIELD_COLOR; level_editor->background_layer = create_background_layer(hexstr("fffda5")); - - level_editor->player_layer = - create_player_layer(vec(0.0f, 0.0f), hexstr("ff8080")); - + level_editor->player_layer = create_player_layer(vec(0.0f, 0.0f), hexstr("ff8080")); level_editor->platforms_layer = create_rect_layer("platform", cursor); - - level_editor->goals_layer = PUSH_LT( - lt, - create_point_layer("goal"), - destroy_point_layer); - if (level_editor->goals_layer == NULL) { - RETURN_LT(lt, NULL); - } - + level_editor->goals_layer = create_point_layer("goal"), level_editor->lava_layer = create_rect_layer("lava", cursor); level_editor->back_platforms_layer = create_rect_layer("back_platform", cursor); level_editor->boxes_layer = create_rect_layer("box", cursor); @@ -82,7 +71,7 @@ LevelEditor *create_level_editor(Cursor *cursor) level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(&level_editor->boxes_layer); level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(&level_editor->platforms_layer); level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(&level_editor->back_platforms_layer); - level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(level_editor->goals_layer); + level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(&level_editor->goals_layer); level_editor->layers[LAYER_PICKER_PLAYER] = player_layer_as_layer(&level_editor->player_layer); level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(&level_editor->lava_layer); level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(&level_editor->regions_layer); @@ -163,7 +152,7 @@ LevelEditor *create_level_editor_from_file(const char *file_name, Cursor *cursor level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(&level_editor->boxes_layer); level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(&level_editor->platforms_layer); level_editor->layers[LAYER_PICKER_BACK_PLATFORMS] = rect_layer_as_layer(&level_editor->back_platforms_layer); - level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(level_editor->goals_layer); + level_editor->layers[LAYER_PICKER_GOALS] = point_layer_as_layer(&level_editor->goals_layer); level_editor->layers[LAYER_PICKER_PLAYER] = player_layer_as_layer(&level_editor->player_layer); level_editor->layers[LAYER_PICKER_LAVA] = rect_layer_as_layer(&level_editor->lava_layer); level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(&level_editor->regions_layer); diff --git a/src/game/level/level_editor.h b/src/game/level/level_editor.h index 4f6dac3a..b56c5f96 100644 --- a/src/game/level/level_editor.h +++ b/src/game/level/level_editor.h @@ -5,11 +5,11 @@ #include "game/level/level_editor/layer_picker.h" #include "game/level/level_editor/undo_history.h" #include "game/level/level_editor/rect_layer.h" +#include "game/level/level_editor/point_layer.h" #include "ui/wiggly_text.h" #include "ui/cursor.h" typedef struct LevelEditor LevelEditor; -typedef struct PointLayer PointLayer; typedef struct LabelLayer LabelLayer; typedef struct Sound_samples Sound_samples; @@ -31,7 +31,7 @@ struct LevelEditor RectLayer boxes_layer; RectLayer platforms_layer; RectLayer back_platforms_layer; - PointLayer *goals_layer; + PointLayer goals_layer; PlayerLayer player_layer; RectLayer lava_layer; RectLayer regions_layer; diff --git a/src/game/level/level_editor/point_layer.c b/src/game/level/level_editor/point_layer.c index 89f3daa6..763ed194 100644 --- a/src/game/level/level_editor/point_layer.c +++ b/src/game/level/level_editor/point_layer.c @@ -25,31 +25,6 @@ static Color point_clipboard_color; // TODO(#1140): PointLayer does not support snapping -typedef enum { - POINT_LAYER_IDLE = 0, - POINT_LAYER_EDIT_ID, - POINT_LAYER_MOVE, - POINT_LAYER_RECOLOR -} PointLayerState; - -struct PointLayer -{ - Lt *lt; - PointLayerState state; - Dynarray/**/ positions; - Dynarray/**/ colors; - Dynarray/**/ ids; - int selection; - ColorPicker color_picker; - - Vec2f inter_position; - Color inter_color; - Edit_field edit_field; - - int id_name_counter; - const char *id_name_prefix; -}; - typedef enum { POINT_UNDO_ADD, POINT_UNDO_DELETE, @@ -165,39 +140,28 @@ LayerPtr point_layer_as_layer(PointLayer *point_layer) return layer; } -PointLayer *create_point_layer(const char *id_name_prefix) +PointLayer create_point_layer(const char *id_name_prefix) { - Lt *lt = create_lt(); - - PointLayer *point_layer = PUSH_LT(lt, nth_calloc(1, sizeof(PointLayer)), free); - if (point_layer == NULL) { - RETURN_LT(lt, NULL); - } - point_layer->lt = lt; - - point_layer->state = POINT_LAYER_IDLE; - - point_layer->positions = create_dynarray(sizeof(Vec2f)); - point_layer->colors = create_dynarray(sizeof(Color)); - point_layer->ids = create_dynarray(sizeof(char) * ID_MAX_SIZE); - - point_layer->edit_field.font_size = POINT_LAYER_ID_TEXT_SIZE; - point_layer->edit_field.font_color = POINT_LAYER_ID_TEXT_COLOR; - - point_layer->id_name_prefix = id_name_prefix; - - return point_layer; + PointLayer result = {0}; + result.state = POINT_LAYER_IDLE; + result.positions = create_dynarray(sizeof(Vec2f)); + result.colors = create_dynarray(sizeof(Color)); + result.ids = create_dynarray(sizeof(char) * ID_MAX_SIZE); + result.edit_field.font_size = POINT_LAYER_ID_TEXT_SIZE; + result.edit_field.font_color = POINT_LAYER_ID_TEXT_COLOR; + result.id_name_prefix = id_name_prefix; + return result; } -PointLayer *chop_point_layer(Memory *memory, - String *input, - const char *id_name_prefix) +PointLayer chop_point_layer(Memory *memory, + String *input, + const char *id_name_prefix) { trace_assert(memory); trace_assert(input); trace_assert(id_name_prefix); - PointLayer *point_layer = create_point_layer(id_name_prefix); + PointLayer result = create_point_layer(id_name_prefix); int n = atoi(string_to_cstr(memory, trim(chop_by_delim(input, '\n')))); char id[ENTITY_MAX_ID_SIZE]; @@ -210,31 +174,17 @@ PointLayer *chop_point_layer(Memory *memory, Color color = hexs(trim(chop_word(&line))); memset(id, 0, ENTITY_MAX_ID_SIZE); - memcpy( - id, - string_id.data, - min_size_t(ENTITY_MAX_ID_SIZE - 1, string_id.count)); - - dynarray_push(&point_layer->positions, &point); - dynarray_push(&point_layer->colors, &color); - dynarray_push(&point_layer->ids, id); - } + memcpy(id, string_id.data, min_size_t(ENTITY_MAX_ID_SIZE - 1, string_id.count)); - point_layer->selection = -1; - point_layer->color_picker = create_color_picker_from_rgba(COLOR_RED); - - return point_layer; -} - -void destroy_point_layer(PointLayer *point_layer) -{ - trace_assert(point_layer); + dynarray_push(&result.positions, &point); + dynarray_push(&result.colors, &color); + dynarray_push(&result.ids, id); + } - free(point_layer->positions.data); - free(point_layer->colors.data); - free(point_layer->ids.data); + result.selection = -1; + result.color_picker = create_color_picker_from_rgba(COLOR_RED); - RETURN_LT0(point_layer->lt); + return result; } static inline diff --git a/src/game/level/level_editor/point_layer.h b/src/game/level/level_editor/point_layer.h index d08df710..a3923d8e 100644 --- a/src/game/level/level_editor/point_layer.h +++ b/src/game/level/level_editor/point_layer.h @@ -7,16 +7,46 @@ #define ID_MAX_SIZE 36 -typedef struct PointLayer PointLayer; +typedef enum { + POINT_LAYER_IDLE = 0, + POINT_LAYER_EDIT_ID, + POINT_LAYER_MOVE, + POINT_LAYER_RECOLOR +} PointLayerState; + +typedef struct { + PointLayerState state; + Dynarray/**/ positions; + Dynarray/**/ colors; + Dynarray/**/ ids; + int selection; + ColorPicker color_picker; + + Vec2f inter_position; + Color inter_color; + Edit_field edit_field; + + int id_name_counter; + const char *id_name_prefix; +} PointLayer; + LayerPtr point_layer_as_layer(PointLayer *point_layer); // NOTE: create_point_layer and create_point_layer_from_line_stream do // not own id_name_prefix -PointLayer *create_point_layer(const char *id_name_prefix); -PointLayer *chop_point_layer(Memory *memory, +PointLayer create_point_layer(const char *id_name_prefix); +PointLayer chop_point_layer(Memory *memory, String *input, const char *id_name_prefix); -void destroy_point_layer(PointLayer *point_layer); + +static inline +void destroy_point_layer(PointLayer point_layer) +{ + free(point_layer.positions.data); + free(point_layer.colors.data); + free(point_layer.ids.data); +} + int point_layer_render(const PointLayer *point_layer, const Camera *camera, -- 2.44.0