-#include "quakedef.h"
-
+#include "darkplaces.h"
#include <math.h>
-#include "matrixlib.h"
#ifdef _MSC_VER
-#pragma warning(disable : 4244) // LordHavoc: MSVC++ 4 x86, double/float
-#pragma warning(disable : 4305) // LordHavoc: MSVC++ 6 x86, double/float
+#pragma warning(disable : 4244) // LadyHavoc: MSVC++ 4 x86, double/float
+#pragma warning(disable : 4305) // LadyHavoc: MSVC++ 6 x86, double/float
#endif
const matrix4x4_t identitymatrix =
}
}
+void Matrix4x4_QuakeToDuke3D(const matrix4x4_t *in, matrix4x4_t *out, double maxShearAngle)
+{
+ // Sorry - this isn't direct at all. We can't just use an alternative to
+ // Matrix4x4_CreateFromQuakeEntity as in some cases the input for
+ // generating the view matrix is generated externally.
+ vec3_t forward, left, up, angles;
+ double scaleforward, scaleleft, scaleup;
+#ifdef MATRIX4x4_OPENGLORIENTATION
+ VectorSet(forward, in->m[0][0], in->m[0][1], in->m[0][2]);
+ VectorSet(left, in->m[1][0], in->m[1][1], in->m[1][2]);
+ VectorSet(up, in->m[2][0], in->m[2][1], in->m[2][2]);
+#else
+ VectorSet(forward, in->m[0][0], in->m[1][0], in->m[2][0]);
+ VectorSet(left, in->m[0][1], in->m[1][1], in->m[2][1]);
+ VectorSet(up, in->m[0][2], in->m[1][2], in->m[2][2]);
+#endif
+ scaleforward = VectorNormalizeLength(forward);
+ scaleleft = VectorNormalizeLength(left);
+ scaleup = VectorNormalizeLength(up);
+ AnglesFromVectors(angles, forward, up, false);
+ AngleVectorsDuke3DFLU(angles, forward, left, up, maxShearAngle);
+ VectorScale(forward, scaleforward, forward);
+ VectorScale(left, scaleleft, left);
+ VectorScale(up, scaleup, up);
+ *out = *in;
+#ifdef MATRIX4x4_OPENGLORIENTATION
+ out->m[0][0] = forward[0];
+ out->m[1][0] = left[0];
+ out->m[2][0] = up[0];
+ out->m[0][1] = forward[1];
+ out->m[1][1] = left[1];
+ out->m[2][1] = up[1];
+ out->m[0][2] = forward[2];
+ out->m[1][2] = left[2];
+ out->m[2][2] = up[2];
+#else
+ out->m[0][0] = forward[0];
+ out->m[0][1] = left[0];
+ out->m[0][2] = up[0];
+ out->m[1][0] = forward[1];
+ out->m[1][1] = left[1];
+ out->m[1][2] = up[1];
+ out->m[2][0] = forward[2];
+ out->m[2][1] = left[2];
+ out->m[2][2] = up[2];
+#endif
+}
+
void Matrix4x4_ToVectors(const matrix4x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
{
#ifdef MATRIX4x4_OPENGLORIENTATION
#endif
}
-void Matrix4x4_FromArrayDoubleD3D (matrix4x4_t *out, const double in[16])
+void Matrix4x4_FromArrayDoubleD3D (matrix4x4_t *out, const double in[4][4])
{
#ifdef MATRIX4x4_OPENGLORIENTATION
- out->m[0][0] = in[0];
- out->m[1][0] = in[1];
- out->m[2][0] = in[2];
- out->m[3][0] = in[3];
- out->m[0][1] = in[4];
- out->m[1][1] = in[5];
- out->m[2][1] = in[6];
- out->m[3][1] = in[7];
- out->m[0][2] = in[8];
- out->m[1][2] = in[9];
- out->m[2][2] = in[10];
- out->m[3][2] = in[11];
- out->m[0][3] = in[12];
- out->m[1][3] = in[13];
- out->m[2][3] = in[14];
- out->m[3][3] = in[15];
+ out->m[0][0] = in[0][0];
+ out->m[1][0] = in[0][1];
+ out->m[2][0] = in[0][2];
+ out->m[3][0] = in[0][3];
+ out->m[0][1] = in[1][0];
+ out->m[1][1] = in[1][1];
+ out->m[2][1] = in[1][2];
+ out->m[3][1] = in[1][3];
+ out->m[0][2] = in[2][0];
+ out->m[1][2] = in[2][1];
+ out->m[2][2] = in[2][2];
+ out->m[3][2] = in[2][3];
+ out->m[0][3] = in[3][0];
+ out->m[1][3] = in[3][1];
+ out->m[2][3] = in[3][2];
+ out->m[3][3] = in[3][3];
#else
- out->m[0][0] = in[0];
- out->m[0][1] = in[1];
- out->m[0][2] = in[2];
- out->m[0][3] = in[3];
- out->m[1][0] = in[4];
- out->m[1][1] = in[5];
- out->m[1][2] = in[6];
- out->m[1][3] = in[7];
- out->m[2][0] = in[8];
- out->m[2][1] = in[9];
- out->m[2][2] = in[10];
- out->m[2][3] = in[11];
- out->m[3][0] = in[12];
- out->m[3][1] = in[13];
- out->m[3][2] = in[14];
- out->m[3][3] = in[15];
+ out->m[0][0] = in[0][0];
+ out->m[0][1] = in[0][1];
+ out->m[0][2] = in[0][2];
+ out->m[0][3] = in[0][3];
+ out->m[1][0] = in[1][0];
+ out->m[1][1] = in[1][1];
+ out->m[1][2] = in[1][2];
+ out->m[1][3] = in[1][3];
+ out->m[2][0] = in[2][0];
+ out->m[2][1] = in[2][1];
+ out->m[2][2] = in[2][2];
+ out->m[2][3] = in[2][3];
+ out->m[3][0] = in[3][0];
+ out->m[3][1] = in[3][1];
+ out->m[3][2] = in[3][2];
+ out->m[3][3] = in[3][3];
#endif
}
#endif
}
-void Matrix4x4_ToArray12FloatGL(const matrix4x4_t *in, float out[12])
+void Matrix4x4_ToArray12FloatGL(const matrix4x4_t *in, float out[4][3])
{
#ifdef MATRIX4x4_OPENGLORIENTATION
- out[ 0] = in->m[0][0];
- out[ 1] = in->m[0][1];
- out[ 2] = in->m[0][2];
- out[ 3] = in->m[1][0];
- out[ 4] = in->m[1][1];
- out[ 5] = in->m[1][2];
- out[ 6] = in->m[2][0];
- out[ 7] = in->m[2][1];
- out[ 8] = in->m[2][2];
- out[ 9] = in->m[3][0];
- out[10] = in->m[3][1];
- out[11] = in->m[3][2];
+ out[0][0] = in->m[0][0];
+ out[0][1] = in->m[0][1];
+ out[0][2] = in->m[0][2];
+ out[1][0] = in->m[1][0];
+ out[1][1] = in->m[1][1];
+ out[1][2] = in->m[1][2];
+ out[2][0] = in->m[2][0];
+ out[2][1] = in->m[2][1];
+ out[2][2] = in->m[2][2];
+ out[3][0] = in->m[3][0];
+ out[3][1] = in->m[3][1];
+ out[3][2] = in->m[3][2];
#else
- out[ 0] = in->m[0][0];
- out[ 1] = in->m[1][0];
- out[ 2] = in->m[2][0];
- out[ 3] = in->m[0][1];
- out[ 4] = in->m[1][1];
- out[ 5] = in->m[2][1];
- out[ 6] = in->m[0][2];
- out[ 7] = in->m[1][2];
- out[ 8] = in->m[2][2];
- out[ 9] = in->m[0][3];
- out[10] = in->m[1][3];
- out[11] = in->m[2][3];
+ out[0][0] = in->m[0][0];
+ out[0][1] = in->m[1][0];
+ out[0][2] = in->m[2][0];
+ out[1][0] = in->m[0][1];
+ out[1][1] = in->m[1][1];
+ out[1][2] = in->m[2][1];
+ out[2][0] = in->m[0][2];
+ out[2][1] = in->m[1][2];
+ out[2][2] = in->m[2][2];
+ out[3][0] = in->m[0][3];
+ out[3][1] = in->m[1][3];
+ out[3][2] = in->m[2][3];
#endif
}
#endif
}
-// LordHavoc: I got this code from:
+// LadyHavoc: I got this code from:
//http://www.doom3world.org/phpbb2/viewtopic.php?t=2884
void Matrix4x4_FromDoom3Joint(matrix4x4_t *m, double ox, double oy, double oz, double x, double y, double z)
{
#endif
}
-void Matrix4x4_OriginScale3 (matrix4x4_t *out, double x, double y, double z)
-{
-#ifdef MATRIX4x4_OPENGLORIENTATION
- out->m[3][0] *= x;
- out->m[3][1] *= y;
- out->m[3][2] *= z;
-#else
- out->m[0][3] *= x;
- out->m[1][3] *= y;
- out->m[2][3] *= z;
-#endif
-}
-
void Matrix4x4_Abs (matrix4x4_t *out)
{
out->m[0][0] = fabs(out->m[0][0]);