rev |
line source |
nuclear@0
|
1 #ifndef VMATH_H_
|
nuclear@0
|
2 #define VMATH_H_
|
nuclear@0
|
3
|
nuclear@0
|
4 #include <math.h>
|
nuclear@0
|
5 #include "matrix.h"
|
nuclear@0
|
6
|
nuclear@0
|
7 class Vector4;
|
nuclear@0
|
8
|
nuclear@0
|
9 class Vector3 {
|
nuclear@0
|
10 public:
|
nuclear@0
|
11 float x, y, z;
|
nuclear@0
|
12
|
nuclear@0
|
13 Vector3() : x(0), y(0), z(0) {}
|
nuclear@0
|
14 Vector3(float xx, float yy, float zz) : x(xx), y(yy), z(zz) {}
|
nuclear@0
|
15 explicit inline Vector3(const Vector4 &v);
|
nuclear@0
|
16
|
nuclear@0
|
17 inline float &operator [](int idx)
|
nuclear@0
|
18 {
|
nuclear@0
|
19 switch(idx) {
|
nuclear@0
|
20 case 0:
|
nuclear@0
|
21 return x;
|
nuclear@0
|
22 case 1:
|
nuclear@0
|
23 return y;
|
nuclear@0
|
24 case 2:
|
nuclear@0
|
25 default:
|
nuclear@0
|
26 return z;
|
nuclear@0
|
27 }
|
nuclear@0
|
28 }
|
nuclear@0
|
29
|
nuclear@0
|
30 inline const float &operator [](int idx) const
|
nuclear@0
|
31 {
|
nuclear@0
|
32 switch(idx) {
|
nuclear@0
|
33 case 0:
|
nuclear@0
|
34 return x;
|
nuclear@0
|
35 case 1:
|
nuclear@0
|
36 return y;
|
nuclear@0
|
37 case 2:
|
nuclear@0
|
38 default:
|
nuclear@0
|
39 return z;
|
nuclear@0
|
40 }
|
nuclear@0
|
41 }
|
nuclear@0
|
42
|
nuclear@0
|
43 inline float length() const
|
nuclear@0
|
44 {
|
nuclear@0
|
45 return sqrt(x * x + y * y + z * z);
|
nuclear@0
|
46 }
|
nuclear@0
|
47
|
nuclear@0
|
48 inline void normalize()
|
nuclear@0
|
49 {
|
nuclear@0
|
50 float len = length();
|
nuclear@0
|
51 if(len != 0) {
|
nuclear@0
|
52 x /= len;
|
nuclear@0
|
53 y /= len;
|
nuclear@0
|
54 z /= len;
|
nuclear@0
|
55 }
|
nuclear@0
|
56 }
|
nuclear@0
|
57 };
|
nuclear@0
|
58
|
nuclear@0
|
59 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
60 {
|
nuclear@0
|
61 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
|
nuclear@0
|
62 }
|
nuclear@0
|
63
|
nuclear@0
|
64 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
65 {
|
nuclear@0
|
66 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
|
nuclear@0
|
67 }
|
nuclear@0
|
68
|
nuclear@0
|
69 inline Vector3 operator *(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
70 {
|
nuclear@0
|
71 return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
|
nuclear@0
|
72 }
|
nuclear@0
|
73
|
nuclear@0
|
74 inline Vector3 operator *(const Vector3 &v, float s)
|
nuclear@0
|
75 {
|
nuclear@0
|
76 return Vector3(v.x * s, v.y * s, v.z * s);
|
nuclear@0
|
77 }
|
nuclear@0
|
78
|
nuclear@0
|
79 inline Vector3 operator *(float s, const Vector3 &v)
|
nuclear@0
|
80 {
|
nuclear@0
|
81 return Vector3(v.x * s, v.y * s, v.z * s);
|
nuclear@0
|
82 }
|
nuclear@0
|
83
|
nuclear@0
|
84 inline Vector3 operator /(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
85 {
|
nuclear@0
|
86 return Vector3(a.x / b.x, a.y / b.y, a.z / b.z);
|
nuclear@0
|
87 }
|
nuclear@0
|
88
|
nuclear@0
|
89 inline Vector3 operator /(const Vector3 &v, float s)
|
nuclear@0
|
90 {
|
nuclear@0
|
91 return Vector3(v.x / s, v.y / s, v.z / s);
|
nuclear@0
|
92 }
|
nuclear@0
|
93
|
nuclear@0
|
94 inline float dot(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
95 {
|
nuclear@0
|
96 return a.x * b.x + a.y * b.y + a.z * b.z;
|
nuclear@0
|
97 }
|
nuclear@0
|
98
|
nuclear@0
|
99 inline Vector3 cross(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
100 {
|
nuclear@0
|
101 return Vector3(a.y * b.z - a.z * b.y,
|
nuclear@0
|
102 a.z * b.x - a.x * b.z,
|
nuclear@0
|
103 a.x * b.y - a.y * b.z);
|
nuclear@0
|
104 }
|
nuclear@0
|
105
|
nuclear@0
|
106
|
nuclear@0
|
107 inline float length(const Vector3 &v)
|
nuclear@0
|
108 {
|
nuclear@0
|
109 return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
nuclear@0
|
110 }
|
nuclear@0
|
111
|
nuclear@0
|
112 inline float length_sq(const Vector3 &v)
|
nuclear@0
|
113 {
|
nuclear@0
|
114 return v.x * v.x + v.y * v.y + v.z * v.z;
|
nuclear@0
|
115 }
|
nuclear@0
|
116
|
nuclear@0
|
117 inline Vector3 normalize(const Vector3 &v)
|
nuclear@0
|
118 {
|
nuclear@0
|
119 float len = length(v);
|
nuclear@0
|
120 float s = len == 0 ? 1.0 : 1.0 / len;
|
nuclear@0
|
121 return v * s;
|
nuclear@0
|
122 }
|
nuclear@0
|
123
|
nuclear@0
|
124 inline Vector3 transform(const Vector3 &v, const Matrix4x4 &m)
|
nuclear@0
|
125 {
|
nuclear@0
|
126 return Vector3(
|
nuclear@0
|
127 m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3],
|
nuclear@0
|
128 m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3],
|
nuclear@0
|
129 m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3]);
|
nuclear@0
|
130 }
|
nuclear@0
|
131
|
nuclear@0
|
132
|
nuclear@0
|
133 // ---- Vector4 ----
|
nuclear@0
|
134 class Vector4 {
|
nuclear@0
|
135 public:
|
nuclear@0
|
136 float x, y, z, w;
|
nuclear@0
|
137
|
nuclear@0
|
138 Vector4() : x(0), y(0), z(0), w(1) {}
|
nuclear@0
|
139 Vector4(float xx, float yy, float zz, float ww = 1.0f) : x(xx), y(yy), z(zz), w(ww) {}
|
nuclear@0
|
140 explicit Vector4(const Vector3 &v) : x(v.x), y(v.y), z(v.z), w(1.0f) {}
|
nuclear@0
|
141
|
nuclear@0
|
142 inline float &operator [](int idx)
|
nuclear@0
|
143 {
|
nuclear@0
|
144 switch(idx) {
|
nuclear@0
|
145 case 0:
|
nuclear@0
|
146 return x;
|
nuclear@0
|
147 case 1:
|
nuclear@0
|
148 return y;
|
nuclear@0
|
149 case 2:
|
nuclear@0
|
150 return z;
|
nuclear@0
|
151 default:
|
nuclear@0
|
152 case 3:
|
nuclear@0
|
153 return w;
|
nuclear@0
|
154 }
|
nuclear@0
|
155 }
|
nuclear@0
|
156
|
nuclear@0
|
157 inline const float &operator [](int idx) const
|
nuclear@0
|
158 {
|
nuclear@0
|
159 switch(idx) {
|
nuclear@0
|
160 case 0:
|
nuclear@0
|
161 return x;
|
nuclear@0
|
162 case 1:
|
nuclear@0
|
163 return y;
|
nuclear@0
|
164 case 2:
|
nuclear@0
|
165 return z;
|
nuclear@0
|
166 case 3:
|
nuclear@0
|
167 default:
|
nuclear@0
|
168 return w;
|
nuclear@0
|
169 }
|
nuclear@0
|
170 }
|
nuclear@0
|
171
|
nuclear@0
|
172 inline float length() const
|
nuclear@0
|
173 {
|
nuclear@0
|
174 return sqrt(x * x + y * y + z * z + w * w);
|
nuclear@0
|
175 }
|
nuclear@0
|
176
|
nuclear@0
|
177 inline void normalize()
|
nuclear@0
|
178 {
|
nuclear@0
|
179 float len = length();
|
nuclear@0
|
180 if(len != 0) {
|
nuclear@0
|
181 x /= len;
|
nuclear@0
|
182 y /= len;
|
nuclear@0
|
183 z /= len;
|
nuclear@0
|
184 w /= len;
|
nuclear@0
|
185 }
|
nuclear@0
|
186 }
|
nuclear@0
|
187 };
|
nuclear@0
|
188
|
nuclear@0
|
189 inline Vector4 operator +(const Vector4 &a, const Vector4 &b)
|
nuclear@0
|
190 {
|
nuclear@0
|
191 return Vector4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
|
nuclear@0
|
192 }
|
nuclear@0
|
193
|
nuclear@0
|
194 inline Vector4 operator -(const Vector4 &a, const Vector4 &b)
|
nuclear@0
|
195 {
|
nuclear@0
|
196 return Vector4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
|
nuclear@0
|
197 }
|
nuclear@0
|
198
|
nuclear@0
|
199 inline Vector4 operator *(const Vector4 &a, const Vector4 &b)
|
nuclear@0
|
200 {
|
nuclear@0
|
201 return Vector4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
|
nuclear@0
|
202 }
|
nuclear@0
|
203
|
nuclear@0
|
204 inline Vector4 operator *(const Vector4 &v, float s)
|
nuclear@0
|
205 {
|
nuclear@0
|
206 return Vector4(v.x * s, v.y * s, v.z * s, v.w * s);
|
nuclear@0
|
207 }
|
nuclear@0
|
208
|
nuclear@0
|
209 inline Vector4 operator *(float s, const Vector4 &v)
|
nuclear@0
|
210 {
|
nuclear@0
|
211 return Vector4(v.x * s, v.y * s, v.z * s, v.w * s);
|
nuclear@0
|
212 }
|
nuclear@0
|
213
|
nuclear@0
|
214 inline Vector4 operator /(const Vector4 &a, const Vector4 &b)
|
nuclear@0
|
215 {
|
nuclear@0
|
216 return Vector4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);
|
nuclear@0
|
217 }
|
nuclear@0
|
218
|
nuclear@0
|
219 inline Vector4 operator /(const Vector4 &v, float s)
|
nuclear@0
|
220 {
|
nuclear@0
|
221 return Vector4(v.x / s, v.y / s, v.z / s, v.w / s);
|
nuclear@0
|
222 }
|
nuclear@0
|
223
|
nuclear@0
|
224 inline float dot(const Vector4 &a, const Vector4 &b)
|
nuclear@0
|
225 {
|
nuclear@0
|
226 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
|
nuclear@0
|
227 }
|
nuclear@0
|
228
|
nuclear@0
|
229 inline float length(const Vector4 &v)
|
nuclear@0
|
230 {
|
nuclear@0
|
231 return sqrt(v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w);
|
nuclear@0
|
232 }
|
nuclear@0
|
233
|
nuclear@0
|
234 inline float length_sq(const Vector4 &v)
|
nuclear@0
|
235 {
|
nuclear@0
|
236 return v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w;
|
nuclear@0
|
237 }
|
nuclear@0
|
238
|
nuclear@0
|
239 inline Vector4 normalize(const Vector4 &v)
|
nuclear@0
|
240 {
|
nuclear@0
|
241 float len = length(v);
|
nuclear@0
|
242 float s = len == 0 ? 1.0 : 1.0 / len;
|
nuclear@0
|
243 return v * s;
|
nuclear@0
|
244 }
|
nuclear@0
|
245
|
nuclear@0
|
246 inline Vector4 transform(const Vector4 &v, const Matrix4x4 &m)
|
nuclear@0
|
247 {
|
nuclear@0
|
248 return Vector4(
|
nuclear@0
|
249 m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w,
|
nuclear@0
|
250 m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w,
|
nuclear@0
|
251 m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w,
|
nuclear@0
|
252 m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w);
|
nuclear@0
|
253 }
|
nuclear@0
|
254
|
nuclear@0
|
255 inline Vector3::Vector3(const Vector4 &v)
|
nuclear@0
|
256 : x(v.x), y(v.y), z(v.z)
|
nuclear@0
|
257 {
|
nuclear@0
|
258 }
|
nuclear@0
|
259
|
nuclear@0
|
260
|
nuclear@0
|
261 #endif // VMATH_H_ |