X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=mathlib.c;h=eaa1a765d8e05bc5c65328a808591ad5053941e1;hp=6758445a20e4ed50e568f1e5c9627cb6b0913673;hb=302711d37e168e57a9e2c8003084a22a3285c555;hpb=faaf0cfa6f80113a05b783eb2a71b49de973b98d diff --git a/mathlib.c b/mathlib.c index 6758445a..eaa1a765 100644 --- a/mathlib.c +++ b/mathlib.c @@ -113,7 +113,7 @@ float m_bytenormals[NUMVERTEXNORMALS][3] = }; #if 0 -qbyte NormalToByte(const vec3_t n) +unsigned char NormalToByte(const vec3_t n) { int i, best; float bestdistance, distance; @@ -133,7 +133,7 @@ qbyte NormalToByte(const vec3_t n) } // note: uses byte partly to force unsigned for the validity check -void ByteToNormal(qbyte num, vec3_t n) +void ByteToNormal(unsigned char num, vec3_t n) { if (num < NUMVERTEXNORMALS) VectorCopy(m_bytenormals[num], n); @@ -141,17 +141,6 @@ void ByteToNormal(qbyte num, vec3_t n) VectorClear(n); // FIXME: complain? } -float Q_RSqrt(float number) -{ - float y; - - if (number == 0.0f) - return 0.0f; - - *((int *)&y) = 0x5f3759df - ((* (int *) &number) >> 1); - return y * (1.5f - (number * 0.5f * y * y)); -} - // assumes "src" is normalized void PerpendicularVector( vec3_t dst, const vec3_t src ) { @@ -216,7 +205,7 @@ void VectorVectors(const vec3_t forward, vec3_t right, vec3_t up) d = DotProduct(forward, right); VectorMA(right, -d, forward, right); - VectorNormalizeFast(right); + VectorNormalize(right); CrossProduct(right, forward, up); } @@ -265,6 +254,24 @@ void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, + (t0 * vr[2] + t1 * vu[2] + vf[2] * vf[2]) * point[2]; } +/*-----------------------------------------------------------------*/ + +// returns the smallest integer greater than or equal to "value", or 0 if "value" is too big +unsigned int CeilPowerOf2(unsigned int value) +{ + unsigned int ceilvalue; + + if (value > (1U << (sizeof(int) * 8 - 1))) + return 0; + + ceilvalue = 1; + while (ceilvalue < value) + ceilvalue <<= 1; + + return ceilvalue; +} + + /*-----------------------------------------------------------------*/ @@ -307,6 +314,7 @@ int BoxOnPlaneSide(const vec3_t emins, const vec3_t emaxs, const mplane_t *p) } } +#if 0 int BoxOnPlaneSide_Separate(const vec3_t emins, const vec3_t emaxs, const vec3_t normal, const vec_t dist) { switch((normal[0] < 0) | ((normal[1] < 0) << 1) | ((normal[2] < 0) << 2)) @@ -322,6 +330,7 @@ int BoxOnPlaneSide_Separate(const vec3_t emins, const vec3_t emaxs, const vec3_t case 7: return (((normal[0] * emins[0] + normal[1] * emins[1] + normal[2] * emins[2]) >= dist) | (((normal[0] * emaxs[0] + normal[1] * emaxs[1] + normal[2] * emaxs[2]) < dist) << 1)); } } +#endif void BoxPlaneCorners(const vec3_t emins, const vec3_t emaxs, const mplane_t *p, vec3_t outnear, vec3_t outfar) { @@ -343,7 +352,7 @@ void BoxPlaneCorners(const vec3_t emins, const vec3_t emaxs, const mplane_t *p, case 5: outnear[0] = emins[0];outnear[1] = emaxs[1];outnear[2] = emins[2];outfar[0] = emaxs[0];outfar[1] = emins[1];outfar[2] = emaxs[2];break; case 6: outnear[0] = emaxs[0];outnear[1] = emins[1];outnear[2] = emins[2];outfar[0] = emins[0];outfar[1] = emaxs[1];outfar[2] = emaxs[2];break; case 7: outnear[0] = emins[0];outnear[1] = emins[1];outnear[2] = emins[2];outfar[0] = emaxs[0];outfar[1] = emaxs[1];outfar[2] = emaxs[2];break; - } + } } void BoxPlaneCorners_Separate(const vec3_t emins, const vec3_t emaxs, const vec3_t normal, vec3_t outnear, vec3_t outfar) @@ -359,7 +368,7 @@ void BoxPlaneCorners_Separate(const vec3_t emins, const vec3_t emaxs, const vec3 case 5: outnear[0] = emins[0];outnear[1] = emaxs[1];outnear[2] = emins[2];outfar[0] = emaxs[0];outfar[1] = emins[1];outfar[2] = emaxs[2];break; case 6: outnear[0] = emaxs[0];outnear[1] = emins[1];outnear[2] = emins[2];outfar[0] = emins[0];outfar[1] = emaxs[1];outfar[2] = emaxs[2];break; case 7: outnear[0] = emins[0];outnear[1] = emins[1];outnear[2] = emins[2];outfar[0] = emaxs[0];outfar[1] = emaxs[1];outfar[2] = emaxs[2];break; - } + } } void BoxPlaneCornerDistances(const vec3_t emins, const vec3_t emaxs, const mplane_t *p, vec_t *outneardist, vec_t *outfardist) @@ -657,3 +666,16 @@ int Math_atov(const char *s, vec3_t out) return i; } +void BoxFromPoints(vec3_t mins, vec3_t maxs, int numpoints, vec_t *point3f) +{ + int i; + VectorCopy(point3f, mins); + VectorCopy(point3f, maxs); + for (i = 1, point3f += 3;i < numpoints;i++, point3f += 3) + { + mins[0] = min(mins[0], point3f[0]);maxs[0] = max(maxs[0], point3f[0]); + mins[1] = min(mins[1], point3f[1]);maxs[1] = max(maxs[1], point3f[1]); + mins[2] = min(mins[2], point3f[2]);maxs[2] = max(maxs[2], point3f[2]); + } +} +