X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame%2Flevel%2Flevel_editor%2Flayer.c;h=d5a170bcb4673f58795211f02c844c2178ee0e87;hb=a5c395687d179e73f8f4fb9375955a195efcc6e1;hp=63d205b321cf24d7b8c89548ad31064df8f0362a;hpb=a9c827b8c12f01bcb8c587e3e3f81de15a820fd8;p=nothing.git diff --git a/src/game/level/level_editor/layer.c b/src/game/level/level_editor/layer.c index 63d205b3..d5a170bc 100644 --- a/src/game/level/level_editor/layer.c +++ b/src/game/level/level_editor/layer.c @@ -1,171 +1,79 @@ #include "game/camera.h" -#include "system/lt.h" -#include "system/stacktrace.h" -#include "system/nth_alloc.h" -#include "system/log.h" -#include "math/rect.h" -#include "color.h" -#include "layer.h" -#include "dynarray.h" -#include "system/line_stream.h" - -struct RectLayer { - Lt *lt; - Dynarray *rects; - Dynarray *colors; -}; - -RectLayer *create_rect_layer(void) -{ - Lt *lt = create_lt(); - if (lt == NULL) { - return NULL; - } - - RectLayer *layer = PUSH_LT(lt, nth_calloc(1, sizeof(RectLayer)), free); - if (layer == NULL) { - RETURN_LT(lt, NULL); - } - layer->lt = lt; - - layer->rects = PUSH_LT( - lt, - create_dynarray(sizeof(Rect)), - destroy_dynarray); - if (layer->rects == NULL) { - RETURN_LT(lt, NULL); - } - - layer->colors = PUSH_LT( - lt, - create_dynarray(sizeof(Color)), - destroy_dynarray); - if (layer->colors == NULL) { - RETURN_LT(lt, NULL); - } - - return layer; -} +#include "rect_layer.h" +#include "point_layer.h" +#include "player_layer.h" +#include "label_layer.h" +#include "./layer.h" -RectLayer *create_layer_from_line_stream(LineStream *line_stream) +int layer_render(LayerPtr layer, Camera *camera, int active) { - trace_assert(line_stream); + switch (layer.type) { + case LAYER_RECT: + return rect_layer_render(layer.ptr, camera, active); - RectLayer *layer = create_rect_layer(); - if (layer == NULL) { - return NULL; - } + case LAYER_POINT: + return point_layer_render(layer.ptr, camera, active); - const char *line = line_stream_next(line_stream); - if (line == NULL) { - RETURN_LT(layer->lt, NULL); - } + case LAYER_PLAYER: + return player_layer_render(layer.ptr, camera, active); - size_t count = 0; - if (sscanf(line, "%lu", &count) < 0) { - RETURN_LT(layer->lt, NULL); - } + case LAYER_COLOR_PICKER: + return active ? color_picker_render(layer.ptr, camera) : 0; - for (size_t i = 0; i < count; ++i) { - line = line_stream_next(line_stream); - if (line == NULL) { - RETURN_LT(layer->lt, NULL); - } - - char hex[7]; - Rect rect; - - if (sscanf(line, "%f%f%f%f%6s\n", - &rect.x, &rect.y, - &rect.w, &rect.h, - hex) < 0) { - RETURN_LT(layer->lt, NULL); - } - - if (rect_layer_add_rect(layer, rect, hexstr(hex)) < 0) { - RETURN_LT(layer->lt, NULL); - } + case LAYER_LABEL: + return label_layer_render(layer.ptr, camera, active); } - return layer; + return -1; } -void destroy_rect_layer(RectLayer *layer) +int layer_event(LayerPtr layer, + const SDL_Event *event, + const Camera *camera, + UndoHistory *undo_history) { - trace_assert(layer); - RETURN_LT0(layer->lt); -} - -int layer_render(const RectLayer *layer, Camera *camera) -{ - trace_assert(layer); - trace_assert(camera); - - const size_t n = dynarray_count(layer->rects); - Rect *rects = dynarray_data(layer->rects); - Color *colors = dynarray_data(layer->colors); - - for (size_t i = 0; i < n; ++i) { - Color color = rgba(colors[i].r, colors[i].g, colors[i].b, 0.75f); - if (camera_fill_rect(camera, rects[i], color) < 0) { - return -1; - } - } + switch (layer.type) { + case LAYER_RECT: + return rect_layer_event(layer.ptr, event, camera, undo_history); - return 0; -} - -int layer_event(RectLayer *layer, const SDL_Event *event) -{ - trace_assert(layer); - trace_assert(event); - return 0; -} + case LAYER_POINT: + return point_layer_event(layer.ptr, event, camera, undo_history); -int rect_layer_add_rect(RectLayer *layer, Rect rect, Color color) -{ - trace_assert(layer); + case LAYER_PLAYER: + return player_layer_event(layer.ptr, event, camera, undo_history); - if (dynarray_push(layer->rects, &rect) < 0) { - return -1; - } + case LAYER_COLOR_PICKER: + // TODO(#1000): undo history is not really applicable to color picker as layer + return color_picker_event(layer.ptr, event, NULL); - if (dynarray_push(layer->colors, &color) < 0) { - return -1; + case LAYER_LABEL: + return label_layer_event(layer.ptr, event, camera, undo_history); } - return 0; + return -1; } -int rect_layer_delete_rect_at(RectLayer *layer, Vec position) +int layer_dump_stream(LayerPtr layer, + FILE *stream) { - trace_assert(layer); + switch (layer.type) { + case LAYER_RECT: + return rect_layer_dump_stream(layer.ptr, stream); - const size_t n = dynarray_count(layer->rects); - Rect *rects = dynarray_data(layer->rects); - - for (size_t i = 0; i < n; ++i) { - if (rect_contains_point(rects[i], position)) { - dynarray_delete_at(layer->rects, i); - dynarray_delete_at(layer->colors, i); - return 0; - } - } + case LAYER_POINT: + return point_layer_dump_stream(layer.ptr, stream); - return 0; -} + case LAYER_PLAYER: + return player_layer_dump_stream(layer.ptr, stream); -size_t layer_count(const RectLayer *layer) -{ - return dynarray_count(layer->rects); -} + case LAYER_COLOR_PICKER: { + color_hex_to_stream(color_picker_rgba(layer.ptr), stream); + return fprintf(stream, "\n"); + } -const Rect *layer_rects(const RectLayer *layer) -{ - return dynarray_data(layer->rects); -} + case LAYER_LABEL: + return label_layer_dump_stream(layer.ptr, stream); + } -const Color *layer_colors(const RectLayer *layer) -{ - return dynarray_data(layer->colors); + return -1; }