Home | History | Annotate | Download | only in dist
      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.amd) {
     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 reserved.
     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 array
    537  * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire 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 array
   1021  * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire 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 array
   1509  * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire 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 axis
   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 and 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 })();
   3866