X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fvector.qh;h=d2d83ff6595dca5a2642017702112745527eef1c;hb=90b21340c6f5678a7b0ea3dda116ec7f4fa4352e;hp=5863fcf27657b67b7d1cda4add0fc4bca9c31200;hpb=aa7d2f01b3013bab75ad7bb0171eddb6bd86465b;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/vector.qh b/qcsrc/lib/vector.qh index 5863fcf27..d2d83ff65 100644 --- a/qcsrc/lib/vector.qh +++ b/qcsrc/lib/vector.qh @@ -76,6 +76,8 @@ float boxesoverlap(vector m1, vector m2, vector m3, vector m4) { return m2_x >= ERASEABLE float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs) { return smins.x >= bmins.x && smaxs.x <= bmaxs.x && smins.y >= bmins.y && smaxs.y <= bmaxs.y && smins.z >= bmins.z && smaxs.z <= bmaxs.z; } +#define pointinsidebox(point, bmins, bmaxs) boxinsidebox(point, point, bmins, bmaxs) + #define PITCH(v) ((v).x) #define YAW(v) ((v).y) #define ROLL(v) ((v).z) @@ -175,13 +177,36 @@ vector vec_epsilon(vector this, float eps) ERASEABLE vector NearestPointOnBox(entity box, vector org) { - vector m1 = box.mins + box.origin; - vector m2 = box.maxs + box.origin; + vector mi = box.mins + box.origin; + vector ma = box.maxs + box.origin; return vec3( - bound(m1.x, org.x, m2.x), - bound(m1.y, org.y, m2.y), - bound(m1.z, org.z, m2.z) + bound(mi.x, org.x, ma.x), + bound(mi.y, org.y, ma.y), + bound(mi.z, org.z, ma.z) ); } + +ERASEABLE +vector NearestPointOnBoundingBox(vector mi, vector ma, vector org) +{ + return vec3( + bound(mi.x, org.x, ma.x), + bound(mi.y, org.y, ma.y), + bound(mi.z, org.z, ma.z) + ); +} + +// bones_was_here: rounding bbox to nearest perfect floats prevents obscure collision bugs like #2742 +// FIXME: QC shouldn't need to work around tracebox potentially returning a tiny trace_fraction when the move should have been blocked. +// Tiny values are valid in some situations and can't simply be ignored. +#define PFLOAT (1/1024) // 1/32 1/64 etc also work +#define RPFLOAT(a) (a=rint(a/PFLOAT)*PFLOAT) +ERASEABLE +vector RoundPerfectVector(vector v) +{ + RPFLOAT(v.x); RPFLOAT(v.y); RPFLOAT(v.z); + return v; +} + #endif