X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame%2Flevel%2Flevel_editor%2Flayer.c;h=1c3e1b8eefd5323a2c880187235c3f5eb3a12e43;hb=f95f6c77920df1cd11145385a6061afbac9e705f;hp=55e67ed1f602153de2fe47a169a4d398469288d2;hpb=108e2ebf4e13f590cf42807ef723409d5f5c76de;p=nothing.git diff --git a/src/game/level/level_editor/layer.c b/src/game/level/level_editor/layer.c index 55e67ed1..1c3e1b8e 100644 --- a/src/game/level/level_editor/layer.c +++ b/src/game/level/level_editor/layer.c @@ -1,171 +1,78 @@ #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 Layer { - Lt *lt; - Dynarray *rects; - Dynarray *colors; -}; - -Layer *create_layer(void) +#include "rect_layer.h" +#include "point_layer.h" +#include "player_layer.h" +#include "label_layer.h" +#include "background_layer.h" +#include "./layer.h" + +int layer_render(LayerPtr layer, const Camera *camera, int active) { - Lt *lt = create_lt(); - if (lt == NULL) { - return NULL; - } + switch (layer.type) { + case LAYER_RECT: + return rect_layer_render(layer.ptr, camera, active); - Layer *layer = PUSH_LT(lt, nth_alloc(sizeof(Layer)), 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); - } + case LAYER_POINT: + return point_layer_render(layer.ptr, camera, active); - layer->colors = PUSH_LT( - lt, - create_dynarray(sizeof(Color)), - destroy_dynarray); - if (layer->colors == NULL) { - RETURN_LT(lt, NULL); - } + case LAYER_PLAYER: + return player_layer_render(layer.ptr, camera, active); - return layer; -} - -Layer *create_layer_from_line_stream(LineStream *line_stream) -{ - trace_assert(line_stream); - - Layer *layer = create_layer(); - if (layer == NULL) { - return NULL; - } + case LAYER_BACKGROUND: + return background_layer_render(layer.ptr, camera, active); - const char *line = line_stream_next(line_stream); - if (line == NULL) { - RETURN_LT(layer->lt, NULL); + case LAYER_LABEL: + return label_layer_render(layer.ptr, camera, active); } - size_t count = 0; - if (sscanf(line, "%lu", &count) < 0) { - RETURN_LT(layer->lt, NULL); - } - - 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 (layer_add_rect(layer, rect, hexstr(hex)) < 0) { - RETURN_LT(layer->lt, NULL); - } - } - - return layer; + return -1; } -void destroy_layer(Layer *layer) +int layer_event(LayerPtr layer, + const SDL_Event *event, + const Camera *camera, + UndoHistory *undo_history) { - trace_assert(layer); - RETURN_LT0(layer->lt); -} + switch (layer.type) { + case LAYER_RECT: + return rect_layer_event(layer.ptr, event, camera, undo_history); -int layer_render(const Layer *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.5f); - if (camera_fill_rect(camera, rects[i], color) < 0) { - return -1; - } - } + case LAYER_POINT: + return point_layer_event(layer.ptr, event, camera, undo_history); - return 0; -} + case LAYER_PLAYER: + return player_layer_event(layer.ptr, event, camera, undo_history); -int layer_event(Layer *layer, const SDL_Event *event) -{ - trace_assert(layer); - trace_assert(event); - return 0; -} - -int layer_add_rect(Layer *layer, Rect rect, Color color) -{ - trace_assert(layer); + case LAYER_BACKGROUND: + return background_layer_event(layer.ptr, event, camera, undo_history); - if (dynarray_push(layer->rects, &rect) < 0) { - return -1; + case LAYER_LABEL: + return label_layer_event(layer.ptr, event, camera, undo_history); } - if (dynarray_push(layer->colors, &color) < 0) { - return -1; - } - - return 0; + return -1; } -int layer_delete_rect_at(Layer *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 Layer *layer) -{ - return dynarray_count(layer->rects); -} + case LAYER_BACKGROUND: { + return background_layer_dump_stream(layer.ptr, stream); + } -const Rect *layer_rects(const Layer *layer) -{ - return dynarray_data(layer->rects); -} + case LAYER_LABEL: + return label_layer_dump_stream(layer.ptr, stream); + } -const Color *layer_colors(const Layer *layer) -{ - return dynarray_data(layer->colors); + return -1; }