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