]> git.lizzy.rs Git - nothing.git/blob - src/game/level/level_editor/point_layer.c
Merge pull request #2 from tsoding/815
[nothing.git] / src / game / level / level_editor / point_layer.c
1 #include <SDL2/SDL.h>
2
3 #include "system/stacktrace.h"
4 #include "system/line_stream.h"
5 #include "system/log.h"
6 #include "system/lt.h"
7 #include "system/nth_alloc.h"
8 #include "system/str.h"
9 #include "dynarray.h"
10 #include "game/camera.h"
11 #include "./point_layer.h"
12
13 struct PointLayer
14 {
15     Lt *lt;
16     Dynarray *points;
17     Dynarray *colors;
18     Dynarray *ids;
19 };
20
21 // TODO(#837): PointLayer does not allow to edit itself
22
23 PointLayer *create_point_layer_from_line_stream(LineStream *line_stream)
24 {
25     trace_assert(line_stream);
26
27     Lt *lt = create_lt();
28     if (lt == NULL) {
29         return NULL;
30     }
31
32     PointLayer *point_layer = PUSH_LT(lt, nth_calloc(1, sizeof(PointLayer)), free);
33     if (point_layer == NULL) {
34         RETURN_LT(lt, NULL);
35     }
36     point_layer->lt = lt;
37
38     point_layer->points = PUSH_LT(lt, create_dynarray(sizeof(Point)), destroy_dynarray);
39     if (point_layer->points == NULL) {
40         RETURN_LT(lt, NULL);
41     }
42
43     point_layer->colors = PUSH_LT(lt, create_dynarray(sizeof(Color)), destroy_dynarray);
44     if (point_layer->colors == NULL) {
45         RETURN_LT(lt, NULL);
46     }
47
48     point_layer->ids = PUSH_LT(lt, create_dynarray(sizeof(char) * ID_MAX_SIZE), destroy_dynarray);
49     if (point_layer->ids == NULL) {
50         RETURN_LT(lt, NULL);
51     }
52
53     size_t count = 0;
54     if (sscanf(
55             line_stream_next(line_stream),
56             "%lu",
57             &count) == EOF) {
58         log_fail("Could not read amount of points");
59         RETURN_LT(lt, NULL);
60     }
61
62     char color_name[7];
63     char id[ID_MAX_SIZE];
64     float x, y;
65     for (size_t i = 0; i < count; ++i) {
66         if (sscanf(
67                 line_stream_next(line_stream),
68                 "%"STRINGIFY(ID_MAX_SIZE)"s%f%f%6s",
69                 id, &x, &y, color_name) < 0) {
70             log_fail("Could not read %dth goal\n", i);
71             RETURN_LT(lt, NULL);
72         }
73         const Color color = hexstr(color_name);
74         const Point point = vec(x, y);
75
76         dynarray_push(point_layer->colors, &color);
77         dynarray_push(point_layer->points, &point);
78         dynarray_push(point_layer->ids, id);
79     }
80
81     return point_layer;
82 }
83
84 void destroy_point_layer(PointLayer *point_layer)
85 {
86     trace_assert(point_layer);
87     RETURN_LT0(point_layer->lt);
88 }
89
90 int point_layer_render(const PointLayer *point_layer,
91                        Camera *camera)
92 {
93     trace_assert(point_layer);
94     trace_assert(camera);
95
96     return 0;
97 }
98
99 int point_layer_mouse_button(PointLayer *point_layer,
100                              const SDL_MouseButtonEvent *event)
101 {
102     trace_assert(point_layer);
103     trace_assert(event);
104     log_info("Clicked %d %d\n", event->x, event->y);
105     return 0;
106 }
107
108
109 int point_layer_event(PointLayer *point_layer,
110                       const SDL_Event *event)
111 {
112     trace_assert(point_layer);
113     trace_assert(event);
114     return 0;
115 }
116
117 size_t point_layer_count(const PointLayer *point_layer)
118 {
119     trace_assert(point_layer);
120     return dynarray_count(point_layer->points);
121 }
122
123 const Point *point_layer_points(const PointLayer *point_layer)
124 {
125     trace_assert(point_layer);
126     return dynarray_data(point_layer->points);
127 }
128
129 const Color *point_layer_colors(const PointLayer *point_layer)
130 {
131     trace_assert(point_layer);
132     return dynarray_data(point_layer->colors);
133 }
134
135 const char *point_layer_ids(const PointLayer *point_layer)
136 {
137     trace_assert(point_layer);
138     return dynarray_data(point_layer->ids);
139 }