X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=mathlib.c;h=d6170d28977c27645f71b9987887854670d34916;hp=60a1a29dd781a5e506888895dafefe75963a5a7e;hb=484246eea9f6b28b015a4772fca0ba1c6207a719;hpb=0ae4d4bbe0675ef24c00c67aa691be170475d202 diff --git a/mathlib.c b/mathlib.c index 60a1a29d..d6170d28 100644 --- a/mathlib.c +++ b/mathlib.c @@ -19,9 +19,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // mathlib.c -- math primitives -#include #include "quakedef.h" +#include + vec3_t vec3_origin = {0,0,0}; float ixtable[4096]; @@ -113,7 +114,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 +134,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 +142,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 +206,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 +255,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 +315,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 +331,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) { @@ -508,6 +518,82 @@ void AngleVectorsFLU (const vec3_t angles, vec3_t forward, vec3_t left, vec3_t u } } +// LordHavoc: calculates pitch/yaw/roll angles from forward and up vectors +void AnglesFromVectors (vec3_t angles, const vec3_t forward, const vec3_t up, qboolean flippitch) +{ + if (forward[0] == 0 && forward[1] == 0) + { + if(forward[2] > 0) + { + angles[PITCH] = -M_PI * 0.5; + angles[YAW] = up ? atan2(-up[1], -up[0]) : 0; + } + else + { + angles[PITCH] = M_PI * 0.5; + angles[YAW] = up ? atan2(up[1], up[0]) : 0; + } + angles[ROLL] = 0; + } + else + { + angles[YAW] = atan2(forward[1], forward[0]); + angles[PITCH] = -atan2(forward[2], sqrt(forward[0]*forward[0] + forward[1]*forward[1])); + if (up) + { + vec_t cp = cos(angles[PITCH]), sp = sin(angles[PITCH]); + vec_t cy = cos(angles[YAW]), sy = sin(angles[YAW]); + vec3_t tleft, tup; + tleft[0] = -sy; + tleft[1] = cy; + tleft[2] = 0; + tup[0] = sp*cy; + tup[1] = sp*sy; + tup[2] = cp; + angles[ROLL] = -atan2(DotProduct(up, tleft), DotProduct(up, tup)); + } + else + angles[ROLL] = 0; + } + + // now convert radians to degrees, and make all values positive + VectorScale(angles, 180.0 / M_PI, angles); + if (flippitch) + angles[PITCH] *= -1; + if (angles[PITCH] < 0) angles[PITCH] += 360; + if (angles[YAW] < 0) angles[YAW] += 360; + if (angles[ROLL] < 0) angles[ROLL] += 360; + +#if 0 +{ + // debugging code + vec3_t tforward, tleft, tup, nforward, nup; + VectorCopy(forward, nforward); + VectorNormalize(nforward); + if (up) + { + VectorCopy(up, nup); + VectorNormalize(nup); + AngleVectors(angles, tforward, tleft, tup); + if (VectorDistance(tforward, nforward) > 0.01 || VectorDistance(tup, nup) > 0.01) + { + Con_Printf("vectoangles('%f %f %f', '%f %f %f') = %f %f %f\n", nforward[0], nforward[1], nforward[2], nup[0], nup[1], nup[2], angles[0], angles[1], angles[2]); + Con_Printf("^3But that is '%f %f %f', '%f %f %f'\n", tforward[0], tforward[1], tforward[2], tup[0], tup[1], tup[2]); + } + } + else + { + AngleVectors(angles, tforward, tleft, tup); + if (VectorDistance(tforward, nforward) > 0.01) + { + Con_Printf("vectoangles('%f %f %f') = %f %f %f\n", nforward[0], nforward[1], nforward[2], angles[0], angles[1], angles[2]); + Con_Printf("^3But that is '%f %f %f'\n", tforward[0], tforward[1], tforward[2]); + } + } +} +#endif +} + #if 0 void AngleMatrix (const vec3_t angles, const vec3_t translate, vec_t matrix[][4]) {