rayzor

view src/vmath.h @ 17:79609d482762

the renderer renders, also fixed an unnoticed matrix conversion problem between scenegraph and min3d
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 14 Apr 2014 07:34:45 +0300
parents be616b58df99
children 252999cd1a3f
line source
1 #ifndef VMATH_H_
2 #define VMATH_H_
4 #include <math.h>
5 #include "vmathmat.h"
7 #define DEG2RAD(x) (M_PI * (x) / 180.0)
8 #define RAD2DEG(x) (180.0 * (x) / M_PI)
10 class Vector3 {
11 public:
12 float x, y, z;
14 Vector3() : x(0), y(0), z(0) {}
15 Vector3(float xx, float yy, float zz) : x(xx), y(yy), z(zz) {}
17 float length_sq() const { return x * x + y * y + z * z; }
18 float length() const { return sqrt(x * x + y * y + z * z); }
20 void normalize()
21 {
22 float len = length();
23 if(len != 0.0) {
24 x /= len;
25 y /= len;
26 z /= len;
27 }
28 }
30 float &operator [](int idx) { return idx == 2 ? z : (idx == 1 ? y : x); }
31 const float &operator [](int idx) const { return idx == 2 ? z : (idx == 1 ? y : x); }
32 };
34 inline Vector3 normalize(const Vector3 &v)
35 {
36 float len = v.length();
37 if(len != 0.0) {
38 return Vector3(v.x / len, v.y / len, v.z / len);
39 }
40 return v;
41 }
43 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
44 {
45 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
46 }
48 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
49 {
50 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
51 }
53 inline Vector3 operator -(const Vector3 &v)
54 {
55 return Vector3(-v.x, -v.y, -v.z);
56 }
58 inline Vector3 operator *(const Vector3 &a, const Vector3 &b)
59 {
60 return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
61 }
63 inline Vector3 operator *(const Vector3 &v, float s)
64 {
65 return Vector3(v.x * s, v.y * s, v.z * s);
66 }
68 inline Vector3 operator /(const Vector3 &v, float s)
69 {
70 return Vector3(v.x / s, v.y / s, v.z / s);
71 }
73 inline float dot(const Vector3 &a, const Vector3 &b)
74 {
75 return a.x * b.x + a.y * b.y + a.z * b.z;
76 }
78 inline Vector3 cross(const Vector3 &a, const Vector3 &b)
79 {
80 return Vector3(a.y * b.z - a.z * b.y,
81 a.z * b.x - a.x * b.z,
82 a.x * b.y - a.y * b.x);
83 }
85 inline Vector3 transform(const Matrix4x4 &m, const Vector3 &v)
86 {
87 float x = m.m[0][0] * v.x + m.m[0][1] * v.y + m.m[0][2] * v.z + m.m[0][3];
88 float y = m.m[1][0] * v.x + m.m[1][1] * v.y + m.m[1][2] * v.z + m.m[1][3];
89 float z = m.m[2][0] * v.x + m.m[2][1] * v.y + m.m[2][2] * v.z + m.m[2][3];
90 return Vector3(x, y, z);
91 }
93 inline Vector3 lerp(const Vector3 &a, const Vector3 &b, float t)
94 {
95 return Vector3(a.x + (b.x - a.x) * t,
96 a.y + (b.y - a.y) * t,
97 a.z + (b.z - a.z) * t);
98 }
100 // ---- Vector4 ----
102 class Vector4 {
103 public:
104 float x, y, z, w;
106 Vector4() : x(0), y(0), z(0), w(1.0) {}
107 Vector4(const Vector3 &v) : x(v.x), y(v.y), z(v.z), w(1.0) {}
108 Vector4(float xx, float yy, float zz, float ww) : x(xx), y(yy), z(zz), w(ww) {}
110 float length_sq() const { return x * x + y * y + z * z + w * w; }
111 float length() const { return sqrt(x * x + y * y + z * z + w * w); }
113 void normalize()
114 {
115 float len = length();
116 if(len != 0.0) {
117 x /= len;
118 y /= len;
119 z /= len;
120 w /= len;
121 }
122 }
124 float &operator [](int idx)
125 {
126 return idx == 3 ? w : (idx == 2 ? z : (idx == 1 ? y : x));
127 }
128 const float &operator [](int idx) const
129 {
130 return idx == 3 ? w : (idx == 2 ? z : (idx == 1 ? y : x));
131 }
132 };
134 inline Vector4 operator +(const Vector4 &a, const Vector4 &b)
135 {
136 return Vector4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
137 }
139 inline Vector4 operator -(const Vector4 &a, const Vector4 &b)
140 {
141 return Vector4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
142 }
144 inline Vector4 operator -(const Vector4 &v)
145 {
146 return Vector4(-v.x, -v.y, -v.z, -v.w);
147 }
149 inline Vector4 operator *(const Vector4 &v, float s)
150 {
151 return Vector4(v.x * s, v.y * s, v.z * s, v.w * s);
152 }
154 inline Vector4 operator /(const Vector4 &v, float s)
155 {
156 return Vector4(v.x / s, v.y / s, v.z / s, v.w / s);
157 }
159 inline float dot(const Vector4 &a, const Vector4 &b)
160 {
161 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
162 }
164 inline Vector4 transform(const Matrix4x4 &m, const Vector4 &v)
165 {
166 float x = m.m[0][0] * v.x + m.m[0][1] * v.y + m.m[0][2] * v.z + m.m[0][3] * v.w;
167 float y = m.m[1][0] * v.x + m.m[1][1] * v.y + m.m[1][2] * v.z + m.m[1][3] * v.w;
168 float z = m.m[2][0] * v.x + m.m[2][1] * v.y + m.m[2][2] * v.z + m.m[2][3] * v.w;
169 float w = m.m[3][0] * v.x + m.m[3][1] * v.y + m.m[3][2] * v.z + m.m[3][3] * v.w;
170 return Vector4(x, y, z, w);
171 }
173 inline Vector4 lerp(const Vector4 &a, const Vector4 &b, float t)
174 {
175 return Vector4(a.x + (b.x - a.x) * t,
176 a.y + (b.y - a.y) * t,
177 a.z + (b.z - a.z) * t,
178 a.w + (b.w - a.w) * t);
179 }
182 #endif // VMATH_H_