OLD | NEW |
| (Empty) |
1 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
2 | |
3 Redistribution and use in source and binary forms, with or without modification, | |
4 are permitted provided that the following conditions are met: | |
5 | |
6 * Redistributions of source code must retain the above copyright notice, this | |
7 list of conditions and the following disclaimer. | |
8 * Redistributions in binary form must reproduce the above copyright notice, | |
9 this list of conditions and the following disclaimer in the documentation | |
10 and/or other materials provided with the distribution. | |
11 | |
12 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
13 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
14 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
15 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
16 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
17 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
18 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
19 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
20 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
21 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
22 | |
23 /** | |
24 * @class 3 Dimensional Vector | |
25 * @name vec3 | |
26 */ | |
27 var vec3 = {}; | |
28 | |
29 /** | |
30 * Creates a new, empty vec3 | |
31 * | |
32 * @returns {vec3} a new 3D vector | |
33 */ | |
34 vec3.create = function() { | |
35 var out = new GLMAT_ARRAY_TYPE(3); | |
36 out[0] = 0; | |
37 out[1] = 0; | |
38 out[2] = 0; | |
39 return out; | |
40 }; | |
41 | |
42 /** | |
43 * Creates a new vec3 initialized with values from an existing vector | |
44 * | |
45 * @param {vec3} a vector to clone | |
46 * @returns {vec3} a new 3D vector | |
47 */ | |
48 vec3.clone = function(a) { | |
49 var out = new GLMAT_ARRAY_TYPE(3); | |
50 out[0] = a[0]; | |
51 out[1] = a[1]; | |
52 out[2] = a[2]; | |
53 return out; | |
54 }; | |
55 | |
56 /** | |
57 * Creates a new vec3 initialized with the given values | |
58 * | |
59 * @param {Number} x X component | |
60 * @param {Number} y Y component | |
61 * @param {Number} z Z component | |
62 * @returns {vec3} a new 3D vector | |
63 */ | |
64 vec3.fromValues = function(x, y, z) { | |
65 var out = new GLMAT_ARRAY_TYPE(3); | |
66 out[0] = x; | |
67 out[1] = y; | |
68 out[2] = z; | |
69 return out; | |
70 }; | |
71 | |
72 /** | |
73 * Copy the values from one vec3 to another | |
74 * | |
75 * @param {vec3} out the receiving vector | |
76 * @param {vec3} a the source vector | |
77 * @returns {vec3} out | |
78 */ | |
79 vec3.copy = function(out, a) { | |
80 out[0] = a[0]; | |
81 out[1] = a[1]; | |
82 out[2] = a[2]; | |
83 return out; | |
84 }; | |
85 | |
86 /** | |
87 * Set the components of a vec3 to the given values | |
88 * | |
89 * @param {vec3} out the receiving vector | |
90 * @param {Number} x X component | |
91 * @param {Number} y Y component | |
92 * @param {Number} z Z component | |
93 * @returns {vec3} out | |
94 */ | |
95 vec3.set = function(out, x, y, z) { | |
96 out[0] = x; | |
97 out[1] = y; | |
98 out[2] = z; | |
99 return out; | |
100 }; | |
101 | |
102 /** | |
103 * Adds two vec3's | |
104 * | |
105 * @param {vec3} out the receiving vector | |
106 * @param {vec3} a the first operand | |
107 * @param {vec3} b the second operand | |
108 * @returns {vec3} out | |
109 */ | |
110 vec3.add = function(out, a, b) { | |
111 out[0] = a[0] + b[0]; | |
112 out[1] = a[1] + b[1]; | |
113 out[2] = a[2] + b[2]; | |
114 return out; | |
115 }; | |
116 | |
117 /** | |
118 * Subtracts two vec3's | |
119 * | |
120 * @param {vec3} out the receiving vector | |
121 * @param {vec3} a the first operand | |
122 * @param {vec3} b the second operand | |
123 * @returns {vec3} out | |
124 */ | |
125 vec3.subtract = function(out, a, b) { | |
126 out[0] = a[0] - b[0]; | |
127 out[1] = a[1] - b[1]; | |
128 out[2] = a[2] - b[2]; | |
129 return out; | |
130 }; | |
131 | |
132 /** | |
133 * Alias for {@link vec3.subtract} | |
134 * @function | |
135 */ | |
136 vec3.sub = vec3.subtract; | |
137 | |
138 /** | |
139 * Multiplies two vec3's | |
140 * | |
141 * @param {vec3} out the receiving vector | |
142 * @param {vec3} a the first operand | |
143 * @param {vec3} b the second operand | |
144 * @returns {vec3} out | |
145 */ | |
146 vec3.multiply = function(out, a, b) { | |
147 out[0] = a[0] * b[0]; | |
148 out[1] = a[1] * b[1]; | |
149 out[2] = a[2] * b[2]; | |
150 return out; | |
151 }; | |
152 | |
153 /** | |
154 * Alias for {@link vec3.multiply} | |
155 * @function | |
156 */ | |
157 vec3.mul = vec3.multiply; | |
158 | |
159 /** | |
160 * Divides two vec3's | |
161 * | |
162 * @param {vec3} out the receiving vector | |
163 * @param {vec3} a the first operand | |
164 * @param {vec3} b the second operand | |
165 * @returns {vec3} out | |
166 */ | |
167 vec3.divide = function(out, a, b) { | |
168 out[0] = a[0] / b[0]; | |
169 out[1] = a[1] / b[1]; | |
170 out[2] = a[2] / b[2]; | |
171 return out; | |
172 }; | |
173 | |
174 /** | |
175 * Alias for {@link vec3.divide} | |
176 * @function | |
177 */ | |
178 vec3.div = vec3.divide; | |
179 | |
180 /** | |
181 * Returns the minimum of two vec3's | |
182 * | |
183 * @param {vec3} out the receiving vector | |
184 * @param {vec3} a the first operand | |
185 * @param {vec3} b the second operand | |
186 * @returns {vec3} out | |
187 */ | |
188 vec3.min = function(out, a, b) { | |
189 out[0] = Math.min(a[0], b[0]); | |
190 out[1] = Math.min(a[1], b[1]); | |
191 out[2] = Math.min(a[2], b[2]); | |
192 return out; | |
193 }; | |
194 | |
195 /** | |
196 * Returns the maximum of two vec3's | |
197 * | |
198 * @param {vec3} out the receiving vector | |
199 * @param {vec3} a the first operand | |
200 * @param {vec3} b the second operand | |
201 * @returns {vec3} out | |
202 */ | |
203 vec3.max = function(out, a, b) { | |
204 out[0] = Math.max(a[0], b[0]); | |
205 out[1] = Math.max(a[1], b[1]); | |
206 out[2] = Math.max(a[2], b[2]); | |
207 return out; | |
208 }; | |
209 | |
210 /** | |
211 * Scales a vec3 by a scalar number | |
212 * | |
213 * @param {vec3} out the receiving vector | |
214 * @param {vec3} a the vector to scale | |
215 * @param {Number} b amount to scale the vector by | |
216 * @returns {vec3} out | |
217 */ | |
218 vec3.scale = function(out, a, b) { | |
219 out[0] = a[0] * b; | |
220 out[1] = a[1] * b; | |
221 out[2] = a[2] * b; | |
222 return out; | |
223 }; | |
224 | |
225 /** | |
226 * Calculates the euclidian distance between two vec3's | |
227 * | |
228 * @param {vec3} a the first operand | |
229 * @param {vec3} b the second operand | |
230 * @returns {Number} distance between a and b | |
231 */ | |
232 vec3.distance = function(a, b) { | |
233 var x = b[0] - a[0], | |
234 y = b[1] - a[1], | |
235 z = b[2] - a[2]; | |
236 return Math.sqrt(x*x + y*y + z*z); | |
237 }; | |
238 | |
239 /** | |
240 * Alias for {@link vec3.distance} | |
241 * @function | |
242 */ | |
243 vec3.dist = vec3.distance; | |
244 | |
245 /** | |
246 * Calculates the squared euclidian distance between two vec3's | |
247 * | |
248 * @param {vec3} a the first operand | |
249 * @param {vec3} b the second operand | |
250 * @returns {Number} squared distance between a and b | |
251 */ | |
252 vec3.squaredDistance = function(a, b) { | |
253 var x = b[0] - a[0], | |
254 y = b[1] - a[1], | |
255 z = b[2] - a[2]; | |
256 return x*x + y*y + z*z; | |
257 }; | |
258 | |
259 /** | |
260 * Alias for {@link vec3.squaredDistance} | |
261 * @function | |
262 */ | |
263 vec3.sqrDist = vec3.squaredDistance; | |
264 | |
265 /** | |
266 * Calculates the length of a vec3 | |
267 * | |
268 * @param {vec3} a vector to calculate length of | |
269 * @returns {Number} length of a | |
270 */ | |
271 vec3.length = function (a) { | |
272 var x = a[0], | |
273 y = a[1], | |
274 z = a[2]; | |
275 return Math.sqrt(x*x + y*y + z*z); | |
276 }; | |
277 | |
278 /** | |
279 * Alias for {@link vec3.length} | |
280 * @function | |
281 */ | |
282 vec3.len = vec3.length; | |
283 | |
284 /** | |
285 * Calculates the squared length of a vec3 | |
286 * | |
287 * @param {vec3} a vector to calculate squared length of | |
288 * @returns {Number} squared length of a | |
289 */ | |
290 vec3.squaredLength = function (a) { | |
291 var x = a[0], | |
292 y = a[1], | |
293 z = a[2]; | |
294 return x*x + y*y + z*z; | |
295 }; | |
296 | |
297 /** | |
298 * Alias for {@link vec3.squaredLength} | |
299 * @function | |
300 */ | |
301 vec3.sqrLen = vec3.squaredLength; | |
302 | |
303 /** | |
304 * Negates the components of a vec3 | |
305 * | |
306 * @param {vec3} out the receiving vector | |
307 * @param {vec3} a vector to negate | |
308 * @returns {vec3} out | |
309 */ | |
310 vec3.negate = function(out, a) { | |
311 out[0] = -a[0]; | |
312 out[1] = -a[1]; | |
313 out[2] = -a[2]; | |
314 return out; | |
315 }; | |
316 | |
317 /** | |
318 * Normalize a vec3 | |
319 * | |
320 * @param {vec3} out the receiving vector | |
321 * @param {vec3} a vector to normalize | |
322 * @returns {vec3} out | |
323 */ | |
324 vec3.normalize = function(out, a) { | |
325 var x = a[0], | |
326 y = a[1], | |
327 z = a[2]; | |
328 var len = x*x + y*y + z*z; | |
329 if (len > 0) { | |
330 //TODO: evaluate use of glm_invsqrt here? | |
331 len = 1 / Math.sqrt(len); | |
332 out[0] = a[0] * len; | |
333 out[1] = a[1] * len; | |
334 out[2] = a[2] * len; | |
335 } | |
336 return out; | |
337 }; | |
338 | |
339 /** | |
340 * Calculates the dot product of two vec3's | |
341 * | |
342 * @param {vec3} a the first operand | |
343 * @param {vec3} b the second operand | |
344 * @returns {Number} dot product of a and b | |
345 */ | |
346 vec3.dot = function (a, b) { | |
347 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; | |
348 }; | |
349 | |
350 /** | |
351 * Computes the cross product of two vec3's | |
352 * | |
353 * @param {vec3} out the receiving vector | |
354 * @param {vec3} a the first operand | |
355 * @param {vec3} b the second operand | |
356 * @returns {vec3} out | |
357 */ | |
358 vec3.cross = function(out, a, b) { | |
359 var ax = a[0], ay = a[1], az = a[2], | |
360 bx = b[0], by = b[1], bz = b[2]; | |
361 | |
362 out[0] = ay * bz - az * by; | |
363 out[1] = az * bx - ax * bz; | |
364 out[2] = ax * by - ay * bx; | |
365 return out; | |
366 }; | |
367 | |
368 /** | |
369 * Performs a linear interpolation between two vec3's | |
370 * | |
371 * @param {vec3} out the receiving vector | |
372 * @param {vec3} a the first operand | |
373 * @param {vec3} b the second operand | |
374 * @param {Number} t interpolation amount between the two inputs | |
375 * @returns {vec3} out | |
376 */ | |
377 vec3.lerp = function (out, a, b, t) { | |
378 var ax = a[0], | |
379 ay = a[1], | |
380 az = a[2]; | |
381 out[0] = ax + t * (b[0] - ax); | |
382 out[1] = ay + t * (b[1] - ay); | |
383 out[2] = az + t * (b[2] - az); | |
384 return out; | |
385 }; | |
386 | |
387 /** | |
388 * Transforms the vec3 with a mat4. | |
389 * 4th vector component is implicitly '1' | |
390 * | |
391 * @param {vec3} out the receiving vector | |
392 * @param {vec3} a the vector to transform | |
393 * @param {mat4} m matrix to transform with | |
394 * @returns {vec3} out | |
395 */ | |
396 vec3.transformMat4 = function(out, a, m) { | |
397 var x = a[0], y = a[1], z = a[2]; | |
398 out[0] = m[0] * x + m[4] * y + m[8] * z + m[12]; | |
399 out[1] = m[1] * x + m[5] * y + m[9] * z + m[13]; | |
400 out[2] = m[2] * x + m[6] * y + m[10] * z + m[14]; | |
401 return out; | |
402 }; | |
403 | |
404 /** | |
405 * Transforms the vec3 with a quat | |
406 * | |
407 * @param {vec3} out the receiving vector | |
408 * @param {vec3} a the vector to transform | |
409 * @param {quat} q quaternion to transform with | |
410 * @returns {vec3} out | |
411 */ | |
412 vec3.transformQuat = function(out, a, q) { | |
413 var x = a[0], y = a[1], z = a[2], | |
414 qx = q[0], qy = q[1], qz = q[2], qw = q[3], | |
415 | |
416 // calculate quat * vec | |
417 ix = qw * x + qy * z - qz * y, | |
418 iy = qw * y + qz * x - qx * z, | |
419 iz = qw * z + qx * y - qy * x, | |
420 iw = -qx * x - qy * y - qz * z; | |
421 | |
422 // calculate result * inverse quat | |
423 out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; | |
424 out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; | |
425 out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; | |
426 return out; | |
427 }; | |
428 | |
429 /** | |
430 * Perform some operation over an array of vec3s. | |
431 * | |
432 * @param {Array} a the array of vectors to iterate over | |
433 * @param {Number} stride Number of elements between the start of each vec3. If
0 assumes tightly packed | |
434 * @param {Number} offset Number of elements to skip at the beginning of the arr
ay | |
435 * @param {Number} count Number of vec3s to iterate over. If 0 iterates over ent
ire array | |
436 * @param {Function} fn Function to call for each vector in the array | |
437 * @param {Object} [arg] additional argument to pass to fn | |
438 * @returns {Array} a | |
439 * @function | |
440 */ | |
441 vec3.forEach = (function() { | |
442 var vec = vec3.create(); | |
443 | |
444 return function(a, stride, offset, count, fn, arg) { | |
445 var i, l; | |
446 if(!stride) { | |
447 stride = 3; | |
448 } | |
449 | |
450 if(!offset) { | |
451 offset = 0; | |
452 } | |
453 | |
454 if(count) { | |
455 l = Math.min((count * stride) + offset, a.length); | |
456 } else { | |
457 l = a.length; | |
458 } | |
459 | |
460 for(i = offset; i < l; i += stride) { | |
461 vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; | |
462 fn(vec, vec, arg); | |
463 a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; | |
464 } | |
465 | |
466 return a; | |
467 }; | |
468 })(); | |
469 | |
470 /** | |
471 * Returns a string representation of a vector | |
472 * | |
473 * @param {vec3} vec vector to represent as a string | |
474 * @returns {String} string representation of the vector | |
475 */ | |
476 vec3.str = function (a) { | |
477 return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')'; | |
478 }; | |
479 | |
480 if(typeof(exports) !== 'undefined') { | |
481 exports.vec3 = vec3; | |
482 } | |
OLD | NEW |