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 2 Dimensional Vector
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @name vec2
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvar vec2 = {};
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates a new, empty vec2
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} a new 2D vector
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.create = function() {
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var out = new GLMAT_ARRAY_TYPE(2);
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = 0;
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = 0;
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates a new vec2 initialized with values from an existing vector
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a vector to clone
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} a new 2D vector
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.clone = function(a) {
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var out = new GLMAT_ARRAY_TYPE(2);
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0];
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1];
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates a new vec2 initialized with the given values
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} x X component
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} y Y component
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} a new 2D vector
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.fromValues = function(x, y) {
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var out = new GLMAT_ARRAY_TYPE(2);
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = x;
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = y;
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Copy the values from one vec2 to another
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the source vector
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.copy = function(out, a) {
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0];
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1];
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Set the components of a vec2 to the given values
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} x X component
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} y Y component
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.set = function(out, x, y) {
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = x;
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = y;
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Adds two vec2's
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.add = function(out, a, b) {
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] + b[0];
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] + b[1];
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Subtracts two vec2's
11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.subtract = function(out, a, b) {
11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] - b[0];
11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] - b[1];
12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec2.subtract}
12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.sub = vec2.subtract;
12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Multiplies two vec2's
13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.multiply = function(out, a, b) {
13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] * b[0];
13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] * b[1];
14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec2.multiply}
14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.mul = vec2.multiply;
14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Divides two vec2's
15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.divide = function(out, a, b) {
15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] / b[0];
15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] / b[1];
16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec2.divide}
16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.div = vec2.divide;
16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Returns the minimum of two vec2's
17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
17366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
17466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
17566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
17666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
17766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.min = function(out, a, b) {
17866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = Math.min(a[0], b[0]);
17966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = Math.min(a[1], b[1]);
18066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
18166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
18266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
18466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Returns the maximum of two vec2's
18566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
18666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
18766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
18866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
18966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
19066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
19166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.max = function(out, a, b) {
19266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = Math.max(a[0], b[0]);
19366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = Math.max(a[1], b[1]);
19466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
19566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Scales a vec2 by a scalar number
19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
20066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
20166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the vector to scale
20266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} b amount to scale the vector by
20366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
20466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
20566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.scale = function(out, a, b) {
20666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = a[0] * b;
20766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = a[1] * b;
20866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
20966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
21066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
21166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
21266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the euclidian distance between two vec2's
21366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
21466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
21566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
21666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} distance between a and b
21766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
21866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.distance = function(a, b) {
21966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = b[0] - a[0],
22066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = b[1] - a[1];
22166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return Math.sqrt(x*x + y*y);
22266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
22366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
22466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
22566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec2.distance}
22666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
22766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
22866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.dist = vec2.distance;
22966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
23066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
23166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the squared euclidian distance between two vec2's
23266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
23366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
23466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
23566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} squared distance between a and b
23666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
23766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.squaredDistance = function(a, b) {
23866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = b[0] - a[0],
23966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = b[1] - a[1];
24066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return x*x + y*y;
24166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
24266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
24366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
24466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec2.squaredDistance}
24566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
24666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
24766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.sqrDist = vec2.squaredDistance;
24866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
24966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
25066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the length of a vec2
25166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
25266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a vector to calculate length of
25366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} length of a
25466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
25566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.length = function (a) {
25666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
25766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1];
25866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return Math.sqrt(x*x + y*y);
25966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
26066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
26166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
26266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec2.length}
26366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
26466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
26566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.len = vec2.length;
26666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
26766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
26866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the squared length of a vec2
26966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
27066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a vector to calculate squared length of
27166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} squared length of a
27266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
27366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.squaredLength = function (a) {
27466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
27566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1];
27666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return x*x + y*y;
27766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
27866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
27966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
28066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Alias for {@link vec2.squaredLength}
28166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
28266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
28366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.sqrLen = vec2.squaredLength;
28466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
28566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
28666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Negates the components of a vec2
28766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
28866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
28966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a vector to negate
29066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
29166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
29266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.negate = function(out, a) {
29366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = -a[0];
29466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = -a[1];
29566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
29666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
29766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
29966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Normalize a vec2
30066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
30166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
30266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a vector to normalize
30366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
30466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
30566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.normalize = function(out, a) {
30666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
30766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1];
30866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var len = x*x + y*y;
30966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    if (len > 0) {
31066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        //TODO: evaluate use of glm_invsqrt here?
31166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        len = 1 / Math.sqrt(len);
31266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        out[0] = a[0] * len;
31366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        out[1] = a[1] * len;
31466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
31566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
31666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
31766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
31866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
31966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Calculates the dot product of two vec2's
32066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
32166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
32266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
32366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Number} dot product of a and b
32466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
32566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.dot = function (a, b) {
32666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return a[0] * b[0] + a[1] * b[1];
32766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
32866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
32966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
33066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Computes the cross product of two vec2's
33166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Note that the cross product must by definition produce a 3D vector
33266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
33366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec3} out the receiving vector
33466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
33566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
33666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec3} out
33766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
33866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.cross = function(out, a, b) {
33966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var z = a[0] * b[1] - a[1] * b[0];
34066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = out[1] = 0;
34166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[2] = z;
34266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
34366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
34466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
34566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
34666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Performs a linear interpolation between two vec2's
34766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
34866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
34966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the first operand
35066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} b the second operand
35166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} t interpolation amount between the two inputs
35266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
35366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
35466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.lerp = function (out, a, b, t) {
35566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var ax = a[0],
35666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ay = a[1];
35766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = ax + t * (b[0] - ax);
35866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = ay + t * (b[1] - ay);
35966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
36066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
36166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
36266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
36366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Transforms the vec2 with a mat2
36466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
36566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
36666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the vector to transform
36766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {mat2} m matrix to transform with
36866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
36966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
37066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.transformMat2 = function(out, a, m) {
37166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
37266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1];
37366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = m[0] * x + m[2] * y;
37466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = m[1] * x + m[3] * y;
37566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
37666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
37766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
37866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
37966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Transforms the vec2 with a mat2d
38066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
38166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
38266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the vector to transform
38366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {mat2d} m matrix to transform with
38466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
38566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
38666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.transformMat2d = function(out, a, m) {
38766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
38866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1];
38966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = m[0] * x + m[2] * y + m[4];
39066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = m[1] * x + m[3] * y + m[5];
39166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
39266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
39366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
39466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
39566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Transforms the vec2 with a mat3
39666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * 3rd vector component is implicitly '1'
39766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
39866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
39966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the vector to transform
40066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {mat3} m matrix to transform with
40166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
40266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
40366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.transformMat3 = function(out, a, m) {
40466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
40566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1];
40666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = m[0] * x + m[3] * y + m[6];
40766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = m[1] * x + m[4] * y + m[7];
40866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
40966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
41066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
41166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
41266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Transforms the vec2 with a mat4
41366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * 3rd vector component is implicitly '0'
41466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * 4th vector component is implicitly '1'
41566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
41666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} out the receiving vector
41766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} a the vector to transform
41866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {mat4} m matrix to transform with
41966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {vec2} out
42066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
42166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.transformMat4 = function(out, a, m) {
42266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var x = a[0],
42366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        y = a[1];
42466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[0] = m[0] * x + m[4] * y + m[12];
42566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    out[1] = m[1] * x + m[5] * y + m[13];
42666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return out;
42766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
42866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
42966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
43066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Perform some operation over an array of vec2s.
43166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
43266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Array} a the array of vectors to iterate over
43366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed
43466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} offset Number of elements to skip at the beginning of the array
43566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array
43666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Function} fn Function to call for each vector in the array
43766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {Object} [arg] additional argument to pass to fn
43866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {Array} a
43966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @function
44066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
44166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.forEach = (function() {
44266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var vec = vec2.create();
44366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
44466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return function(a, stride, offset, count, fn, arg) {
44566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var i, l;
44666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if(!stride) {
44766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            stride = 2;
44866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
44966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
45066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if(!offset) {
45166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            offset = 0;
45266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
45366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
45466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if(count) {
45566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            l = Math.min((count * stride) + offset, a.length);
45666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        } else {
45766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            l = a.length;
45866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
45966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
46066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        for(i = offset; i < l; i += stride) {
46166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            vec[0] = a[i]; vec[1] = a[i+1];
46266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            fn(vec, vec, arg);
46366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            a[i] = vec[0]; a[i+1] = vec[1];
46466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
46566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
46666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return a;
46766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    };
46866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis})();
46966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
47066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
47166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Returns a string representation of a vector
47266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis *
47366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {vec2} vec vector to represent as a string
47466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @returns {String} string representation of the vector
47566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
47666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisvec2.str = function (a) {
47766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return 'vec2(' + a[0] + ', ' + a[1] + ')';
47866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis};
47966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
48066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisif(typeof(exports) !== 'undefined') {
48166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    exports.vec2 = vec2;
48266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis}
483