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"
15 Platforms create_platforms_from_rect_layer(const RectLayer *layer)
19 Platforms platforms = {0};
20 platforms.rects_size = rect_layer_count(layer);
22 platforms.rects = nth_calloc(1, sizeof(Rect) * platforms.rects_size);
25 rect_layer_rects(layer),
26 sizeof(Rect) * platforms.rects_size);
28 platforms.colors = nth_calloc(1, sizeof(Color) * platforms.rects_size);
31 rect_layer_colors(layer),
32 sizeof(Color) * platforms.rects_size);
37 void destroy_platforms(Platforms platforms)
39 free(platforms.rects);
40 free(platforms.colors);
43 int platforms_render(const Platforms *platforms,
46 for (size_t i = 0; i < platforms->rects_size; ++i) {
47 Rect platform_rect = platforms->rects[i];
51 platforms->colors[i]) < 0) {
56 snprintf(debug_text, 256,
62 i, platform_rect.x, platform_rect.y, platform_rect.w, platform_rect.h);
64 Vec2f text_pos = (Vec2f){.x = platform_rect.x, .y = platform_rect.y};
65 Rect text_rect = sprite_font_boundary_box(text_pos, vec(2.0f, 2.0f), debug_text);
67 Rect world_viewport = camera_view_port(camera);
68 Rect viewport = camera_view_port_screen(camera);
75 camera_is_point_visible(
78 if (platform_rect.w > text_rect.w){
79 text_pos.x = fmaxf(fminf(world_viewport.x, platform_rect.x + platform_rect.w - text_rect.w),
82 if (platform_rect.h > text_rect.h){
83 text_pos.y = fmaxf(fminf(world_viewport.y, platform_rect.y + platform_rect.h - text_rect.h),
88 if (camera_render_debug_text(
99 void platforms_touches_rect_sides(const Platforms *platforms,
101 int sides[RECT_SIDE_N])
103 trace_assert(platforms);
105 for (size_t i = 0; i < platforms->rects_size; ++i) {
106 rect_object_impact(object, platforms->rects[i], sides);
110 Vec2f platforms_snap_rect(const Platforms *platforms,
113 trace_assert(platforms);
115 Vec2f result = vec(1.0f, 1.0f);
116 for (size_t i = 0; i < platforms->rects_size; ++i) {
117 if (rects_overlap(platforms->rects[i], *object)) {
118 // TODO(#1161): can we reuse the Level Editor snapping mechanism in physics snapping
119 result = vec_entry_mult(result, rect_snap(platforms->rects[i], object));