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