glide_test1

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