X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=mathlib.c;h=ed0a43c60d3869c735dad47f6495f50afa47928d;hb=aa18f6ecab09516f2af3bf710fc4c9090634d3c3;hp=eaa1a765d8e05bc5c65328a808591ad5053941e1;hpb=da29a8beeb35293e2fd38b51883c91b5cf4cf4ad;p=xonotic%2Fdarkplaces.git diff --git a/mathlib.c b/mathlib.c index eaa1a765..ed0a43c6 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]; @@ -202,11 +203,16 @@ void VectorVectors(const vec3_t forward, vec3_t right, vec3_t up) right[0] = forward[2]; right[1] = -forward[0]; right[2] = forward[1]; + // BUG! + // assume forward = {sqrt(1/3), sqrt(1/3), -sqrt(1/3)} + // then right will be {-sqrt(1/3), -sqrt(1/3), sqrt(1/3)} + // PROBLEM? d = DotProduct(forward, right); VectorMA(right, -d, forward, right); VectorNormalize(right); CrossProduct(right, forward, up); + VectorNormalize(up); // CrossProduct in this case returns 'up thats length is not 1 } void VectorVectorsDouble(const double *forward, double *right, double *up) @@ -517,6 +523,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]) { @@ -679,3 +761,12 @@ void BoxFromPoints(vec3_t mins, vec3_t maxs, int numpoints, vec_t *point3f) } } +// LordHavoc: this has to be done right or you get severe precision breakdown +int LoopingFrameNumberFromDouble(double t, int loopframes) +{ + if (loopframes) + return (int)(t - floor(t/loopframes)*loopframes); + else + return (int)t; +} +