]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/layer.c
(#1050) Replace system clipboard with internal one
[nothing.git] / src / game / level / level_editor / layer.c
index 5a13039f24e0ceb1913ee2078a339753e7a0237c..1b95068596f8e838c0df4f590ae0276972be300b 100644 (file)
 #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, 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);
+    switch (layer.type) {
+    case LAYER_RECT:
+        return rect_layer_event(layer.ptr, event, camera, undo_history);
 
-    const size_t n = dynarray_count(layer->rects);
-    Rect *rects = dynarray_data(layer->rects);
-    Color *colors = dynarray_data(layer->colors);
+    case LAYER_POINT:
+        return point_layer_event(layer.ptr, event, camera, undo_history);
 
-    for (size_t i = 0; i < n; ++i) {
-        if (camera_fill_rect(camera, rects[i], colors[i]) < 0) {
-            return -1;
-        }
-    }
+    case LAYER_PLAYER:
+        return player_layer_event(layer.ptr, event, camera, undo_history);
 
-    return 0;
-}
+    case LAYER_BACKGROUND:
+        return background_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_LABEL:
+        return label_layer_event(layer.ptr, event, camera, undo_history);
+    }
+
+    return -1;
 }
 
-int layer_add_rect(Layer *layer, Rect rect, Color color)
+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);
 
-    dynarray_push(layer->rects, &rect);
-    dynarray_push(layer->colors, &color);
+    case LAYER_POINT:
+        return point_layer_dump_stream(layer.ptr, stream);
 
-    return 0;
-}
-
-int layer_delete_rect_at(Layer *layer, Vec position)
-{
-    trace_assert(layer);
+    case LAYER_PLAYER:
+        return player_layer_dump_stream(layer.ptr, stream);
 
-    const size_t n = dynarray_count(layer->rects);
-    Rect *rects = dynarray_data(layer->rects);
+    case LAYER_BACKGROUND: {
+        return background_layer_dump_stream(layer.ptr, stream);
+    }
 
-    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_LABEL:
+        return label_layer_dump_stream(layer.ptr, stream);
     }
 
-    return 0;
+    return -1;
 }