commit 9e168f53175fd11c3b955e0b8cfa92e00b5ee5f7
parent 41c106971b3219fe98814aacbc76e04f5077f38e
Author: averagecoder <averagecoder@noreply.codeberg.org>
Date: Mon, 24 Aug 2026 20:08:58 +0300
fix: 5-points legs collision
Diffstat:
1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/src/render.c b/src/render.c
@@ -1233,9 +1233,16 @@ get_ground_height(float px, float pz, float cur_y)
{
const struct col_cell *c;
const struct col_triangle *t;
- float best_below, hit_y, min_x, max_x, min_z, max_z;
+ float best_below, hit_y, min_x, max_x, min_z, max_z, sx, sz;
uint32_t i;
- int gx, gz;
+ int gx, gz, k;
+ static const float offsets[5][2] = {
+ { 0.0f, 0.0f },
+ { 0.18f, 0.0f },
+ {-0.18f, 0.0f },
+ { 0.0f, 0.18f },
+ { 0.0f, -0.18f }
+ };
gx = (int)((px - MAP_MIN) / ((MAP_MAX - MAP_MIN) / GRID_SZ));
gz = (int)((pz - MAP_MIN) / ((MAP_MAX - MAP_MIN) / GRID_SZ));
@@ -1254,19 +1261,23 @@ get_ground_height(float px, float pz, float cur_y)
min_x = fminf(t->v0[0], fminf(t->v1[0], t->v2[0]));
max_x = fmaxf(t->v0[0], fmaxf(t->v1[0], t->v2[0]));
- if (px < min_x || px > max_x) {
+ if (px + 0.20f < min_x || px - 0.20f > max_x) {
continue;
}
min_z = fminf(t->v0[2], fminf(t->v1[2], t->v2[2]));
max_z = fmaxf(t->v0[2], fmaxf(t->v1[2], t->v2[2]));
- if (pz < min_z || pz > max_z) {
+ if (pz + 0.20f < min_z || pz - 0.20f > max_z) {
continue;
}
- if (ray_tri_intersect_y(t, px, pz, &hit_y)) {
- if (hit_y <= cur_y + 0.50f && hit_y > best_below) {
- best_below = hit_y;
+ for (k = 0; k < 5; k++) {
+ sx = px + offsets[k][0];
+ sz = pz + offsets[k][1];
+ if (ray_tri_intersect_y(t, sx, sz, &hit_y)) {
+ if (hit_y <= cur_y + 0.60f && hit_y > best_below) {
+ best_below = hit_y;
+ }
}
}
}