3 #include "system/stacktrace.h"
4 #include "system/line_stream.h"
5 #include "system/log.h"
7 #include "system/nth_alloc.h"
8 #include "system/str.h"
10 #include "game/camera.h"
11 #include "./point_layer.h"
21 // TODO(#837): PointLayer does not allow to edit itself
23 PointLayer *create_point_layer_from_line_stream(LineStream *line_stream)
25 trace_assert(line_stream);
32 PointLayer *point_layer = PUSH_LT(lt, nth_calloc(1, sizeof(PointLayer)), free);
33 if (point_layer == NULL) {
38 point_layer->points = PUSH_LT(lt, create_dynarray(sizeof(Point)), destroy_dynarray);
39 if (point_layer->points == NULL) {
43 point_layer->colors = PUSH_LT(lt, create_dynarray(sizeof(Color)), destroy_dynarray);
44 if (point_layer->colors == NULL) {
48 point_layer->ids = PUSH_LT(lt, create_dynarray(sizeof(char) * ID_MAX_SIZE), destroy_dynarray);
49 if (point_layer->ids == NULL) {
55 line_stream_next(line_stream),
58 log_fail("Could not read amount of points");
65 for (size_t i = 0; i < count; ++i) {
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);
73 const Color color = hexstr(color_name);
74 const Point point = vec(x, y);
76 dynarray_push(point_layer->colors, &color);
77 dynarray_push(point_layer->points, &point);
78 dynarray_push(point_layer->ids, id);
84 void destroy_point_layer(PointLayer *point_layer)
86 trace_assert(point_layer);
87 RETURN_LT0(point_layer->lt);
90 int point_layer_render(const PointLayer *point_layer,
93 trace_assert(point_layer);
96 const size_t n = dynarray_count(point_layer->points);
97 Point *points = dynarray_data(point_layer->points);
98 Color *colors = dynarray_data(point_layer->colors);
100 for (size_t i = 0; i < n; ++i) {
101 const Triangle t = triangle_mat3x3_product(
102 equilateral_triangle(),
104 trans_mat(points[i].x, points[i].y),
107 if (camera_fill_triangle(camera, t, colors[i]) < 0) {
115 // TODO(#841): PointLayer does not allow to remove elements
117 int point_layer_mouse_button(PointLayer *point_layer,
118 const SDL_MouseButtonEvent *event,
119 const Camera *camera,
122 trace_assert(point_layer);
125 if (event->type == SDL_MOUSEBUTTONDOWN && event->button == SDL_BUTTON_LEFT) {
126 char id[ID_MAX_SIZE];
128 // TODO(#842): PointLayer does not allow to specify an id of a point
129 for (size_t i = 0; i < ID_MAX_SIZE - 1; ++i) {
130 id[i] = (char) ('a' + rand() % ('z' - 'a' + 1));
133 const Point point = camera_map_screen(camera, event->x, event->y);
135 dynarray_push(point_layer->points, &point);
136 dynarray_push(point_layer->colors, &color);
137 dynarray_push(point_layer->ids, id);
143 size_t point_layer_count(const PointLayer *point_layer)
145 trace_assert(point_layer);
146 return dynarray_count(point_layer->points);
149 const Point *point_layer_points(const PointLayer *point_layer)
151 trace_assert(point_layer);
152 return dynarray_data(point_layer->points);
155 const Color *point_layer_colors(const PointLayer *point_layer)
157 trace_assert(point_layer);
158 return dynarray_data(point_layer->colors);
161 const char *point_layer_ids(const PointLayer *point_layer)
163 trace_assert(point_layer);
164 return dynarray_data(point_layer->ids);