1 #include "game/camera.h"
3 #include "system/stacktrace.h"
4 #include "system/nth_alloc.h"
5 #include "system/log.h"
10 #include "system/line_stream.h"
18 RectLayer *create_rect_layer(void)
25 RectLayer *layer = PUSH_LT(lt, nth_calloc(1, sizeof(RectLayer)), free);
31 layer->rects = PUSH_LT(
33 create_dynarray(sizeof(Rect)),
35 if (layer->rects == NULL) {
39 layer->colors = PUSH_LT(
41 create_dynarray(sizeof(Color)),
43 if (layer->colors == NULL) {
50 RectLayer *create_layer_from_line_stream(LineStream *line_stream)
52 trace_assert(line_stream);
54 RectLayer *layer = create_rect_layer();
59 const char *line = line_stream_next(line_stream);
61 RETURN_LT(layer->lt, NULL);
65 if (sscanf(line, "%lu", &count) < 0) {
66 RETURN_LT(layer->lt, NULL);
69 for (size_t i = 0; i < count; ++i) {
70 line = line_stream_next(line_stream);
72 RETURN_LT(layer->lt, NULL);
78 if (sscanf(line, "%f%f%f%f%6s\n",
82 RETURN_LT(layer->lt, NULL);
85 if (rect_layer_add_rect(layer, rect, hexstr(hex)) < 0) {
86 RETURN_LT(layer->lt, NULL);
93 void destroy_rect_layer(RectLayer *layer)
96 RETURN_LT0(layer->lt);
99 int rect_layer_render(const RectLayer *layer, Camera *camera)
102 trace_assert(camera);
104 const size_t n = dynarray_count(layer->rects);
105 Rect *rects = dynarray_data(layer->rects);
106 Color *colors = dynarray_data(layer->colors);
108 for (size_t i = 0; i < n; ++i) {
109 Color color = rgba(colors[i].r, colors[i].g, colors[i].b, 0.75f);
110 if (camera_fill_rect(camera, rects[i], color) < 0) {
118 int rect_layer_event(RectLayer *layer, const SDL_Event *event)
125 int rect_layer_add_rect(RectLayer *layer, Rect rect, Color color)
129 if (dynarray_push(layer->rects, &rect) < 0) {
133 if (dynarray_push(layer->colors, &color) < 0) {
140 int rect_layer_delete_rect_at(RectLayer *layer, Vec position)
144 const size_t n = dynarray_count(layer->rects);
145 Rect *rects = dynarray_data(layer->rects);
147 for (size_t i = 0; i < n; ++i) {
148 if (rect_contains_point(rects[i], position)) {
149 dynarray_delete_at(layer->rects, i);
150 dynarray_delete_at(layer->colors, i);
158 size_t rect_layer_count(const RectLayer *layer)
160 return dynarray_count(layer->rects);
163 const Rect *rect_layer_rects(const RectLayer *layer)
165 return dynarray_data(layer->rects);
168 const Color *rect_layer_colors(const RectLayer *layer)
170 return dynarray_data(layer->colors);