--- src/qcommon/q_math.c 2007-09-11 03:12:59.000000000 -0700 +++ src/qcommon/q_math.c 2007-10-06 14:58:52.000000000 -0700 @@ -289,51 +289,20 @@ This is not implemented very well... =============== */ -void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, - float degrees ) { - float sin_a; - float cos_a; - float cos_ia; - float i_i_ia; - float j_j_ia; - float k_k_ia; - float i_j_ia; - float i_k_ia; - float j_k_ia; - float a_sin; - float b_sin; - float c_sin; - float rot[3][3]; - - cos_ia = DEG2RAD(degrees); - sin_a = sin(cos_ia); - cos_a = cos(cos_ia); - cos_ia = 1.0F - cos_a; - - i_i_ia = dir[0] * dir[0] * cos_ia; - j_j_ia = dir[1] * dir[1] * cos_ia; - k_k_ia = dir[2] * dir[2] * cos_ia; - i_j_ia = dir[0] * dir[1] * cos_ia; - i_k_ia = dir[0] * dir[2] * cos_ia; - j_k_ia = dir[1] * dir[2] * cos_ia; - - a_sin = dir[0] * sin_a; - b_sin = dir[1] * sin_a; - c_sin = dir[2] * sin_a; - - rot[0][0] = i_i_ia + cos_a; - rot[0][1] = i_j_ia - c_sin; - rot[0][2] = i_k_ia + b_sin; - rot[1][0] = i_j_ia + c_sin; - rot[1][1] = j_j_ia + cos_a; - rot[1][2] = j_k_ia - a_sin; - rot[2][0] = i_k_ia - b_sin; - rot[2][1] = j_k_ia + a_sin; - rot[2][2] = k_k_ia + cos_a; - - dst[0] = point[0] * rot[0][0] + point[1] * rot[0][1] + point[2] * rot[0][2]; - dst[1] = point[0] * rot[1][0] + point[1] * rot[1][1] + point[2] * rot[1][2]; - dst[2] = point[0] * rot[2][0] + point[1] * rot[2][1] + point[2] * rot[2][2]; +void RotatePointAroundVector( vec3_t dst, const vec3_t dir, + const vec3_t point, vec_t degrees ) { + vec_t sind, cosd, expr; + vec3_t dxp; + + degrees = DEG2RAD( degrees ); + sind = sin( degrees ); + cosd = cos( degrees ); + expr = ( 1 - cosd ) * DotProduct( dir, point ); + CrossProduct( dir, point, dxp ); + + dst[0] = expr*dir[0] + cosd*point[0] + sind*dxp[0]; + dst[1] = expr*dir[1] + cosd*point[1] + sind*dxp[1]; + dst[2] = expr*dir[2] + cosd*point[2] + sind*dxp[2]; } /* @@ -1290,38 +1259,40 @@ } -void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up) { - float angle; - static float sr, sp, sy, cr, cp, cy; +void AngleVectors( const vec3_t angles, vec3_t forward, + vec3_t right, vec3_t up ) { + float angle; + static float sp, sy, cp, cy, sr, cr; // static to help MS compiler fp bugs - angle = angles[YAW] * (M_PI*2 / 360); - sy = sin(angle); - cy = cos(angle); - angle = angles[PITCH] * (M_PI*2 / 360); - sp = sin(angle); - cp = cos(angle); - angle = angles[ROLL] * (M_PI*2 / 360); - sr = sin(angle); - cr = cos(angle); + angle = DEG2RAD( angles[PITCH] ); + sp = sin( angle ); + cp = cos( angle ); + + angle = DEG2RAD( angles[YAW] ); + sy = sin( angle ); + cy = cos( angle ); - if (forward) - { + if( forward ) { forward[0] = cp*cy; forward[1] = cp*sy; forward[2] = -sp; } - if (right) - { - right[0] = (-1*sr*sp*cy+-1*cr*-sy); - right[1] = (-1*sr*sp*sy+-1*cr*cy); - right[2] = -1*sr*cp; - } - if (up) - { - up[0] = (cr*sp*cy+-sr*-sy); - up[1] = (cr*sp*sy+-sr*cy); - up[2] = cr*cp; + if( right || up ) { + angle = DEG2RAD( angles[ROLL] ); + sr = sin( angle ); + cr = cos( angle ); + + if( right ) { + right[0] = -1*sr*sp*cy+-1*cr*-sy; + right[1] = -1*sr*sp*sy+-1*cr*cy; + right[2] = -1*sr*cp; + } + if( up ) { + up[0] = cr*sp*cy+-sr*-sy; + up[1] = cr*sp*sy+-sr*cy; + up[2] = cr*cp; + } } }