2 #include "system/stacktrace.h"
10 #include "system/nth_alloc.h"
11 #include "system/log.h"
12 #include "game/level/level_editor/rect_layer.h"
13 #include "math/extrema.h"
24 Platforms *create_platforms_from_rect_layer(const RectLayer *layer)
30 Platforms *platforms = PUSH_LT(
32 nth_calloc(1, sizeof(Platforms)),
34 if (platforms == NULL) {
39 platforms->rects_size = rect_layer_count(layer);
41 platforms->rects = PUSH_LT(lt, nth_calloc(1, sizeof(Rect) * platforms->rects_size), free);
42 if (platforms->rects == NULL) {
45 memcpy(platforms->rects, rect_layer_rects(layer), sizeof(Rect) * platforms->rects_size);
48 platforms->colors = PUSH_LT(lt, nth_calloc(1, sizeof(Color) * platforms->rects_size), free);
49 if (platforms->colors == NULL) {
52 memcpy(platforms->colors, rect_layer_colors(layer), sizeof(Color) * platforms->rects_size);
54 platforms->hiding = PUSH_LT(lt, nth_calloc(1, sizeof(int) * platforms->rects_size), free);
55 if (platforms->hiding == NULL) {
58 memset(platforms->hiding, 0, sizeof(int) * platforms->rects_size);
63 void destroy_platforms(Platforms *platforms)
65 trace_assert(platforms);
66 RETURN_LT0(platforms->lt);
69 int platforms_render(const Platforms *platforms,
72 for (size_t i = 0; i < platforms->rects_size; ++i) {
73 Rect platform_rect = platforms->rects[i];
77 platforms->colors[i]) < 0) {
82 snprintf(debug_text, 256,
88 i, platform_rect.x, platform_rect.y, platform_rect.w, platform_rect.h);
90 Vec2f text_pos = (Vec2f){.x = platform_rect.x, .y = platform_rect.y};
91 Rect text_rect = sprite_font_boundary_box(text_pos, vec(2.0f, 2.0f), debug_text);
93 Rect world_viewport = camera_view_port(camera);
94 Rect viewport = camera_view_port_screen(camera);
101 camera_is_point_visible(
103 text_pos) == false) {
104 if (platform_rect.w > text_rect.w){
105 text_pos.x = fmaxf(fminf(world_viewport.x, platform_rect.x + platform_rect.w - text_rect.w),
108 if (platform_rect.h > text_rect.h){
109 text_pos.y = fmaxf(fminf(world_viewport.y, platform_rect.y + platform_rect.h - text_rect.h),
114 if (camera_render_debug_text(
125 void platforms_touches_rect_sides(const Platforms *platforms,
127 int sides[RECT_SIDE_N])
129 trace_assert(platforms);
131 for (size_t i = 0; i < platforms->rects_size; ++i) {
132 rect_object_impact(object, platforms->rects[i], sides);
136 Vec2f platforms_snap_rect(const Platforms *platforms,
139 trace_assert(platforms);
141 Vec2f result = vec(1.0f, 1.0f);
142 for (size_t i = 0; i < platforms->rects_size; ++i) {
143 if (rects_overlap(platforms->rects[i], *object)) {
144 // TODO(#1161): can we reuse the Level Editor snapping mechanism in physics snapping
145 result = vec_entry_mult(result, rect_snap(platforms->rects[i], object));
152 #define HIDING_SPEED 2.0f
154 void platforms_update(Platforms *platforms, float dt)
156 trace_assert(platforms);
157 for (size_t i = 0; i < platforms->rects_size; ++i) {
158 if (platforms->hiding[i]) {
159 if (platforms->colors[i].a > 0.0f) {
160 platforms->colors[i].a =
161 fmaxf(0.0f, platforms->colors[i].a - HIDING_SPEED * dt);
163 platforms->hiding[i] = 0;
169 void platforms_hide_platform_at(const Platforms *platforms,
172 trace_assert(platforms);
174 for (size_t i = 0; i < platforms->rects_size; ++i) {
175 if (rect_contains_point(platforms->rects[i], position)) {
176 platforms->hiding[i] = 1;