rev |
line source |
nuclear@0
|
1 #ifndef GMATH_VEC_H_
|
nuclear@0
|
2 #define GMATH_VEC_H_
|
nuclear@0
|
3
|
nuclear@0
|
4 #include <math.h>
|
nuclear@0
|
5
|
nuclear@2
|
6 namespace gph {
|
nuclear@0
|
7
|
nuclear@3
|
8 class Vector4;
|
nuclear@3
|
9
|
nuclear@2
|
10 class Vector3 {
|
nuclear@0
|
11 public:
|
nuclear@0
|
12 float x, y, z;
|
nuclear@0
|
13
|
nuclear@2
|
14 Vector3() : x(0), y(0), z(0) {}
|
nuclear@2
|
15 Vector3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {}
|
nuclear@3
|
16 Vector3(const Vector4 &v);
|
nuclear@0
|
17
|
nuclear@3
|
18 inline void normalize()
|
nuclear@3
|
19 {
|
nuclear@3
|
20 float len = (float)sqrt(x * x + y * y + z * z);
|
nuclear@3
|
21 if(len != 0.0f) {
|
nuclear@3
|
22 x /= len;
|
nuclear@3
|
23 y /= len;
|
nuclear@3
|
24 z /= len;
|
nuclear@3
|
25 }
|
nuclear@3
|
26 }
|
nuclear@3
|
27
|
nuclear@3
|
28 inline float &operator[] (int idx)
|
nuclear@3
|
29 {
|
nuclear@3
|
30 return idx == 0 ? x : (idx == 1 ? y : z);
|
nuclear@3
|
31 }
|
nuclear@3
|
32
|
nuclear@3
|
33 inline const float &operator[] (int idx) const
|
nuclear@3
|
34 {
|
nuclear@3
|
35 return idx == 0 ? x : (idx == 1 ? y : z);
|
nuclear@3
|
36 }
|
nuclear@0
|
37 };
|
nuclear@0
|
38
|
nuclear@3
|
39
|
nuclear@3
|
40 class Vector4 {
|
nuclear@3
|
41 public:
|
nuclear@3
|
42 float x, y, z, w;
|
nuclear@3
|
43
|
nuclear@3
|
44 Vector4() : x(0), y(0), z(0), w(0) {}
|
nuclear@3
|
45 Vector4(float x_, float y_, float z_, float w_) : x(x_), y(y_), z(z_), w(w_) {}
|
nuclear@3
|
46 Vector4(const Vector3 &v);
|
nuclear@3
|
47
|
nuclear@3
|
48 inline void normalize()
|
nuclear@3
|
49 {
|
nuclear@3
|
50 float len = (float)sqrt(x * x + y * y + z * z + w * w);
|
nuclear@3
|
51 if(len != 0.0f) {
|
nuclear@3
|
52 x /= len;
|
nuclear@3
|
53 y /= len;
|
nuclear@3
|
54 z /= len;
|
nuclear@3
|
55 w /= len;
|
nuclear@3
|
56 }
|
nuclear@3
|
57 }
|
nuclear@3
|
58
|
nuclear@3
|
59 inline float &operator[] (int idx)
|
nuclear@3
|
60 {
|
nuclear@3
|
61 return idx == 0 ? x : (idx == 1 ? y : (idx == 2 ? z : w));
|
nuclear@3
|
62 }
|
nuclear@3
|
63
|
nuclear@3
|
64 inline const float &operator[] (int idx) const
|
nuclear@3
|
65 {
|
nuclear@3
|
66 return idx == 0 ? x : (idx == 1 ? y : (idx == 2 ? z : w));
|
nuclear@3
|
67 }
|
nuclear@3
|
68 };
|
nuclear@3
|
69
|
nuclear@3
|
70 // ---- Vector3 functions ----
|
nuclear@3
|
71
|
nuclear@2
|
72 inline Vector3 operator +(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
73 {
|
nuclear@2
|
74 return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
|
nuclear@0
|
75 }
|
nuclear@0
|
76
|
nuclear@2
|
77 inline Vector3 operator -(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
78 {
|
nuclear@2
|
79 return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
|
nuclear@0
|
80 }
|
nuclear@0
|
81
|
nuclear@2
|
82 inline Vector3 operator *(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
83 {
|
nuclear@2
|
84 return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
|
nuclear@0
|
85 }
|
nuclear@0
|
86
|
nuclear@2
|
87 inline Vector3 operator /(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
88 {
|
nuclear@2
|
89 return Vector3(a.x / b.x, a.y / b.y, a.z / b.z);
|
nuclear@0
|
90 }
|
nuclear@0
|
91
|
nuclear@2
|
92 inline Vector3 operator *(const Vector3 &v, float s)
|
nuclear@0
|
93 {
|
nuclear@2
|
94 return Vector3(v.x * s, v.y * s, v.z * s);
|
nuclear@0
|
95 }
|
nuclear@0
|
96
|
nuclear@2
|
97 inline Vector3 operator *(float s, const Vector3 &v)
|
nuclear@0
|
98 {
|
nuclear@2
|
99 return Vector3(s * v.x, s * v.y, s * v.z);
|
nuclear@0
|
100 }
|
nuclear@0
|
101
|
nuclear@2
|
102 inline Vector3 operator /(const Vector3 &v, float s)
|
nuclear@0
|
103 {
|
nuclear@2
|
104 return Vector3(v.x / s, v.y / s, v.z / s);
|
nuclear@0
|
105 }
|
nuclear@0
|
106
|
nuclear@2
|
107 inline Vector3 operator /(float s, const Vector3 &v)
|
nuclear@0
|
108 {
|
nuclear@2
|
109 return Vector3(s / v.x, s / v.y, s / v.z);
|
nuclear@0
|
110 }
|
nuclear@0
|
111
|
nuclear@2
|
112 inline Vector3 &operator +=(Vector3 &a, const Vector3 &b)
|
nuclear@0
|
113 {
|
nuclear@0
|
114 a.x += b.x;
|
nuclear@0
|
115 a.y += b.y;
|
nuclear@0
|
116 a.z += b.z;
|
nuclear@2
|
117 return a;
|
nuclear@0
|
118 }
|
nuclear@0
|
119
|
nuclear@2
|
120 inline Vector3 &operator -=(Vector3 &a, const Vector3 &b)
|
nuclear@0
|
121 {
|
nuclear@0
|
122 a.x -= b.x;
|
nuclear@0
|
123 a.y -= b.y;
|
nuclear@0
|
124 a.z -= b.z;
|
nuclear@2
|
125 return a;
|
nuclear@0
|
126 }
|
nuclear@0
|
127
|
nuclear@2
|
128 inline Vector3 &operator *=(Vector3 &a, const Vector3 &b)
|
nuclear@0
|
129 {
|
nuclear@0
|
130 a.x *= b.x;
|
nuclear@0
|
131 a.y *= b.y;
|
nuclear@0
|
132 a.z *= b.z;
|
nuclear@2
|
133 return a;
|
nuclear@0
|
134 }
|
nuclear@0
|
135
|
nuclear@2
|
136 inline Vector3 &operator /=(Vector3 &a, const Vector3 &b)
|
nuclear@0
|
137 {
|
nuclear@0
|
138 a.x /= b.x;
|
nuclear@0
|
139 a.y /= b.y;
|
nuclear@0
|
140 a.z /= b.z;
|
nuclear@2
|
141 return a;
|
nuclear@0
|
142 }
|
nuclear@0
|
143
|
nuclear@2
|
144 inline Vector3 &operator *=(Vector3 &v, float s)
|
nuclear@0
|
145 {
|
nuclear@0
|
146 v.x *= s;
|
nuclear@0
|
147 v.y *= s;
|
nuclear@0
|
148 v.z *= s;
|
nuclear@2
|
149 return v;
|
nuclear@0
|
150 }
|
nuclear@0
|
151
|
nuclear@2
|
152 inline Vector3 &operator /=(Vector3 &v, float s)
|
nuclear@0
|
153 {
|
nuclear@0
|
154 v.x /= s;
|
nuclear@0
|
155 v.y /= s;
|
nuclear@0
|
156 v.z /= s;
|
nuclear@2
|
157 return v;
|
nuclear@0
|
158 }
|
nuclear@0
|
159
|
nuclear@2
|
160 inline float dot(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
161 {
|
nuclear@0
|
162 return a.x * b.x + a.y * b.y + a.z * b.z;
|
nuclear@0
|
163 }
|
nuclear@0
|
164
|
nuclear@2
|
165 inline Vector3 cross(const Vector3 &a, const Vector3 &b)
|
nuclear@0
|
166 {
|
nuclear@3
|
167 return Vector3(a.y * b.z - a.z * b.y,
|
nuclear@3
|
168 a.z * b.x - a.x * b.z,
|
nuclear@3
|
169 a.x * b.y - a.y * b.x);
|
nuclear@0
|
170 }
|
nuclear@0
|
171
|
nuclear@2
|
172 inline float length(const Vector3 &v)
|
nuclear@0
|
173 {
|
nuclear@0
|
174 return (float)sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
nuclear@0
|
175 }
|
nuclear@0
|
176
|
nuclear@2
|
177 inline float length_sq(const Vector3 &v)
|
nuclear@0
|
178 {
|
nuclear@0
|
179 return v.x * v.x + v.y * v.y + v.z * v.z;
|
nuclear@0
|
180 }
|
nuclear@0
|
181
|
nuclear@2
|
182 inline Vector3 normalize(const Vector3 &v)
|
nuclear@0
|
183 {
|
nuclear@0
|
184 float len = length(v);
|
nuclear@0
|
185 if(len == 0.0f) {
|
nuclear@0
|
186 return v;
|
nuclear@0
|
187 }
|
nuclear@0
|
188
|
nuclear@2
|
189 return Vector3(v.x / len, v.y / len, v.z / len);
|
nuclear@0
|
190 }
|
nuclear@0
|
191
|
nuclear@0
|
192 }
|
nuclear@0
|
193
|
nuclear@0
|
194 #endif /* GMATH_VEC_H_ */
|