summaryrefslogtreecommitdiff
path: root/src/shared/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/matrix.c')
-rw-r--r--src/shared/matrix.c41
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;
}