/* * Copyright (c) 2010 Mozilla Corporation * Copyright (c) 2010 Vladimir Vukicevic * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ /* * File: mjs * * Vector and Matrix math utilities for JavaScript, optimized for WebGL. * Edited to work with the Elm Programming Language */ Elm.Native.Math = Elm.Native.Math || {}; Elm.Native.Math.Vector2 = {}; Elm.Native.Math.Vector2.make = function(elm) { elm.Native = elm.Native || {}; elm.Native.Math = elm.Native.Math || {}; elm.Native.Math.Vector2 = elm.Native.Math.Vector2 || {}; if (elm.Native.Math.Vector2.values) return elm.Native.Math.Vector2.values; var MJS_FLOAT_ARRAY_TYPE = Float32Array; var V2 = { }; if (MJS_FLOAT_ARRAY_TYPE == Array) { V2.$ = function V2_$(x, y) { return [x, y]; }; } else { V2.$ = function V2_$(x, y) { return new MJS_FLOAT_ARRAY_TYPE([x, y]); }; } V2.getX = function V2_getX(a) { return a[0]; } V2.getY = function V2_getY(a) { return a[1]; } V2.setX = function V2_setX(x, a) { return new MJS_FLOAT_ARRAY_TYPE(x, a[1]); } V2.setY = function V2_setY(y, a) { return new MJS_FLOAT_ARRAY_TYPE(a[0], y); } V2.toTuple = function V2_toTuple(a) { return { ctor:"_Tuple2", _0:a[0], _1:a[1] }; }; V2.fromTuple = function V2_fromTuple(t) { return new MJS_FLOAT_ARRAY_TYPE([t._0, t._1]); }; V2.toRecord = function V2_toRecord(a) { return { _:{}, x:a[0], y:a[1] }; }; V2.fromRecord = function V2_fromRecord(r) { return new MJS_FLOAT_ARRAY_TYPE([r.x, r.y]); }; V2.add = function V2_add(a, b) { var r = new MJS_FLOAT_ARRAY_TYPE(2); r[0] = a[0] + b[0]; r[1] = a[1] + b[1]; return r; }; V2.sub = function V2_sub(a, b) { var r = new MJS_FLOAT_ARRAY_TYPE(2); r[0] = a[0] - b[0]; r[1] = a[1] - b[1]; return r; }; V2.neg = function V2_neg(a) { var r = new MJS_FLOAT_ARRAY_TYPE(2); r[0] = - a[0]; r[1] = - a[1]; return r; }; V2.direction = function V2_direction(a, b) { var r = new MJS_FLOAT_ARRAY_TYPE(2); r[0] = a[0] - b[0]; r[1] = a[1] - b[1]; var im = 1.0 / V2.length(r); r[0] = r[0] * im; r[1] = r[1] * im; return r; }; V2.length = function V2_length(a) { return Math.sqrt(a[0]*a[0] + a[1]*a[1]); }; V2.lengthSquared = function V2_lengthSquared(a) { return a[0]*a[0] + a[1]*a[1]; }; V2.distance = function V2_distance(a, b) { var dx = a[0] - b[0]; var dy = a[1] - b[1]; return Math.sqrt(dx * dx + dy * dy); }; V2.distanceSquared = function V2_distanceSquared(a) { var dx = a[0] - b[0]; var dy = a[1] - b[1]; return dx * dx + dy * dy; }; V2.normalize = function V2_normalize(a) { var r = new MJS_FLOAT_ARRAY_TYPE(2); var im = 1.0 / V2.length(a); r[0] = a[0] * im; r[1] = a[1] * im; return r; }; V2.scale = function V2_scale(a, k) { var r = new MJS_FLOAT_ARRAY_TYPE(2); r[0] = a[0] * k; r[1] = a[1] * k; return r; }; V2.dot = function V2_dot(a, b) { return a[0] * b[0] + a[1] * b[1]; }; return { v2: F2(V2.$), getX: V2.getX, getY: V2.getY, setX: F2(V2.setX), setY: F2(V2.setY), toTuple: V2.toTuple, toRecord: V2.toRecord, fromTuple: V2.fromTuple, fromRecord: V2.fromRecord, add: F2(V2.add), sub: F2(V2.sub), neg: V2.neg, direction: F2(V2.direction), length: V2.length, lengthSquared: V2.lengthSquared, distance: F2(V2.distance), distanceSquared: F2(V2.distanceSquared), normalize: V2.normalize, scale: F2(V2.scale), dot: F2(V2.dot), }; }