diff options
Diffstat (limited to 'src/shared/matrix.c')
-rw-r--r-- | src/shared/matrix.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/src/shared/matrix.c b/src/shared/matrix.c index 24682b2..be89c5f 100644 --- a/src/shared/matrix.c +++ b/src/shared/matrix.c @@ -35,29 +35,40 @@ void AngleVectors(vec3_t angles, vec3_t forward, vec3_t right, vec3_t up) } } -vec_t VectorNormalize(vec3_t v) +static float inv_sqrt(float n) { - float length = VectorLength(v); + float x2 = n * 0.5F; + union { + float f; + int i; + } y; - if (length) - VectorScale(v, 1 / length, v); + /* magic number for doubles: 0x5fe6eb50c7b537a9 */ - return length; + y.f = n; + y.i = 0x5f375a86 - (y.i >> 1); + y.f = y.f * (1.5F - (x2 * y.f * y.f)); + y.f = y.f * (1.5F - (x2 * y.f * y.f)); + + return y.f; +} + +void VectorNormalize(vec3_t v) +{ + VectorScale(v, inv_sqrt(VectorLengthSquared(v)), v); } -vec_t VectorNormalize2(vec3_t v, vec3_t out) +void VectorNormalize2(vec3_t v, vec3_t out) { - float length, ilength; + VectorScale(v, inv_sqrt(VectorLengthSquared(v)), out); +} - length = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; - length = sqrt(length); // FIXME +vec_t VectorNormalizeLen(vec3_t v) +{ + float length = VectorLength(v); - if (length) { - ilength = 1 / length; - out[0] = v[0] * ilength; - out[1] = v[1] * ilength; - out[2] = v[2] * ilength; - } + if (length) + VectorScale(v, 1 / length, v); return length; } |