#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)
+#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);
- 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);
- }
+ 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;
-}
-
-RectLayer *create_layer_from_line_stream(LineStream *line_stream)
-{
- trace_assert(line_stream);
-
- RectLayer *layer = create_rect_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 (rect_layer_add_rect(layer, rect, hexstr(hex)) < 0) {
- RETURN_LT(layer->lt, NULL);
- }
- }
-
- 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);
-}
+ switch (layer.type) {
+ case LAYER_RECT:
+ return rect_layer_event(layer.ptr, event, camera, undo_history);
-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;
- }
- }
+ 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(RectLayer *layer, const SDL_Event *event)
-{
- trace_assert(layer);
- trace_assert(event);
- return 0;
-}
-
-int rect_layer_add_rect(RectLayer *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 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_BACKGROUND: {
+ return background_layer_dump_stream(layer.ptr, stream);
+ }
-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;
}