]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/layer.c
Merge pull request #998 from tsoding/824
[nothing.git] / src / game / level / level_editor / layer.c
index bc858e6a669ad5bbcce2b28de2832f3c44f79f79..d5a170bcb4673f58795211f02c844c2178ee0e87 100644 (file)
@@ -1,88 +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"
-
-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 "./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_COLOR_PICKER:
+        return active ? color_picker_render(layer.ptr, camera) : 0;
 
-    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_COLOR_PICKER:
+        // TODO(#1000): undo history is not really applicable to color picker as layer
+        return color_picker_event(layer.ptr, event, NULL);
 
-    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_COLOR_PICKER: {
+        color_hex_to_stream(color_picker_rgba(layer.ptr), stream);
+        return fprintf(stream, "\n");
+    }
+
+    case LAYER_LABEL:
+        return label_layer_dump_stream(layer.ptr, stream);
+    }
 
-    return 0;
+    return -1;
 }