rev |
line source |
nuclear@12
|
1 /*
|
nuclear@12
|
2 eqemu - electronic queue system emulator
|
nuclear@12
|
3 Copyright (C) 2014 John Tsiombikas <nuclear@member.fsf.org>,
|
nuclear@12
|
4 Eleni-Maria Stea <eleni@mutantstargoat.com>
|
nuclear@12
|
5
|
nuclear@12
|
6 This program is free software: you can redistribute it and/or modify
|
nuclear@12
|
7 it under the terms of the GNU General Public License as published by
|
nuclear@12
|
8 the Free Software Foundation, either version 3 of the License, or
|
nuclear@12
|
9 (at your option) any later version.
|
nuclear@12
|
10
|
nuclear@12
|
11 This program is distributed in the hope that it will be useful,
|
nuclear@12
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
nuclear@12
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
nuclear@12
|
14 GNU General Public License for more details.
|
nuclear@12
|
15
|
nuclear@12
|
16 You should have received a copy of the GNU General Public License
|
nuclear@12
|
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
|
nuclear@12
|
18 */
|
nuclear@3
|
19 #ifndef VMATH_H_
|
nuclear@3
|
20 #define VMATH_H_
|
nuclear@3
|
21
|
nuclear@4
|
22 #include <math.h>
|
nuclear@4
|
23
|
nuclear@3
|
24 class Vector2 {
|
nuclear@3
|
25 public:
|
nuclear@3
|
26 float x, y;
|
nuclear@3
|
27
|
nuclear@3
|
28 Vector2() : x(0), y(0) {}
|
nuclear@3
|
29 Vector2(float xa, float ya) : x(xa), y(ya) {}
|
nuclear@3
|
30
|
nuclear@3
|
31 float &operator [](int idx) { return (&x)[idx]; }
|
nuclear@3
|
32 const float &operator [](int idx) const { return (&x)[idx]; }
|
nuclear@3
|
33 };
|
nuclear@3
|
34
|
nuclear@3
|
35 class Vector3 {
|
nuclear@3
|
36 public:
|
nuclear@3
|
37 float x, y, z;
|
nuclear@3
|
38
|
nuclear@3
|
39 Vector3() : x(0), y(0), z(0) {}
|
nuclear@3
|
40 Vector3(float xa, float ya, float za) : x(xa), y(ya), z(za) {}
|
nuclear@3
|
41
|
nuclear@3
|
42 float &operator [](int idx) { return (&x)[idx]; }
|
nuclear@3
|
43 const float &operator [](int idx) const { return (&x)[idx]; }
|
nuclear@3
|
44 };
|
nuclear@3
|
45
|
nuclear@4
|
46 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
|
nuclear@4
|
47 {
|
nuclear@4
|
48 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
|
nuclear@4
|
49 }
|
nuclear@4
|
50
|
nuclear@4
|
51 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
|
nuclear@4
|
52 {
|
nuclear@4
|
53 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
|
nuclear@4
|
54 }
|
nuclear@4
|
55
|
nuclear@4
|
56 inline Vector3 operator *(const Vector3 &a, float s)
|
nuclear@4
|
57 {
|
nuclear@4
|
58 return Vector3(a.x * s, a.y * s, a.z * s);
|
nuclear@4
|
59 }
|
nuclear@4
|
60
|
nuclear@4
|
61 inline float dot(const Vector3 &a, const Vector3 &b)
|
nuclear@4
|
62 {
|
nuclear@4
|
63 return a.x * b.x + a.y * b.y + a.z * b.z;
|
nuclear@4
|
64 }
|
nuclear@4
|
65
|
nuclear@4
|
66 inline float length(const Vector3 &v)
|
nuclear@4
|
67 {
|
nuclear@4
|
68 return sqrt(dot(v, v));
|
nuclear@4
|
69 }
|
nuclear@4
|
70
|
nuclear@4
|
71 inline Vector3 normalize(const Vector3 &v)
|
nuclear@4
|
72 {
|
nuclear@4
|
73 float len = length(v);
|
nuclear@4
|
74 if(len == 0.0) {
|
nuclear@4
|
75 return v;
|
nuclear@4
|
76 }
|
nuclear@4
|
77 return Vector3(v.x / len, v.y / len, v.z / len);
|
nuclear@4
|
78 }
|
nuclear@4
|
79
|
nuclear@3
|
80 class Vector4 {
|
nuclear@3
|
81 public:
|
nuclear@3
|
82 float x, y, z, w;
|
nuclear@3
|
83
|
nuclear@3
|
84 Vector4() : x(0), y(0), z(0), w(0) {}
|
nuclear@3
|
85 Vector4(float xa, float ya, float za, float wa) : x(xa), y(ya), z(za), w(wa) {}
|
nuclear@3
|
86
|
nuclear@3
|
87 float &operator [](int idx) { return (&x)[idx]; }
|
nuclear@3
|
88 const float &operator [](int idx) const { return (&x)[idx]; }
|
nuclear@3
|
89 };
|
nuclear@3
|
90
|
nuclear@4
|
91 class Ray {
|
nuclear@4
|
92 public:
|
nuclear@4
|
93 Vector3 origin, dir;
|
nuclear@4
|
94
|
nuclear@4
|
95 Ray() : origin(0, 0, 0), dir(0, 0, 1) {}
|
nuclear@4
|
96 Ray(const Vector3 &o, const Vector3 &d) : origin(o), dir(d) {}
|
nuclear@4
|
97 };
|
nuclear@4
|
98
|
nuclear@3
|
99 #endif // VMATH_H_
|