#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"
-
-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);
- trace_assert(layer);
+ case LAYER_BACKGROUND:
+ return background_layer_render(layer.ptr, camera, active);
- return layer;
-}
+ case LAYER_LABEL:
+ return label_layer_render(layer.ptr, camera, active);
+ }
-void destroy_layer(Layer *layer)
-{
- trace_assert(layer);
- RETURN_LT0(layer->lt);
+ return -1;
}
-int layer_render(const Layer *layer, Camera *camera)
+int layer_event(LayerPtr layer,
+ const SDL_Event *event,
+ const Camera *camera,
+ UndoHistory *undo_history)
{
- trace_assert(layer);
- trace_assert(camera);
- return 0;
-}
+ switch (layer.type) {
+ case LAYER_RECT:
+ return rect_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;
-}
+ case LAYER_POINT:
+ return point_layer_event(layer.ptr, event, camera, undo_history);
-// TODO: layer_add_rect is not implemented
-int layer_add_rect(Layer *layer, Rect rect, Color color)
-{
- trace_assert(layer);
- (void) rect;
- (void) color;
+ case LAYER_PLAYER:
+ return player_layer_event(layer.ptr, event, camera, undo_history);
+
+ case LAYER_BACKGROUND:
+ return background_layer_event(layer.ptr, event, camera, undo_history);
- return 0;
+ case LAYER_LABEL:
+ return label_layer_event(layer.ptr, event, camera, undo_history);
+ }
+
+ return -1;
}
-// TODO: layer_delete_rect_at is not implemented
-int layer_delete_rect_at(Layer *layer, Vec position)
+int layer_dump_stream(LayerPtr layer,
+ FILE *stream)
{
- trace_assert(layer);
- (void) position;
+ switch (layer.type) {
+ case LAYER_RECT:
+ return rect_layer_dump_stream(layer.ptr, stream);
+
+ case LAYER_POINT:
+ return point_layer_dump_stream(layer.ptr, stream);
+
+ case LAYER_PLAYER:
+ return player_layer_dump_stream(layer.ptr, stream);
+
+ case LAYER_BACKGROUND: {
+ return background_layer_dump_stream(layer.ptr, stream);
+ }
+
+ case LAYER_LABEL:
+ return label_layer_dump_stream(layer.ptr, stream);
+ }
- return 0;
+ return -1;
}