@@ -0,0 +1,224 @@
1+
2+/*
3+ * Copyright (c) 2010 Mozilla Corporation
4+ * Copyright (c) 2010 Vladimir Vukicevic
5+ *
6+ * Permission is hereby granted, free of charge, to any person
7+ * obtaining a copy of this software and associated documentation
8+ * files (the "Software"), to deal in the Software without
9+ * restriction, including without limitation the rights to use,
10+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
11+ * copies of the Software, and to permit persons to whom the
12+ * Software is furnished to do so, subject to the following
13+ * conditions:
14+ *
15+ * The above copyright notice and this permission notice shall be
16+ * included in all copies or substantial portions of the Software.
17+ *
18+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25+ * OTHER DEALINGS IN THE SOFTWARE.
26+ */
27+
28+/*
29+ * File: mjs
30+ *
31+ * Vector and Matrix math utilities for JavaScript, optimized for WebGL.
32+ * Edited to work with the Elm Programming Language
33+ */
34+
35+Elm.Native.Math = Elm.Native.Math || {};
36+Elm.Native.Math.Vector4 = {};
37+Elm.Native.Math.Vector4.make = function(elm) {
38+
39+ elm.Native = elm.Native || {};
40+ elm.Native.Math = elm.Native.Math || {};
41+ elm.Native.Math.Vector4 = elm.Native.Math.Vector4 || {};
42+ if (elm.Native.Math.Vector4.values) return elm.Native.Math.Vector4.values;
43+
44+ var MJS_FLOAT_ARRAY_TYPE = Float32Array;
45+
46+ var V4 = { };
47+
48+ if (MJS_FLOAT_ARRAY_TYPE == Array) {
49+ V4.$ = function V4_$(x, y, z, w) {
50+ return [x, y, z, w];
51+ };
52+ } else {
53+ V4.$ = function V4_$(x, y, z, w) {
54+ return new MJS_FLOAT_ARRAY_TYPE([x, y, z, w]);
55+ };
56+ }
57+
58+ V4.getX = function V4_getX(a) {
59+ return a[0];
60+ }
61+ V4.getY = function V4_getY(a) {
62+ return a[1];
63+ }
64+ V4.getZ = function V4_getZ(a) {
65+ return a[2];
66+ }
67+ V4.getW = function V4_getW(a) {
68+ return a[3];
69+ }
70+ V4.setX = function V4_setX(x, a) {
71+ return new MJS_FLOAT_ARRAY_TYPE(x, a[1], a[2], a[3]);
72+ }
73+ V4.setY = function V4_setY(y, a) {
74+ return new MJS_FLOAT_ARRAY_TYPE(a[0], y, a[2], a[3]);
75+ }
76+ V4.setZ = function V4_setZ(z, a) {
77+ return new MJS_FLOAT_ARRAY_TYPE(a[0], a[1], z, a[3]);
78+ }
79+ V4.setW = function V4_setW(w, a) {
80+ return new MJS_FLOAT_ARRAY_TYPE(a[0], a[1], a[2], w);
81+ }
82+
83+ V4.toTuple = function V4_toTuple(a) {
84+ return {
85+ ctor:"_Tuple4",
86+ _0:a[0],
87+ _1:a[1],
88+ _2:a[2],
89+ _3:a[3]
90+ };
91+ };
92+ V4.fromTuple = function V4_fromTuple(t) {
93+ return new MJS_FLOAT_ARRAY_TYPE([t._0, t._1, t._2, t._3]);
94+ };
95+
96+ V4.toRecord = function V4_toRecord(a) {
97+ return {
98+ _:{},
99+ x:a[0],
100+ y:a[1],
101+ z:a[2],
102+ w:a[3]
103+ };
104+ };
105+ V4.fromRecord = function V4_fromRecord(r) {
106+ return new MJS_FLOAT_ARRAY_TYPE([r.x, r.y, r.z, r.w]);
107+ };
108+
109+ V4.add = function V4_add(a, b) {
110+ var r = new MJS_FLOAT_ARRAY_TYPE(4);
111+ r[0] = a[0] + b[0];
112+ r[1] = a[1] + b[1];
113+ r[2] = a[2] + b[2];
114+ r[3] = a[3] + b[3];
115+ return r;
116+ };
117+
118+ V4.sub = function V4_sub(a, b) {
119+ var r = new MJS_FLOAT_ARRAY_TYPE(4);
120+ r[0] = a[0] - b[0];
121+ r[1] = a[1] - b[1];
122+ r[2] = a[2] - b[2];
123+ r[3] = a[3] - b[3];
124+ return r;
125+ };
126+
127+ V4.neg = function V4_neg(a) {
128+ var r = new MJS_FLOAT_ARRAY_TYPE(4);
129+ r[0] = - a[0];
130+ r[1] = - a[1];
131+ r[2] = - a[2];
132+ r[3] = - a[3];
133+ return r;
134+ };
135+
136+ V4.direction = function V4_direction(a, b) {
137+ var r = new MJS_FLOAT_ARRAY_TYPE(4);
138+ r[0] = a[0] - b[0];
139+ r[1] = a[1] - b[1];
140+ r[2] = a[2] - b[2];
141+ r[3] = a[3] - b[3];
142+ var im = 1.0 / V4.length(r);
143+ r[0] = r[0] * im;
144+ r[1] = r[1] * im;
145+ r[2] = r[2] * im;
146+ r[3] = r[3] * im;
147+ return r;
148+ };
149+
150+ V4.length = function V4_length(a) {
151+ return Math.sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2] + a[3]*a[3]);
152+ };
153+
154+ V4.lengthSquared = function V4_lengthSquared(a) {
155+ return a[0]*a[0] + a[1]*a[1] + a[2]*a[2] + a[3]*a[3];
156+ };
157+
158+ V4.distance = function V4_distance(a, b) {
159+ var dx = a[0] - b[0];
160+ var dy = a[1] - b[1];
161+ var dz = a[2] - b[2];
162+ var dw = a[3] - b[3];
163+ return Math.sqrt(dx * dx + dy * dy + dz * dz + dw * dw);
164+ };
165+
166+ V4.distanceSquared = function V4_distanceSquared(a) {
167+ var dx = a[0] - b[0];
168+ var dy = a[1] - b[1];
169+ var dz = a[2] - b[2];
170+ var dw = a[3] - b[3];
171+ return dx * dx + dy * dy + dz * dz + dw * dw;
172+ };
173+
174+ V4.normalize = function V4_normalize(a) {
175+ var r = new MJS_FLOAT_ARRAY_TYPE(4);
176+ var im = 1.0 / V4.length(a);
177+ r[0] = a[0] * im;
178+ r[1] = a[1] * im;
179+ r[2] = a[2] * im;
180+ r[3] = a[3] * im;
181+ return r;
182+ };
183+
184+ V4.scale = function V4_scale(a, k) {
185+ var r = new MJS_FLOAT_ARRAY_TYPE(4);
186+ r[0] = a[0] * k;
187+ r[1] = a[1] * k;
188+ r[2] = a[2] * k;
189+ r[3] = a[3] * k;
190+ return r;
191+ };
192+
193+ V4.dot = function V4_dot(a, b) {
194+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
195+ };
196+
197+ return {
198+ v4: F4(V4.$),
199+ getX: V4.getX,
200+ getY: V4.getY,
201+ getZ: V4.getZ,
202+ getW: V4.getW,
203+ setX: F2(V4.setX),
204+ setY: F2(V4.setY),
205+ setZ: F2(V4.setZ),
206+ setW: F2(V4.setW),
207+ toTuple: V4.toTuple,
208+ toRecord: V4.toRecord,
209+ fromTuple: V4.fromTuple,
210+ fromRecord: V4.fromRecord,
211+ add: F2(V4.add),
212+ sub: F2(V4.sub),
213+ neg: V4.neg,
214+ direction: F2(V4.direction),
215+ length: V4.length,
216+ lengthSquared: V4.lengthSquared,
217+ distance: F2(V4.distance),
218+ distanceSquared: F2(V4.distanceSquared),
219+ normalize: V4.normalize,
220+ scale: F2(V4.scale),
221+ dot: F2(V4.dot),
222+ };
223+
224+}