]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - matrixlib.c
SOLID_NOT is now linked into the areagrid, which fixed the bugs with corpses not...
[xonotic/darkplaces.git] / matrixlib.c
index a036d822053a494c8ae1d23058e7bfa54814e73e..5433aaccbb032661c0c3cb7eddc0c5bf5a760c82 100644 (file)
@@ -2,6 +2,16 @@
 #include <math.h>
 #include "matrixlib.h"
 
+const matrix4x4_t identitymatrix =
+{
+       {
+               {1, 0, 0, 0},
+               {0, 1, 0, 0},
+               {0, 0, 1, 0},
+               {0, 0, 0, 1}
+       }
+};
+
 void Matrix4x4_Copy (matrix4x4_t *out, const matrix4x4_t *in)
 {
        *out = *in;
@@ -148,6 +158,29 @@ void Matrix4x4_Invert_Simple (matrix4x4_t *out, const matrix4x4_t *in1)
        out->m[3][3] = 1;
 }
 
+void Matrix4x4_Normalize (matrix4x4_t *out, matrix4x4_t *in1)
+{
+       // scale rotation matrix vectors to a length of 1
+       // note: this is only designed to undo uniform scaling
+       double scale = 1.0 / sqrt(in1->m[0][0] * in1->m[0][0] + in1->m[0][1] * in1->m[0][1] + in1->m[0][2] * in1->m[0][2]);
+       out->m[0][0] = (float)(in1->m[0][0] * scale);
+       out->m[0][1] = (float)(in1->m[1][0] * scale);
+       out->m[0][2] = (float)(in1->m[2][0] * scale);
+       out->m[0][3] = (float)(in1->m[0][3]);
+       out->m[1][0] = (float)(in1->m[0][1] * scale);
+       out->m[1][1] = (float)(in1->m[1][1] * scale);
+       out->m[1][2] = (float)(in1->m[2][1] * scale);
+       out->m[1][3] = (float)(in1->m[1][3]);
+       out->m[2][0] = (float)(in1->m[0][2] * scale);
+       out->m[2][1] = (float)(in1->m[1][2] * scale);
+       out->m[2][2] = (float)(in1->m[2][2] * scale);
+       out->m[2][3] = (float)(in1->m[2][3]);
+       out->m[3][0] = 0;
+       out->m[3][1] = 0;
+       out->m[3][2] = 0;
+       out->m[3][3] = 1;
+}
+
 void Matrix4x4_CreateIdentity (matrix4x4_t *out)
 {
        out->m[0][0]=1.0f;