Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(338)

Side by Side Diff: tools/cc-frame-viewer/third_party/gl-matrix/dist/gl-matrix.js

Issue 12251005: [cc-frame-viewer] Add gl-matrix to third_party [redux] (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 })();
OLDNEW
« no previous file with comments | « tools/cc-frame-viewer/third_party/gl-matrix/VERSION ('k') | tools/cc-frame-viewer/third_party/gl-matrix/dist/gl-matrix-min.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698