on 9026039 help sign in
elk/libraries/Native/Math/Vector4.js
224 lines 6.3 kB history raw
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 */
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 */
35Elm.Native.Math = Elm.Native.Math || {};
36Elm.Native.Math.Vector4 = {};
37Elm.Native.Math.Vector4.make = function(elm) {
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;
44 var MJS_FLOAT_ARRAY_TYPE = Float32Array;
46 var V4 = { };
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 }
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 }
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 };
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 };
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 };
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 };
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 };
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 };
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 };
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 };
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 };
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 };
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 };
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 };
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 };
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 };