166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
366a37686207944273ced825e0e8b6b6375f8c3deJamie GennisRedistribution and use in source and binary forms, with or without modification,
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisare permitted provided that the following conditions are met:
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  * Redistributions of source code must retain the above copyright notice, this
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    list of conditions and the following disclaimer.
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  * Redistributions in binary form must reproduce the above copyright notice,
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this list of conditions and the following disclaimer in the documentation
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    and/or other materials provided with the distribution.
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1266a37686207944273ced825e0e8b6b6375f8c3deJamie GennisTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
1366a37686207944273ced825e0e8b6b6375f8c3deJamie GennisANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1466a37686207944273ced825e0e8b6b6375f8c3deJamie GennisWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1566a37686207944273ced825e0e8b6b6375f8c3deJamie GennisDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
1666a37686207944273ced825e0e8b6b6375f8c3deJamie GennisANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
1866a37686207944273ced825e0e8b6b6375f8c3deJamie GennisLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
1966a37686207944273ced825e0e8b6b6375f8c3deJamie GennisANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2166a37686207944273ced825e0e8b6b6375f8c3deJamie GennisSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @class 4 Dimensional Vector
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @name vec4
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvar vec4 = {};
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates a new, empty vec4
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} a new 4D vector
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.create = function() {
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var out = new GLMAT_ARRAY_TYPE(4);
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = 0;
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = 0;
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = 0;
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = 0;
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates a new vec4 initialized with values from an existing vector
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a vector to clone
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} a new 4D vector
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.clone = function(a) {
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var out = new GLMAT_ARRAY_TYPE(4);
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0];
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1];
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = a[2];
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = a[3];
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates a new vec4 initialized with the given values
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} x X component
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} y Y component
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} z Z component
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} w W component
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} a new 4D vector
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.fromValues = function(x, y, z, w) {
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var out = new GLMAT_ARRAY_TYPE(4);
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = x;
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = y;
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = z;
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = w;
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Copy the values from one vec4 to another
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the source vector
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.copy = function(out, a) {
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0];
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1];
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = a[2];
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = a[3];
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Set the components of a vec4 to the given values
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} x X component
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} y Y component
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} z Z component
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} w W component
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.set = function(out, x, y, z, w) {
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = x;
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = y;
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = z;
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = w;
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Adds two vec4's
11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.add = function(out, a, b) {
11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] + b[0];
11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] + b[1];
12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = a[2] + b[2];
12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = a[3] + b[3];
12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Subtracts two vec4's
12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.subtract = function(out, a, b) {
13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] - b[0];
13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] - b[1];
13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = a[2] - b[2];
13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = a[3] - b[3];
13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec4.subtract}
14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.sub = vec4.subtract;
14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Multiplies two vec4's
14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.multiply = function(out, a, b) {
15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] * b[0];
15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] * b[1];
15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = a[2] * b[2];
15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = a[3] * b[3];
16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec4.multiply}
16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.mul = vec4.multiply;
16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Divides two vec4's
17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
17366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
17466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
17566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
17666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
17766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.divide = function(out, a, b) {
17866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] / b[0];
17966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] / b[1];
18066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = a[2] / b[2];
18166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = a[3] / b[3];
18266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
18366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
18466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
18666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec4.divide}
18766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
18866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
18966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.div = vec4.divide;
19066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
19266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Returns the minimum of two vec4's
19366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
19466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
19566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.min = function(out, a, b) {
20066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = Math.min(a[0], b[0]);
20166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = Math.min(a[1], b[1]);
20266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = Math.min(a[2], b[2]);
20366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = Math.min(a[3], b[3]);
20466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
20566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
20666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
20766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
20866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Returns the maximum of two vec4's
20966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
21066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
21166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
21266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
21366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
21466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
21566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.max = function(out, a, b) {
21666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = Math.max(a[0], b[0]);
21766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = Math.max(a[1], b[1]);
21866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = Math.max(a[2], b[2]);
21966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = Math.max(a[3], b[3]);
22066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
22166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
22266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
22366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
22466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Scales a vec4 by a scalar number
22566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
22666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
22766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the vector to scale
22866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} b amount to scale the vector by
22966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
23066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
23166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.scale = function(out, a, b) {
23266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] * b;
23366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] * b;
23466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = a[2] * b;
23566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = a[3] * b;
23666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
23766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
23866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
23966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
24066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the euclidian distance between two vec4's
24166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
24266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
24366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
24466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} distance between a and b
24566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
24666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.distance = function(a, b) {
24766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = b[0] - a[0],
24866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = b[1] - a[1],
24966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        z = b[2] - a[2],
25066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        w = b[3] - a[3];
25166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return Math.sqrt(x*x + y*y + z*z + w*w);
25266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
25366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
25466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
25566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec4.distance}
25666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
25766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
25866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.dist = vec4.distance;
25966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
26066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
26166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the squared euclidian distance between two vec4's
26266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
26366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
26466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
26566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} squared distance between a and b
26666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
26766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.squaredDistance = function(a, b) {
26866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = b[0] - a[0],
26966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = b[1] - a[1],
27066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        z = b[2] - a[2],
27166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        w = b[3] - a[3];
27266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return x*x + y*y + z*z + w*w;
27366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
27466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
27566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
27666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec4.squaredDistance}
27766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
27866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
27966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.sqrDist = vec4.squaredDistance;
28066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
28166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
28266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the length of a vec4
28366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
28466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a vector to calculate length of
28566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} length of a
28666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
28766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.length = function (a) {
28866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
28966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1],
29066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        z = a[2],
29166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        w = a[3];
29266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return Math.sqrt(x*x + y*y + z*z + w*w);
29366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
29466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
29666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec4.length}
29766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
29866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
29966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.len = vec4.length;
30066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
30166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
30266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the squared length of a vec4
30366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
30466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a vector to calculate squared length of
30566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} squared length of a
30666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
30766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.squaredLength = function (a) {
30866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
30966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1],
31066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        z = a[2],
31166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        w = a[3];
31266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return x*x + y*y + z*z + w*w;
31366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
31466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
31566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
31666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec4.squaredLength}
31766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
31866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
31966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.sqrLen = vec4.squaredLength;
32066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
32166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
32266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Negates the components of a vec4
32366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
32466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
32566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a vector to negate
32666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
32766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
32866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.negate = function(out, a) {
32966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = -a[0];
33066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = -a[1];
33166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = -a[2];
33266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = -a[3];
33366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
33466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
33566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
33666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
33766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Normalize a vec4
33866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
33966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
34066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a vector to normalize
34166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
34266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
34366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.normalize = function(out, a) {
34466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
34566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1],
34666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        z = a[2],
34766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        w = a[3];
34866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var len = x*x + y*y + z*z + w*w;
34966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    if (len > 0) {
35066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        len = 1 / Math.sqrt(len);
35166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        out[0] = a[0] * len;
35266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        out[1] = a[1] * len;
35366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        out[2] = a[2] * len;
35466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        out[3] = a[3] * len;
35566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
35666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
35766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
35866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
35966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
36066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the dot product of two vec4's
36166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
36266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
36366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
36466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} dot product of a and b
36566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
36666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.dot = function (a, b) {
36766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
36866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
36966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
37066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
37166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Performs a linear interpolation between two vec4's
37266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
37366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
37466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the first operand
37566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} b the second operand
37666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} t interpolation amount between the two inputs
37766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
37866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
37966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.lerp = function (out, a, b, t) {
38066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var ax = a[0],
38166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ay = a[1],
38266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        az = a[2],
38366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        aw = a[3];
38466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = ax + t * (b[0] - ax);
38566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = ay + t * (b[1] - ay);
38666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = az + t * (b[2] - az);
38766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = aw + t * (b[3] - aw);
38866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
38966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
39066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
39166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
39266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Transforms the vec4 with a mat4.
39366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
39466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
39566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the vector to transform
39666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {mat4} m matrix to transform with
39766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
39866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
39966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.transformMat4 = function(out, a, m) {
40066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0], y = a[1], z = a[2], w = a[3];
40166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
40266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
40366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
40466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
40566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
40666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
40766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
40866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
40966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Transforms the vec4 with a quat
41066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
41166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} out the receiving vector
41266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} a the vector to transform
41366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {quat} q quaternion to transform with
41466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec4} out
41566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
41666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.transformQuat = function(out, a, q) {
41766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0], y = a[1], z = a[2],
41866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        qx = q[0], qy = q[1], qz = q[2], qw = q[3],
41966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
42066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        // calculate quat * vec
42166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ix = qw * x + qy * z - qz * y,
42266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        iy = qw * y + qz * x - qx * z,
42366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        iz = qw * z + qx * y - qy * x,
42466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        iw = -qx * x - qy * y - qz * z;
42566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
42666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    // calculate result * inverse quat
42766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
42866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
42966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
43066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
43166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
43266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
43366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
43466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Perform some operation over an array of vec4s.
43566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
43666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Array} a the array of vectors to iterate over
43766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed
43866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} offset Number of elements to skip at the beginning of the array
43966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array
44066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Function} fn Function to call for each vector in the array
44166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Object} [arg] additional argument to pass to fn
44266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Array} a
44366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
44466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
44566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.forEach = (function() {
44666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var vec = vec4.create();
44766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
44866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return function(a, stride, offset, count, fn, arg) {
44966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var i, l;
45066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if(!stride) {
45166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            stride = 4;
45266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
45366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
45466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if(!offset) {
45566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            offset = 0;
45666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
45766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
45866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if(count) {
45966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            l = Math.min((count * stride) + offset, a.length);
46066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        } else {
46166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            l = a.length;
46266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
46366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
46466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        for(i = offset; i < l; i += stride) {
46566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3];
46666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            fn(vec, vec, arg);
46766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3];
46866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
46966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
47066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return a;
47166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    };
47266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis})();
47366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
47466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
47566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Returns a string representation of a vector
47666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
47766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec4} vec vector to represent as a string
47866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {String} string representation of the vector
47966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
48066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec4.str = function (a) {
48166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';
48266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
48366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
48466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisif(typeof(exports) !== 'undefined') {
48566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    exports.vec4 = vec4;
48666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis}
487