2 #include "system/stacktrace.h"
10 #include "system/lt/lt_adapters.h"
11 #include "system/line_stream.h"
12 #include "system/nth_alloc.h"
13 #include "system/log.h"
14 #include "game/level/level_editor/layer.h"
24 Platforms *create_platforms_from_rect_layer(const RectLayer *layer)
33 Platforms *platforms = PUSH_LT(
35 nth_calloc(1, sizeof(Platforms)),
37 if (platforms == NULL) {
42 platforms->rects_size = rect_layer_count(layer);
44 platforms->rects = PUSH_LT(lt, nth_calloc(1, sizeof(Rect) * platforms->rects_size), free);
45 if (platforms->rects == NULL) {
48 memcpy(platforms->rects, rect_layer_rects(layer), sizeof(Rect) * platforms->rects_size);
51 platforms->colors = PUSH_LT(lt, nth_calloc(1, sizeof(Color) * platforms->rects_size), free);
52 if (platforms->colors == NULL) {
55 memcpy(platforms->colors, rect_layer_colors(layer), sizeof(Color) * platforms->rects_size);
60 void destroy_platforms(Platforms *platforms)
62 trace_assert(platforms);
63 RETURN_LT0(platforms->lt);
66 /* TODO(#450): platforms do not render their ids in debug mode */
67 int platforms_render(const Platforms *platforms,
70 for (size_t i = 0; i < platforms->rects_size; ++i) {
74 platforms->colors[i]) < 0) {
82 void platforms_touches_rect_sides(const Platforms *platforms,
84 int sides[RECT_SIDE_N])
86 trace_assert(platforms);
88 for (size_t i = 0; i < platforms->rects_size; ++i) {
89 rect_object_impact(object, platforms->rects[i], sides);
93 Vec platforms_snap_rect(const Platforms *platforms,
96 trace_assert(platforms);
98 Vec result = vec(1.0f, 1.0f);
99 for (size_t i = 0; i < platforms->rects_size; ++i) {
100 if (rects_overlap(platforms->rects[i], *object)) {
101 result = vec_entry_mult(result, rect_snap(platforms->rects[i], object));