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);
#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);
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);
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);
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);
#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;
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;
// 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/*<Vec2f>*/ positions;
- Dynarray/*<Color>*/ colors;
- Dynarray/*<char[ID_MAX_SIZE]>*/ 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,
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];
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
#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/*<Vec2f>*/ positions;
+ Dynarray/*<Color>*/ colors;
+ Dynarray/*<char[ID_MAX_SIZE]>*/ 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,