X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=matrixlib.c;h=26283a3693c988240746b4abd8ec68b72cfb8149;hb=11412bd9b37cead3418715820ef25530b6b2db1e;hp=550a511837d6981c196204e21f8d6618334bcea8;hpb=c3e8914018f3ee262d5e3aef0be7f7d26728a412;p=xonotic%2Fdarkplaces.git diff --git a/matrixlib.c b/matrixlib.c index 550a5118..26283a36 100644 --- a/matrixlib.c +++ b/matrixlib.c @@ -39,17 +39,17 @@ void Matrix4x4_CopyRotateOnly (matrix4x4_t *out, const matrix4x4_t *in) void Matrix4x4_CopyTranslateOnly (matrix4x4_t *out, const matrix4x4_t *in) { - out->m[0][0] = 0.0f; + out->m[0][0] = 1.0f; out->m[0][1] = 0.0f; out->m[0][2] = 0.0f; out->m[0][3] = in->m[0][3]; out->m[1][0] = 0.0f; - out->m[1][1] = 0.0f; + out->m[1][1] = 1.0f; out->m[1][2] = 0.0f; out->m[1][3] = in->m[1][3]; out->m[2][0] = 0.0f; out->m[2][1] = 0.0f; - out->m[2][2] = 0.0f; + out->m[2][2] = 1.0f; out->m[2][3] = in->m[2][3]; out->m[3][0] = 0.0f; out->m[3][1] = 0.0f; @@ -158,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[0][1] * scale); + out->m[0][2] = (float)(in1->m[0][2] * scale); + out->m[0][3] = (float)(in1->m[0][3]); + out->m[1][0] = (float)(in1->m[1][0] * scale); + out->m[1][1] = (float)(in1->m[1][1] * scale); + out->m[1][2] = (float)(in1->m[1][2] * scale); + out->m[1][3] = (float)(in1->m[1][3]); + out->m[2][0] = (float)(in1->m[2][0] * scale); + out->m[2][1] = (float)(in1->m[2][1] * 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;