]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/layer.c
Try to fix MSVC build
[nothing.git] / src / game / level / level_editor / layer.c
index 0964eb713fff49e0c42285e8b0fffcadd218b32e..1c3e1b8eefd5323a2c880187235c3f5eb3a12e43 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"
-#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 rect_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 rect_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 rect_layer_count(const RectLayer *layer)
-{
-    return dynarray_count(layer->rects);
-}
+    case LAYER_BACKGROUND: {
+        return background_layer_dump_stream(layer.ptr, stream);
+    }
 
-const Rect *rect_layer_rects(const RectLayer *layer)
-{
-    return dynarray_data(layer->rects);
-}
+    case LAYER_LABEL:
+        return label_layer_dump_stream(layer.ptr, stream);
+    }
 
-const Color *rect_layer_colors(const RectLayer *layer)
-{
-    return dynarray_data(layer->colors);
+    return -1;
 }