glide_test1

annotate matrix.h @ 0:f3ddb2bb7024

first 3dfx glide test, initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 09 Mar 2014 06:27:58 +0200
parents
children
rev   line source
nuclear@0 1 #ifndef MATRIX_H_
nuclear@0 2 #define MATRIX_H_
nuclear@0 3
nuclear@0 4 #define _USE_MATH_DEFINES
nuclear@0 5 #include <math.h>
nuclear@0 6
nuclear@0 7 #ifndef M_PI
nuclear@0 8 #define M_PI 3.14159265359
nuclear@0 9 #endif
nuclear@0 10
nuclear@0 11 class Matrix4x4 {
nuclear@0 12 public:
nuclear@0 13 float m[4][4];
nuclear@0 14
nuclear@0 15 inline Matrix4x4()
nuclear@0 16 {
nuclear@0 17 *this = Matrix4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
nuclear@0 18 }
nuclear@0 19
nuclear@0 20 inline Matrix4x4(float m00, float m01, float m02, float m03,
nuclear@0 21 float m10, float m11, float m12, float m13,
nuclear@0 22 float m20, float m21, float m22, float m23,
nuclear@0 23 float m30, float m31, float m32, float m33)
nuclear@0 24 {
nuclear@0 25 m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03;
nuclear@0 26 m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13;
nuclear@0 27 m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23;
nuclear@0 28 m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33;
nuclear@0 29 }
nuclear@0 30
nuclear@0 31 friend inline Matrix4x4 operator *(const Matrix4x4 &a, const Matrix4x4 &b);
nuclear@0 32
nuclear@0 33 inline void set_identity()
nuclear@0 34 {
nuclear@0 35 *this = Matrix4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
nuclear@0 36 }
nuclear@0 37
nuclear@0 38 inline void translate(float x, float y, float z)
nuclear@0 39 {
nuclear@0 40 *this = *this * Matrix4x4(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);
nuclear@0 41 }
nuclear@0 42
nuclear@0 43 inline void scale(float x, float y, float z)
nuclear@0 44 {
nuclear@0 45 *this = *this * Matrix4x4(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);
nuclear@0 46 }
nuclear@0 47
nuclear@0 48 inline void rotate(float angle, float x, float y, float z)
nuclear@0 49 {
nuclear@0 50 float rad = M_PI * angle / 180.0;
nuclear@0 51 float sina = (float)sin(rad);
nuclear@0 52 float cosa = (float)cos(rad);
nuclear@0 53 float invcosa = 1.0f - cosa;
nuclear@0 54 float nxsq = x * x;
nuclear@0 55 float nysq = y * y;
nuclear@0 56 float nzsq = z * z;
nuclear@0 57
nuclear@0 58 Matrix4x4 xform;
nuclear@0 59 xform[0][0] = nxsq + (1.0f - nxsq) * cosa;
nuclear@0 60 xform[0][1] = x * y * invcosa - z * sina;
nuclear@0 61 xform[0][2] = x * z * invcosa + y * sina;
nuclear@0 62 xform[1][0] = x * y * invcosa + z * sina;
nuclear@0 63 xform[1][1] = nysq + (1.0f - nysq) * cosa;
nuclear@0 64 xform[1][2] = y * z * invcosa - x * sina;
nuclear@0 65 xform[2][0] = x * z * invcosa - y * sina;
nuclear@0 66 xform[2][1] = y * z * invcosa + x * sina;
nuclear@0 67 xform[2][2] = nzsq + (1.0f - nzsq) * cosa;
nuclear@0 68 *this = *this * xform;
nuclear@0 69 }
nuclear@0 70
nuclear@0 71 inline void perspective(float vfov_deg, float aspect, float znear, float zfar)
nuclear@0 72 {
nuclear@0 73 float vfov_rad = M_PI * vfov_deg / 180.0;
nuclear@0 74 float f = 1.0f / tan(vfov_rad * 0.5f);
nuclear@0 75 float dz = znear - zfar;
nuclear@0 76
nuclear@0 77 Matrix4x4 xform;
nuclear@0 78 xform[0][0] = f / aspect;
nuclear@0 79 xform[1][1] = f;
nuclear@0 80 xform[2][2] = (zfar + znear) / dz;
nuclear@0 81 xform[3][2] = -1.0f;
nuclear@0 82 xform[2][3] = 2.0f * zfar * znear / dz;
nuclear@0 83 xform[3][3] = 0.0f;
nuclear@0 84 *this = *this * xform;
nuclear@0 85 }
nuclear@0 86
nuclear@0 87 inline float *operator [](int idx)
nuclear@0 88 {
nuclear@0 89 return m[idx];
nuclear@0 90 }
nuclear@0 91
nuclear@0 92 inline const float *operator[](int idx) const
nuclear@0 93 {
nuclear@0 94 return m[idx];
nuclear@0 95 }
nuclear@0 96 };
nuclear@0 97
nuclear@0 98 inline Matrix4x4 operator *(const Matrix4x4 &a, const Matrix4x4 &b)
nuclear@0 99 {
nuclear@0 100 Matrix4x4 res;
nuclear@0 101
nuclear@0 102 for(int i=0; i<4; i++) {
nuclear@0 103 for(int j=0; j<4; j++) {
nuclear@0 104 res.m[i][j] = a.m[i][0] * b.m[0][j] + a.m[i][1] * b.m[1][j] + a.m[i][2] * b.m[2][j] + a.m[i][3] * b.m[3][j];
nuclear@0 105 }
nuclear@0 106 }
nuclear@0 107 return res;
nuclear@0 108 }
nuclear@0 109
nuclear@0 110
nuclear@0 111 #endif // MATRIX_H_