Jankily fix collision issue with bounds of level

main
Cameron Murphy Reikes 2 years ago
parent 02d4cea01c
commit 7476d25edd

@ -1847,8 +1847,7 @@ Vec2 move_and_slide(MoveSlideParams p)
assert(collision_aabb_size.y > 0.0f); assert(collision_aabb_size.y > 0.0f);
AABB at_new = centered_aabb(new_pos, collision_aabb_size); AABB at_new = centered_aabb(new_pos, collision_aabb_size);
dbgrect(at_new); dbgrect(at_new);
AABB to_check[256] = {0}; BUFF(AABB, 256) to_check = {0};
int to_check_index = 0;
// add tilemap boxes // add tilemap boxes
{ {
@ -1866,8 +1865,7 @@ Vec2 move_and_slide(MoveSlideParams p)
if(is_tile_solid(get_tile_layer(&level_level0, 2, tilecoord_to_check))) if(is_tile_solid(get_tile_layer(&level_level0, 2, tilecoord_to_check)))
to_check[to_check_index++] = tile_aabb(tilecoord_to_check); BUFF_APPEND(&to_check, tile_aabb(tilecoord_to_check));
assert(to_check_index < ARRLEN(to_check));
} }
} }
@ -1878,17 +1876,62 @@ Vec2 move_and_slide(MoveSlideParams p)
{ {
if(!(it->is_character && it->is_rolling) && it != p.from && !(it->is_npc && it->dead) && !it->is_item) if(!(it->is_character && it->is_rolling) && it != p.from && !(it->is_npc && it->dead) && !it->is_item)
{ {
to_check[to_check_index++] = centered_aabb(it->pos, entity_aabb_size(it)); BUFF_APPEND(&to_check, centered_aabb(it->pos, entity_aabb_size(it)));
assert(to_check_index < ARRLEN(to_check));
} }
} }
} }
// here we do some janky C stuff to resolve collisions with the closest
// box first, because doing so is a simple heuristic to avoid depenetrating and losing
// sideways velocity. It's visual and I can't put diagrams in code so uh oh!
BUFF(AABB, 32) actually_overlapping = {0};
BUFF_ITER(AABB, &to_check)
{
if(overlapping(at_new, *it))
{
BUFF_APPEND(&actually_overlapping, *it);
}
}
float smallest_distance = FLT_MAX;
int smallest_aabb_index = 0;
int i = 0;
BUFF_ITER(AABB, &actually_overlapping)
{
float cur_dist = LenV2(SubV2(aabb_center(at_new), aabb_center(*it)));
if(cur_dist < smallest_distance){
smallest_distance = cur_dist;
smallest_aabb_index = i;
}
i++;
}
i = 0;
BUFF(AABB, 32) overlapping_smallest_first = {0};
if(actually_overlapping.cur_index > 0)
{
BUFF_APPEND(&overlapping_smallest_first, actually_overlapping.data[smallest_aabb_index]);
}
BUFF_ITER(AABB, &actually_overlapping)
{
if(i == smallest_aabb_index)
{
continue;
}
else
{
BUFF_APPEND(&overlapping_smallest_first, *it);
}
i++;
}
CollisionInfo info = {0}; CollisionInfo info = {0};
for(int col_iter_i = 0; col_iter_i < 1; col_iter_i++) for(int col_iter_i = 0; col_iter_i < 1; col_iter_i++)
for(int i = 0; i < to_check_index; i++) BUFF_ITER(AABB, &overlapping_smallest_first)
{ {
AABB to_depenetrate_from = to_check[i]; AABB to_depenetrate_from = *it;
dbgrect(to_depenetrate_from); dbgrect(to_depenetrate_from);
int iters_tried_to_push_apart = 0; int iters_tried_to_push_apart = 0;
while(overlapping(to_depenetrate_from, at_new) && iters_tried_to_push_apart < 500) while(overlapping(to_depenetrate_from, at_new) && iters_tried_to_push_apart < 500)

Loading…
Cancel
Save