OLD | NEW |
| (Empty) |
1 /** | |
2 * @fileoverview gl-matrix - High performance matrix and vector operations | |
3 * @author Brandon Jones | |
4 * @author Colin MacKenzie IV | |
5 * @version 2.1.0 | |
6 */ | |
7 | |
8 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
9 | |
10 Redistribution and use in source and binary forms, with or without modification, | |
11 are permitted provided that the following conditions are met: | |
12 | |
13 * Redistributions of source code must retain the above copyright notice, this | |
14 list of conditions and the following disclaimer. | |
15 * Redistributions in binary form must reproduce the above copyright notice, | |
16 this list of conditions and the following disclaimer in the documentation | |
17 and/or other materials provided with the distribution. | |
18 | |
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
22 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
23 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
24 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
25 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
26 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
28 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
29 | |
30 | |
31 (function() { | |
32 "use strict"; | |
33 | |
34 var shim = {}; | |
35 if (typeof(exports) === 'undefined') { | |
36 if(typeof define == 'function' && typeof define.amd == 'object' && define.am
d) { | |
37 shim.exports = {}; | |
38 define(function() { | |
39 return shim.exports; | |
40 }); | |
41 } else { | |
42 // gl-matrix lives in a browser, define its namespaces in global | |
43 shim.exports = window; | |
44 } | |
45 } | |
46 else { | |
47 // gl-matrix lives in commonjs, define its namespaces in exports | |
48 shim.exports = exports; | |
49 } | |
50 | |
51 (function(exports) { | |
52 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserve
d. | |
53 | |
54 Redistribution and use in source and binary forms, with or without modification, | |
55 are permitted provided that the following conditions are met: | |
56 | |
57 * Redistributions of source code must retain the above copyright notice, this | |
58 list of conditions and the following disclaimer. | |
59 * Redistributions in binary form must reproduce the above copyright notice, | |
60 this list of conditions and the following disclaimer in the documentation | |
61 and/or other materials provided with the distribution. | |
62 | |
63 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
64 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
65 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
66 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
67 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
68 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
69 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
70 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
71 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
72 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
73 | |
74 | |
75 if(!GLMAT_EPSILON) { | |
76 var GLMAT_EPSILON = 0.000001; | |
77 } | |
78 | |
79 if(!GLMAT_ARRAY_TYPE) { | |
80 var GLMAT_ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array
: Array; | |
81 } | |
82 | |
83 /** | |
84 * @class Common utilities | |
85 * @name glMatrix | |
86 */ | |
87 var glMatrix = {}; | |
88 | |
89 /** | |
90 * Sets the type of array used when creating new vectors and matricies | |
91 * | |
92 * @param {Type} type Array type, such as Float32Array or Array | |
93 */ | |
94 glMatrix.setMatrixArrayType = function(type) { | |
95 GLMAT_ARRAY_TYPE = type; | |
96 } | |
97 | |
98 if(typeof(exports) !== 'undefined') { | |
99 exports.glMatrix = glMatrix; | |
100 } | |
101 ; | |
102 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
103 | |
104 Redistribution and use in source and binary forms, with or without modification, | |
105 are permitted provided that the following conditions are met: | |
106 | |
107 * Redistributions of source code must retain the above copyright notice, this | |
108 list of conditions and the following disclaimer. | |
109 * Redistributions in binary form must reproduce the above copyright notice, | |
110 this list of conditions and the following disclaimer in the documentation | |
111 and/or other materials provided with the distribution. | |
112 | |
113 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
114 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
115 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
116 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
117 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
118 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
119 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
120 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
121 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
122 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
123 | |
124 /** | |
125 * @class 2 Dimensional Vector | |
126 * @name vec2 | |
127 */ | |
128 | |
129 var vec2 = {}; | |
130 | |
131 /** | |
132 * Creates a new, empty vec2 | |
133 * | |
134 * @returns {vec2} a new 2D vector | |
135 */ | |
136 vec2.create = function() { | |
137 var out = new GLMAT_ARRAY_TYPE(2); | |
138 out[0] = 0; | |
139 out[1] = 0; | |
140 return out; | |
141 }; | |
142 | |
143 /** | |
144 * Creates a new vec2 initialized with values from an existing vector | |
145 * | |
146 * @param {vec2} a vector to clone | |
147 * @returns {vec2} a new 2D vector | |
148 */ | |
149 vec2.clone = function(a) { | |
150 var out = new GLMAT_ARRAY_TYPE(2); | |
151 out[0] = a[0]; | |
152 out[1] = a[1]; | |
153 return out; | |
154 }; | |
155 | |
156 /** | |
157 * Creates a new vec2 initialized with the given values | |
158 * | |
159 * @param {Number} x X component | |
160 * @param {Number} y Y component | |
161 * @returns {vec2} a new 2D vector | |
162 */ | |
163 vec2.fromValues = function(x, y) { | |
164 var out = new GLMAT_ARRAY_TYPE(2); | |
165 out[0] = x; | |
166 out[1] = y; | |
167 return out; | |
168 }; | |
169 | |
170 /** | |
171 * Copy the values from one vec2 to another | |
172 * | |
173 * @param {vec2} out the receiving vector | |
174 * @param {vec2} a the source vector | |
175 * @returns {vec2} out | |
176 */ | |
177 vec2.copy = function(out, a) { | |
178 out[0] = a[0]; | |
179 out[1] = a[1]; | |
180 return out; | |
181 }; | |
182 | |
183 /** | |
184 * Set the components of a vec2 to the given values | |
185 * | |
186 * @param {vec2} out the receiving vector | |
187 * @param {Number} x X component | |
188 * @param {Number} y Y component | |
189 * @returns {vec2} out | |
190 */ | |
191 vec2.set = function(out, x, y) { | |
192 out[0] = x; | |
193 out[1] = y; | |
194 return out; | |
195 }; | |
196 | |
197 /** | |
198 * Adds two vec2's | |
199 * | |
200 * @param {vec2} out the receiving vector | |
201 * @param {vec2} a the first operand | |
202 * @param {vec2} b the second operand | |
203 * @returns {vec2} out | |
204 */ | |
205 vec2.add = function(out, a, b) { | |
206 out[0] = a[0] + b[0]; | |
207 out[1] = a[1] + b[1]; | |
208 return out; | |
209 }; | |
210 | |
211 /** | |
212 * Subtracts two vec2's | |
213 * | |
214 * @param {vec2} out the receiving vector | |
215 * @param {vec2} a the first operand | |
216 * @param {vec2} b the second operand | |
217 * @returns {vec2} out | |
218 */ | |
219 vec2.subtract = function(out, a, b) { | |
220 out[0] = a[0] - b[0]; | |
221 out[1] = a[1] - b[1]; | |
222 return out; | |
223 }; | |
224 | |
225 /** | |
226 * Alias for {@link vec2.subtract} | |
227 * @function | |
228 */ | |
229 vec2.sub = vec2.subtract; | |
230 | |
231 /** | |
232 * Multiplies two vec2's | |
233 * | |
234 * @param {vec2} out the receiving vector | |
235 * @param {vec2} a the first operand | |
236 * @param {vec2} b the second operand | |
237 * @returns {vec2} out | |
238 */ | |
239 vec2.multiply = function(out, a, b) { | |
240 out[0] = a[0] * b[0]; | |
241 out[1] = a[1] * b[1]; | |
242 return out; | |
243 }; | |
244 | |
245 /** | |
246 * Alias for {@link vec2.multiply} | |
247 * @function | |
248 */ | |
249 vec2.mul = vec2.multiply; | |
250 | |
251 /** | |
252 * Divides two vec2's | |
253 * | |
254 * @param {vec2} out the receiving vector | |
255 * @param {vec2} a the first operand | |
256 * @param {vec2} b the second operand | |
257 * @returns {vec2} out | |
258 */ | |
259 vec2.divide = function(out, a, b) { | |
260 out[0] = a[0] / b[0]; | |
261 out[1] = a[1] / b[1]; | |
262 return out; | |
263 }; | |
264 | |
265 /** | |
266 * Alias for {@link vec2.divide} | |
267 * @function | |
268 */ | |
269 vec2.div = vec2.divide; | |
270 | |
271 /** | |
272 * Returns the minimum of two vec2's | |
273 * | |
274 * @param {vec2} out the receiving vector | |
275 * @param {vec2} a the first operand | |
276 * @param {vec2} b the second operand | |
277 * @returns {vec2} out | |
278 */ | |
279 vec2.min = function(out, a, b) { | |
280 out[0] = Math.min(a[0], b[0]); | |
281 out[1] = Math.min(a[1], b[1]); | |
282 return out; | |
283 }; | |
284 | |
285 /** | |
286 * Returns the maximum of two vec2's | |
287 * | |
288 * @param {vec2} out the receiving vector | |
289 * @param {vec2} a the first operand | |
290 * @param {vec2} b the second operand | |
291 * @returns {vec2} out | |
292 */ | |
293 vec2.max = function(out, a, b) { | |
294 out[0] = Math.max(a[0], b[0]); | |
295 out[1] = Math.max(a[1], b[1]); | |
296 return out; | |
297 }; | |
298 | |
299 /** | |
300 * Scales a vec2 by a scalar number | |
301 * | |
302 * @param {vec2} out the receiving vector | |
303 * @param {vec2} a the vector to scale | |
304 * @param {Number} b amount to scale the vector by | |
305 * @returns {vec2} out | |
306 */ | |
307 vec2.scale = function(out, a, b) { | |
308 out[0] = a[0] * b; | |
309 out[1] = a[1] * b; | |
310 return out; | |
311 }; | |
312 | |
313 /** | |
314 * Calculates the euclidian distance between two vec2's | |
315 * | |
316 * @param {vec2} a the first operand | |
317 * @param {vec2} b the second operand | |
318 * @returns {Number} distance between a and b | |
319 */ | |
320 vec2.distance = function(a, b) { | |
321 var x = b[0] - a[0], | |
322 y = b[1] - a[1]; | |
323 return Math.sqrt(x*x + y*y); | |
324 }; | |
325 | |
326 /** | |
327 * Alias for {@link vec2.distance} | |
328 * @function | |
329 */ | |
330 vec2.dist = vec2.distance; | |
331 | |
332 /** | |
333 * Calculates the squared euclidian distance between two vec2's | |
334 * | |
335 * @param {vec2} a the first operand | |
336 * @param {vec2} b the second operand | |
337 * @returns {Number} squared distance between a and b | |
338 */ | |
339 vec2.squaredDistance = function(a, b) { | |
340 var x = b[0] - a[0], | |
341 y = b[1] - a[1]; | |
342 return x*x + y*y; | |
343 }; | |
344 | |
345 /** | |
346 * Alias for {@link vec2.squaredDistance} | |
347 * @function | |
348 */ | |
349 vec2.sqrDist = vec2.squaredDistance; | |
350 | |
351 /** | |
352 * Calculates the length of a vec2 | |
353 * | |
354 * @param {vec2} a vector to calculate length of | |
355 * @returns {Number} length of a | |
356 */ | |
357 vec2.length = function (a) { | |
358 var x = a[0], | |
359 y = a[1]; | |
360 return Math.sqrt(x*x + y*y); | |
361 }; | |
362 | |
363 /** | |
364 * Alias for {@link vec2.length} | |
365 * @function | |
366 */ | |
367 vec2.len = vec2.length; | |
368 | |
369 /** | |
370 * Calculates the squared length of a vec2 | |
371 * | |
372 * @param {vec2} a vector to calculate squared length of | |
373 * @returns {Number} squared length of a | |
374 */ | |
375 vec2.squaredLength = function (a) { | |
376 var x = a[0], | |
377 y = a[1]; | |
378 return x*x + y*y; | |
379 }; | |
380 | |
381 /** | |
382 * Alias for {@link vec2.squaredLength} | |
383 * @function | |
384 */ | |
385 vec2.sqrLen = vec2.squaredLength; | |
386 | |
387 /** | |
388 * Negates the components of a vec2 | |
389 * | |
390 * @param {vec2} out the receiving vector | |
391 * @param {vec2} a vector to negate | |
392 * @returns {vec2} out | |
393 */ | |
394 vec2.negate = function(out, a) { | |
395 out[0] = -a[0]; | |
396 out[1] = -a[1]; | |
397 return out; | |
398 }; | |
399 | |
400 /** | |
401 * Normalize a vec2 | |
402 * | |
403 * @param {vec2} out the receiving vector | |
404 * @param {vec2} a vector to normalize | |
405 * @returns {vec2} out | |
406 */ | |
407 vec2.normalize = function(out, a) { | |
408 var x = a[0], | |
409 y = a[1]; | |
410 var len = x*x + y*y; | |
411 if (len > 0) { | |
412 //TODO: evaluate use of glm_invsqrt here? | |
413 len = 1 / Math.sqrt(len); | |
414 out[0] = a[0] * len; | |
415 out[1] = a[1] * len; | |
416 } | |
417 return out; | |
418 }; | |
419 | |
420 /** | |
421 * Calculates the dot product of two vec2's | |
422 * | |
423 * @param {vec2} a the first operand | |
424 * @param {vec2} b the second operand | |
425 * @returns {Number} dot product of a and b | |
426 */ | |
427 vec2.dot = function (a, b) { | |
428 return a[0] * b[0] + a[1] * b[1]; | |
429 }; | |
430 | |
431 /** | |
432 * Computes the cross product of two vec2's | |
433 * Note that the cross product must by definition produce a 3D vector | |
434 * | |
435 * @param {vec3} out the receiving vector | |
436 * @param {vec2} a the first operand | |
437 * @param {vec2} b the second operand | |
438 * @returns {vec3} out | |
439 */ | |
440 vec2.cross = function(out, a, b) { | |
441 var z = a[0] * b[1] - a[1] * b[0]; | |
442 out[0] = out[1] = 0; | |
443 out[2] = z; | |
444 return out; | |
445 }; | |
446 | |
447 /** | |
448 * Performs a linear interpolation between two vec2's | |
449 * | |
450 * @param {vec2} out the receiving vector | |
451 * @param {vec2} a the first operand | |
452 * @param {vec2} b the second operand | |
453 * @param {Number} t interpolation amount between the two inputs | |
454 * @returns {vec2} out | |
455 */ | |
456 vec2.lerp = function (out, a, b, t) { | |
457 var ax = a[0], | |
458 ay = a[1]; | |
459 out[0] = ax + t * (b[0] - ax); | |
460 out[1] = ay + t * (b[1] - ay); | |
461 return out; | |
462 }; | |
463 | |
464 /** | |
465 * Transforms the vec2 with a mat2 | |
466 * | |
467 * @param {vec2} out the receiving vector | |
468 * @param {vec2} a the vector to transform | |
469 * @param {mat2} m matrix to transform with | |
470 * @returns {vec2} out | |
471 */ | |
472 vec2.transformMat2 = function(out, a, m) { | |
473 var x = a[0], | |
474 y = a[1]; | |
475 out[0] = m[0] * x + m[2] * y; | |
476 out[1] = m[1] * x + m[3] * y; | |
477 return out; | |
478 }; | |
479 | |
480 /** | |
481 * Transforms the vec2 with a mat2d | |
482 * | |
483 * @param {vec2} out the receiving vector | |
484 * @param {vec2} a the vector to transform | |
485 * @param {mat2d} m matrix to transform with | |
486 * @returns {vec2} out | |
487 */ | |
488 vec2.transformMat2d = function(out, a, m) { | |
489 var x = a[0], | |
490 y = a[1]; | |
491 out[0] = m[0] * x + m[2] * y + m[4]; | |
492 out[1] = m[1] * x + m[3] * y + m[5]; | |
493 return out; | |
494 }; | |
495 | |
496 /** | |
497 * Transforms the vec2 with a mat3 | |
498 * 3rd vector component is implicitly '1' | |
499 * | |
500 * @param {vec2} out the receiving vector | |
501 * @param {vec2} a the vector to transform | |
502 * @param {mat3} m matrix to transform with | |
503 * @returns {vec2} out | |
504 */ | |
505 vec2.transformMat3 = function(out, a, m) { | |
506 var x = a[0], | |
507 y = a[1]; | |
508 out[0] = m[0] * x + m[3] * y + m[6]; | |
509 out[1] = m[1] * x + m[4] * y + m[7]; | |
510 return out; | |
511 }; | |
512 | |
513 /** | |
514 * Transforms the vec2 with a mat4 | |
515 * 3rd vector component is implicitly '0' | |
516 * 4th vector component is implicitly '1' | |
517 * | |
518 * @param {vec2} out the receiving vector | |
519 * @param {vec2} a the vector to transform | |
520 * @param {mat4} m matrix to transform with | |
521 * @returns {vec2} out | |
522 */ | |
523 vec2.transformMat4 = function(out, a, m) { | |
524 var x = a[0], | |
525 y = a[1]; | |
526 out[0] = m[0] * x + m[4] * y + m[12]; | |
527 out[1] = m[1] * x + m[5] * y + m[13]; | |
528 return out; | |
529 }; | |
530 | |
531 /** | |
532 * Perform some operation over an array of vec2s. | |
533 * | |
534 * @param {Array} a the array of vectors to iterate over | |
535 * @param {Number} stride Number of elements between the start of each vec2. If
0 assumes tightly packed | |
536 * @param {Number} offset Number of elements to skip at the beginning of the arr
ay | |
537 * @param {Number} count Number of vec2s to iterate over. If 0 iterates over ent
ire array | |
538 * @param {Function} fn Function to call for each vector in the array | |
539 * @param {Object} [arg] additional argument to pass to fn | |
540 * @returns {Array} a | |
541 * @function | |
542 */ | |
543 vec2.forEach = (function() { | |
544 var vec = vec2.create(); | |
545 | |
546 return function(a, stride, offset, count, fn, arg) { | |
547 var i, l; | |
548 if(!stride) { | |
549 stride = 2; | |
550 } | |
551 | |
552 if(!offset) { | |
553 offset = 0; | |
554 } | |
555 | |
556 if(count) { | |
557 l = Math.min((count * stride) + offset, a.length); | |
558 } else { | |
559 l = a.length; | |
560 } | |
561 | |
562 for(i = offset; i < l; i += stride) { | |
563 vec[0] = a[i]; vec[1] = a[i+1]; | |
564 fn(vec, vec, arg); | |
565 a[i] = vec[0]; a[i+1] = vec[1]; | |
566 } | |
567 | |
568 return a; | |
569 }; | |
570 })(); | |
571 | |
572 /** | |
573 * Returns a string representation of a vector | |
574 * | |
575 * @param {vec2} vec vector to represent as a string | |
576 * @returns {String} string representation of the vector | |
577 */ | |
578 vec2.str = function (a) { | |
579 return 'vec2(' + a[0] + ', ' + a[1] + ')'; | |
580 }; | |
581 | |
582 if(typeof(exports) !== 'undefined') { | |
583 exports.vec2 = vec2; | |
584 } | |
585 ; | |
586 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
587 | |
588 Redistribution and use in source and binary forms, with or without modification, | |
589 are permitted provided that the following conditions are met: | |
590 | |
591 * Redistributions of source code must retain the above copyright notice, this | |
592 list of conditions and the following disclaimer. | |
593 * Redistributions in binary form must reproduce the above copyright notice, | |
594 this list of conditions and the following disclaimer in the documentation | |
595 and/or other materials provided with the distribution. | |
596 | |
597 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
598 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
599 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
600 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
601 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
602 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
603 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
604 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
605 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
606 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
607 | |
608 /** | |
609 * @class 3 Dimensional Vector | |
610 * @name vec3 | |
611 */ | |
612 | |
613 var vec3 = {}; | |
614 | |
615 /** | |
616 * Creates a new, empty vec3 | |
617 * | |
618 * @returns {vec3} a new 3D vector | |
619 */ | |
620 vec3.create = function() { | |
621 var out = new GLMAT_ARRAY_TYPE(3); | |
622 out[0] = 0; | |
623 out[1] = 0; | |
624 out[2] = 0; | |
625 return out; | |
626 }; | |
627 | |
628 /** | |
629 * Creates a new vec3 initialized with values from an existing vector | |
630 * | |
631 * @param {vec3} a vector to clone | |
632 * @returns {vec3} a new 3D vector | |
633 */ | |
634 vec3.clone = function(a) { | |
635 var out = new GLMAT_ARRAY_TYPE(3); | |
636 out[0] = a[0]; | |
637 out[1] = a[1]; | |
638 out[2] = a[2]; | |
639 return out; | |
640 }; | |
641 | |
642 /** | |
643 * Creates a new vec3 initialized with the given values | |
644 * | |
645 * @param {Number} x X component | |
646 * @param {Number} y Y component | |
647 * @param {Number} z Z component | |
648 * @returns {vec3} a new 3D vector | |
649 */ | |
650 vec3.fromValues = function(x, y, z) { | |
651 var out = new GLMAT_ARRAY_TYPE(3); | |
652 out[0] = x; | |
653 out[1] = y; | |
654 out[2] = z; | |
655 return out; | |
656 }; | |
657 | |
658 /** | |
659 * Copy the values from one vec3 to another | |
660 * | |
661 * @param {vec3} out the receiving vector | |
662 * @param {vec3} a the source vector | |
663 * @returns {vec3} out | |
664 */ | |
665 vec3.copy = function(out, a) { | |
666 out[0] = a[0]; | |
667 out[1] = a[1]; | |
668 out[2] = a[2]; | |
669 return out; | |
670 }; | |
671 | |
672 /** | |
673 * Set the components of a vec3 to the given values | |
674 * | |
675 * @param {vec3} out the receiving vector | |
676 * @param {Number} x X component | |
677 * @param {Number} y Y component | |
678 * @param {Number} z Z component | |
679 * @returns {vec3} out | |
680 */ | |
681 vec3.set = function(out, x, y, z) { | |
682 out[0] = x; | |
683 out[1] = y; | |
684 out[2] = z; | |
685 return out; | |
686 }; | |
687 | |
688 /** | |
689 * Adds two vec3's | |
690 * | |
691 * @param {vec3} out the receiving vector | |
692 * @param {vec3} a the first operand | |
693 * @param {vec3} b the second operand | |
694 * @returns {vec3} out | |
695 */ | |
696 vec3.add = function(out, a, b) { | |
697 out[0] = a[0] + b[0]; | |
698 out[1] = a[1] + b[1]; | |
699 out[2] = a[2] + b[2]; | |
700 return out; | |
701 }; | |
702 | |
703 /** | |
704 * Subtracts two vec3's | |
705 * | |
706 * @param {vec3} out the receiving vector | |
707 * @param {vec3} a the first operand | |
708 * @param {vec3} b the second operand | |
709 * @returns {vec3} out | |
710 */ | |
711 vec3.subtract = function(out, a, b) { | |
712 out[0] = a[0] - b[0]; | |
713 out[1] = a[1] - b[1]; | |
714 out[2] = a[2] - b[2]; | |
715 return out; | |
716 }; | |
717 | |
718 /** | |
719 * Alias for {@link vec3.subtract} | |
720 * @function | |
721 */ | |
722 vec3.sub = vec3.subtract; | |
723 | |
724 /** | |
725 * Multiplies two vec3's | |
726 * | |
727 * @param {vec3} out the receiving vector | |
728 * @param {vec3} a the first operand | |
729 * @param {vec3} b the second operand | |
730 * @returns {vec3} out | |
731 */ | |
732 vec3.multiply = function(out, a, b) { | |
733 out[0] = a[0] * b[0]; | |
734 out[1] = a[1] * b[1]; | |
735 out[2] = a[2] * b[2]; | |
736 return out; | |
737 }; | |
738 | |
739 /** | |
740 * Alias for {@link vec3.multiply} | |
741 * @function | |
742 */ | |
743 vec3.mul = vec3.multiply; | |
744 | |
745 /** | |
746 * Divides two vec3's | |
747 * | |
748 * @param {vec3} out the receiving vector | |
749 * @param {vec3} a the first operand | |
750 * @param {vec3} b the second operand | |
751 * @returns {vec3} out | |
752 */ | |
753 vec3.divide = function(out, a, b) { | |
754 out[0] = a[0] / b[0]; | |
755 out[1] = a[1] / b[1]; | |
756 out[2] = a[2] / b[2]; | |
757 return out; | |
758 }; | |
759 | |
760 /** | |
761 * Alias for {@link vec3.divide} | |
762 * @function | |
763 */ | |
764 vec3.div = vec3.divide; | |
765 | |
766 /** | |
767 * Returns the minimum of two vec3's | |
768 * | |
769 * @param {vec3} out the receiving vector | |
770 * @param {vec3} a the first operand | |
771 * @param {vec3} b the second operand | |
772 * @returns {vec3} out | |
773 */ | |
774 vec3.min = function(out, a, b) { | |
775 out[0] = Math.min(a[0], b[0]); | |
776 out[1] = Math.min(a[1], b[1]); | |
777 out[2] = Math.min(a[2], b[2]); | |
778 return out; | |
779 }; | |
780 | |
781 /** | |
782 * Returns the maximum of two vec3's | |
783 * | |
784 * @param {vec3} out the receiving vector | |
785 * @param {vec3} a the first operand | |
786 * @param {vec3} b the second operand | |
787 * @returns {vec3} out | |
788 */ | |
789 vec3.max = function(out, a, b) { | |
790 out[0] = Math.max(a[0], b[0]); | |
791 out[1] = Math.max(a[1], b[1]); | |
792 out[2] = Math.max(a[2], b[2]); | |
793 return out; | |
794 }; | |
795 | |
796 /** | |
797 * Scales a vec3 by a scalar number | |
798 * | |
799 * @param {vec3} out the receiving vector | |
800 * @param {vec3} a the vector to scale | |
801 * @param {Number} b amount to scale the vector by | |
802 * @returns {vec3} out | |
803 */ | |
804 vec3.scale = function(out, a, b) { | |
805 out[0] = a[0] * b; | |
806 out[1] = a[1] * b; | |
807 out[2] = a[2] * b; | |
808 return out; | |
809 }; | |
810 | |
811 /** | |
812 * Calculates the euclidian distance between two vec3's | |
813 * | |
814 * @param {vec3} a the first operand | |
815 * @param {vec3} b the second operand | |
816 * @returns {Number} distance between a and b | |
817 */ | |
818 vec3.distance = function(a, b) { | |
819 var x = b[0] - a[0], | |
820 y = b[1] - a[1], | |
821 z = b[2] - a[2]; | |
822 return Math.sqrt(x*x + y*y + z*z); | |
823 }; | |
824 | |
825 /** | |
826 * Alias for {@link vec3.distance} | |
827 * @function | |
828 */ | |
829 vec3.dist = vec3.distance; | |
830 | |
831 /** | |
832 * Calculates the squared euclidian distance between two vec3's | |
833 * | |
834 * @param {vec3} a the first operand | |
835 * @param {vec3} b the second operand | |
836 * @returns {Number} squared distance between a and b | |
837 */ | |
838 vec3.squaredDistance = function(a, b) { | |
839 var x = b[0] - a[0], | |
840 y = b[1] - a[1], | |
841 z = b[2] - a[2]; | |
842 return x*x + y*y + z*z; | |
843 }; | |
844 | |
845 /** | |
846 * Alias for {@link vec3.squaredDistance} | |
847 * @function | |
848 */ | |
849 vec3.sqrDist = vec3.squaredDistance; | |
850 | |
851 /** | |
852 * Calculates the length of a vec3 | |
853 * | |
854 * @param {vec3} a vector to calculate length of | |
855 * @returns {Number} length of a | |
856 */ | |
857 vec3.length = function (a) { | |
858 var x = a[0], | |
859 y = a[1], | |
860 z = a[2]; | |
861 return Math.sqrt(x*x + y*y + z*z); | |
862 }; | |
863 | |
864 /** | |
865 * Alias for {@link vec3.length} | |
866 * @function | |
867 */ | |
868 vec3.len = vec3.length; | |
869 | |
870 /** | |
871 * Calculates the squared length of a vec3 | |
872 * | |
873 * @param {vec3} a vector to calculate squared length of | |
874 * @returns {Number} squared length of a | |
875 */ | |
876 vec3.squaredLength = function (a) { | |
877 var x = a[0], | |
878 y = a[1], | |
879 z = a[2]; | |
880 return x*x + y*y + z*z; | |
881 }; | |
882 | |
883 /** | |
884 * Alias for {@link vec3.squaredLength} | |
885 * @function | |
886 */ | |
887 vec3.sqrLen = vec3.squaredLength; | |
888 | |
889 /** | |
890 * Negates the components of a vec3 | |
891 * | |
892 * @param {vec3} out the receiving vector | |
893 * @param {vec3} a vector to negate | |
894 * @returns {vec3} out | |
895 */ | |
896 vec3.negate = function(out, a) { | |
897 out[0] = -a[0]; | |
898 out[1] = -a[1]; | |
899 out[2] = -a[2]; | |
900 return out; | |
901 }; | |
902 | |
903 /** | |
904 * Normalize a vec3 | |
905 * | |
906 * @param {vec3} out the receiving vector | |
907 * @param {vec3} a vector to normalize | |
908 * @returns {vec3} out | |
909 */ | |
910 vec3.normalize = function(out, a) { | |
911 var x = a[0], | |
912 y = a[1], | |
913 z = a[2]; | |
914 var len = x*x + y*y + z*z; | |
915 if (len > 0) { | |
916 //TODO: evaluate use of glm_invsqrt here? | |
917 len = 1 / Math.sqrt(len); | |
918 out[0] = a[0] * len; | |
919 out[1] = a[1] * len; | |
920 out[2] = a[2] * len; | |
921 } | |
922 return out; | |
923 }; | |
924 | |
925 /** | |
926 * Calculates the dot product of two vec3's | |
927 * | |
928 * @param {vec3} a the first operand | |
929 * @param {vec3} b the second operand | |
930 * @returns {Number} dot product of a and b | |
931 */ | |
932 vec3.dot = function (a, b) { | |
933 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; | |
934 }; | |
935 | |
936 /** | |
937 * Computes the cross product of two vec3's | |
938 * | |
939 * @param {vec3} out the receiving vector | |
940 * @param {vec3} a the first operand | |
941 * @param {vec3} b the second operand | |
942 * @returns {vec3} out | |
943 */ | |
944 vec3.cross = function(out, a, b) { | |
945 var ax = a[0], ay = a[1], az = a[2], | |
946 bx = b[0], by = b[1], bz = b[2]; | |
947 | |
948 out[0] = ay * bz - az * by; | |
949 out[1] = az * bx - ax * bz; | |
950 out[2] = ax * by - ay * bx; | |
951 return out; | |
952 }; | |
953 | |
954 /** | |
955 * Performs a linear interpolation between two vec3's | |
956 * | |
957 * @param {vec3} out the receiving vector | |
958 * @param {vec3} a the first operand | |
959 * @param {vec3} b the second operand | |
960 * @param {Number} t interpolation amount between the two inputs | |
961 * @returns {vec3} out | |
962 */ | |
963 vec3.lerp = function (out, a, b, t) { | |
964 var ax = a[0], | |
965 ay = a[1], | |
966 az = a[2]; | |
967 out[0] = ax + t * (b[0] - ax); | |
968 out[1] = ay + t * (b[1] - ay); | |
969 out[2] = az + t * (b[2] - az); | |
970 return out; | |
971 }; | |
972 | |
973 /** | |
974 * Transforms the vec3 with a mat4. | |
975 * 4th vector component is implicitly '1' | |
976 * | |
977 * @param {vec3} out the receiving vector | |
978 * @param {vec3} a the vector to transform | |
979 * @param {mat4} m matrix to transform with | |
980 * @returns {vec3} out | |
981 */ | |
982 vec3.transformMat4 = function(out, a, m) { | |
983 var x = a[0], y = a[1], z = a[2]; | |
984 out[0] = m[0] * x + m[4] * y + m[8] * z + m[12]; | |
985 out[1] = m[1] * x + m[5] * y + m[9] * z + m[13]; | |
986 out[2] = m[2] * x + m[6] * y + m[10] * z + m[14]; | |
987 return out; | |
988 }; | |
989 | |
990 /** | |
991 * Transforms the vec3 with a quat | |
992 * | |
993 * @param {vec3} out the receiving vector | |
994 * @param {vec3} a the vector to transform | |
995 * @param {quat} q quaternion to transform with | |
996 * @returns {vec3} out | |
997 */ | |
998 vec3.transformQuat = function(out, a, q) { | |
999 var x = a[0], y = a[1], z = a[2], | |
1000 qx = q[0], qy = q[1], qz = q[2], qw = q[3], | |
1001 | |
1002 // calculate quat * vec | |
1003 ix = qw * x + qy * z - qz * y, | |
1004 iy = qw * y + qz * x - qx * z, | |
1005 iz = qw * z + qx * y - qy * x, | |
1006 iw = -qx * x - qy * y - qz * z; | |
1007 | |
1008 // calculate result * inverse quat | |
1009 out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; | |
1010 out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; | |
1011 out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; | |
1012 return out; | |
1013 }; | |
1014 | |
1015 /** | |
1016 * Perform some operation over an array of vec3s. | |
1017 * | |
1018 * @param {Array} a the array of vectors to iterate over | |
1019 * @param {Number} stride Number of elements between the start of each vec3. If
0 assumes tightly packed | |
1020 * @param {Number} offset Number of elements to skip at the beginning of the arr
ay | |
1021 * @param {Number} count Number of vec3s to iterate over. If 0 iterates over ent
ire array | |
1022 * @param {Function} fn Function to call for each vector in the array | |
1023 * @param {Object} [arg] additional argument to pass to fn | |
1024 * @returns {Array} a | |
1025 * @function | |
1026 */ | |
1027 vec3.forEach = (function() { | |
1028 var vec = vec3.create(); | |
1029 | |
1030 return function(a, stride, offset, count, fn, arg) { | |
1031 var i, l; | |
1032 if(!stride) { | |
1033 stride = 3; | |
1034 } | |
1035 | |
1036 if(!offset) { | |
1037 offset = 0; | |
1038 } | |
1039 | |
1040 if(count) { | |
1041 l = Math.min((count * stride) + offset, a.length); | |
1042 } else { | |
1043 l = a.length; | |
1044 } | |
1045 | |
1046 for(i = offset; i < l; i += stride) { | |
1047 vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; | |
1048 fn(vec, vec, arg); | |
1049 a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; | |
1050 } | |
1051 | |
1052 return a; | |
1053 }; | |
1054 })(); | |
1055 | |
1056 /** | |
1057 * Returns a string representation of a vector | |
1058 * | |
1059 * @param {vec3} vec vector to represent as a string | |
1060 * @returns {String} string representation of the vector | |
1061 */ | |
1062 vec3.str = function (a) { | |
1063 return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')'; | |
1064 }; | |
1065 | |
1066 if(typeof(exports) !== 'undefined') { | |
1067 exports.vec3 = vec3; | |
1068 } | |
1069 ; | |
1070 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
1071 | |
1072 Redistribution and use in source and binary forms, with or without modification, | |
1073 are permitted provided that the following conditions are met: | |
1074 | |
1075 * Redistributions of source code must retain the above copyright notice, this | |
1076 list of conditions and the following disclaimer. | |
1077 * Redistributions in binary form must reproduce the above copyright notice, | |
1078 this list of conditions and the following disclaimer in the documentation | |
1079 and/or other materials provided with the distribution. | |
1080 | |
1081 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
1082 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
1083 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
1084 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
1085 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
1086 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
1087 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
1088 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
1089 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
1090 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
1091 | |
1092 /** | |
1093 * @class 4 Dimensional Vector | |
1094 * @name vec4 | |
1095 */ | |
1096 | |
1097 var vec4 = {}; | |
1098 | |
1099 /** | |
1100 * Creates a new, empty vec4 | |
1101 * | |
1102 * @returns {vec4} a new 4D vector | |
1103 */ | |
1104 vec4.create = function() { | |
1105 var out = new GLMAT_ARRAY_TYPE(4); | |
1106 out[0] = 0; | |
1107 out[1] = 0; | |
1108 out[2] = 0; | |
1109 out[3] = 0; | |
1110 return out; | |
1111 }; | |
1112 | |
1113 /** | |
1114 * Creates a new vec4 initialized with values from an existing vector | |
1115 * | |
1116 * @param {vec4} a vector to clone | |
1117 * @returns {vec4} a new 4D vector | |
1118 */ | |
1119 vec4.clone = function(a) { | |
1120 var out = new GLMAT_ARRAY_TYPE(4); | |
1121 out[0] = a[0]; | |
1122 out[1] = a[1]; | |
1123 out[2] = a[2]; | |
1124 out[3] = a[3]; | |
1125 return out; | |
1126 }; | |
1127 | |
1128 /** | |
1129 * Creates a new vec4 initialized with the given values | |
1130 * | |
1131 * @param {Number} x X component | |
1132 * @param {Number} y Y component | |
1133 * @param {Number} z Z component | |
1134 * @param {Number} w W component | |
1135 * @returns {vec4} a new 4D vector | |
1136 */ | |
1137 vec4.fromValues = function(x, y, z, w) { | |
1138 var out = new GLMAT_ARRAY_TYPE(4); | |
1139 out[0] = x; | |
1140 out[1] = y; | |
1141 out[2] = z; | |
1142 out[3] = w; | |
1143 return out; | |
1144 }; | |
1145 | |
1146 /** | |
1147 * Copy the values from one vec4 to another | |
1148 * | |
1149 * @param {vec4} out the receiving vector | |
1150 * @param {vec4} a the source vector | |
1151 * @returns {vec4} out | |
1152 */ | |
1153 vec4.copy = function(out, a) { | |
1154 out[0] = a[0]; | |
1155 out[1] = a[1]; | |
1156 out[2] = a[2]; | |
1157 out[3] = a[3]; | |
1158 return out; | |
1159 }; | |
1160 | |
1161 /** | |
1162 * Set the components of a vec4 to the given values | |
1163 * | |
1164 * @param {vec4} out the receiving vector | |
1165 * @param {Number} x X component | |
1166 * @param {Number} y Y component | |
1167 * @param {Number} z Z component | |
1168 * @param {Number} w W component | |
1169 * @returns {vec4} out | |
1170 */ | |
1171 vec4.set = function(out, x, y, z, w) { | |
1172 out[0] = x; | |
1173 out[1] = y; | |
1174 out[2] = z; | |
1175 out[3] = w; | |
1176 return out; | |
1177 }; | |
1178 | |
1179 /** | |
1180 * Adds two vec4's | |
1181 * | |
1182 * @param {vec4} out the receiving vector | |
1183 * @param {vec4} a the first operand | |
1184 * @param {vec4} b the second operand | |
1185 * @returns {vec4} out | |
1186 */ | |
1187 vec4.add = function(out, a, b) { | |
1188 out[0] = a[0] + b[0]; | |
1189 out[1] = a[1] + b[1]; | |
1190 out[2] = a[2] + b[2]; | |
1191 out[3] = a[3] + b[3]; | |
1192 return out; | |
1193 }; | |
1194 | |
1195 /** | |
1196 * Subtracts two vec4's | |
1197 * | |
1198 * @param {vec4} out the receiving vector | |
1199 * @param {vec4} a the first operand | |
1200 * @param {vec4} b the second operand | |
1201 * @returns {vec4} out | |
1202 */ | |
1203 vec4.subtract = function(out, a, b) { | |
1204 out[0] = a[0] - b[0]; | |
1205 out[1] = a[1] - b[1]; | |
1206 out[2] = a[2] - b[2]; | |
1207 out[3] = a[3] - b[3]; | |
1208 return out; | |
1209 }; | |
1210 | |
1211 /** | |
1212 * Alias for {@link vec4.subtract} | |
1213 * @function | |
1214 */ | |
1215 vec4.sub = vec4.subtract; | |
1216 | |
1217 /** | |
1218 * Multiplies two vec4's | |
1219 * | |
1220 * @param {vec4} out the receiving vector | |
1221 * @param {vec4} a the first operand | |
1222 * @param {vec4} b the second operand | |
1223 * @returns {vec4} out | |
1224 */ | |
1225 vec4.multiply = function(out, a, b) { | |
1226 out[0] = a[0] * b[0]; | |
1227 out[1] = a[1] * b[1]; | |
1228 out[2] = a[2] * b[2]; | |
1229 out[3] = a[3] * b[3]; | |
1230 return out; | |
1231 }; | |
1232 | |
1233 /** | |
1234 * Alias for {@link vec4.multiply} | |
1235 * @function | |
1236 */ | |
1237 vec4.mul = vec4.multiply; | |
1238 | |
1239 /** | |
1240 * Divides two vec4's | |
1241 * | |
1242 * @param {vec4} out the receiving vector | |
1243 * @param {vec4} a the first operand | |
1244 * @param {vec4} b the second operand | |
1245 * @returns {vec4} out | |
1246 */ | |
1247 vec4.divide = function(out, a, b) { | |
1248 out[0] = a[0] / b[0]; | |
1249 out[1] = a[1] / b[1]; | |
1250 out[2] = a[2] / b[2]; | |
1251 out[3] = a[3] / b[3]; | |
1252 return out; | |
1253 }; | |
1254 | |
1255 /** | |
1256 * Alias for {@link vec4.divide} | |
1257 * @function | |
1258 */ | |
1259 vec4.div = vec4.divide; | |
1260 | |
1261 /** | |
1262 * Returns the minimum of two vec4's | |
1263 * | |
1264 * @param {vec4} out the receiving vector | |
1265 * @param {vec4} a the first operand | |
1266 * @param {vec4} b the second operand | |
1267 * @returns {vec4} out | |
1268 */ | |
1269 vec4.min = function(out, a, b) { | |
1270 out[0] = Math.min(a[0], b[0]); | |
1271 out[1] = Math.min(a[1], b[1]); | |
1272 out[2] = Math.min(a[2], b[2]); | |
1273 out[3] = Math.min(a[3], b[3]); | |
1274 return out; | |
1275 }; | |
1276 | |
1277 /** | |
1278 * Returns the maximum of two vec4's | |
1279 * | |
1280 * @param {vec4} out the receiving vector | |
1281 * @param {vec4} a the first operand | |
1282 * @param {vec4} b the second operand | |
1283 * @returns {vec4} out | |
1284 */ | |
1285 vec4.max = function(out, a, b) { | |
1286 out[0] = Math.max(a[0], b[0]); | |
1287 out[1] = Math.max(a[1], b[1]); | |
1288 out[2] = Math.max(a[2], b[2]); | |
1289 out[3] = Math.max(a[3], b[3]); | |
1290 return out; | |
1291 }; | |
1292 | |
1293 /** | |
1294 * Scales a vec4 by a scalar number | |
1295 * | |
1296 * @param {vec4} out the receiving vector | |
1297 * @param {vec4} a the vector to scale | |
1298 * @param {Number} b amount to scale the vector by | |
1299 * @returns {vec4} out | |
1300 */ | |
1301 vec4.scale = function(out, a, b) { | |
1302 out[0] = a[0] * b; | |
1303 out[1] = a[1] * b; | |
1304 out[2] = a[2] * b; | |
1305 out[3] = a[3] * b; | |
1306 return out; | |
1307 }; | |
1308 | |
1309 /** | |
1310 * Calculates the euclidian distance between two vec4's | |
1311 * | |
1312 * @param {vec4} a the first operand | |
1313 * @param {vec4} b the second operand | |
1314 * @returns {Number} distance between a and b | |
1315 */ | |
1316 vec4.distance = function(a, b) { | |
1317 var x = b[0] - a[0], | |
1318 y = b[1] - a[1], | |
1319 z = b[2] - a[2], | |
1320 w = b[3] - a[3]; | |
1321 return Math.sqrt(x*x + y*y + z*z + w*w); | |
1322 }; | |
1323 | |
1324 /** | |
1325 * Alias for {@link vec4.distance} | |
1326 * @function | |
1327 */ | |
1328 vec4.dist = vec4.distance; | |
1329 | |
1330 /** | |
1331 * Calculates the squared euclidian distance between two vec4's | |
1332 * | |
1333 * @param {vec4} a the first operand | |
1334 * @param {vec4} b the second operand | |
1335 * @returns {Number} squared distance between a and b | |
1336 */ | |
1337 vec4.squaredDistance = function(a, b) { | |
1338 var x = b[0] - a[0], | |
1339 y = b[1] - a[1], | |
1340 z = b[2] - a[2], | |
1341 w = b[3] - a[3]; | |
1342 return x*x + y*y + z*z + w*w; | |
1343 }; | |
1344 | |
1345 /** | |
1346 * Alias for {@link vec4.squaredDistance} | |
1347 * @function | |
1348 */ | |
1349 vec4.sqrDist = vec4.squaredDistance; | |
1350 | |
1351 /** | |
1352 * Calculates the length of a vec4 | |
1353 * | |
1354 * @param {vec4} a vector to calculate length of | |
1355 * @returns {Number} length of a | |
1356 */ | |
1357 vec4.length = function (a) { | |
1358 var x = a[0], | |
1359 y = a[1], | |
1360 z = a[2], | |
1361 w = a[3]; | |
1362 return Math.sqrt(x*x + y*y + z*z + w*w); | |
1363 }; | |
1364 | |
1365 /** | |
1366 * Alias for {@link vec4.length} | |
1367 * @function | |
1368 */ | |
1369 vec4.len = vec4.length; | |
1370 | |
1371 /** | |
1372 * Calculates the squared length of a vec4 | |
1373 * | |
1374 * @param {vec4} a vector to calculate squared length of | |
1375 * @returns {Number} squared length of a | |
1376 */ | |
1377 vec4.squaredLength = function (a) { | |
1378 var x = a[0], | |
1379 y = a[1], | |
1380 z = a[2], | |
1381 w = a[3]; | |
1382 return x*x + y*y + z*z + w*w; | |
1383 }; | |
1384 | |
1385 /** | |
1386 * Alias for {@link vec4.squaredLength} | |
1387 * @function | |
1388 */ | |
1389 vec4.sqrLen = vec4.squaredLength; | |
1390 | |
1391 /** | |
1392 * Negates the components of a vec4 | |
1393 * | |
1394 * @param {vec4} out the receiving vector | |
1395 * @param {vec4} a vector to negate | |
1396 * @returns {vec4} out | |
1397 */ | |
1398 vec4.negate = function(out, a) { | |
1399 out[0] = -a[0]; | |
1400 out[1] = -a[1]; | |
1401 out[2] = -a[2]; | |
1402 out[3] = -a[3]; | |
1403 return out; | |
1404 }; | |
1405 | |
1406 /** | |
1407 * Normalize a vec4 | |
1408 * | |
1409 * @param {vec4} out the receiving vector | |
1410 * @param {vec4} a vector to normalize | |
1411 * @returns {vec4} out | |
1412 */ | |
1413 vec4.normalize = function(out, a) { | |
1414 var x = a[0], | |
1415 y = a[1], | |
1416 z = a[2], | |
1417 w = a[3]; | |
1418 var len = x*x + y*y + z*z + w*w; | |
1419 if (len > 0) { | |
1420 len = 1 / Math.sqrt(len); | |
1421 out[0] = a[0] * len; | |
1422 out[1] = a[1] * len; | |
1423 out[2] = a[2] * len; | |
1424 out[3] = a[3] * len; | |
1425 } | |
1426 return out; | |
1427 }; | |
1428 | |
1429 /** | |
1430 * Calculates the dot product of two vec4's | |
1431 * | |
1432 * @param {vec4} a the first operand | |
1433 * @param {vec4} b the second operand | |
1434 * @returns {Number} dot product of a and b | |
1435 */ | |
1436 vec4.dot = function (a, b) { | |
1437 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; | |
1438 }; | |
1439 | |
1440 /** | |
1441 * Performs a linear interpolation between two vec4's | |
1442 * | |
1443 * @param {vec4} out the receiving vector | |
1444 * @param {vec4} a the first operand | |
1445 * @param {vec4} b the second operand | |
1446 * @param {Number} t interpolation amount between the two inputs | |
1447 * @returns {vec4} out | |
1448 */ | |
1449 vec4.lerp = function (out, a, b, t) { | |
1450 var ax = a[0], | |
1451 ay = a[1], | |
1452 az = a[2], | |
1453 aw = a[3]; | |
1454 out[0] = ax + t * (b[0] - ax); | |
1455 out[1] = ay + t * (b[1] - ay); | |
1456 out[2] = az + t * (b[2] - az); | |
1457 out[3] = aw + t * (b[3] - aw); | |
1458 return out; | |
1459 }; | |
1460 | |
1461 /** | |
1462 * Transforms the vec4 with a mat4. | |
1463 * | |
1464 * @param {vec4} out the receiving vector | |
1465 * @param {vec4} a the vector to transform | |
1466 * @param {mat4} m matrix to transform with | |
1467 * @returns {vec4} out | |
1468 */ | |
1469 vec4.transformMat4 = function(out, a, m) { | |
1470 var x = a[0], y = a[1], z = a[2], w = a[3]; | |
1471 out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; | |
1472 out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; | |
1473 out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; | |
1474 out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; | |
1475 return out; | |
1476 }; | |
1477 | |
1478 /** | |
1479 * Transforms the vec4 with a quat | |
1480 * | |
1481 * @param {vec4} out the receiving vector | |
1482 * @param {vec4} a the vector to transform | |
1483 * @param {quat} q quaternion to transform with | |
1484 * @returns {vec4} out | |
1485 */ | |
1486 vec4.transformQuat = function(out, a, q) { | |
1487 var x = a[0], y = a[1], z = a[2], | |
1488 qx = q[0], qy = q[1], qz = q[2], qw = q[3], | |
1489 | |
1490 // calculate quat * vec | |
1491 ix = qw * x + qy * z - qz * y, | |
1492 iy = qw * y + qz * x - qx * z, | |
1493 iz = qw * z + qx * y - qy * x, | |
1494 iw = -qx * x - qy * y - qz * z; | |
1495 | |
1496 // calculate result * inverse quat | |
1497 out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; | |
1498 out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; | |
1499 out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; | |
1500 return out; | |
1501 }; | |
1502 | |
1503 /** | |
1504 * Perform some operation over an array of vec4s. | |
1505 * | |
1506 * @param {Array} a the array of vectors to iterate over | |
1507 * @param {Number} stride Number of elements between the start of each vec4. If
0 assumes tightly packed | |
1508 * @param {Number} offset Number of elements to skip at the beginning of the arr
ay | |
1509 * @param {Number} count Number of vec2s to iterate over. If 0 iterates over ent
ire array | |
1510 * @param {Function} fn Function to call for each vector in the array | |
1511 * @param {Object} [arg] additional argument to pass to fn | |
1512 * @returns {Array} a | |
1513 * @function | |
1514 */ | |
1515 vec4.forEach = (function() { | |
1516 var vec = vec4.create(); | |
1517 | |
1518 return function(a, stride, offset, count, fn, arg) { | |
1519 var i, l; | |
1520 if(!stride) { | |
1521 stride = 4; | |
1522 } | |
1523 | |
1524 if(!offset) { | |
1525 offset = 0; | |
1526 } | |
1527 | |
1528 if(count) { | |
1529 l = Math.min((count * stride) + offset, a.length); | |
1530 } else { | |
1531 l = a.length; | |
1532 } | |
1533 | |
1534 for(i = offset; i < l; i += stride) { | |
1535 vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3]; | |
1536 fn(vec, vec, arg); | |
1537 a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3]; | |
1538 } | |
1539 | |
1540 return a; | |
1541 }; | |
1542 })(); | |
1543 | |
1544 /** | |
1545 * Returns a string representation of a vector | |
1546 * | |
1547 * @param {vec4} vec vector to represent as a string | |
1548 * @returns {String} string representation of the vector | |
1549 */ | |
1550 vec4.str = function (a) { | |
1551 return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; | |
1552 }; | |
1553 | |
1554 if(typeof(exports) !== 'undefined') { | |
1555 exports.vec4 = vec4; | |
1556 } | |
1557 ; | |
1558 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
1559 | |
1560 Redistribution and use in source and binary forms, with or without modification, | |
1561 are permitted provided that the following conditions are met: | |
1562 | |
1563 * Redistributions of source code must retain the above copyright notice, this | |
1564 list of conditions and the following disclaimer. | |
1565 * Redistributions in binary form must reproduce the above copyright notice, | |
1566 this list of conditions and the following disclaimer in the documentation | |
1567 and/or other materials provided with the distribution. | |
1568 | |
1569 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
1570 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
1571 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
1572 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
1573 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
1574 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
1575 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
1576 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
1577 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
1578 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
1579 | |
1580 /** | |
1581 * @class 2x2 Matrix | |
1582 * @name mat2 | |
1583 */ | |
1584 | |
1585 var mat2 = {}; | |
1586 | |
1587 /** | |
1588 * Creates a new identity mat2 | |
1589 * | |
1590 * @returns {mat2} a new 2x2 matrix | |
1591 */ | |
1592 mat2.create = function() { | |
1593 var out = new GLMAT_ARRAY_TYPE(4); | |
1594 out[0] = 1; | |
1595 out[1] = 0; | |
1596 out[2] = 0; | |
1597 out[3] = 1; | |
1598 return out; | |
1599 }; | |
1600 | |
1601 /** | |
1602 * Creates a new mat2 initialized with values from an existing matrix | |
1603 * | |
1604 * @param {mat2} a matrix to clone | |
1605 * @returns {mat2} a new 2x2 matrix | |
1606 */ | |
1607 mat2.clone = function(a) { | |
1608 var out = new GLMAT_ARRAY_TYPE(4); | |
1609 out[0] = a[0]; | |
1610 out[1] = a[1]; | |
1611 out[2] = a[2]; | |
1612 out[3] = a[3]; | |
1613 return out; | |
1614 }; | |
1615 | |
1616 /** | |
1617 * Copy the values from one mat2 to another | |
1618 * | |
1619 * @param {mat2} out the receiving matrix | |
1620 * @param {mat2} a the source matrix | |
1621 * @returns {mat2} out | |
1622 */ | |
1623 mat2.copy = function(out, a) { | |
1624 out[0] = a[0]; | |
1625 out[1] = a[1]; | |
1626 out[2] = a[2]; | |
1627 out[3] = a[3]; | |
1628 return out; | |
1629 }; | |
1630 | |
1631 /** | |
1632 * Set a mat2 to the identity matrix | |
1633 * | |
1634 * @param {mat2} out the receiving matrix | |
1635 * @returns {mat2} out | |
1636 */ | |
1637 mat2.identity = function(out) { | |
1638 out[0] = 1; | |
1639 out[1] = 0; | |
1640 out[2] = 0; | |
1641 out[3] = 1; | |
1642 return out; | |
1643 }; | |
1644 | |
1645 /** | |
1646 * Transpose the values of a mat2 | |
1647 * | |
1648 * @param {mat2} out the receiving matrix | |
1649 * @param {mat2} a the source matrix | |
1650 * @returns {mat2} out | |
1651 */ | |
1652 mat2.transpose = function(out, a) { | |
1653 // If we are transposing ourselves we can skip a few steps but have to cache
some values | |
1654 if (out === a) { | |
1655 var a1 = a[1]; | |
1656 out[1] = a[2]; | |
1657 out[2] = a1; | |
1658 } else { | |
1659 out[0] = a[0]; | |
1660 out[1] = a[2]; | |
1661 out[2] = a[1]; | |
1662 out[3] = a[3]; | |
1663 } | |
1664 | |
1665 return out; | |
1666 }; | |
1667 | |
1668 /** | |
1669 * Inverts a mat2 | |
1670 * | |
1671 * @param {mat2} out the receiving matrix | |
1672 * @param {mat2} a the source matrix | |
1673 * @returns {mat2} out | |
1674 */ | |
1675 mat2.invert = function(out, a) { | |
1676 var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], | |
1677 | |
1678 // Calculate the determinant | |
1679 det = a0 * a3 - a2 * a1; | |
1680 | |
1681 if (!det) { | |
1682 return null; | |
1683 } | |
1684 det = 1.0 / det; | |
1685 | |
1686 out[0] = a3 * det; | |
1687 out[1] = -a1 * det; | |
1688 out[2] = -a2 * det; | |
1689 out[3] = a0 * det; | |
1690 | |
1691 return out; | |
1692 }; | |
1693 | |
1694 /** | |
1695 * Calculates the adjugate of a mat2 | |
1696 * | |
1697 * @param {mat2} out the receiving matrix | |
1698 * @param {mat2} a the source matrix | |
1699 * @returns {mat2} out | |
1700 */ | |
1701 mat2.adjoint = function(out, a) { | |
1702 // Caching this value is nessecary if out == a | |
1703 var a0 = a[0]; | |
1704 out[0] = a[3]; | |
1705 out[1] = -a[1]; | |
1706 out[2] = -a[2]; | |
1707 out[3] = a0; | |
1708 | |
1709 return out; | |
1710 }; | |
1711 | |
1712 /** | |
1713 * Calculates the determinant of a mat2 | |
1714 * | |
1715 * @param {mat2} a the source matrix | |
1716 * @returns {Number} determinant of a | |
1717 */ | |
1718 mat2.determinant = function (a) { | |
1719 return a[0] * a[3] - a[2] * a[1]; | |
1720 }; | |
1721 | |
1722 /** | |
1723 * Multiplies two mat2's | |
1724 * | |
1725 * @param {mat2} out the receiving matrix | |
1726 * @param {mat2} a the first operand | |
1727 * @param {mat2} b the second operand | |
1728 * @returns {mat2} out | |
1729 */ | |
1730 mat2.multiply = function (out, a, b) { | |
1731 var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; | |
1732 var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; | |
1733 out[0] = a0 * b0 + a1 * b2; | |
1734 out[1] = a0 * b1 + a1 * b3; | |
1735 out[2] = a2 * b0 + a3 * b2; | |
1736 out[3] = a2 * b1 + a3 * b3; | |
1737 return out; | |
1738 }; | |
1739 | |
1740 /** | |
1741 * Alias for {@link mat2.multiply} | |
1742 * @function | |
1743 */ | |
1744 mat2.mul = mat2.multiply; | |
1745 | |
1746 /** | |
1747 * Rotates a mat2 by the given angle | |
1748 * | |
1749 * @param {mat2} out the receiving matrix | |
1750 * @param {mat2} a the matrix to rotate | |
1751 * @param {Number} rad the angle to rotate the matrix by | |
1752 * @returns {mat2} out | |
1753 */ | |
1754 mat2.rotate = function (out, a, rad) { | |
1755 var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], | |
1756 s = Math.sin(rad), | |
1757 c = Math.cos(rad); | |
1758 out[0] = a0 * c + a1 * s; | |
1759 out[1] = a0 * -s + a1 * c; | |
1760 out[2] = a2 * c + a3 * s; | |
1761 out[3] = a2 * -s + a3 * c; | |
1762 return out; | |
1763 }; | |
1764 | |
1765 /** | |
1766 * Scales the mat2 by the dimensions in the given vec2 | |
1767 * | |
1768 * @param {mat2} out the receiving matrix | |
1769 * @param {mat2} a the matrix to rotate | |
1770 * @param {vec2} v the vec2 to scale the matrix by | |
1771 * @returns {mat2} out | |
1772 **/ | |
1773 mat2.scale = function(out, a, v) { | |
1774 var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], | |
1775 v0 = v[0], v1 = v[1]; | |
1776 out[0] = a0 * v0; | |
1777 out[1] = a1 * v1; | |
1778 out[2] = a2 * v0; | |
1779 out[3] = a3 * v1; | |
1780 return out; | |
1781 }; | |
1782 | |
1783 /** | |
1784 * Returns a string representation of a mat2 | |
1785 * | |
1786 * @param {mat2} mat matrix to represent as a string | |
1787 * @returns {String} string representation of the matrix | |
1788 */ | |
1789 mat2.str = function (a) { | |
1790 return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; | |
1791 }; | |
1792 | |
1793 if(typeof(exports) !== 'undefined') { | |
1794 exports.mat2 = mat2; | |
1795 } | |
1796 ; | |
1797 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
1798 | |
1799 Redistribution and use in source and binary forms, with or without modification, | |
1800 are permitted provided that the following conditions are met: | |
1801 | |
1802 * Redistributions of source code must retain the above copyright notice, this | |
1803 list of conditions and the following disclaimer. | |
1804 * Redistributions in binary form must reproduce the above copyright notice, | |
1805 this list of conditions and the following disclaimer in the documentation | |
1806 and/or other materials provided with the distribution. | |
1807 | |
1808 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
1809 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
1810 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
1811 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
1812 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
1813 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
1814 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
1815 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
1816 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
1817 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
1818 | |
1819 /** | |
1820 * @class 2x3 Matrix | |
1821 * @name mat2d | |
1822 * | |
1823 * @description | |
1824 * A mat2d contains six elements defined as: | |
1825 * <pre> | |
1826 * [a, b, | |
1827 * c, d, | |
1828 * tx,ty] | |
1829 * </pre> | |
1830 * This is a short form for the 3x3 matrix: | |
1831 * <pre> | |
1832 * [a, b, 0 | |
1833 * c, d, 0 | |
1834 * tx,ty,1] | |
1835 * </pre> | |
1836 * The last column is ignored so the array is shorter and operations are faster. | |
1837 */ | |
1838 | |
1839 var mat2d = {}; | |
1840 | |
1841 /** | |
1842 * Creates a new identity mat2d | |
1843 * | |
1844 * @returns {mat2d} a new 2x3 matrix | |
1845 */ | |
1846 mat2d.create = function() { | |
1847 var out = new GLMAT_ARRAY_TYPE(6); | |
1848 out[0] = 1; | |
1849 out[1] = 0; | |
1850 out[2] = 0; | |
1851 out[3] = 1; | |
1852 out[4] = 0; | |
1853 out[5] = 0; | |
1854 return out; | |
1855 }; | |
1856 | |
1857 /** | |
1858 * Creates a new mat2d initialized with values from an existing matrix | |
1859 * | |
1860 * @param {mat2d} a matrix to clone | |
1861 * @returns {mat2d} a new 2x3 matrix | |
1862 */ | |
1863 mat2d.clone = function(a) { | |
1864 var out = new GLMAT_ARRAY_TYPE(6); | |
1865 out[0] = a[0]; | |
1866 out[1] = a[1]; | |
1867 out[2] = a[2]; | |
1868 out[3] = a[3]; | |
1869 out[4] = a[4]; | |
1870 out[5] = a[5]; | |
1871 return out; | |
1872 }; | |
1873 | |
1874 /** | |
1875 * Copy the values from one mat2d to another | |
1876 * | |
1877 * @param {mat2d} out the receiving matrix | |
1878 * @param {mat2d} a the source matrix | |
1879 * @returns {mat2d} out | |
1880 */ | |
1881 mat2d.copy = function(out, a) { | |
1882 out[0] = a[0]; | |
1883 out[1] = a[1]; | |
1884 out[2] = a[2]; | |
1885 out[3] = a[3]; | |
1886 out[4] = a[4]; | |
1887 out[5] = a[5]; | |
1888 return out; | |
1889 }; | |
1890 | |
1891 /** | |
1892 * Set a mat2d to the identity matrix | |
1893 * | |
1894 * @param {mat2d} out the receiving matrix | |
1895 * @returns {mat2d} out | |
1896 */ | |
1897 mat2d.identity = function(out) { | |
1898 out[0] = 1; | |
1899 out[1] = 0; | |
1900 out[2] = 0; | |
1901 out[3] = 1; | |
1902 out[4] = 0; | |
1903 out[5] = 0; | |
1904 return out; | |
1905 }; | |
1906 | |
1907 /** | |
1908 * Inverts a mat2d | |
1909 * | |
1910 * @param {mat2d} out the receiving matrix | |
1911 * @param {mat2d} a the source matrix | |
1912 * @returns {mat2d} out | |
1913 */ | |
1914 mat2d.invert = function(out, a) { | |
1915 var aa = a[0], ab = a[1], ac = a[2], ad = a[3], | |
1916 atx = a[4], aty = a[5]; | |
1917 | |
1918 var det = aa * ad - ab * ac; | |
1919 if(!det){ | |
1920 return null; | |
1921 } | |
1922 det = 1.0 / det; | |
1923 | |
1924 out[0] = ad * det; | |
1925 out[1] = -ab * det; | |
1926 out[2] = -ac * det; | |
1927 out[3] = aa * det; | |
1928 out[4] = (ac * aty - ad * atx) * det; | |
1929 out[5] = (ab * atx - aa * aty) * det; | |
1930 return out; | |
1931 }; | |
1932 | |
1933 /** | |
1934 * Calculates the determinant of a mat2d | |
1935 * | |
1936 * @param {mat2d} a the source matrix | |
1937 * @returns {Number} determinant of a | |
1938 */ | |
1939 mat2d.determinant = function (a) { | |
1940 return a[0] * a[3] - a[1] * a[2]; | |
1941 }; | |
1942 | |
1943 /** | |
1944 * Multiplies two mat2d's | |
1945 * | |
1946 * @param {mat2d} out the receiving matrix | |
1947 * @param {mat2d} a the first operand | |
1948 * @param {mat2d} b the second operand | |
1949 * @returns {mat2d} out | |
1950 */ | |
1951 mat2d.multiply = function (out, a, b) { | |
1952 var aa = a[0], ab = a[1], ac = a[2], ad = a[3], | |
1953 atx = a[4], aty = a[5], | |
1954 ba = b[0], bb = b[1], bc = b[2], bd = b[3], | |
1955 btx = b[4], bty = b[5]; | |
1956 | |
1957 out[0] = aa*ba + ab*bc; | |
1958 out[1] = aa*bb + ab*bd; | |
1959 out[2] = ac*ba + ad*bc; | |
1960 out[3] = ac*bb + ad*bd; | |
1961 out[4] = ba*atx + bc*aty + btx; | |
1962 out[5] = bb*atx + bd*aty + bty; | |
1963 return out; | |
1964 }; | |
1965 | |
1966 /** | |
1967 * Alias for {@link mat2d.multiply} | |
1968 * @function | |
1969 */ | |
1970 mat2d.mul = mat2d.multiply; | |
1971 | |
1972 | |
1973 /** | |
1974 * Rotates a mat2d by the given angle | |
1975 * | |
1976 * @param {mat2d} out the receiving matrix | |
1977 * @param {mat2d} a the matrix to rotate | |
1978 * @param {Number} rad the angle to rotate the matrix by | |
1979 * @returns {mat2d} out | |
1980 */ | |
1981 mat2d.rotate = function (out, a, rad) { | |
1982 var aa = a[0], | |
1983 ab = a[1], | |
1984 ac = a[2], | |
1985 ad = a[3], | |
1986 atx = a[4], | |
1987 aty = a[5], | |
1988 st = Math.sin(rad), | |
1989 ct = Math.cos(rad); | |
1990 | |
1991 out[0] = aa*ct + ab*st; | |
1992 out[1] = -aa*st + ab*ct; | |
1993 out[2] = ac*ct + ad*st; | |
1994 out[3] = -ac*st + ct*ad; | |
1995 out[4] = ct*atx + st*aty; | |
1996 out[5] = ct*aty - st*atx; | |
1997 return out; | |
1998 }; | |
1999 | |
2000 /** | |
2001 * Scales the mat2d by the dimensions in the given vec2 | |
2002 * | |
2003 * @param {mat2d} out the receiving matrix | |
2004 * @param {mat2d} a the matrix to translate | |
2005 * @param {mat2d} v the vec2 to scale the matrix by | |
2006 * @returns {mat2d} out | |
2007 **/ | |
2008 mat2d.scale = function(out, a, v) { | |
2009 var vx = v[0], vy = v[1]; | |
2010 out[0] = a[0] * vx; | |
2011 out[1] = a[1] * vy; | |
2012 out[2] = a[2] * vx; | |
2013 out[3] = a[3] * vy; | |
2014 out[4] = a[4] * vx; | |
2015 out[5] = a[5] * vy; | |
2016 return out; | |
2017 }; | |
2018 | |
2019 /** | |
2020 * Translates the mat2d by the dimensions in the given vec2 | |
2021 * | |
2022 * @param {mat2d} out the receiving matrix | |
2023 * @param {mat2d} a the matrix to translate | |
2024 * @param {mat2d} v the vec2 to translate the matrix by | |
2025 * @returns {mat2d} out | |
2026 **/ | |
2027 mat2d.translate = function(out, a, v) { | |
2028 out[0] = a[0]; | |
2029 out[1] = a[1]; | |
2030 out[2] = a[2]; | |
2031 out[3] = a[3]; | |
2032 out[4] = a[4] + v[0]; | |
2033 out[5] = a[5] + v[1]; | |
2034 return out; | |
2035 }; | |
2036 | |
2037 /** | |
2038 * Returns a string representation of a mat2d | |
2039 * | |
2040 * @param {mat2d} a matrix to represent as a string | |
2041 * @returns {String} string representation of the matrix | |
2042 */ | |
2043 mat2d.str = function (a) { | |
2044 return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + | |
2045 a[3] + ', ' + a[4] + ', ' + a[5] + ')'; | |
2046 }; | |
2047 | |
2048 if(typeof(exports) !== 'undefined') { | |
2049 exports.mat2d = mat2d; | |
2050 } | |
2051 ; | |
2052 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
2053 | |
2054 Redistribution and use in source and binary forms, with or without modification, | |
2055 are permitted provided that the following conditions are met: | |
2056 | |
2057 * Redistributions of source code must retain the above copyright notice, this | |
2058 list of conditions and the following disclaimer. | |
2059 * Redistributions in binary form must reproduce the above copyright notice, | |
2060 this list of conditions and the following disclaimer in the documentation | |
2061 and/or other materials provided with the distribution. | |
2062 | |
2063 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
2064 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
2065 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
2066 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
2067 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
2068 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
2069 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
2070 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
2071 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
2072 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
2073 | |
2074 /** | |
2075 * @class 3x3 Matrix | |
2076 * @name mat3 | |
2077 */ | |
2078 | |
2079 var mat3 = {}; | |
2080 | |
2081 /** | |
2082 * Creates a new identity mat3 | |
2083 * | |
2084 * @returns {mat3} a new 3x3 matrix | |
2085 */ | |
2086 mat3.create = function() { | |
2087 var out = new GLMAT_ARRAY_TYPE(9); | |
2088 out[0] = 1; | |
2089 out[1] = 0; | |
2090 out[2] = 0; | |
2091 out[3] = 0; | |
2092 out[4] = 1; | |
2093 out[5] = 0; | |
2094 out[6] = 0; | |
2095 out[7] = 0; | |
2096 out[8] = 1; | |
2097 return out; | |
2098 }; | |
2099 | |
2100 /** | |
2101 * Copies the upper-left 3x3 values into the given mat3. | |
2102 * | |
2103 * @param {mat3} out the receiving 3x3 matrix | |
2104 * @param {mat4} a the source 4x4 matrix | |
2105 * @returns {mat3} out | |
2106 */ | |
2107 mat3.fromMat4 = function(out, a) { | |
2108 out[0] = a[0]; | |
2109 out[1] = a[1]; | |
2110 out[2] = a[2]; | |
2111 out[3] = a[4]; | |
2112 out[4] = a[5]; | |
2113 out[5] = a[6]; | |
2114 out[6] = a[8]; | |
2115 out[7] = a[9]; | |
2116 out[8] = a[10]; | |
2117 return out; | |
2118 }; | |
2119 | |
2120 /** | |
2121 * Creates a new mat3 initialized with values from an existing matrix | |
2122 * | |
2123 * @param {mat3} a matrix to clone | |
2124 * @returns {mat3} a new 3x3 matrix | |
2125 */ | |
2126 mat3.clone = function(a) { | |
2127 var out = new GLMAT_ARRAY_TYPE(9); | |
2128 out[0] = a[0]; | |
2129 out[1] = a[1]; | |
2130 out[2] = a[2]; | |
2131 out[3] = a[3]; | |
2132 out[4] = a[4]; | |
2133 out[5] = a[5]; | |
2134 out[6] = a[6]; | |
2135 out[7] = a[7]; | |
2136 out[8] = a[8]; | |
2137 return out; | |
2138 }; | |
2139 | |
2140 /** | |
2141 * Copy the values from one mat3 to another | |
2142 * | |
2143 * @param {mat3} out the receiving matrix | |
2144 * @param {mat3} a the source matrix | |
2145 * @returns {mat3} out | |
2146 */ | |
2147 mat3.copy = function(out, a) { | |
2148 out[0] = a[0]; | |
2149 out[1] = a[1]; | |
2150 out[2] = a[2]; | |
2151 out[3] = a[3]; | |
2152 out[4] = a[4]; | |
2153 out[5] = a[5]; | |
2154 out[6] = a[6]; | |
2155 out[7] = a[7]; | |
2156 out[8] = a[8]; | |
2157 return out; | |
2158 }; | |
2159 | |
2160 /** | |
2161 * Set a mat3 to the identity matrix | |
2162 * | |
2163 * @param {mat3} out the receiving matrix | |
2164 * @returns {mat3} out | |
2165 */ | |
2166 mat3.identity = function(out) { | |
2167 out[0] = 1; | |
2168 out[1] = 0; | |
2169 out[2] = 0; | |
2170 out[3] = 0; | |
2171 out[4] = 1; | |
2172 out[5] = 0; | |
2173 out[6] = 0; | |
2174 out[7] = 0; | |
2175 out[8] = 1; | |
2176 return out; | |
2177 }; | |
2178 | |
2179 /** | |
2180 * Transpose the values of a mat3 | |
2181 * | |
2182 * @param {mat3} out the receiving matrix | |
2183 * @param {mat3} a the source matrix | |
2184 * @returns {mat3} out | |
2185 */ | |
2186 mat3.transpose = function(out, a) { | |
2187 // If we are transposing ourselves we can skip a few steps but have to cache
some values | |
2188 if (out === a) { | |
2189 var a01 = a[1], a02 = a[2], a12 = a[5]; | |
2190 out[1] = a[3]; | |
2191 out[2] = a[6]; | |
2192 out[3] = a01; | |
2193 out[5] = a[7]; | |
2194 out[6] = a02; | |
2195 out[7] = a12; | |
2196 } else { | |
2197 out[0] = a[0]; | |
2198 out[1] = a[3]; | |
2199 out[2] = a[6]; | |
2200 out[3] = a[1]; | |
2201 out[4] = a[4]; | |
2202 out[5] = a[7]; | |
2203 out[6] = a[2]; | |
2204 out[7] = a[5]; | |
2205 out[8] = a[8]; | |
2206 } | |
2207 | |
2208 return out; | |
2209 }; | |
2210 | |
2211 /** | |
2212 * Inverts a mat3 | |
2213 * | |
2214 * @param {mat3} out the receiving matrix | |
2215 * @param {mat3} a the source matrix | |
2216 * @returns {mat3} out | |
2217 */ | |
2218 mat3.invert = function(out, a) { | |
2219 var a00 = a[0], a01 = a[1], a02 = a[2], | |
2220 a10 = a[3], a11 = a[4], a12 = a[5], | |
2221 a20 = a[6], a21 = a[7], a22 = a[8], | |
2222 | |
2223 b01 = a22 * a11 - a12 * a21, | |
2224 b11 = -a22 * a10 + a12 * a20, | |
2225 b21 = a21 * a10 - a11 * a20, | |
2226 | |
2227 // Calculate the determinant | |
2228 det = a00 * b01 + a01 * b11 + a02 * b21; | |
2229 | |
2230 if (!det) { | |
2231 return null; | |
2232 } | |
2233 det = 1.0 / det; | |
2234 | |
2235 out[0] = b01 * det; | |
2236 out[1] = (-a22 * a01 + a02 * a21) * det; | |
2237 out[2] = (a12 * a01 - a02 * a11) * det; | |
2238 out[3] = b11 * det; | |
2239 out[4] = (a22 * a00 - a02 * a20) * det; | |
2240 out[5] = (-a12 * a00 + a02 * a10) * det; | |
2241 out[6] = b21 * det; | |
2242 out[7] = (-a21 * a00 + a01 * a20) * det; | |
2243 out[8] = (a11 * a00 - a01 * a10) * det; | |
2244 return out; | |
2245 }; | |
2246 | |
2247 /** | |
2248 * Calculates the adjugate of a mat3 | |
2249 * | |
2250 * @param {mat3} out the receiving matrix | |
2251 * @param {mat3} a the source matrix | |
2252 * @returns {mat3} out | |
2253 */ | |
2254 mat3.adjoint = function(out, a) { | |
2255 var a00 = a[0], a01 = a[1], a02 = a[2], | |
2256 a10 = a[3], a11 = a[4], a12 = a[5], | |
2257 a20 = a[6], a21 = a[7], a22 = a[8]; | |
2258 | |
2259 out[0] = (a11 * a22 - a12 * a21); | |
2260 out[1] = (a02 * a21 - a01 * a22); | |
2261 out[2] = (a01 * a12 - a02 * a11); | |
2262 out[3] = (a12 * a20 - a10 * a22); | |
2263 out[4] = (a00 * a22 - a02 * a20); | |
2264 out[5] = (a02 * a10 - a00 * a12); | |
2265 out[6] = (a10 * a21 - a11 * a20); | |
2266 out[7] = (a01 * a20 - a00 * a21); | |
2267 out[8] = (a00 * a11 - a01 * a10); | |
2268 return out; | |
2269 }; | |
2270 | |
2271 /** | |
2272 * Calculates the determinant of a mat3 | |
2273 * | |
2274 * @param {mat3} a the source matrix | |
2275 * @returns {Number} determinant of a | |
2276 */ | |
2277 mat3.determinant = function (a) { | |
2278 var a00 = a[0], a01 = a[1], a02 = a[2], | |
2279 a10 = a[3], a11 = a[4], a12 = a[5], | |
2280 a20 = a[6], a21 = a[7], a22 = a[8]; | |
2281 | |
2282 return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02
* (a21 * a10 - a11 * a20); | |
2283 }; | |
2284 | |
2285 /** | |
2286 * Multiplies two mat3's | |
2287 * | |
2288 * @param {mat3} out the receiving matrix | |
2289 * @param {mat3} a the first operand | |
2290 * @param {mat3} b the second operand | |
2291 * @returns {mat3} out | |
2292 */ | |
2293 mat3.multiply = function (out, a, b) { | |
2294 var a00 = a[0], a01 = a[1], a02 = a[2], | |
2295 a10 = a[3], a11 = a[4], a12 = a[5], | |
2296 a20 = a[6], a21 = a[7], a22 = a[8], | |
2297 | |
2298 b00 = b[0], b01 = b[1], b02 = b[2], | |
2299 b10 = b[3], b11 = b[4], b12 = b[5], | |
2300 b20 = b[6], b21 = b[7], b22 = b[8]; | |
2301 | |
2302 out[0] = b00 * a00 + b01 * a10 + b02 * a20; | |
2303 out[1] = b00 * a01 + b01 * a11 + b02 * a21; | |
2304 out[2] = b00 * a02 + b01 * a12 + b02 * a22; | |
2305 | |
2306 out[3] = b10 * a00 + b11 * a10 + b12 * a20; | |
2307 out[4] = b10 * a01 + b11 * a11 + b12 * a21; | |
2308 out[5] = b10 * a02 + b11 * a12 + b12 * a22; | |
2309 | |
2310 out[6] = b20 * a00 + b21 * a10 + b22 * a20; | |
2311 out[7] = b20 * a01 + b21 * a11 + b22 * a21; | |
2312 out[8] = b20 * a02 + b21 * a12 + b22 * a22; | |
2313 return out; | |
2314 }; | |
2315 | |
2316 /** | |
2317 * Alias for {@link mat3.multiply} | |
2318 * @function | |
2319 */ | |
2320 mat3.mul = mat3.multiply; | |
2321 | |
2322 /** | |
2323 * Translate a mat3 by the given vector | |
2324 * | |
2325 * @param {mat3} out the receiving matrix | |
2326 * @param {mat3} a the matrix to translate | |
2327 * @param {vec2} v vector to translate by | |
2328 * @returns {mat3} out | |
2329 */ | |
2330 mat3.translate = function(out, a, v) { | |
2331 var a00 = a[0], a01 = a[1], a02 = a[2], | |
2332 a10 = a[3], a11 = a[4], a12 = a[5], | |
2333 a20 = a[6], a21 = a[7], a22 = a[8], | |
2334 x = v[0], y = v[1]; | |
2335 | |
2336 out[0] = a00; | |
2337 out[1] = a01; | |
2338 out[2] = a02; | |
2339 | |
2340 out[3] = a10; | |
2341 out[4] = a11; | |
2342 out[5] = a12; | |
2343 | |
2344 out[6] = x * a00 + y * a10 + a20; | |
2345 out[7] = x * a01 + y * a11 + a21; | |
2346 out[8] = x * a02 + y * a12 + a22; | |
2347 return out; | |
2348 }; | |
2349 | |
2350 /** | |
2351 * Rotates a mat3 by the given angle | |
2352 * | |
2353 * @param {mat3} out the receiving matrix | |
2354 * @param {mat3} a the matrix to rotate | |
2355 * @param {Number} rad the angle to rotate the matrix by | |
2356 * @returns {mat3} out | |
2357 */ | |
2358 mat3.rotate = function (out, a, rad) { | |
2359 var a00 = a[0], a01 = a[1], a02 = a[2], | |
2360 a10 = a[3], a11 = a[4], a12 = a[5], | |
2361 a20 = a[6], a21 = a[7], a22 = a[8], | |
2362 | |
2363 s = Math.sin(rad), | |
2364 c = Math.cos(rad); | |
2365 | |
2366 out[0] = c * a00 + s * a10; | |
2367 out[1] = c * a01 + s * a11; | |
2368 out[2] = c * a02 + s * a12; | |
2369 | |
2370 out[3] = c * a10 - s * a00; | |
2371 out[4] = c * a11 - s * a01; | |
2372 out[5] = c * a12 - s * a02; | |
2373 | |
2374 out[6] = a20; | |
2375 out[7] = a21; | |
2376 out[8] = a22; | |
2377 return out; | |
2378 }; | |
2379 | |
2380 /** | |
2381 * Scales the mat3 by the dimensions in the given vec2 | |
2382 * | |
2383 * @param {mat3} out the receiving matrix | |
2384 * @param {mat3} a the matrix to rotate | |
2385 * @param {vec2} v the vec2 to scale the matrix by | |
2386 * @returns {mat3} out | |
2387 **/ | |
2388 mat3.scale = function(out, a, v) { | |
2389 var x = v[0], y = v[2]; | |
2390 | |
2391 out[0] = x * a[0]; | |
2392 out[1] = x * a[1]; | |
2393 out[2] = x * a[2]; | |
2394 | |
2395 out[3] = y * a[3]; | |
2396 out[4] = y * a[4]; | |
2397 out[5] = y * a[5]; | |
2398 | |
2399 out[6] = a[6]; | |
2400 out[7] = a[7]; | |
2401 out[8] = a[8]; | |
2402 return out; | |
2403 }; | |
2404 | |
2405 /** | |
2406 * Copies the values from a mat2d into a mat3 | |
2407 * | |
2408 * @param {mat3} out the receiving matrix | |
2409 * @param {mat3} a the matrix to rotate | |
2410 * @param {vec2} v the vec2 to scale the matrix by | |
2411 * @returns {mat3} out | |
2412 **/ | |
2413 mat3.fromMat2d = function(out, a) { | |
2414 out[0] = a[0]; | |
2415 out[1] = a[1]; | |
2416 out[2] = 0; | |
2417 | |
2418 out[3] = a[2]; | |
2419 out[4] = a[3]; | |
2420 out[5] = 0; | |
2421 | |
2422 out[6] = a[4]; | |
2423 out[7] = a[5]; | |
2424 out[8] = 1; | |
2425 return out; | |
2426 }; | |
2427 | |
2428 /** | |
2429 * Calculates a 3x3 matrix from the given quaternion | |
2430 * | |
2431 * @param {mat3} out mat3 receiving operation result | |
2432 * @param {quat} q Quaternion to create matrix from | |
2433 * | |
2434 * @returns {mat3} out | |
2435 */ | |
2436 mat3.fromQuat = function (out, q) { | |
2437 var x = q[0], y = q[1], z = q[2], w = q[3], | |
2438 x2 = x + x, | |
2439 y2 = y + y, | |
2440 z2 = z + z, | |
2441 | |
2442 xx = x * x2, | |
2443 xy = x * y2, | |
2444 xz = x * z2, | |
2445 yy = y * y2, | |
2446 yz = y * z2, | |
2447 zz = z * z2, | |
2448 wx = w * x2, | |
2449 wy = w * y2, | |
2450 wz = w * z2; | |
2451 | |
2452 out[0] = 1 - (yy + zz); | |
2453 out[1] = xy + wz; | |
2454 out[2] = xz - wy; | |
2455 | |
2456 out[3] = xy - wz; | |
2457 out[4] = 1 - (xx + zz); | |
2458 out[5] = yz + wx; | |
2459 | |
2460 out[6] = xz + wy; | |
2461 out[7] = yz - wx; | |
2462 out[8] = 1 - (xx + yy); | |
2463 | |
2464 return out; | |
2465 }; | |
2466 | |
2467 /** | |
2468 * Returns a string representation of a mat3 | |
2469 * | |
2470 * @param {mat3} mat matrix to represent as a string | |
2471 * @returns {String} string representation of the matrix | |
2472 */ | |
2473 mat3.str = function (a) { | |
2474 return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + | |
2475 a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + | |
2476 a[6] + ', ' + a[7] + ', ' + a[8] + ')'; | |
2477 }; | |
2478 | |
2479 if(typeof(exports) !== 'undefined') { | |
2480 exports.mat3 = mat3; | |
2481 } | |
2482 ; | |
2483 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
2484 | |
2485 Redistribution and use in source and binary forms, with or without modification, | |
2486 are permitted provided that the following conditions are met: | |
2487 | |
2488 * Redistributions of source code must retain the above copyright notice, this | |
2489 list of conditions and the following disclaimer. | |
2490 * Redistributions in binary form must reproduce the above copyright notice, | |
2491 this list of conditions and the following disclaimer in the documentation | |
2492 and/or other materials provided with the distribution. | |
2493 | |
2494 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
2495 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
2496 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
2497 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
2498 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
2499 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
2500 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
2501 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
2502 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
2503 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
2504 | |
2505 /** | |
2506 * @class 4x4 Matrix | |
2507 * @name mat4 | |
2508 */ | |
2509 | |
2510 var mat4 = {}; | |
2511 | |
2512 /** | |
2513 * Creates a new identity mat4 | |
2514 * | |
2515 * @returns {mat4} a new 4x4 matrix | |
2516 */ | |
2517 mat4.create = function() { | |
2518 var out = new GLMAT_ARRAY_TYPE(16); | |
2519 out[0] = 1; | |
2520 out[1] = 0; | |
2521 out[2] = 0; | |
2522 out[3] = 0; | |
2523 out[4] = 0; | |
2524 out[5] = 1; | |
2525 out[6] = 0; | |
2526 out[7] = 0; | |
2527 out[8] = 0; | |
2528 out[9] = 0; | |
2529 out[10] = 1; | |
2530 out[11] = 0; | |
2531 out[12] = 0; | |
2532 out[13] = 0; | |
2533 out[14] = 0; | |
2534 out[15] = 1; | |
2535 return out; | |
2536 }; | |
2537 | |
2538 /** | |
2539 * Creates a new mat4 initialized with values from an existing matrix | |
2540 * | |
2541 * @param {mat4} a matrix to clone | |
2542 * @returns {mat4} a new 4x4 matrix | |
2543 */ | |
2544 mat4.clone = function(a) { | |
2545 var out = new GLMAT_ARRAY_TYPE(16); | |
2546 out[0] = a[0]; | |
2547 out[1] = a[1]; | |
2548 out[2] = a[2]; | |
2549 out[3] = a[3]; | |
2550 out[4] = a[4]; | |
2551 out[5] = a[5]; | |
2552 out[6] = a[6]; | |
2553 out[7] = a[7]; | |
2554 out[8] = a[8]; | |
2555 out[9] = a[9]; | |
2556 out[10] = a[10]; | |
2557 out[11] = a[11]; | |
2558 out[12] = a[12]; | |
2559 out[13] = a[13]; | |
2560 out[14] = a[14]; | |
2561 out[15] = a[15]; | |
2562 return out; | |
2563 }; | |
2564 | |
2565 /** | |
2566 * Copy the values from one mat4 to another | |
2567 * | |
2568 * @param {mat4} out the receiving matrix | |
2569 * @param {mat4} a the source matrix | |
2570 * @returns {mat4} out | |
2571 */ | |
2572 mat4.copy = function(out, a) { | |
2573 out[0] = a[0]; | |
2574 out[1] = a[1]; | |
2575 out[2] = a[2]; | |
2576 out[3] = a[3]; | |
2577 out[4] = a[4]; | |
2578 out[5] = a[5]; | |
2579 out[6] = a[6]; | |
2580 out[7] = a[7]; | |
2581 out[8] = a[8]; | |
2582 out[9] = a[9]; | |
2583 out[10] = a[10]; | |
2584 out[11] = a[11]; | |
2585 out[12] = a[12]; | |
2586 out[13] = a[13]; | |
2587 out[14] = a[14]; | |
2588 out[15] = a[15]; | |
2589 return out; | |
2590 }; | |
2591 | |
2592 /** | |
2593 * Set a mat4 to the identity matrix | |
2594 * | |
2595 * @param {mat4} out the receiving matrix | |
2596 * @returns {mat4} out | |
2597 */ | |
2598 mat4.identity = function(out) { | |
2599 out[0] = 1; | |
2600 out[1] = 0; | |
2601 out[2] = 0; | |
2602 out[3] = 0; | |
2603 out[4] = 0; | |
2604 out[5] = 1; | |
2605 out[6] = 0; | |
2606 out[7] = 0; | |
2607 out[8] = 0; | |
2608 out[9] = 0; | |
2609 out[10] = 1; | |
2610 out[11] = 0; | |
2611 out[12] = 0; | |
2612 out[13] = 0; | |
2613 out[14] = 0; | |
2614 out[15] = 1; | |
2615 return out; | |
2616 }; | |
2617 | |
2618 /** | |
2619 * Transpose the values of a mat4 | |
2620 * | |
2621 * @param {mat4} out the receiving matrix | |
2622 * @param {mat4} a the source matrix | |
2623 * @returns {mat4} out | |
2624 */ | |
2625 mat4.transpose = function(out, a) { | |
2626 // If we are transposing ourselves we can skip a few steps but have to cache
some values | |
2627 if (out === a) { | |
2628 var a01 = a[1], a02 = a[2], a03 = a[3], | |
2629 a12 = a[6], a13 = a[7], | |
2630 a23 = a[11]; | |
2631 | |
2632 out[1] = a[4]; | |
2633 out[2] = a[8]; | |
2634 out[3] = a[12]; | |
2635 out[4] = a01; | |
2636 out[6] = a[9]; | |
2637 out[7] = a[13]; | |
2638 out[8] = a02; | |
2639 out[9] = a12; | |
2640 out[11] = a[14]; | |
2641 out[12] = a03; | |
2642 out[13] = a13; | |
2643 out[14] = a23; | |
2644 } else { | |
2645 out[0] = a[0]; | |
2646 out[1] = a[4]; | |
2647 out[2] = a[8]; | |
2648 out[3] = a[12]; | |
2649 out[4] = a[1]; | |
2650 out[5] = a[5]; | |
2651 out[6] = a[9]; | |
2652 out[7] = a[13]; | |
2653 out[8] = a[2]; | |
2654 out[9] = a[6]; | |
2655 out[10] = a[10]; | |
2656 out[11] = a[14]; | |
2657 out[12] = a[3]; | |
2658 out[13] = a[7]; | |
2659 out[14] = a[11]; | |
2660 out[15] = a[15]; | |
2661 } | |
2662 | |
2663 return out; | |
2664 }; | |
2665 | |
2666 /** | |
2667 * Inverts a mat4 | |
2668 * | |
2669 * @param {mat4} out the receiving matrix | |
2670 * @param {mat4} a the source matrix | |
2671 * @returns {mat4} out | |
2672 */ | |
2673 mat4.invert = function(out, a) { | |
2674 var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], | |
2675 a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], | |
2676 a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], | |
2677 a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], | |
2678 | |
2679 b00 = a00 * a11 - a01 * a10, | |
2680 b01 = a00 * a12 - a02 * a10, | |
2681 b02 = a00 * a13 - a03 * a10, | |
2682 b03 = a01 * a12 - a02 * a11, | |
2683 b04 = a01 * a13 - a03 * a11, | |
2684 b05 = a02 * a13 - a03 * a12, | |
2685 b06 = a20 * a31 - a21 * a30, | |
2686 b07 = a20 * a32 - a22 * a30, | |
2687 b08 = a20 * a33 - a23 * a30, | |
2688 b09 = a21 * a32 - a22 * a31, | |
2689 b10 = a21 * a33 - a23 * a31, | |
2690 b11 = a22 * a33 - a23 * a32, | |
2691 | |
2692 // Calculate the determinant | |
2693 det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 *
b06; | |
2694 | |
2695 if (!det) { | |
2696 return null; | |
2697 } | |
2698 det = 1.0 / det; | |
2699 | |
2700 out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; | |
2701 out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; | |
2702 out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; | |
2703 out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; | |
2704 out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; | |
2705 out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; | |
2706 out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; | |
2707 out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; | |
2708 out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; | |
2709 out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; | |
2710 out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; | |
2711 out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; | |
2712 out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; | |
2713 out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; | |
2714 out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; | |
2715 out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; | |
2716 | |
2717 return out; | |
2718 }; | |
2719 | |
2720 /** | |
2721 * Calculates the adjugate of a mat4 | |
2722 * | |
2723 * @param {mat4} out the receiving matrix | |
2724 * @param {mat4} a the source matrix | |
2725 * @returns {mat4} out | |
2726 */ | |
2727 mat4.adjoint = function(out, a) { | |
2728 var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], | |
2729 a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], | |
2730 a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], | |
2731 a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; | |
2732 | |
2733 out[0] = (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) +
a31 * (a12 * a23 - a13 * a22)); | |
2734 out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) +
a31 * (a02 * a23 - a03 * a22)); | |
2735 out[2] = (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) +
a31 * (a02 * a13 - a03 * a12)); | |
2736 out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) +
a21 * (a02 * a13 - a03 * a12)); | |
2737 out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) +
a30 * (a12 * a23 - a13 * a22)); | |
2738 out[5] = (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) +
a30 * (a02 * a23 - a03 * a22)); | |
2739 out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) +
a30 * (a02 * a13 - a03 * a12)); | |
2740 out[7] = (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) +
a20 * (a02 * a13 - a03 * a12)); | |
2741 out[8] = (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) +
a30 * (a11 * a23 - a13 * a21)); | |
2742 out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) +
a30 * (a01 * a23 - a03 * a21)); | |
2743 out[10] = (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) +
a30 * (a01 * a13 - a03 * a11)); | |
2744 out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) +
a20 * (a01 * a13 - a03 * a11)); | |
2745 out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) +
a30 * (a11 * a22 - a12 * a21)); | |
2746 out[13] = (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) +
a30 * (a01 * a22 - a02 * a21)); | |
2747 out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) +
a30 * (a01 * a12 - a02 * a11)); | |
2748 out[15] = (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) +
a20 * (a01 * a12 - a02 * a11)); | |
2749 return out; | |
2750 }; | |
2751 | |
2752 /** | |
2753 * Calculates the determinant of a mat4 | |
2754 * | |
2755 * @param {mat4} a the source matrix | |
2756 * @returns {Number} determinant of a | |
2757 */ | |
2758 mat4.determinant = function (a) { | |
2759 var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], | |
2760 a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], | |
2761 a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], | |
2762 a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], | |
2763 | |
2764 b00 = a00 * a11 - a01 * a10, | |
2765 b01 = a00 * a12 - a02 * a10, | |
2766 b02 = a00 * a13 - a03 * a10, | |
2767 b03 = a01 * a12 - a02 * a11, | |
2768 b04 = a01 * a13 - a03 * a11, | |
2769 b05 = a02 * a13 - a03 * a12, | |
2770 b06 = a20 * a31 - a21 * a30, | |
2771 b07 = a20 * a32 - a22 * a30, | |
2772 b08 = a20 * a33 - a23 * a30, | |
2773 b09 = a21 * a32 - a22 * a31, | |
2774 b10 = a21 * a33 - a23 * a31, | |
2775 b11 = a22 * a33 - a23 * a32; | |
2776 | |
2777 // Calculate the determinant | |
2778 return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06
; | |
2779 }; | |
2780 | |
2781 /** | |
2782 * Multiplies two mat4's | |
2783 * | |
2784 * @param {mat4} out the receiving matrix | |
2785 * @param {mat4} a the first operand | |
2786 * @param {mat4} b the second operand | |
2787 * @returns {mat4} out | |
2788 */ | |
2789 mat4.multiply = function (out, a, b) { | |
2790 var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], | |
2791 a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], | |
2792 a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], | |
2793 a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; | |
2794 | |
2795 // Cache only the current line of the second matrix | |
2796 var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; | |
2797 out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30; | |
2798 out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31; | |
2799 out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32; | |
2800 out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33; | |
2801 | |
2802 b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; | |
2803 out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30; | |
2804 out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31; | |
2805 out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32; | |
2806 out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33; | |
2807 | |
2808 b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; | |
2809 out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30; | |
2810 out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31; | |
2811 out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32; | |
2812 out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33; | |
2813 | |
2814 b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; | |
2815 out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30; | |
2816 out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31; | |
2817 out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32; | |
2818 out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; | |
2819 return out; | |
2820 }; | |
2821 | |
2822 /** | |
2823 * Alias for {@link mat4.multiply} | |
2824 * @function | |
2825 */ | |
2826 mat4.mul = mat4.multiply; | |
2827 | |
2828 /** | |
2829 * Translate a mat4 by the given vector | |
2830 * | |
2831 * @param {mat4} out the receiving matrix | |
2832 * @param {mat4} a the matrix to translate | |
2833 * @param {vec3} v vector to translate by | |
2834 * @returns {mat4} out | |
2835 */ | |
2836 mat4.translate = function (out, a, v) { | |
2837 var x = v[0], y = v[1], z = v[2], | |
2838 a00, a01, a02, a03, | |
2839 a10, a11, a12, a13, | |
2840 a20, a21, a22, a23; | |
2841 | |
2842 if (a === out) { | |
2843 out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; | |
2844 out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; | |
2845 out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; | |
2846 out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; | |
2847 } else { | |
2848 a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; | |
2849 a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; | |
2850 a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; | |
2851 | |
2852 out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; | |
2853 out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; | |
2854 out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; | |
2855 | |
2856 out[12] = a00 * x + a10 * y + a20 * z + a[12]; | |
2857 out[13] = a01 * x + a11 * y + a21 * z + a[13]; | |
2858 out[14] = a02 * x + a12 * y + a22 * z + a[14]; | |
2859 out[15] = a03 * x + a13 * y + a23 * z + a[15]; | |
2860 } | |
2861 | |
2862 return out; | |
2863 }; | |
2864 | |
2865 /** | |
2866 * Scales the mat4 by the dimensions in the given vec3 | |
2867 * | |
2868 * @param {mat4} out the receiving matrix | |
2869 * @param {mat4} a the matrix to scale | |
2870 * @param {vec3} v the vec3 to scale the matrix by | |
2871 * @returns {mat4} out | |
2872 **/ | |
2873 mat4.scale = function(out, a, v) { | |
2874 var x = v[0], y = v[1], z = v[2]; | |
2875 | |
2876 out[0] = a[0] * x; | |
2877 out[1] = a[1] * x; | |
2878 out[2] = a[2] * x; | |
2879 out[3] = a[3] * x; | |
2880 out[4] = a[4] * y; | |
2881 out[5] = a[5] * y; | |
2882 out[6] = a[6] * y; | |
2883 out[7] = a[7] * y; | |
2884 out[8] = a[8] * z; | |
2885 out[9] = a[9] * z; | |
2886 out[10] = a[10] * z; | |
2887 out[11] = a[11] * z; | |
2888 out[12] = a[12]; | |
2889 out[13] = a[13]; | |
2890 out[14] = a[14]; | |
2891 out[15] = a[15]; | |
2892 return out; | |
2893 }; | |
2894 | |
2895 /** | |
2896 * Rotates a mat4 by the given angle | |
2897 * | |
2898 * @param {mat4} out the receiving matrix | |
2899 * @param {mat4} a the matrix to rotate | |
2900 * @param {Number} rad the angle to rotate the matrix by | |
2901 * @param {vec3} axis the axis to rotate around | |
2902 * @returns {mat4} out | |
2903 */ | |
2904 mat4.rotate = function (out, a, rad, axis) { | |
2905 var x = axis[0], y = axis[1], z = axis[2], | |
2906 len = Math.sqrt(x * x + y * y + z * z), | |
2907 s, c, t, | |
2908 a00, a01, a02, a03, | |
2909 a10, a11, a12, a13, | |
2910 a20, a21, a22, a23, | |
2911 b00, b01, b02, | |
2912 b10, b11, b12, | |
2913 b20, b21, b22; | |
2914 | |
2915 if (Math.abs(len) < GLMAT_EPSILON) { return null; } | |
2916 | |
2917 len = 1 / len; | |
2918 x *= len; | |
2919 y *= len; | |
2920 z *= len; | |
2921 | |
2922 s = Math.sin(rad); | |
2923 c = Math.cos(rad); | |
2924 t = 1 - c; | |
2925 | |
2926 a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; | |
2927 a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; | |
2928 a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; | |
2929 | |
2930 // Construct the elements of the rotation matrix | |
2931 b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; | |
2932 b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; | |
2933 b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; | |
2934 | |
2935 // Perform rotation-specific matrix multiplication | |
2936 out[0] = a00 * b00 + a10 * b01 + a20 * b02; | |
2937 out[1] = a01 * b00 + a11 * b01 + a21 * b02; | |
2938 out[2] = a02 * b00 + a12 * b01 + a22 * b02; | |
2939 out[3] = a03 * b00 + a13 * b01 + a23 * b02; | |
2940 out[4] = a00 * b10 + a10 * b11 + a20 * b12; | |
2941 out[5] = a01 * b10 + a11 * b11 + a21 * b12; | |
2942 out[6] = a02 * b10 + a12 * b11 + a22 * b12; | |
2943 out[7] = a03 * b10 + a13 * b11 + a23 * b12; | |
2944 out[8] = a00 * b20 + a10 * b21 + a20 * b22; | |
2945 out[9] = a01 * b20 + a11 * b21 + a21 * b22; | |
2946 out[10] = a02 * b20 + a12 * b21 + a22 * b22; | |
2947 out[11] = a03 * b20 + a13 * b21 + a23 * b22; | |
2948 | |
2949 if (a !== out) { // If the source and destination differ, copy the unchanged
last row | |
2950 out[12] = a[12]; | |
2951 out[13] = a[13]; | |
2952 out[14] = a[14]; | |
2953 out[15] = a[15]; | |
2954 } | |
2955 return out; | |
2956 }; | |
2957 | |
2958 /** | |
2959 * Rotates a matrix by the given angle around the X axis | |
2960 * | |
2961 * @param {mat4} out the receiving matrix | |
2962 * @param {mat4} a the matrix to rotate | |
2963 * @param {Number} rad the angle to rotate the matrix by | |
2964 * @returns {mat4} out | |
2965 */ | |
2966 mat4.rotateX = function (out, a, rad) { | |
2967 var s = Math.sin(rad), | |
2968 c = Math.cos(rad), | |
2969 a10 = a[4], | |
2970 a11 = a[5], | |
2971 a12 = a[6], | |
2972 a13 = a[7], | |
2973 a20 = a[8], | |
2974 a21 = a[9], | |
2975 a22 = a[10], | |
2976 a23 = a[11]; | |
2977 | |
2978 if (a !== out) { // If the source and destination differ, copy the unchanged
rows | |
2979 out[0] = a[0]; | |
2980 out[1] = a[1]; | |
2981 out[2] = a[2]; | |
2982 out[3] = a[3]; | |
2983 out[12] = a[12]; | |
2984 out[13] = a[13]; | |
2985 out[14] = a[14]; | |
2986 out[15] = a[15]; | |
2987 } | |
2988 | |
2989 // Perform axis-specific matrix multiplication | |
2990 out[4] = a10 * c + a20 * s; | |
2991 out[5] = a11 * c + a21 * s; | |
2992 out[6] = a12 * c + a22 * s; | |
2993 out[7] = a13 * c + a23 * s; | |
2994 out[8] = a20 * c - a10 * s; | |
2995 out[9] = a21 * c - a11 * s; | |
2996 out[10] = a22 * c - a12 * s; | |
2997 out[11] = a23 * c - a13 * s; | |
2998 return out; | |
2999 }; | |
3000 | |
3001 /** | |
3002 * Rotates a matrix by the given angle around the Y axis | |
3003 * | |
3004 * @param {mat4} out the receiving matrix | |
3005 * @param {mat4} a the matrix to rotate | |
3006 * @param {Number} rad the angle to rotate the matrix by | |
3007 * @returns {mat4} out | |
3008 */ | |
3009 mat4.rotateY = function (out, a, rad) { | |
3010 var s = Math.sin(rad), | |
3011 c = Math.cos(rad), | |
3012 a00 = a[0], | |
3013 a01 = a[1], | |
3014 a02 = a[2], | |
3015 a03 = a[3], | |
3016 a20 = a[8], | |
3017 a21 = a[9], | |
3018 a22 = a[10], | |
3019 a23 = a[11]; | |
3020 | |
3021 if (a !== out) { // If the source and destination differ, copy the unchanged
rows | |
3022 out[4] = a[4]; | |
3023 out[5] = a[5]; | |
3024 out[6] = a[6]; | |
3025 out[7] = a[7]; | |
3026 out[12] = a[12]; | |
3027 out[13] = a[13]; | |
3028 out[14] = a[14]; | |
3029 out[15] = a[15]; | |
3030 } | |
3031 | |
3032 // Perform axis-specific matrix multiplication | |
3033 out[0] = a00 * c - a20 * s; | |
3034 out[1] = a01 * c - a21 * s; | |
3035 out[2] = a02 * c - a22 * s; | |
3036 out[3] = a03 * c - a23 * s; | |
3037 out[8] = a00 * s + a20 * c; | |
3038 out[9] = a01 * s + a21 * c; | |
3039 out[10] = a02 * s + a22 * c; | |
3040 out[11] = a03 * s + a23 * c; | |
3041 return out; | |
3042 }; | |
3043 | |
3044 /** | |
3045 * Rotates a matrix by the given angle around the Z axis | |
3046 * | |
3047 * @param {mat4} out the receiving matrix | |
3048 * @param {mat4} a the matrix to rotate | |
3049 * @param {Number} rad the angle to rotate the matrix by | |
3050 * @returns {mat4} out | |
3051 */ | |
3052 mat4.rotateZ = function (out, a, rad) { | |
3053 var s = Math.sin(rad), | |
3054 c = Math.cos(rad), | |
3055 a00 = a[0], | |
3056 a01 = a[1], | |
3057 a02 = a[2], | |
3058 a03 = a[3], | |
3059 a10 = a[4], | |
3060 a11 = a[5], | |
3061 a12 = a[6], | |
3062 a13 = a[7]; | |
3063 | |
3064 if (a !== out) { // If the source and destination differ, copy the unchanged
last row | |
3065 out[8] = a[8]; | |
3066 out[9] = a[9]; | |
3067 out[10] = a[10]; | |
3068 out[11] = a[11]; | |
3069 out[12] = a[12]; | |
3070 out[13] = a[13]; | |
3071 out[14] = a[14]; | |
3072 out[15] = a[15]; | |
3073 } | |
3074 | |
3075 // Perform axis-specific matrix multiplication | |
3076 out[0] = a00 * c + a10 * s; | |
3077 out[1] = a01 * c + a11 * s; | |
3078 out[2] = a02 * c + a12 * s; | |
3079 out[3] = a03 * c + a13 * s; | |
3080 out[4] = a10 * c - a00 * s; | |
3081 out[5] = a11 * c - a01 * s; | |
3082 out[6] = a12 * c - a02 * s; | |
3083 out[7] = a13 * c - a03 * s; | |
3084 return out; | |
3085 }; | |
3086 | |
3087 /** | |
3088 * Creates a matrix from a quaternion rotation and vector translation | |
3089 * This is equivalent to (but much faster than): | |
3090 * | |
3091 * mat4.identity(dest); | |
3092 * mat4.translate(dest, vec); | |
3093 * var quatMat = mat4.create(); | |
3094 * quat4.toMat4(quat, quatMat); | |
3095 * mat4.multiply(dest, quatMat); | |
3096 * | |
3097 * @param {mat4} out mat4 receiving operation result | |
3098 * @param {quat4} q Rotation quaternion | |
3099 * @param {vec3} v Translation vector | |
3100 * @returns {mat4} out | |
3101 */ | |
3102 mat4.fromRotationTranslation = function (out, q, v) { | |
3103 // Quaternion math | |
3104 var x = q[0], y = q[1], z = q[2], w = q[3], | |
3105 x2 = x + x, | |
3106 y2 = y + y, | |
3107 z2 = z + z, | |
3108 | |
3109 xx = x * x2, | |
3110 xy = x * y2, | |
3111 xz = x * z2, | |
3112 yy = y * y2, | |
3113 yz = y * z2, | |
3114 zz = z * z2, | |
3115 wx = w * x2, | |
3116 wy = w * y2, | |
3117 wz = w * z2; | |
3118 | |
3119 out[0] = 1 - (yy + zz); | |
3120 out[1] = xy + wz; | |
3121 out[2] = xz - wy; | |
3122 out[3] = 0; | |
3123 out[4] = xy - wz; | |
3124 out[5] = 1 - (xx + zz); | |
3125 out[6] = yz + wx; | |
3126 out[7] = 0; | |
3127 out[8] = xz + wy; | |
3128 out[9] = yz - wx; | |
3129 out[10] = 1 - (xx + yy); | |
3130 out[11] = 0; | |
3131 out[12] = v[0]; | |
3132 out[13] = v[1]; | |
3133 out[14] = v[2]; | |
3134 out[15] = 1; | |
3135 | |
3136 return out; | |
3137 }; | |
3138 | |
3139 /** | |
3140 * Calculates a 4x4 matrix from the given quaternion | |
3141 * | |
3142 * @param {mat4} out mat4 receiving operation result | |
3143 * @param {quat} q Quaternion to create matrix from | |
3144 * | |
3145 * @returns {mat4} out | |
3146 */ | |
3147 mat4.fromQuat = function (out, q) { | |
3148 var x = q[0], y = q[1], z = q[2], w = q[3], | |
3149 x2 = x + x, | |
3150 y2 = y + y, | |
3151 z2 = z + z, | |
3152 | |
3153 xx = x * x2, | |
3154 xy = x * y2, | |
3155 xz = x * z2, | |
3156 yy = y * y2, | |
3157 yz = y * z2, | |
3158 zz = z * z2, | |
3159 wx = w * x2, | |
3160 wy = w * y2, | |
3161 wz = w * z2; | |
3162 | |
3163 out[0] = 1 - (yy + zz); | |
3164 out[1] = xy + wz; | |
3165 out[2] = xz - wy; | |
3166 out[3] = 0; | |
3167 | |
3168 out[4] = xy - wz; | |
3169 out[5] = 1 - (xx + zz); | |
3170 out[6] = yz + wx; | |
3171 out[7] = 0; | |
3172 | |
3173 out[8] = xz + wy; | |
3174 out[9] = yz - wx; | |
3175 out[10] = 1 - (xx + yy); | |
3176 out[11] = 0; | |
3177 | |
3178 out[12] = 0; | |
3179 out[13] = 0; | |
3180 out[14] = 0; | |
3181 out[15] = 1; | |
3182 | |
3183 return out; | |
3184 }; | |
3185 | |
3186 /** | |
3187 * Generates a frustum matrix with the given bounds | |
3188 * | |
3189 * @param {mat4} out mat4 frustum matrix will be written into | |
3190 * @param {Number} left Left bound of the frustum | |
3191 * @param {Number} right Right bound of the frustum | |
3192 * @param {Number} bottom Bottom bound of the frustum | |
3193 * @param {Number} top Top bound of the frustum | |
3194 * @param {Number} near Near bound of the frustum | |
3195 * @param {Number} far Far bound of the frustum | |
3196 * @returns {mat4} out | |
3197 */ | |
3198 mat4.frustum = function (out, left, right, bottom, top, near, far) { | |
3199 var rl = 1 / (right - left), | |
3200 tb = 1 / (top - bottom), | |
3201 nf = 1 / (near - far); | |
3202 out[0] = (near * 2) * rl; | |
3203 out[1] = 0; | |
3204 out[2] = 0; | |
3205 out[3] = 0; | |
3206 out[4] = 0; | |
3207 out[5] = (near * 2) * tb; | |
3208 out[6] = 0; | |
3209 out[7] = 0; | |
3210 out[8] = (right + left) * rl; | |
3211 out[9] = (top + bottom) * tb; | |
3212 out[10] = (far + near) * nf; | |
3213 out[11] = -1; | |
3214 out[12] = 0; | |
3215 out[13] = 0; | |
3216 out[14] = (far * near * 2) * nf; | |
3217 out[15] = 0; | |
3218 return out; | |
3219 }; | |
3220 | |
3221 /** | |
3222 * Generates a perspective projection matrix with the given bounds | |
3223 * | |
3224 * @param {mat4} out mat4 frustum matrix will be written into | |
3225 * @param {number} fovy Vertical field of view in radians | |
3226 * @param {number} aspect Aspect ratio. typically viewport width/height | |
3227 * @param {number} near Near bound of the frustum | |
3228 * @param {number} far Far bound of the frustum | |
3229 * @returns {mat4} out | |
3230 */ | |
3231 mat4.perspective = function (out, fovy, aspect, near, far) { | |
3232 var f = 1.0 / Math.tan(fovy / 2), | |
3233 nf = 1 / (near - far); | |
3234 out[0] = f / aspect; | |
3235 out[1] = 0; | |
3236 out[2] = 0; | |
3237 out[3] = 0; | |
3238 out[4] = 0; | |
3239 out[5] = f; | |
3240 out[6] = 0; | |
3241 out[7] = 0; | |
3242 out[8] = 0; | |
3243 out[9] = 0; | |
3244 out[10] = (far + near) * nf; | |
3245 out[11] = -1; | |
3246 out[12] = 0; | |
3247 out[13] = 0; | |
3248 out[14] = (2 * far * near) * nf; | |
3249 out[15] = 0; | |
3250 return out; | |
3251 }; | |
3252 | |
3253 /** | |
3254 * Generates a orthogonal projection matrix with the given bounds | |
3255 * | |
3256 * @param {mat4} out mat4 frustum matrix will be written into | |
3257 * @param {number} left Left bound of the frustum | |
3258 * @param {number} right Right bound of the frustum | |
3259 * @param {number} bottom Bottom bound of the frustum | |
3260 * @param {number} top Top bound of the frustum | |
3261 * @param {number} near Near bound of the frustum | |
3262 * @param {number} far Far bound of the frustum | |
3263 * @returns {mat4} out | |
3264 */ | |
3265 mat4.ortho = function (out, left, right, bottom, top, near, far) { | |
3266 var lr = 1 / (left - right), | |
3267 bt = 1 / (bottom - top), | |
3268 nf = 1 / (near - far); | |
3269 out[0] = -2 * lr; | |
3270 out[1] = 0; | |
3271 out[2] = 0; | |
3272 out[3] = 0; | |
3273 out[4] = 0; | |
3274 out[5] = -2 * bt; | |
3275 out[6] = 0; | |
3276 out[7] = 0; | |
3277 out[8] = 0; | |
3278 out[9] = 0; | |
3279 out[10] = 2 * nf; | |
3280 out[11] = 0; | |
3281 out[12] = (left + right) * lr; | |
3282 out[13] = (top + bottom) * bt; | |
3283 out[14] = (far + near) * nf; | |
3284 out[15] = 1; | |
3285 return out; | |
3286 }; | |
3287 | |
3288 /** | |
3289 * Generates a look-at matrix with the given eye position, focal point, and up a
xis | |
3290 * | |
3291 * @param {mat4} out mat4 frustum matrix will be written into | |
3292 * @param {vec3} eye Position of the viewer | |
3293 * @param {vec3} center Point the viewer is looking at | |
3294 * @param {vec3} up vec3 pointing up | |
3295 * @returns {mat4} out | |
3296 */ | |
3297 mat4.lookAt = function (out, eye, center, up) { | |
3298 var x0, x1, x2, y0, y1, y2, z0, z1, z2, len, | |
3299 eyex = eye[0], | |
3300 eyey = eye[1], | |
3301 eyez = eye[2], | |
3302 upx = up[0], | |
3303 upy = up[1], | |
3304 upz = up[2], | |
3305 centerx = center[0], | |
3306 centery = center[1], | |
3307 centerz = center[2]; | |
3308 | |
3309 if (Math.abs(eyex - centerx) < GLMAT_EPSILON && | |
3310 Math.abs(eyey - centery) < GLMAT_EPSILON && | |
3311 Math.abs(eyez - centerz) < GLMAT_EPSILON) { | |
3312 return mat4.identity(out); | |
3313 } | |
3314 | |
3315 z0 = eyex - centerx; | |
3316 z1 = eyey - centery; | |
3317 z2 = eyez - centerz; | |
3318 | |
3319 len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2); | |
3320 z0 *= len; | |
3321 z1 *= len; | |
3322 z2 *= len; | |
3323 | |
3324 x0 = upy * z2 - upz * z1; | |
3325 x1 = upz * z0 - upx * z2; | |
3326 x2 = upx * z1 - upy * z0; | |
3327 len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2); | |
3328 if (!len) { | |
3329 x0 = 0; | |
3330 x1 = 0; | |
3331 x2 = 0; | |
3332 } else { | |
3333 len = 1 / len; | |
3334 x0 *= len; | |
3335 x1 *= len; | |
3336 x2 *= len; | |
3337 } | |
3338 | |
3339 y0 = z1 * x2 - z2 * x1; | |
3340 y1 = z2 * x0 - z0 * x2; | |
3341 y2 = z0 * x1 - z1 * x0; | |
3342 | |
3343 len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2); | |
3344 if (!len) { | |
3345 y0 = 0; | |
3346 y1 = 0; | |
3347 y2 = 0; | |
3348 } else { | |
3349 len = 1 / len; | |
3350 y0 *= len; | |
3351 y1 *= len; | |
3352 y2 *= len; | |
3353 } | |
3354 | |
3355 out[0] = x0; | |
3356 out[1] = y0; | |
3357 out[2] = z0; | |
3358 out[3] = 0; | |
3359 out[4] = x1; | |
3360 out[5] = y1; | |
3361 out[6] = z1; | |
3362 out[7] = 0; | |
3363 out[8] = x2; | |
3364 out[9] = y2; | |
3365 out[10] = z2; | |
3366 out[11] = 0; | |
3367 out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); | |
3368 out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); | |
3369 out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); | |
3370 out[15] = 1; | |
3371 | |
3372 return out; | |
3373 }; | |
3374 | |
3375 /** | |
3376 * Returns a string representation of a mat4 | |
3377 * | |
3378 * @param {mat4} mat matrix to represent as a string | |
3379 * @returns {String} string representation of the matrix | |
3380 */ | |
3381 mat4.str = function (a) { | |
3382 return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + | |
3383 a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + | |
3384 a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + | |
3385 a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')'; | |
3386 }; | |
3387 | |
3388 if(typeof(exports) !== 'undefined') { | |
3389 exports.mat4 = mat4; | |
3390 } | |
3391 ; | |
3392 /* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. | |
3393 | |
3394 Redistribution and use in source and binary forms, with or without modification, | |
3395 are permitted provided that the following conditions are met: | |
3396 | |
3397 * Redistributions of source code must retain the above copyright notice, this | |
3398 list of conditions and the following disclaimer. | |
3399 * Redistributions in binary form must reproduce the above copyright notice, | |
3400 this list of conditions and the following disclaimer in the documentation | |
3401 and/or other materials provided with the distribution. | |
3402 | |
3403 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
3404 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
3405 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
3406 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
3407 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
3408 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
3409 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
3410 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
3411 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
3412 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |
3413 | |
3414 /** | |
3415 * @class Quaternion | |
3416 * @name quat | |
3417 */ | |
3418 | |
3419 var quat = {}; | |
3420 | |
3421 /** | |
3422 * Creates a new identity quat | |
3423 * | |
3424 * @returns {quat} a new quaternion | |
3425 */ | |
3426 quat.create = function() { | |
3427 var out = new GLMAT_ARRAY_TYPE(4); | |
3428 out[0] = 0; | |
3429 out[1] = 0; | |
3430 out[2] = 0; | |
3431 out[3] = 1; | |
3432 return out; | |
3433 }; | |
3434 | |
3435 /** | |
3436 * Creates a new quat initialized with values from an existing quaternion | |
3437 * | |
3438 * @param {quat} a quaternion to clone | |
3439 * @returns {quat} a new quaternion | |
3440 * @function | |
3441 */ | |
3442 quat.clone = vec4.clone; | |
3443 | |
3444 /** | |
3445 * Creates a new quat initialized with the given values | |
3446 * | |
3447 * @param {Number} x X component | |
3448 * @param {Number} y Y component | |
3449 * @param {Number} z Z component | |
3450 * @param {Number} w W component | |
3451 * @returns {quat} a new quaternion | |
3452 * @function | |
3453 */ | |
3454 quat.fromValues = vec4.fromValues; | |
3455 | |
3456 /** | |
3457 * Copy the values from one quat to another | |
3458 * | |
3459 * @param {quat} out the receiving quaternion | |
3460 * @param {quat} a the source quaternion | |
3461 * @returns {quat} out | |
3462 * @function | |
3463 */ | |
3464 quat.copy = vec4.copy; | |
3465 | |
3466 /** | |
3467 * Set the components of a quat to the given values | |
3468 * | |
3469 * @param {quat} out the receiving quaternion | |
3470 * @param {Number} x X component | |
3471 * @param {Number} y Y component | |
3472 * @param {Number} z Z component | |
3473 * @param {Number} w W component | |
3474 * @returns {quat} out | |
3475 * @function | |
3476 */ | |
3477 quat.set = vec4.set; | |
3478 | |
3479 /** | |
3480 * Set a quat to the identity quaternion | |
3481 * | |
3482 * @param {quat} out the receiving quaternion | |
3483 * @returns {quat} out | |
3484 */ | |
3485 quat.identity = function(out) { | |
3486 out[0] = 0; | |
3487 out[1] = 0; | |
3488 out[2] = 0; | |
3489 out[3] = 1; | |
3490 return out; | |
3491 }; | |
3492 | |
3493 /** | |
3494 * Sets a quat from the given angle and rotation axis, | |
3495 * then returns it. | |
3496 * | |
3497 * @param {quat} out the receiving quaternion | |
3498 * @param {vec3} axis the axis around which to rotate | |
3499 * @param {Number} rad the angle in radians | |
3500 * @returns {quat} out | |
3501 **/ | |
3502 quat.setAxisAngle = function(out, axis, rad) { | |
3503 rad = rad * 0.5; | |
3504 var s = Math.sin(rad); | |
3505 out[0] = s * axis[0]; | |
3506 out[1] = s * axis[1]; | |
3507 out[2] = s * axis[2]; | |
3508 out[3] = Math.cos(rad); | |
3509 return out; | |
3510 }; | |
3511 | |
3512 /** | |
3513 * Adds two quat's | |
3514 * | |
3515 * @param {quat} out the receiving quaternion | |
3516 * @param {quat} a the first operand | |
3517 * @param {quat} b the second operand | |
3518 * @returns {quat} out | |
3519 * @function | |
3520 */ | |
3521 quat.add = vec4.add; | |
3522 | |
3523 /** | |
3524 * Multiplies two quat's | |
3525 * | |
3526 * @param {quat} out the receiving quaternion | |
3527 * @param {quat} a the first operand | |
3528 * @param {quat} b the second operand | |
3529 * @returns {quat} out | |
3530 */ | |
3531 quat.multiply = function(out, a, b) { | |
3532 var ax = a[0], ay = a[1], az = a[2], aw = a[3], | |
3533 bx = b[0], by = b[1], bz = b[2], bw = b[3]; | |
3534 | |
3535 out[0] = ax * bw + aw * bx + ay * bz - az * by; | |
3536 out[1] = ay * bw + aw * by + az * bx - ax * bz; | |
3537 out[2] = az * bw + aw * bz + ax * by - ay * bx; | |
3538 out[3] = aw * bw - ax * bx - ay * by - az * bz; | |
3539 return out; | |
3540 }; | |
3541 | |
3542 /** | |
3543 * Alias for {@link quat.multiply} | |
3544 * @function | |
3545 */ | |
3546 quat.mul = quat.multiply; | |
3547 | |
3548 /** | |
3549 * Scales a quat by a scalar number | |
3550 * | |
3551 * @param {quat} out the receiving vector | |
3552 * @param {quat} a the vector to scale | |
3553 * @param {Number} b amount to scale the vector by | |
3554 * @returns {quat} out | |
3555 * @function | |
3556 */ | |
3557 quat.scale = vec4.scale; | |
3558 | |
3559 /** | |
3560 * Rotates a quaternion by the given angle around the X axis | |
3561 * | |
3562 * @param {quat} out quat receiving operation result | |
3563 * @param {quat} a quat to rotate | |
3564 * @param {number} rad angle (in radians) to rotate | |
3565 * @returns {quat} out | |
3566 */ | |
3567 quat.rotateX = function (out, a, rad) { | |
3568 rad *= 0.5; | |
3569 | |
3570 var ax = a[0], ay = a[1], az = a[2], aw = a[3], | |
3571 bx = Math.sin(rad), bw = Math.cos(rad); | |
3572 | |
3573 out[0] = ax * bw + aw * bx; | |
3574 out[1] = ay * bw + az * bx; | |
3575 out[2] = az * bw - ay * bx; | |
3576 out[3] = aw * bw - ax * bx; | |
3577 return out; | |
3578 }; | |
3579 | |
3580 /** | |
3581 * Rotates a quaternion by the given angle around the Y axis | |
3582 * | |
3583 * @param {quat} out quat receiving operation result | |
3584 * @param {quat} a quat to rotate | |
3585 * @param {number} rad angle (in radians) to rotate | |
3586 * @returns {quat} out | |
3587 */ | |
3588 quat.rotateY = function (out, a, rad) { | |
3589 rad *= 0.5; | |
3590 | |
3591 var ax = a[0], ay = a[1], az = a[2], aw = a[3], | |
3592 by = Math.sin(rad), bw = Math.cos(rad); | |
3593 | |
3594 out[0] = ax * bw - az * by; | |
3595 out[1] = ay * bw + aw * by; | |
3596 out[2] = az * bw + ax * by; | |
3597 out[3] = aw * bw - ay * by; | |
3598 return out; | |
3599 }; | |
3600 | |
3601 /** | |
3602 * Rotates a quaternion by the given angle around the Z axis | |
3603 * | |
3604 * @param {quat} out quat receiving operation result | |
3605 * @param {quat} a quat to rotate | |
3606 * @param {number} rad angle (in radians) to rotate | |
3607 * @returns {quat} out | |
3608 */ | |
3609 quat.rotateZ = function (out, a, rad) { | |
3610 rad *= 0.5; | |
3611 | |
3612 var ax = a[0], ay = a[1], az = a[2], aw = a[3], | |
3613 bz = Math.sin(rad), bw = Math.cos(rad); | |
3614 | |
3615 out[0] = ax * bw + ay * bz; | |
3616 out[1] = ay * bw - ax * bz; | |
3617 out[2] = az * bw + aw * bz; | |
3618 out[3] = aw * bw - az * bz; | |
3619 return out; | |
3620 }; | |
3621 | |
3622 /** | |
3623 * Calculates the W component of a quat from the X, Y, and Z components. | |
3624 * Assumes that quaternion is 1 unit in length. | |
3625 * Any existing W component will be ignored. | |
3626 * | |
3627 * @param {quat} out the receiving quaternion | |
3628 * @param {quat} a quat to calculate W component of | |
3629 * @returns {quat} out | |
3630 */ | |
3631 quat.calculateW = function (out, a) { | |
3632 var x = a[0], y = a[1], z = a[2]; | |
3633 | |
3634 out[0] = x; | |
3635 out[1] = y; | |
3636 out[2] = z; | |
3637 out[3] = -Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); | |
3638 return out; | |
3639 }; | |
3640 | |
3641 /** | |
3642 * Calculates the dot product of two quat's | |
3643 * | |
3644 * @param {quat} a the first operand | |
3645 * @param {quat} b the second operand | |
3646 * @returns {Number} dot product of a and b | |
3647 * @function | |
3648 */ | |
3649 quat.dot = vec4.dot; | |
3650 | |
3651 /** | |
3652 * Performs a linear interpolation between two quat's | |
3653 * | |
3654 * @param {quat} out the receiving quaternion | |
3655 * @param {quat} a the first operand | |
3656 * @param {quat} b the second operand | |
3657 * @param {Number} t interpolation amount between the two inputs | |
3658 * @returns {quat} out | |
3659 * @function | |
3660 */ | |
3661 quat.lerp = vec4.lerp; | |
3662 | |
3663 /** | |
3664 * Performs a spherical linear interpolation between two quat | |
3665 * | |
3666 * @param {quat} out the receiving quaternion | |
3667 * @param {quat} a the first operand | |
3668 * @param {quat} b the second operand | |
3669 * @param {Number} t interpolation amount between the two inputs | |
3670 * @returns {quat} out | |
3671 */ | |
3672 quat.slerp = function (out, a, b, t) { | |
3673 var ax = a[0], ay = a[1], az = a[2], aw = a[3], | |
3674 bx = b[0], by = b[1], bz = b[2], bw = b[3]; | |
3675 | |
3676 var cosHalfTheta = ax * bx + ay * by + az * bz + aw * bw, | |
3677 halfTheta, | |
3678 sinHalfTheta, | |
3679 ratioA, | |
3680 ratioB; | |
3681 | |
3682 if (Math.abs(cosHalfTheta) >= 1.0) { | |
3683 if (out !== a) { | |
3684 out[0] = ax; | |
3685 out[1] = ay; | |
3686 out[2] = az; | |
3687 out[3] = aw; | |
3688 } | |
3689 return out; | |
3690 } | |
3691 | |
3692 halfTheta = Math.acos(cosHalfTheta); | |
3693 sinHalfTheta = Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta); | |
3694 | |
3695 if (Math.abs(sinHalfTheta) < 0.001) { | |
3696 out[0] = (ax * 0.5 + bx * 0.5); | |
3697 out[1] = (ay * 0.5 + by * 0.5); | |
3698 out[2] = (az * 0.5 + bz * 0.5); | |
3699 out[3] = (aw * 0.5 + bw * 0.5); | |
3700 return out; | |
3701 } | |
3702 | |
3703 ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta; | |
3704 ratioB = Math.sin(t * halfTheta) / sinHalfTheta; | |
3705 | |
3706 out[0] = (ax * ratioA + bx * ratioB); | |
3707 out[1] = (ay * ratioA + by * ratioB); | |
3708 out[2] = (az * ratioA + bz * ratioB); | |
3709 out[3] = (aw * ratioA + bw * ratioB); | |
3710 | |
3711 return out; | |
3712 }; | |
3713 | |
3714 /** | |
3715 * Calculates the inverse of a quat | |
3716 * | |
3717 * @param {quat} out the receiving quaternion | |
3718 * @param {quat} a quat to calculate inverse of | |
3719 * @returns {quat} out | |
3720 */ | |
3721 quat.invert = function(out, a) { | |
3722 var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], | |
3723 dot = a0*a0 + a1*a1 + a2*a2 + a3*a3, | |
3724 invDot = dot ? 1.0/dot : 0; | |
3725 | |
3726 // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 | |
3727 | |
3728 out[0] = -a0*invDot; | |
3729 out[1] = -a1*invDot; | |
3730 out[2] = -a2*invDot; | |
3731 out[3] = a3*invDot; | |
3732 return out; | |
3733 }; | |
3734 | |
3735 /** | |
3736 * Calculates the conjugate of a quat | |
3737 * If the quaternion is normalized, this function is faster than quat.inverse an
d produces the same result. | |
3738 * | |
3739 * @param {quat} out the receiving quaternion | |
3740 * @param {quat} a quat to calculate conjugate of | |
3741 * @returns {quat} out | |
3742 */ | |
3743 quat.conjugate = function (out, a) { | |
3744 out[0] = -a[0]; | |
3745 out[1] = -a[1]; | |
3746 out[2] = -a[2]; | |
3747 out[3] = a[3]; | |
3748 return out; | |
3749 }; | |
3750 | |
3751 /** | |
3752 * Calculates the length of a quat | |
3753 * | |
3754 * @param {quat} a vector to calculate length of | |
3755 * @returns {Number} length of a | |
3756 * @function | |
3757 */ | |
3758 quat.length = vec4.length; | |
3759 | |
3760 /** | |
3761 * Alias for {@link quat.length} | |
3762 * @function | |
3763 */ | |
3764 quat.len = quat.length; | |
3765 | |
3766 /** | |
3767 * Calculates the squared length of a quat | |
3768 * | |
3769 * @param {quat} a vector to calculate squared length of | |
3770 * @returns {Number} squared length of a | |
3771 * @function | |
3772 */ | |
3773 quat.squaredLength = vec4.squaredLength; | |
3774 | |
3775 /** | |
3776 * Alias for {@link quat.squaredLength} | |
3777 * @function | |
3778 */ | |
3779 quat.sqrLen = quat.squaredLength; | |
3780 | |
3781 /** | |
3782 * Normalize a quat | |
3783 * | |
3784 * @param {quat} out the receiving quaternion | |
3785 * @param {quat} a quaternion to normalize | |
3786 * @returns {quat} out | |
3787 * @function | |
3788 */ | |
3789 quat.normalize = vec4.normalize; | |
3790 | |
3791 /** | |
3792 * Creates a quaternion from the given 3x3 rotation matrix. | |
3793 * | |
3794 * @param {quat} out the receiving quaternion | |
3795 * @param {mat3} m rotation matrix | |
3796 * @returns {quat} out | |
3797 * @function | |
3798 */ | |
3799 quat.fromMat3 = (function() { | |
3800 var s_iNext = [1,2,0]; | |
3801 return function(out, m) { | |
3802 // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes | |
3803 // article "Quaternion Calculus and Fast Animation". | |
3804 var fTrace = m[0] + m[4] + m[8]; | |
3805 var fRoot; | |
3806 | |
3807 if ( fTrace > 0.0 ) { | |
3808 // |w| > 1/2, may as well choose w > 1/2 | |
3809 fRoot = Math.sqrt(fTrace + 1.0); // 2w | |
3810 out[3] = 0.5 * fRoot; | |
3811 fRoot = 0.5/fRoot; // 1/(4w) | |
3812 out[0] = (m[7]-m[5])*fRoot; | |
3813 out[1] = (m[2]-m[6])*fRoot; | |
3814 out[2] = (m[3]-m[1])*fRoot; | |
3815 } else { | |
3816 // |w| <= 1/2 | |
3817 var i = 0; | |
3818 if ( m[4] > m[0] ) | |
3819 i = 1; | |
3820 if ( m[8] > m[i*3+i] ) | |
3821 i = 2; | |
3822 var j = s_iNext[i]; | |
3823 var k = s_iNext[j]; | |
3824 | |
3825 fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0); | |
3826 out[i] = 0.5 * fRoot; | |
3827 fRoot = 0.5 / fRoot; | |
3828 out[3] = (m[k*3+j] - m[j*3+k]) * fRoot; | |
3829 out[j] = (m[j*3+i] + m[i*3+j]) * fRoot; | |
3830 out[k] = (m[k*3+i] + m[i*3+k]) * fRoot; | |
3831 } | |
3832 | |
3833 return out; | |
3834 }; | |
3835 })(); | |
3836 | |
3837 /** | |
3838 * Returns a string representation of a quatenion | |
3839 * | |
3840 * @param {quat} vec vector to represent as a string | |
3841 * @returns {String} string representation of the vector | |
3842 */ | |
3843 quat.str = function (a) { | |
3844 return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; | |
3845 }; | |
3846 | |
3847 if(typeof(exports) !== 'undefined') { | |
3848 exports.quat = quat; | |
3849 } | |
3850 ; | |
3851 | |
3852 | |
3853 | |
3854 | |
3855 | |
3856 | |
3857 | |
3858 | |
3859 | |
3860 | |
3861 | |
3862 | |
3863 | |
3864 })(shim.exports); | |
3865 })(); | |
OLD | NEW |