]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/point_layer.c
Implement chop_point_layer
[nothing.git] / src / game / level / level_editor / point_layer.c
index 50f6d77535ddb40a7145cc78f94bf0babba691a2..5eac7322fa226f4b27193d6d54f9f9ba99ecdec3 100644 (file)
@@ -37,9 +37,9 @@ struct PointLayer
 {
     Lt *lt;
     PointLayerState state;
-    Dynarray/*<Vec2f>*/ *positions;
-    Dynarray/*<Color>*/ *colors;
-    Dynarray/*<char[ID_MAX_SIZE]>*/ *ids;
+    Dynarray/*<Vec2f>*/ positions;
+    Dynarray/*<Color>*/ colors;
+    Dynarray/*<char[ID_MAX_SIZE]>*/ ids;
     int selection;
     ColorPicker color_picker;
 
@@ -73,8 +73,8 @@ PointUndoContext create_point_undo_swap_context(PointLayer *point_layer,
                                      size_t index, size_t index2)
 {
     trace_assert(point_layer);
-    trace_assert(index < dynarray_count(point_layer->positions));
-    trace_assert(index2 < dynarray_count(point_layer->positions));
+    trace_assert(index < point_layer->positions.count);
+    trace_assert(index2 < point_layer->positions.count);
 
     PointUndoContext undo_context;
     undo_context.type = POINT_UNDO_SWAP;
@@ -96,14 +96,14 @@ PointUndoContext create_point_undo_context(PointLayer *point_layer,
 
     size_t index =
         type == POINT_UNDO_ADD
-        ? dynarray_count(point_layer->positions) - 1
+        ? point_layer->positions.count - 1
         : (size_t) point_layer->selection;
 
     undo_context.type = type;
     undo_context.layer = point_layer;
-    dynarray_copy_to(point_layer->positions, &undo_context.position, index);
-    dynarray_copy_to(point_layer->colors, &undo_context.color, index);
-    dynarray_copy_to(point_layer->ids, &undo_context.id, index);
+    dynarray_copy_to(&point_layer->positions, &undo_context.position, index);
+    dynarray_copy_to(&point_layer->colors, &undo_context.color, index);
+    dynarray_copy_to(&point_layer->ids, &undo_context.id, index);
     undo_context.index = index;
 
     return undo_context;
@@ -120,29 +120,29 @@ void point_layer_undo(void *context, size_t context_size)
 
     switch (undo_context->type) {
     case POINT_UNDO_ADD: {
-        dynarray_pop(point_layer->positions, NULL);
-        dynarray_pop(point_layer->colors, NULL);
-        dynarray_pop(point_layer->ids, NULL);
+        dynarray_pop(&point_layer->positions, NULL);
+        dynarray_pop(&point_layer->colors, NULL);
+        dynarray_pop(&point_layer->ids, NULL);
         point_layer->selection = -1;
     } break;
 
     case POINT_UNDO_DELETE: {
-        dynarray_insert_before(point_layer->positions, undo_context->index, &undo_context->position);
-        dynarray_insert_before(point_layer->colors, undo_context->index, &undo_context->color);
-        dynarray_insert_before(point_layer->ids, undo_context->index, &undo_context->id);
+        dynarray_insert_before(&point_layer->positions, undo_context->index, &undo_context->position);
+        dynarray_insert_before(&point_layer->colors, undo_context->index, &undo_context->color);
+        dynarray_insert_before(&point_layer->ids, undo_context->index, &undo_context->id);
         point_layer->selection = -1;
     } break;
 
     case POINT_UNDO_UPDATE: {
-        dynarray_replace_at(point_layer->positions, undo_context->index, &undo_context->position);
-        dynarray_replace_at(point_layer->colors, undo_context->index, &undo_context->color);
-        dynarray_replace_at(point_layer->ids, undo_context->index, &undo_context->id);
+        dynarray_replace_at(&point_layer->positions, undo_context->index, &undo_context->position);
+        dynarray_replace_at(&point_layer->colors, undo_context->index, &undo_context->color);
+        dynarray_replace_at(&point_layer->ids, undo_context->index, &undo_context->id);
     } break;
 
     case POINT_UNDO_SWAP: {
-        dynarray_swap(point_layer->positions, undo_context->index, undo_context->index2);
-        dynarray_swap(point_layer->colors, undo_context->index, undo_context->index2);
-        dynarray_swap(point_layer->ids, undo_context->index, undo_context->index2);
+        dynarray_swap(&point_layer->positions, undo_context->index, undo_context->index2);
+        dynarray_swap(&point_layer->colors, undo_context->index, undo_context->index2);
+        dynarray_swap(&point_layer->ids, undo_context->index, undo_context->index2);
     } break;
     }
 }
@@ -178,20 +178,9 @@ PointLayer *create_point_layer(const char *id_name_prefix)
 
     point_layer->state = POINT_LAYER_IDLE;
 
-    point_layer->positions = PUSH_LT(lt, create_dynarray(sizeof(Vec2f)), destroy_dynarray);
-    if (point_layer->positions == NULL) {
-        RETURN_LT(lt, NULL);
-    }
-
-    point_layer->colors = PUSH_LT(lt, create_dynarray(sizeof(Color)), destroy_dynarray);
-    if (point_layer->colors == NULL) {
-        RETURN_LT(lt, NULL);
-    }
-
-    point_layer->ids = PUSH_LT(lt, create_dynarray(sizeof(char) * ID_MAX_SIZE), destroy_dynarray);
-    if (point_layer->ids == NULL) {
-        RETURN_LT(lt, NULL);
-    }
+    point_layer->positions = create_dynarray(sizeof(Vec2f));
+    point_layer->colors = create_dynarray(sizeof(Color));
+    point_layer->ids = create_dynarray(sizeof(char) * ID_MAX_SIZE);
 
     point_layer->edit_field = PUSH_LT(
         lt,
@@ -238,9 +227,9 @@ PointLayer *create_point_layer_from_line_stream(LineStream *line_stream,
         const Color color = hexstr(color_name);
         const Vec2f point = vec(x, y);
 
-        dynarray_push(point_layer->colors, &color);
-        dynarray_push(point_layer->positions, &point);
-        dynarray_push(point_layer->ids, id);
+        dynarray_push(&point_layer->colors, &color);
+        dynarray_push(&point_layer->positions, &point);
+        dynarray_push(&point_layer->ids, id);
     }
 
     point_layer->selection = -1;
@@ -250,9 +239,51 @@ PointLayer *create_point_layer_from_line_stream(LineStream *line_stream,
     return point_layer;
 }
 
+PointLayer *chop_point_layer(Memory *memory,
+                             String *input,
+                             const char *id_name_prefix)
+{
+    trace_assert(memory);
+    trace_assert(input);
+    trace_assert(id_name_prefix);
+
+    PointLayer *point_layer = create_point_layer(id_name_prefix);
+
+    int n = atoi(string_to_cstr(memory, trim(chop_by_delim(input, '\n'))));
+    char id[ENTITY_MAX_ID_SIZE];
+    for (int i = 0; i < n; ++i) {
+        String line = trim(chop_by_delim(input, '\n'));
+        String string_id = trim(chop_word(&line));
+        Vec2f point;
+        point.x = strtof(string_to_cstr(memory, trim(chop_word(&line))), NULL);
+        point.y = strtof(string_to_cstr(memory, trim(chop_word(&line))), NULL);
+        Color color = hexs(trim(chop_word(&line)));
+
+        memset(id, 0, ENTITY_MAX_ID_SIZE);
+        memcpy(
+            id,
+            string_id.data,
+            min_size_t(ENTITY_MAX_ID_SIZE - 1, string_id.count));
+
+        dynarray_push(&point_layer->positions, &point);
+        dynarray_push(&point_layer->colors, &color);
+        dynarray_push(&point_layer->ids, id);
+    }
+
+    point_layer->selection = -1;
+    point_layer->color_picker = create_color_picker_from_rgba(COLOR_RED);
+
+    return point_layer;
+}
+
 void destroy_point_layer(PointLayer *point_layer)
 {
     trace_assert(point_layer);
+
+    free(point_layer->positions.data);
+    free(point_layer->colors.data);
+    free(point_layer->ids.data);
+
     RETURN_LT0(point_layer->lt);
 }
 
@@ -273,10 +304,10 @@ int point_layer_render(const PointLayer *point_layer,
     trace_assert(point_layer);
     trace_assert(camera);
 
-    const int n = (int) dynarray_count(point_layer->positions);
-    Vec2f *positions = dynarray_data(point_layer->positions);
-    Color *colors = dynarray_data(point_layer->colors);
-    char *ids = dynarray_data(point_layer->ids);
+    const int n = (int)point_layer->positions.count;
+    Vec2f *positions = (Vec2f *)point_layer->positions.data;
+    Color *colors = (Color *)point_layer->colors.data;
+    char *ids = (char *)point_layer->ids.data;
 
     for (int i = 0; i < n; ++i) {
         const Color color = color_scale(
@@ -345,8 +376,8 @@ int point_layer_element_at(const PointLayer *point_layer,
 {
     trace_assert(point_layer);
 
-    int n = (int) dynarray_count(point_layer->positions);
-    Vec2f *positions = dynarray_data(point_layer->positions);
+    int n = (int) point_layer->positions.count;
+    Vec2f *positions = (Vec2f *)point_layer->positions.data;
 
     for (int i = n - 1; i >= 0; --i) {
         if (vec_length(vec_sub(positions[i], position)) < POINT_LAYER_ELEMENT_RADIUS) {
@@ -371,9 +402,9 @@ int point_layer_add_element(PointLayer *point_layer,
              point_layer->id_name_prefix,
              point_layer->id_name_counter++);
 
-    dynarray_push(point_layer->positions, &position);
-    dynarray_push(point_layer->colors, &color);
-    dynarray_push(point_layer->ids, id);
+    dynarray_push(&point_layer->positions, &position);
+    dynarray_push(&point_layer->colors, &color);
+    dynarray_push(&point_layer->ids, id);
 
     POINT_UNDO_PUSH(
         undo_history,
@@ -389,12 +420,12 @@ void point_layer_swap_elements(PointLayer *point_layer,
 {
     trace_assert(point_layer);
     trace_assert(undo_history);
-    trace_assert(a < dynarray_count(point_layer->positions));
-    trace_assert(b < dynarray_count(point_layer->positions));
+    trace_assert(a < point_layer->positions.count);
+    trace_assert(b < point_layer->positions.count);
 
-    dynarray_swap(point_layer->positions, a, b);
-    dynarray_swap(point_layer->colors, a, b);
-    dynarray_swap(point_layer->ids, a, b);
+    dynarray_swap(&point_layer->positions, a, b);
+    dynarray_swap(&point_layer->colors, a, b);
+    dynarray_swap(&point_layer->ids, a, b);
 
     POINT_UNDO_PUSH(
         undo_history,
@@ -414,9 +445,9 @@ void point_layer_delete_nth_element(PointLayer *point_layer,
             point_layer,
             POINT_UNDO_DELETE));
 
-    dynarray_delete_at(point_layer->positions, i);
-    dynarray_delete_at(point_layer->colors, i);
-    dynarray_delete_at(point_layer->ids, i);
+    dynarray_delete_at(&point_layer->positions, i);
+    dynarray_delete_at(&point_layer->colors, i);
+    dynarray_delete_at(&point_layer->ids, i);
 }
 
 static
@@ -462,8 +493,8 @@ int point_layer_idle_event(PointLayer *point_layer,
                     color_picker_rgba(&point_layer->color_picker),
                     undo_history);
             } else {
-                Color *colors = dynarray_data(point_layer->colors);
-                Vec2f *positions = dynarray_data(point_layer->positions);
+                Color *colors = (Color*)point_layer->colors.data;
+                Vec2f *positions = (Vec2f*)point_layer->positions.data;
 
                 point_layer->state = POINT_LAYER_MOVE;
                 point_layer->color_picker =
@@ -479,7 +510,7 @@ int point_layer_idle_event(PointLayer *point_layer,
         case SDLK_UP: {
             if ((event->key.keysym.mod & KMOD_SHIFT)
                 && (point_layer->selection >= 0)
-                && ((size_t)(point_layer->selection + 1) < dynarray_count(point_layer->positions))) {
+                && ((size_t)(point_layer->selection + 1) < point_layer->positions.count)) {
                 point_layer_swap_elements(
                     point_layer,
                     (size_t) point_layer->selection,
@@ -492,7 +523,7 @@ int point_layer_idle_event(PointLayer *point_layer,
         case SDLK_DOWN: {
             if ((event->key.keysym.mod & KMOD_SHIFT)
                 && (point_layer->selection > 0)
-                && ((size_t) point_layer->selection < dynarray_count(point_layer->positions))) {
+                && ((size_t) point_layer->selection < point_layer->positions.count)) {
                 point_layer_swap_elements(
                     point_layer,
                     (size_t) point_layer->selection,
@@ -503,7 +534,7 @@ int point_layer_idle_event(PointLayer *point_layer,
         } break;
 
         case SDLK_DELETE: {
-            if (0 <= point_layer->selection && point_layer->selection < (int) dynarray_count(point_layer->positions)) {
+            if (0 <= point_layer->selection && point_layer->selection < (int) point_layer->positions.count) {
                 point_layer_delete_nth_element(
                     point_layer,
                     (size_t)point_layer->selection,
@@ -514,7 +545,7 @@ int point_layer_idle_event(PointLayer *point_layer,
 
         case SDLK_F2: {
             if (point_layer->selection >= 0) {
-                char *ids = dynarray_data(point_layer->ids);
+                char *ids = (char*)point_layer->ids.data;
                 point_layer->state = POINT_LAYER_EDIT_ID;
                 edit_field_replace(
                     point_layer->edit_field,
@@ -526,7 +557,7 @@ int point_layer_idle_event(PointLayer *point_layer,
         case SDLK_c: {
             if ((event->key.keysym.mod & KMOD_LCTRL) && point_layer->selection >= 0) {
                 point_clipboard = 1;
-                dynarray_copy_to(point_layer->colors, &point_clipboard_color, (size_t)point_layer->selection);
+                dynarray_copy_to(&point_layer->colors, &point_clipboard_color, (size_t)point_layer->selection);
             }
         } break;
 
@@ -570,7 +601,7 @@ int point_layer_edit_id_event(PointLayer *point_layer,
                     point_layer,
                     POINT_UNDO_UPDATE));
 
-            char *id = dynarray_pointer_at(point_layer->ids, (size_t) point_layer->selection);
+            char *id = dynarray_pointer_at(&point_layer->ids, (size_t) point_layer->selection);
             const char *text = edit_field_as_text(point_layer->edit_field);
             size_t n = min_size_t(strlen(text), ID_MAX_SIZE - 1);
             memcpy(id, text, n);
@@ -604,7 +635,7 @@ int point_layer_move_event(PointLayer *point_layer,
     trace_assert(camera);
     trace_assert(point_layer->selection >= 0);
 
-    Vec2f *positions = dynarray_data(point_layer->positions);
+    Vec2f *positions = (Vec2f*)point_layer->positions.data;
 
     switch (event->type) {
     case SDL_MOUSEBUTTONUP: {
@@ -624,7 +655,7 @@ int point_layer_move_event(PointLayer *point_layer,
                         POINT_UNDO_UPDATE));
 
                 dynarray_replace_at(
-                    point_layer->positions,
+                    &point_layer->positions,
                     (size_t) point_layer->selection,
                     &point_layer->inter_position);
             }
@@ -687,7 +718,7 @@ int point_layer_recolor_event(PointLayer *point_layer,
                     POINT_UNDO_UPDATE));
 
             dynarray_replace_at(
-                point_layer->colors,
+                &point_layer->colors,
                 (size_t) point_layer->selection,
                 &point_layer->inter_color);
 
@@ -729,25 +760,25 @@ int point_layer_event(PointLayer *point_layer,
 size_t point_layer_count(const PointLayer *point_layer)
 {
     trace_assert(point_layer);
-    return dynarray_count(point_layer->positions);
+    return point_layer->positions.count;
 }
 
 const Vec2f *point_layer_positions(const PointLayer *point_layer)
 {
     trace_assert(point_layer);
-    return dynarray_data(point_layer->positions);
+    return (const Vec2f *)point_layer->positions.data;
 }
 
 const Color *point_layer_colors(const PointLayer *point_layer)
 {
     trace_assert(point_layer);
-    return dynarray_data(point_layer->colors);
+    return (const Color *)point_layer->colors.data;
 }
 
 const char *point_layer_ids(const PointLayer *point_layer)
 {
     trace_assert(point_layer);
-    return dynarray_data(point_layer->ids);
+    return (const char *)point_layer->ids.data;
 }
 
 int point_layer_dump_stream(const PointLayer *point_layer,
@@ -756,10 +787,10 @@ int point_layer_dump_stream(const PointLayer *point_layer,
     trace_assert(point_layer);
     trace_assert(filedump);
 
-    size_t n = dynarray_count(point_layer->ids);
-    char *ids = dynarray_data(point_layer->ids);
-    Vec2f *positions = dynarray_data(point_layer->positions);
-    Color *colors = dynarray_data(point_layer->colors);
+    size_t n = point_layer->ids.count;
+    char *ids = (char *) point_layer->ids.data;
+    Vec2f *positions = (Vec2f *) point_layer->positions.data;
+    Color *colors = (Color *) point_layer->colors.data;
 
     fprintf(filedump, "%zd\n", n);
     for (size_t i = 0; i < n; ++i) {