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_ |