2 This file is part of XRay, a photorealistic 3D rendering library.
3 Copyright (C) 2005 John Tsiombikas
5 XRay is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 XRay is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with XRay; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 * @author John Tsiombikas
28 * Inline functions of vector classes.
32 inline scalar_t &Vector2::operator [](int elem) {
36 inline Vector2 operator -(const Vector2 &vec) {
37 return Vector2(-vec.x, -vec.y);
40 inline scalar_t dot_product(const Vector2 &v1, const Vector2 &v2) {
41 return v1.x * v2.x + v1.y * v2.y;
44 inline Vector2 operator +(const Vector2 &v1, const Vector2 &v2) {
45 return Vector2(v1.x + v2.x, v1.y + v2.y);
48 inline Vector2 operator -(const Vector2 &v1, const Vector2 &v2) {
49 return Vector2(v1.x - v2.x, v1.y - v2.y);
52 inline Vector2 operator *(const Vector2 &v1, const Vector2 &v2) {
53 return Vector2(v1.x * v2.x, v1.y * v2.y);
56 inline Vector2 operator /(const Vector2 &v1, const Vector2 &v2) {
57 return Vector2(v1.x / v2.x, v1.y / v2.y);
60 inline bool operator ==(const Vector2 &v1, const Vector2 &v2) {
61 return (fabs(v1.x - v2.x) < xsmall_number) && (fabs(v1.y - v2.x) < xsmall_number);
64 inline void operator +=(Vector2 &v1, const Vector2 &v2) {
69 inline void operator -=(Vector2 &v1, const Vector2 &v2) {
74 inline void operator *=(Vector2 &v1, const Vector2 &v2) {
79 inline void operator /=(Vector2 &v1, const Vector2 &v2) {
84 inline Vector2 operator +(const Vector2 &vec, scalar_t scalar) {
85 return Vector2(vec.x + scalar, vec.y + scalar);
88 inline Vector2 operator +(scalar_t scalar, const Vector2 &vec) {
89 return Vector2(vec.x + scalar, vec.y + scalar);
92 inline Vector2 operator -(const Vector2 &vec, scalar_t scalar) {
93 return Vector2(vec.x - scalar, vec.y - scalar);
96 inline Vector2 operator -(scalar_t scalar, const Vector2 &vec) {
97 return Vector2(vec.x - scalar, vec.y - scalar);
100 inline Vector2 operator *(const Vector2 &vec, scalar_t scalar) {
101 return Vector2(vec.x * scalar, vec.y * scalar);
104 inline Vector2 operator *(scalar_t scalar, const Vector2 &vec) {
105 return Vector2(vec.x * scalar, vec.y * scalar);
108 inline Vector2 operator /(const Vector2 &vec, scalar_t scalar) {
109 return Vector2(vec.x / scalar, vec.y / scalar);
112 inline Vector2 operator /(scalar_t scalar, const Vector2 &vec) {
113 return Vector2(vec.x / scalar, vec.y / scalar);
116 inline void operator +=(Vector2 &vec, scalar_t scalar) {
121 inline void operator -=(Vector2 &vec, scalar_t scalar) {
126 inline void operator *=(Vector2 &vec, scalar_t scalar) {
131 inline void operator /=(Vector2 &vec, scalar_t scalar) {
136 inline scalar_t Vector2::length() const {
137 return sqrt(x*x + y*y);
140 inline scalar_t Vector2::length_sq() const {
146 // ------------- Vector3 --------------
148 inline scalar_t &Vector3::operator [](int elem) {
149 return elem ? (elem == 1 ? y : z) : x;
153 inline Vector3 operator -(const Vector3 &vec) {
154 return Vector3(-vec.x, -vec.y, -vec.z);
157 // binary vector (op) vector operations
158 inline scalar_t dot_product(const Vector3 &v1, const Vector3 &v2) {
159 return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
162 inline Vector3 cross_product(const Vector3 &v1, const Vector3 &v2) {
163 return Vector3(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z, v1.x * v2.y - v1.y * v2.x);
167 inline Vector3 operator +(const Vector3 &v1, const Vector3 &v2) {
168 return Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
171 inline Vector3 operator -(const Vector3 &v1, const Vector3 &v2) {
172 return Vector3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
175 inline Vector3 operator *(const Vector3 &v1, const Vector3 &v2) {
176 return Vector3(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z);
179 inline Vector3 operator /(const Vector3 &v1, const Vector3 &v2) {
180 return Vector3(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z);
183 inline bool operator ==(const Vector3 &v1, const Vector3 &v2) {
184 return (fabs(v1.x - v2.x) < xsmall_number) && (fabs(v1.y - v2.y) < xsmall_number) && (fabs(v1.z - v2.z) < xsmall_number);
187 inline void operator +=(Vector3 &v1, const Vector3 &v2) {
193 inline void operator -=(Vector3 &v1, const Vector3 &v2) {
199 inline void operator *=(Vector3 &v1, const Vector3 &v2) {
205 inline void operator /=(Vector3 &v1, const Vector3 &v2) {
210 // binary vector (op) scalar and scalar (op) vector operations
211 inline Vector3 operator +(const Vector3 &vec, scalar_t scalar) {
212 return Vector3(vec.x + scalar, vec.y + scalar, vec.z + scalar);
215 inline Vector3 operator +(scalar_t scalar, const Vector3 &vec) {
216 return Vector3(vec.x + scalar, vec.y + scalar, vec.z + scalar);
219 inline Vector3 operator -(const Vector3 &vec, scalar_t scalar) {
220 return Vector3(vec.x - scalar, vec.y - scalar, vec.z - scalar);
223 inline Vector3 operator -(scalar_t scalar, const Vector3 &vec) {
224 return Vector3(vec.x - scalar, vec.y - scalar, vec.z - scalar);
227 inline Vector3 operator *(const Vector3 &vec, scalar_t scalar) {
228 return Vector3(vec.x * scalar, vec.y * scalar, vec.z * scalar);
231 inline Vector3 operator *(scalar_t scalar, const Vector3 &vec) {
232 return Vector3(vec.x * scalar, vec.y * scalar, vec.z * scalar);
235 inline Vector3 operator /(const Vector3 &vec, scalar_t scalar) {
236 return Vector3(vec.x / scalar, vec.y / scalar, vec.z / scalar);
239 inline Vector3 operator /(scalar_t scalar, const Vector3 &vec) {
240 return Vector3(vec.x / scalar, vec.y / scalar, vec.z / scalar);
243 inline void operator +=(Vector3 &vec, scalar_t scalar) {
249 inline void operator -=(Vector3 &vec, scalar_t scalar) {
255 inline void operator *=(Vector3 &vec, scalar_t scalar) {
261 inline void operator /=(Vector3 &vec, scalar_t scalar) {
267 inline scalar_t Vector3::length() const {
268 return sqrt(x*x + y*y + z*z);
270 inline scalar_t Vector3::length_sq() const {
271 return x*x + y*y + z*z;
276 // ----------- Vector4 -----------------
278 inline scalar_t &Vector4::operator [](int elem) {
279 return elem ? (elem == 1 ? y : (elem == 2 ? z : w)) : x;
282 inline Vector4 operator -(const Vector4 &vec) {
283 return Vector4(-vec.x, -vec.y, -vec.z, -vec.w);
286 inline scalar_t dot_product(const Vector4 &v1, const Vector4 &v2) {
287 return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w;
290 inline Vector4 cross_product(const Vector4 &v1, const Vector4 &v2, const Vector4 &v3) {
291 float A, B, C, D, E, F; // Intermediate Values
294 // Calculate intermediate values.
295 A = (v2.x * v3.y) - (v2.y * v3.x);
296 B = (v2.x * v3.z) - (v2.z * v3.x);
297 C = (v2.x * v3.w) - (v2.w * v3.x);
298 D = (v2.y * v3.z) - (v2.z * v3.y);
299 E = (v2.y * v3.w) - (v2.w * v3.y);
300 F = (v2.z * v3.w) - (v2.w * v3.z);
302 // Calculate the result-vector components.
303 result.x = (v1.y * F) - (v1.z * E) + (v1.w * D);
304 result.y = - (v1.x * F) + (v1.z * C) - (v1.w * B);
305 result.z = (v1.x * E) - (v1.y * C) + (v1.w * A);
306 result.w = - (v1.x * D) + (v1.y * B) - (v1.z * A);
310 inline Vector4 operator +(const Vector4 &v1, const Vector4 &v2) {
311 return Vector4(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z, v1.w + v2.w);
314 inline Vector4 operator -(const Vector4 &v1, const Vector4 &v2) {
315 return Vector4(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z, v1.w - v2.w);
318 inline Vector4 operator *(const Vector4 &v1, const Vector4 &v2) {
319 return Vector4(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z, v1.w * v2.w);
322 inline Vector4 operator /(const Vector4 &v1, const Vector4 &v2) {
323 return Vector4(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z, v1.w / v2.w);
326 inline bool operator ==(const Vector4 &v1, const Vector4 &v2) {
327 return (fabs(v1.x - v2.x) < xsmall_number) &&
328 (fabs(v1.y - v2.y) < xsmall_number) &&
329 (fabs(v1.z - v2.z) < xsmall_number) &&
330 (fabs(v1.w - v2.w) < xsmall_number);
333 inline void operator +=(Vector4 &v1, const Vector4 &v2) {
340 inline void operator -=(Vector4 &v1, const Vector4 &v2) {
347 inline void operator *=(Vector4 &v1, const Vector4 &v2) {
354 inline void operator /=(Vector4 &v1, const Vector4 &v2) {
361 // binary vector (op) scalar and scalar (op) vector operations
362 inline Vector4 operator +(const Vector4 &vec, scalar_t scalar) {
363 return Vector4(vec.x + scalar, vec.y + scalar, vec.z + scalar, vec.w + scalar);
366 inline Vector4 operator +(scalar_t scalar, const Vector4 &vec) {
367 return Vector4(vec.x + scalar, vec.y + scalar, vec.z + scalar, vec.w + scalar);
370 inline Vector4 operator -(const Vector4 &vec, scalar_t scalar) {
371 return Vector4(vec.x - scalar, vec.y - scalar, vec.z - scalar, vec.w - scalar);
374 inline Vector4 operator -(scalar_t scalar, const Vector4 &vec) {
375 return Vector4(vec.x - scalar, vec.y - scalar, vec.z - scalar, vec.w - scalar);
378 inline Vector4 operator *(const Vector4 &vec, scalar_t scalar) {
379 return Vector4(vec.x * scalar, vec.y * scalar, vec.z * scalar, vec.w * scalar);
382 inline Vector4 operator *(scalar_t scalar, const Vector4 &vec) {
383 return Vector4(vec.x * scalar, vec.y * scalar, vec.z * scalar, vec.w * scalar);
386 inline Vector4 operator /(const Vector4 &vec, scalar_t scalar) {
387 return Vector4(vec.x / scalar, vec.y / scalar, vec.z / scalar, vec.w / scalar);
390 inline Vector4 operator /(scalar_t scalar, const Vector4 &vec) {
391 return Vector4(vec.x / scalar, vec.y / scalar, vec.z / scalar, vec.w / scalar);
394 inline void operator +=(Vector4 &vec, scalar_t scalar) {
401 inline void operator -=(Vector4 &vec, scalar_t scalar) {
408 inline void operator *=(Vector4 &vec, scalar_t scalar) {
415 inline void operator /=(Vector4 &vec, scalar_t scalar) {
422 inline scalar_t Vector4::length() const {
423 return sqrt(x*x + y*y + z*z + w*w);
425 inline scalar_t Vector4::length_sq() const {
426 return x*x + y*y + z*z + w*w;