@math.gl/core 3.6.3 → 4.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/classes/base/math-array.d.ts +5 -4
  2. package/dist/classes/base/math-array.d.ts.map +1 -1
  3. package/dist/{esm/classes → classes}/base/math-array.js +8 -3
  4. package/dist/classes/base/math-array.js.map +1 -0
  5. package/dist/classes/base/matrix.d.ts +2 -2
  6. package/dist/classes/base/matrix.d.ts.map +1 -1
  7. package/dist/{esm/classes → classes}/base/matrix.js +4 -4
  8. package/dist/classes/base/matrix.js.map +1 -0
  9. package/dist/classes/base/vector.d.ts +2 -2
  10. package/dist/classes/base/vector.d.ts.map +1 -1
  11. package/dist/{esm/classes → classes}/base/vector.js +4 -4
  12. package/dist/classes/base/vector.js.map +1 -0
  13. package/dist/classes/euler.d.ts +4 -4
  14. package/dist/classes/euler.d.ts.map +1 -1
  15. package/dist/{esm/classes → classes}/euler.js +6 -6
  16. package/dist/classes/euler.js.map +1 -0
  17. package/dist/classes/matrix3.d.ts +5 -2
  18. package/dist/classes/matrix3.d.ts.map +1 -1
  19. package/dist/{esm/classes → classes}/matrix3.js +20 -20
  20. package/dist/classes/matrix3.js.map +1 -0
  21. package/dist/classes/matrix4.d.ts +2 -2
  22. package/dist/classes/matrix4.d.ts.map +1 -1
  23. package/dist/{esm/classes → classes}/matrix4.js +27 -27
  24. package/dist/classes/matrix4.js.map +1 -0
  25. package/dist/classes/pose.d.ts +4 -4
  26. package/dist/classes/pose.d.ts.map +1 -1
  27. package/dist/{esm/classes → classes}/pose.js +4 -4
  28. package/dist/classes/pose.js.map +1 -0
  29. package/dist/classes/quaternion.d.ts +2 -2
  30. package/dist/classes/quaternion.d.ts.map +1 -1
  31. package/dist/{esm/classes → classes}/quaternion.js +26 -26
  32. package/dist/classes/quaternion.js.map +1 -0
  33. package/dist/classes/spherical-coordinates.d.ts +2 -2
  34. package/dist/classes/spherical-coordinates.d.ts.map +1 -1
  35. package/dist/{esm/classes → classes}/spherical-coordinates.js +5 -5
  36. package/dist/classes/spherical-coordinates.js.map +1 -0
  37. package/dist/classes/vector2.d.ts +2 -2
  38. package/dist/classes/vector2.d.ts.map +1 -1
  39. package/dist/{esm/classes → classes}/vector2.js +10 -10
  40. package/dist/classes/vector2.js.map +1 -0
  41. package/dist/classes/vector3.d.ts +2 -2
  42. package/dist/classes/vector3.d.ts.map +1 -1
  43. package/dist/{esm/classes → classes}/vector3.js +14 -14
  44. package/dist/classes/vector3.js.map +1 -0
  45. package/dist/classes/vector4.d.ts +3 -3
  46. package/dist/classes/vector4.d.ts.map +1 -1
  47. package/dist/{esm/classes → classes}/vector4.js +8 -8
  48. package/dist/classes/vector4.js.map +1 -0
  49. package/dist/gl-matrix/common.d.ts +38 -0
  50. package/dist/gl-matrix/common.d.ts.map +1 -0
  51. package/dist/gl-matrix/common.js +19 -0
  52. package/dist/gl-matrix/common.js.map +1 -0
  53. package/dist/gl-matrix/mat3.d.ts +295 -0
  54. package/dist/gl-matrix/mat3.d.ts.map +1 -0
  55. package/dist/gl-matrix/mat3.js +489 -0
  56. package/dist/gl-matrix/mat3.js.map +1 -0
  57. package/dist/gl-matrix/mat4.d.ts +577 -0
  58. package/dist/gl-matrix/mat4.d.ts.map +1 -0
  59. package/dist/gl-matrix/mat4.js +1455 -0
  60. package/dist/gl-matrix/mat4.js.map +1 -0
  61. package/dist/gl-matrix/quat.d.ts +357 -0
  62. package/dist/gl-matrix/quat.d.ts.map +1 -0
  63. package/dist/gl-matrix/quat.js +315 -0
  64. package/dist/gl-matrix/quat.js.map +1 -0
  65. package/dist/gl-matrix/vec2.d.ts +373 -0
  66. package/dist/gl-matrix/vec2.d.ts.map +1 -0
  67. package/dist/gl-matrix/vec2.js +257 -0
  68. package/dist/gl-matrix/vec2.js.map +1 -0
  69. package/dist/gl-matrix/vec3.d.ts +416 -0
  70. package/dist/gl-matrix/vec3.d.ts.map +1 -0
  71. package/dist/gl-matrix/vec3.js +384 -0
  72. package/dist/gl-matrix/vec3.js.map +1 -0
  73. package/dist/gl-matrix/vec4.d.ts +340 -0
  74. package/dist/gl-matrix/vec4.d.ts.map +1 -0
  75. package/dist/gl-matrix/vec4.js +334 -0
  76. package/dist/gl-matrix/vec4.js.map +1 -0
  77. package/dist/gl-matrix/wip/index.d.ts +5 -0
  78. package/dist/gl-matrix/wip/index.d.ts.map +1 -0
  79. package/dist/gl-matrix/wip/index.js +12 -0
  80. package/dist/gl-matrix/wip/index.js.map +1 -0
  81. package/dist/gl-matrix/wip/mat2.d.ts +229 -0
  82. package/dist/gl-matrix/wip/mat2.d.ts.map +1 -0
  83. package/dist/gl-matrix/wip/mat2.js +208 -0
  84. package/dist/gl-matrix/wip/mat2.js.map +1 -0
  85. package/dist/gl-matrix/wip/mat2d.d.ts +244 -0
  86. package/dist/gl-matrix/wip/mat2d.d.ts.map +1 -0
  87. package/dist/gl-matrix/wip/mat2d.js +251 -0
  88. package/dist/gl-matrix/wip/mat2d.js.map +1 -0
  89. package/dist/gl-matrix/wip/quat2.d.ts +352 -0
  90. package/dist/gl-matrix/wip/quat2.d.ts.map +1 -0
  91. package/dist/gl-matrix/wip/quat2.js +482 -0
  92. package/dist/gl-matrix/wip/quat2.js.map +1 -0
  93. package/dist/gl-matrix/wip/types.d.js +2 -0
  94. package/dist/{esm/lib/gl-matrix.d.js.map → gl-matrix/wip/types.d.js.map} +1 -1
  95. package/dist/index.cjs +3788 -0
  96. package/dist/index.d.ts +15 -14
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +17 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/lib/assert.d.ts +1 -1
  101. package/dist/lib/assert.d.ts.map +1 -1
  102. package/dist/lib/assert.js +6 -0
  103. package/dist/lib/assert.js.map +1 -0
  104. package/dist/lib/common.d.ts +10 -5
  105. package/dist/lib/common.d.ts.map +1 -1
  106. package/dist/{esm/lib → lib}/common.js +11 -9
  107. package/dist/lib/common.js.map +1 -0
  108. package/dist/lib/gl-matrix-extras.js.map +1 -0
  109. package/dist/lib/math-utils.d.ts +24 -27
  110. package/dist/lib/math-utils.d.ts.map +1 -1
  111. package/dist/lib/math-utils.js +25 -0
  112. package/dist/lib/math-utils.js.map +1 -0
  113. package/dist/lib/validators.d.ts +1 -1
  114. package/dist/lib/validators.d.ts.map +1 -1
  115. package/dist/{esm/lib → lib}/validators.js +2 -2
  116. package/dist/lib/validators.js.map +1 -0
  117. package/package.json +6 -6
  118. package/src/classes/base/math-array.ts +16 -8
  119. package/src/classes/base/matrix.ts +7 -4
  120. package/src/classes/base/vector.ts +4 -4
  121. package/src/classes/euler.ts +9 -8
  122. package/src/classes/matrix3.ts +37 -24
  123. package/src/classes/matrix4.ts +48 -29
  124. package/src/classes/pose.ts +4 -4
  125. package/src/classes/quaternion.ts +54 -32
  126. package/src/classes/spherical-coordinates.ts +5 -4
  127. package/src/classes/vector2.ts +13 -9
  128. package/src/classes/vector3.ts +26 -12
  129. package/src/classes/vector4.ts +14 -10
  130. package/src/gl-matrix/common.js +58 -0
  131. package/src/gl-matrix/mat3.js +842 -0
  132. package/src/gl-matrix/mat4.js +2169 -0
  133. package/src/gl-matrix/quat.ts +789 -0
  134. package/src/gl-matrix/vec2.js +629 -0
  135. package/src/gl-matrix/vec3.js +827 -0
  136. package/src/gl-matrix/vec4.js +675 -0
  137. package/src/gl-matrix/wip/index.js +15 -0
  138. package/src/gl-matrix/wip/mat2.js +442 -0
  139. package/src/gl-matrix/wip/mat2d.js +505 -0
  140. package/src/gl-matrix/wip/quat2.ts +886 -0
  141. package/src/gl-matrix/wip/types.d.ts +93 -0
  142. package/src/index.ts +16 -14
  143. package/src/lib/assert.ts +1 -1
  144. package/src/lib/common.ts +31 -19
  145. package/src/lib/math-utils.ts +24 -26
  146. package/src/lib/validators.ts +3 -3
  147. package/dist/es5/classes/base/math-array.js +0 -348
  148. package/dist/es5/classes/base/math-array.js.map +0 -1
  149. package/dist/es5/classes/base/matrix.js +0 -108
  150. package/dist/es5/classes/base/matrix.js.map +0 -1
  151. package/dist/es5/classes/base/vector.js +0 -210
  152. package/dist/es5/classes/base/vector.js.map +0 -1
  153. package/dist/es5/classes/euler.js +0 -654
  154. package/dist/es5/classes/euler.js.map +0 -1
  155. package/dist/es5/classes/matrix3.js +0 -284
  156. package/dist/es5/classes/matrix3.js.map +0 -1
  157. package/dist/es5/classes/matrix4.js +0 -574
  158. package/dist/es5/classes/matrix4.js.map +0 -1
  159. package/dist/es5/classes/pose.js +0 -159
  160. package/dist/es5/classes/pose.js.map +0 -1
  161. package/dist/es5/classes/quaternion.js +0 -323
  162. package/dist/es5/classes/quaternion.js.map +0 -1
  163. package/dist/es5/classes/spherical-coordinates.js +0 -208
  164. package/dist/es5/classes/spherical-coordinates.js.map +0 -1
  165. package/dist/es5/classes/vector2.js +0 -156
  166. package/dist/es5/classes/vector2.js.map +0 -1
  167. package/dist/es5/classes/vector3.js +0 -213
  168. package/dist/es5/classes/vector3.js.map +0 -1
  169. package/dist/es5/classes/vector4.js +0 -185
  170. package/dist/es5/classes/vector4.js.map +0 -1
  171. package/dist/es5/docs/README.md +0 -0
  172. package/dist/es5/index.js +0 -236
  173. package/dist/es5/index.js.map +0 -1
  174. package/dist/es5/lib/assert.js +0 -13
  175. package/dist/es5/lib/assert.js.map +0 -1
  176. package/dist/es5/lib/common.js +0 -255
  177. package/dist/es5/lib/common.js.map +0 -1
  178. package/dist/es5/lib/gl-matrix-extras.js +0 -61
  179. package/dist/es5/lib/gl-matrix-extras.js.map +0 -1
  180. package/dist/es5/lib/gl-matrix.d.js +0 -2
  181. package/dist/es5/lib/math-utils.js +0 -34
  182. package/dist/es5/lib/math-utils.js.map +0 -1
  183. package/dist/es5/lib/validators.js +0 -53
  184. package/dist/es5/lib/validators.js.map +0 -1
  185. package/dist/esm/classes/base/math-array.js.map +0 -1
  186. package/dist/esm/classes/base/matrix.js.map +0 -1
  187. package/dist/esm/classes/base/vector.js.map +0 -1
  188. package/dist/esm/classes/euler.js.map +0 -1
  189. package/dist/esm/classes/matrix3.js.map +0 -1
  190. package/dist/esm/classes/matrix4.js.map +0 -1
  191. package/dist/esm/classes/pose.js.map +0 -1
  192. package/dist/esm/classes/quaternion.js.map +0 -1
  193. package/dist/esm/classes/spherical-coordinates.js.map +0 -1
  194. package/dist/esm/classes/vector2.js.map +0 -1
  195. package/dist/esm/classes/vector3.js.map +0 -1
  196. package/dist/esm/classes/vector4.js.map +0 -1
  197. package/dist/esm/docs/README.md +0 -0
  198. package/dist/esm/index.js +0 -16
  199. package/dist/esm/index.js.map +0 -1
  200. package/dist/esm/lib/assert.js +0 -6
  201. package/dist/esm/lib/assert.js.map +0 -1
  202. package/dist/esm/lib/common.js.map +0 -1
  203. package/dist/esm/lib/gl-matrix-extras.js.map +0 -1
  204. package/dist/esm/lib/math-utils.js +0 -27
  205. package/dist/esm/lib/math-utils.js.map +0 -1
  206. package/dist/esm/lib/validators.js.map +0 -1
  207. package/src/docs/README.md +0 -0
  208. /package/dist/{esm/lib → lib}/gl-matrix-extras.js +0 -0
  209. /package/dist/{esm/lib → lib}/gl-matrix.d.js +0 -0
  210. /package/dist/{es5/lib → lib}/gl-matrix.d.js.map +0 -0
@@ -0,0 +1,886 @@
1
+ // @ts-nocheck
2
+ /* eslint-disable */
3
+ import * as glMatrix from './common.js';
4
+ import * as quat from './quat.js';
5
+ import * as mat4 from './mat4.js';
6
+
7
+ /**
8
+ * Dual Quaternion<br>
9
+ * Format: [real, dual]<br>
10
+ * Quaternion format: XYZW<br>
11
+ * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.<br>
12
+ * @module quat2
13
+ */
14
+
15
+ /**
16
+ * Creates a new identity dual quat
17
+ *
18
+ * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation]
19
+ */
20
+ export function create() {
21
+ let dq = new glMatrix.ARRAY_TYPE(8);
22
+ if (glMatrix.ARRAY_TYPE != Float32Array) {
23
+ dq[0] = 0;
24
+ dq[1] = 0;
25
+ dq[2] = 0;
26
+ dq[4] = 0;
27
+ dq[5] = 0;
28
+ dq[6] = 0;
29
+ dq[7] = 0;
30
+ }
31
+ dq[3] = 1;
32
+ return dq;
33
+ }
34
+
35
+ /**
36
+ * Creates a new quat initialized with values from an existing quaternion
37
+ *
38
+ * @param {ReadonlyQuat2} a dual quaternion to clone
39
+ * @returns {quat2} new dual quaternion
40
+ * @function
41
+ */
42
+ export function clone(a) {
43
+ let dq = new glMatrix.ARRAY_TYPE(8);
44
+ dq[0] = a[0];
45
+ dq[1] = a[1];
46
+ dq[2] = a[2];
47
+ dq[3] = a[3];
48
+ dq[4] = a[4];
49
+ dq[5] = a[5];
50
+ dq[6] = a[6];
51
+ dq[7] = a[7];
52
+ return dq;
53
+ }
54
+
55
+ /**
56
+ * Creates a new dual quat initialized with the given values
57
+ *
58
+ * @param {Number} x1 X component
59
+ * @param {Number} y1 Y component
60
+ * @param {Number} z1 Z component
61
+ * @param {Number} w1 W component
62
+ * @param {Number} x2 X component
63
+ * @param {Number} y2 Y component
64
+ * @param {Number} z2 Z component
65
+ * @param {Number} w2 W component
66
+ * @returns {quat2} new dual quaternion
67
+ * @function
68
+ */
69
+ export function fromValues(x1, y1, z1, w1, x2, y2, z2, w2) {
70
+ let dq = new glMatrix.ARRAY_TYPE(8);
71
+ dq[0] = x1;
72
+ dq[1] = y1;
73
+ dq[2] = z1;
74
+ dq[3] = w1;
75
+ dq[4] = x2;
76
+ dq[5] = y2;
77
+ dq[6] = z2;
78
+ dq[7] = w2;
79
+ return dq;
80
+ }
81
+
82
+ /**
83
+ * Creates a new dual quat from the given values (quat and translation)
84
+ *
85
+ * @param {Number} x1 X component
86
+ * @param {Number} y1 Y component
87
+ * @param {Number} z1 Z component
88
+ * @param {Number} w1 W component
89
+ * @param {Number} x2 X component (translation)
90
+ * @param {Number} y2 Y component (translation)
91
+ * @param {Number} z2 Z component (translation)
92
+ * @returns {quat2} new dual quaternion
93
+ * @function
94
+ */
95
+ export function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) {
96
+ let dq = new glMatrix.ARRAY_TYPE(8);
97
+ dq[0] = x1;
98
+ dq[1] = y1;
99
+ dq[2] = z1;
100
+ dq[3] = w1;
101
+ let ax = x2 * 0.5,
102
+ ay = y2 * 0.5,
103
+ az = z2 * 0.5;
104
+ dq[4] = ax * w1 + ay * z1 - az * y1;
105
+ dq[5] = ay * w1 + az * x1 - ax * z1;
106
+ dq[6] = az * w1 + ax * y1 - ay * x1;
107
+ dq[7] = -ax * x1 - ay * y1 - az * z1;
108
+ return dq;
109
+ }
110
+
111
+ /**
112
+ * Creates a dual quat from a quaternion and a translation
113
+ *
114
+ * @param {ReadonlyQuat2} dual quaternion receiving operation result
115
+ * @param {ReadonlyQuat} q a normalized quaternion
116
+ * @param {ReadonlyVec3} t translation vector
117
+ * @returns {quat2} dual quaternion receiving operation result
118
+ * @function
119
+ */
120
+ export function fromRotationTranslation(out, q, t) {
121
+ let ax = t[0] * 0.5,
122
+ ay = t[1] * 0.5,
123
+ az = t[2] * 0.5,
124
+ bx = q[0],
125
+ by = q[1],
126
+ bz = q[2],
127
+ bw = q[3];
128
+ out[0] = bx;
129
+ out[1] = by;
130
+ out[2] = bz;
131
+ out[3] = bw;
132
+ out[4] = ax * bw + ay * bz - az * by;
133
+ out[5] = ay * bw + az * bx - ax * bz;
134
+ out[6] = az * bw + ax * by - ay * bx;
135
+ out[7] = -ax * bx - ay * by - az * bz;
136
+ return out;
137
+ }
138
+
139
+ /**
140
+ * Creates a dual quat from a translation
141
+ *
142
+ * @param {ReadonlyQuat2} dual quaternion receiving operation result
143
+ * @param {ReadonlyVec3} t translation vector
144
+ * @returns {quat2} dual quaternion receiving operation result
145
+ * @function
146
+ */
147
+ export function fromTranslation(out, t) {
148
+ out[0] = 0;
149
+ out[1] = 0;
150
+ out[2] = 0;
151
+ out[3] = 1;
152
+ out[4] = t[0] * 0.5;
153
+ out[5] = t[1] * 0.5;
154
+ out[6] = t[2] * 0.5;
155
+ out[7] = 0;
156
+ return out;
157
+ }
158
+
159
+ /**
160
+ * Creates a dual quat from a quaternion
161
+ *
162
+ * @param {ReadonlyQuat2} dual quaternion receiving operation result
163
+ * @param {ReadonlyQuat} q the quaternion
164
+ * @returns {quat2} dual quaternion receiving operation result
165
+ * @function
166
+ */
167
+ export function fromRotation(out, q) {
168
+ out[0] = q[0];
169
+ out[1] = q[1];
170
+ out[2] = q[2];
171
+ out[3] = q[3];
172
+ out[4] = 0;
173
+ out[5] = 0;
174
+ out[6] = 0;
175
+ out[7] = 0;
176
+ return out;
177
+ }
178
+
179
+ /**
180
+ * Creates a new dual quat from a matrix (4x4)
181
+ *
182
+ * @param {quat2} out the dual quaternion
183
+ * @param {ReadonlyMat4} a the matrix
184
+ * @returns {quat2} dual quat receiving operation result
185
+ * @function
186
+ */
187
+ export function fromMat4(out, a) {
188
+ //TODO Optimize this
189
+ let outer = quat.create();
190
+ mat4.getRotation(outer, a);
191
+ let t = new glMatrix.ARRAY_TYPE(3);
192
+ mat4.getTranslation(t, a);
193
+ fromRotationTranslation(out, outer, t);
194
+ return out;
195
+ }
196
+
197
+ /**
198
+ * Copy the values from one dual quat to another
199
+ *
200
+ * @param {quat2} out the receiving dual quaternion
201
+ * @param {ReadonlyQuat2} a the source dual quaternion
202
+ * @returns {quat2} out
203
+ * @function
204
+ */
205
+ export function copy(out, a) {
206
+ out[0] = a[0];
207
+ out[1] = a[1];
208
+ out[2] = a[2];
209
+ out[3] = a[3];
210
+ out[4] = a[4];
211
+ out[5] = a[5];
212
+ out[6] = a[6];
213
+ out[7] = a[7];
214
+ return out;
215
+ }
216
+
217
+ /**
218
+ * Set a dual quat to the identity dual quaternion
219
+ *
220
+ * @param {quat2} out the receiving quaternion
221
+ * @returns {quat2} out
222
+ */
223
+ export function identity(out) {
224
+ out[0] = 0;
225
+ out[1] = 0;
226
+ out[2] = 0;
227
+ out[3] = 1;
228
+ out[4] = 0;
229
+ out[5] = 0;
230
+ out[6] = 0;
231
+ out[7] = 0;
232
+ return out;
233
+ }
234
+
235
+ /**
236
+ * Set the components of a dual quat to the given values
237
+ *
238
+ * @param {quat2} out the receiving quaternion
239
+ * @param {Number} x1 X component
240
+ * @param {Number} y1 Y component
241
+ * @param {Number} z1 Z component
242
+ * @param {Number} w1 W component
243
+ * @param {Number} x2 X component
244
+ * @param {Number} y2 Y component
245
+ * @param {Number} z2 Z component
246
+ * @param {Number} w2 W component
247
+ * @returns {quat2} out
248
+ * @function
249
+ */
250
+ export function set(out, x1, y1, z1, w1, x2, y2, z2, w2) {
251
+ out[0] = x1;
252
+ out[1] = y1;
253
+ out[2] = z1;
254
+ out[3] = w1;
255
+
256
+ out[4] = x2;
257
+ out[5] = y2;
258
+ out[6] = z2;
259
+ out[7] = w2;
260
+ return out;
261
+ }
262
+
263
+ /**
264
+ * Gets the real part of a dual quat
265
+ * @param {quat} out real part
266
+ * @param {ReadonlyQuat2} a Dual Quaternion
267
+ * @return {quat} real part
268
+ */
269
+ export const getReal = quat.copy;
270
+
271
+ /**
272
+ * Gets the dual part of a dual quat
273
+ * @param {quat} out dual part
274
+ * @param {ReadonlyQuat2} a Dual Quaternion
275
+ * @return {quat} dual part
276
+ */
277
+ export function getDual(out, a) {
278
+ out[0] = a[4];
279
+ out[1] = a[5];
280
+ out[2] = a[6];
281
+ out[3] = a[7];
282
+ return out;
283
+ }
284
+
285
+ /**
286
+ * Set the real component of a dual quat to the given quaternion
287
+ *
288
+ * @param {quat2} out the receiving quaternion
289
+ * @param {ReadonlyQuat} q a quaternion representing the real part
290
+ * @returns {quat2} out
291
+ * @function
292
+ */
293
+ export const setReal = quat.copy;
294
+
295
+ /**
296
+ * Set the dual component of a dual quat to the given quaternion
297
+ *
298
+ * @param {quat2} out the receiving quaternion
299
+ * @param {ReadonlyQuat} q a quaternion representing the dual part
300
+ * @returns {quat2} out
301
+ * @function
302
+ */
303
+ export function setDual(out, q) {
304
+ out[4] = q[0];
305
+ out[5] = q[1];
306
+ out[6] = q[2];
307
+ out[7] = q[3];
308
+ return out;
309
+ }
310
+
311
+ /**
312
+ * Gets the translation of a normalized dual quat
313
+ * @param {vec3} out translation
314
+ * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed
315
+ * @return {vec3} translation
316
+ */
317
+ export function getTranslation(out, a) {
318
+ let ax = a[4],
319
+ ay = a[5],
320
+ az = a[6],
321
+ aw = a[7],
322
+ bx = -a[0],
323
+ by = -a[1],
324
+ bz = -a[2],
325
+ bw = a[3];
326
+ out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;
327
+ out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;
328
+ out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;
329
+ return out;
330
+ }
331
+
332
+ /**
333
+ * Translates a dual quat by the given vector
334
+ *
335
+ * @param {quat2} out the receiving dual quaternion
336
+ * @param {ReadonlyQuat2} a the dual quaternion to translate
337
+ * @param {ReadonlyVec3} v vector to translate by
338
+ * @returns {quat2} out
339
+ */
340
+ export function translate(out, a, v) {
341
+ let ax1 = a[0],
342
+ ay1 = a[1],
343
+ az1 = a[2],
344
+ aw1 = a[3],
345
+ bx1 = v[0] * 0.5,
346
+ by1 = v[1] * 0.5,
347
+ bz1 = v[2] * 0.5,
348
+ ax2 = a[4],
349
+ ay2 = a[5],
350
+ az2 = a[6],
351
+ aw2 = a[7];
352
+ out[0] = ax1;
353
+ out[1] = ay1;
354
+ out[2] = az1;
355
+ out[3] = aw1;
356
+ out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2;
357
+ out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2;
358
+ out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2;
359
+ out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2;
360
+ return out;
361
+ }
362
+
363
+ /**
364
+ * Rotates a dual quat around the X axis
365
+ *
366
+ * @param {quat2} out the receiving dual quaternion
367
+ * @param {ReadonlyQuat2} a the dual quaternion to rotate
368
+ * @param {number} rad how far should the rotation be
369
+ * @returns {quat2} out
370
+ */
371
+ export function rotateX(out, a, rad) {
372
+ let bx = -a[0],
373
+ by = -a[1],
374
+ bz = -a[2],
375
+ bw = a[3],
376
+ ax = a[4],
377
+ ay = a[5],
378
+ az = a[6],
379
+ aw = a[7],
380
+ ax1 = ax * bw + aw * bx + ay * bz - az * by,
381
+ ay1 = ay * bw + aw * by + az * bx - ax * bz,
382
+ az1 = az * bw + aw * bz + ax * by - ay * bx,
383
+ aw1 = aw * bw - ax * bx - ay * by - az * bz;
384
+ quat.rotateX(out, a, rad);
385
+ bx = out[0];
386
+ by = out[1];
387
+ bz = out[2];
388
+ bw = out[3];
389
+ out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
390
+ out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
391
+ out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
392
+ out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
393
+ return out;
394
+ }
395
+
396
+ /**
397
+ * Rotates a dual quat around the Y axis
398
+ *
399
+ * @param {quat2} out the receiving dual quaternion
400
+ * @param {ReadonlyQuat2} a the dual quaternion to rotate
401
+ * @param {number} rad how far should the rotation be
402
+ * @returns {quat2} out
403
+ */
404
+ export function rotateY(out, a, rad) {
405
+ let bx = -a[0],
406
+ by = -a[1],
407
+ bz = -a[2],
408
+ bw = a[3],
409
+ ax = a[4],
410
+ ay = a[5],
411
+ az = a[6],
412
+ aw = a[7],
413
+ ax1 = ax * bw + aw * bx + ay * bz - az * by,
414
+ ay1 = ay * bw + aw * by + az * bx - ax * bz,
415
+ az1 = az * bw + aw * bz + ax * by - ay * bx,
416
+ aw1 = aw * bw - ax * bx - ay * by - az * bz;
417
+ quat.rotateY(out, a, rad);
418
+ bx = out[0];
419
+ by = out[1];
420
+ bz = out[2];
421
+ bw = out[3];
422
+ out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
423
+ out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
424
+ out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
425
+ out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
426
+ return out;
427
+ }
428
+
429
+ /**
430
+ * Rotates a dual quat around the Z axis
431
+ *
432
+ * @param {quat2} out the receiving dual quaternion
433
+ * @param {ReadonlyQuat2} a the dual quaternion to rotate
434
+ * @param {number} rad how far should the rotation be
435
+ * @returns {quat2} out
436
+ */
437
+ export function rotateZ(out, a, rad) {
438
+ let bx = -a[0],
439
+ by = -a[1],
440
+ bz = -a[2],
441
+ bw = a[3],
442
+ ax = a[4],
443
+ ay = a[5],
444
+ az = a[6],
445
+ aw = a[7],
446
+ ax1 = ax * bw + aw * bx + ay * bz - az * by,
447
+ ay1 = ay * bw + aw * by + az * bx - ax * bz,
448
+ az1 = az * bw + aw * bz + ax * by - ay * bx,
449
+ aw1 = aw * bw - ax * bx - ay * by - az * bz;
450
+ quat.rotateZ(out, a, rad);
451
+ bx = out[0];
452
+ by = out[1];
453
+ bz = out[2];
454
+ bw = out[3];
455
+ out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
456
+ out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
457
+ out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
458
+ out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
459
+ return out;
460
+ }
461
+
462
+ /**
463
+ * Rotates a dual quat by a given quaternion (a * q)
464
+ *
465
+ * @param {quat2} out the receiving dual quaternion
466
+ * @param {ReadonlyQuat2} a the dual quaternion to rotate
467
+ * @param {ReadonlyQuat} q quaternion to rotate by
468
+ * @returns {quat2} out
469
+ */
470
+ export function rotateByQuatAppend(out, a, q) {
471
+ let qx = q[0],
472
+ qy = q[1],
473
+ qz = q[2],
474
+ qw = q[3],
475
+ ax = a[0],
476
+ ay = a[1],
477
+ az = a[2],
478
+ aw = a[3];
479
+
480
+ out[0] = ax * qw + aw * qx + ay * qz - az * qy;
481
+ out[1] = ay * qw + aw * qy + az * qx - ax * qz;
482
+ out[2] = az * qw + aw * qz + ax * qy - ay * qx;
483
+ out[3] = aw * qw - ax * qx - ay * qy - az * qz;
484
+ ax = a[4];
485
+ ay = a[5];
486
+ az = a[6];
487
+ aw = a[7];
488
+ out[4] = ax * qw + aw * qx + ay * qz - az * qy;
489
+ out[5] = ay * qw + aw * qy + az * qx - ax * qz;
490
+ out[6] = az * qw + aw * qz + ax * qy - ay * qx;
491
+ out[7] = aw * qw - ax * qx - ay * qy - az * qz;
492
+ return out;
493
+ }
494
+
495
+ /**
496
+ * Rotates a dual quat by a given quaternion (q * a)
497
+ *
498
+ * @param {quat2} out the receiving dual quaternion
499
+ * @param {ReadonlyQuat} q quaternion to rotate by
500
+ * @param {ReadonlyQuat2} a the dual quaternion to rotate
501
+ * @returns {quat2} out
502
+ */
503
+ export function rotateByQuatPrepend(out, q, a) {
504
+ let qx = q[0],
505
+ qy = q[1],
506
+ qz = q[2],
507
+ qw = q[3],
508
+ bx = a[0],
509
+ by = a[1],
510
+ bz = a[2],
511
+ bw = a[3];
512
+
513
+ out[0] = qx * bw + qw * bx + qy * bz - qz * by;
514
+ out[1] = qy * bw + qw * by + qz * bx - qx * bz;
515
+ out[2] = qz * bw + qw * bz + qx * by - qy * bx;
516
+ out[3] = qw * bw - qx * bx - qy * by - qz * bz;
517
+ bx = a[4];
518
+ by = a[5];
519
+ bz = a[6];
520
+ bw = a[7];
521
+ out[4] = qx * bw + qw * bx + qy * bz - qz * by;
522
+ out[5] = qy * bw + qw * by + qz * bx - qx * bz;
523
+ out[6] = qz * bw + qw * bz + qx * by - qy * bx;
524
+ out[7] = qw * bw - qx * bx - qy * by - qz * bz;
525
+ return out;
526
+ }
527
+
528
+ /**
529
+ * Rotates a dual quat around a given axis. Does the normalisation automatically
530
+ *
531
+ * @param {quat2} out the receiving dual quaternion
532
+ * @param {ReadonlyQuat2} a the dual quaternion to rotate
533
+ * @param {ReadonlyVec3} axis the axis to rotate around
534
+ * @param {Number} rad how far the rotation should be
535
+ * @returns {quat2} out
536
+ */
537
+ export function rotateAroundAxis(out, a, axis, rad) {
538
+ //Special case for rad = 0
539
+ if (Math.abs(rad) < glMatrix.EPSILON) {
540
+ return copy(out, a);
541
+ }
542
+ let axisLength = Math.sqrt(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
543
+
544
+ rad = rad * 0.5;
545
+ let s = Math.sin(rad);
546
+ let bx = (s * axis[0]) / axisLength;
547
+ let by = (s * axis[1]) / axisLength;
548
+ let bz = (s * axis[2]) / axisLength;
549
+ let bw = Math.cos(rad);
550
+
551
+ let ax1 = a[0],
552
+ ay1 = a[1],
553
+ az1 = a[2],
554
+ aw1 = a[3];
555
+ out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;
556
+ out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;
557
+ out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;
558
+ out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;
559
+
560
+ let ax = a[4],
561
+ ay = a[5],
562
+ az = a[6],
563
+ aw = a[7];
564
+ out[4] = ax * bw + aw * bx + ay * bz - az * by;
565
+ out[5] = ay * bw + aw * by + az * bx - ax * bz;
566
+ out[6] = az * bw + aw * bz + ax * by - ay * bx;
567
+ out[7] = aw * bw - ax * bx - ay * by - az * bz;
568
+
569
+ return out;
570
+ }
571
+
572
+ /**
573
+ * Adds two dual quat's
574
+ *
575
+ * @param {quat2} out the receiving dual quaternion
576
+ * @param {ReadonlyQuat2} a the first operand
577
+ * @param {ReadonlyQuat2} b the second operand
578
+ * @returns {quat2} out
579
+ * @function
580
+ */
581
+ export function add(out, a, b) {
582
+ out[0] = a[0] + b[0];
583
+ out[1] = a[1] + b[1];
584
+ out[2] = a[2] + b[2];
585
+ out[3] = a[3] + b[3];
586
+ out[4] = a[4] + b[4];
587
+ out[5] = a[5] + b[5];
588
+ out[6] = a[6] + b[6];
589
+ out[7] = a[7] + b[7];
590
+ return out;
591
+ }
592
+
593
+ /**
594
+ * Multiplies two dual quat's
595
+ *
596
+ * @param {quat2} out the receiving dual quaternion
597
+ * @param {ReadonlyQuat2} a the first operand
598
+ * @param {ReadonlyQuat2} b the second operand
599
+ * @returns {quat2} out
600
+ */
601
+ export function multiply(out, a, b) {
602
+ let ax0 = a[0],
603
+ ay0 = a[1],
604
+ az0 = a[2],
605
+ aw0 = a[3],
606
+ bx1 = b[4],
607
+ by1 = b[5],
608
+ bz1 = b[6],
609
+ bw1 = b[7],
610
+ ax1 = a[4],
611
+ ay1 = a[5],
612
+ az1 = a[6],
613
+ aw1 = a[7],
614
+ bx0 = b[0],
615
+ by0 = b[1],
616
+ bz0 = b[2],
617
+ bw0 = b[3];
618
+ out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0;
619
+ out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0;
620
+ out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0;
621
+ out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0;
622
+ out[4] =
623
+ ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0;
624
+ out[5] =
625
+ ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0;
626
+ out[6] =
627
+ az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0;
628
+ out[7] =
629
+ aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0;
630
+ return out;
631
+ }
632
+
633
+ /**
634
+ * Alias for {@link quat2.multiply}
635
+ * @function
636
+ */
637
+ export const mul = multiply;
638
+
639
+ /**
640
+ * Scales a dual quat by a scalar number
641
+ *
642
+ * @param {quat2} out the receiving dual quat
643
+ * @param {ReadonlyQuat2} a the dual quat to scale
644
+ * @param {Number} b amount to scale the dual quat by
645
+ * @returns {quat2} out
646
+ * @function
647
+ */
648
+ export function scale(out, a, b) {
649
+ out[0] = a[0] * b;
650
+ out[1] = a[1] * b;
651
+ out[2] = a[2] * b;
652
+ out[3] = a[3] * b;
653
+ out[4] = a[4] * b;
654
+ out[5] = a[5] * b;
655
+ out[6] = a[6] * b;
656
+ out[7] = a[7] * b;
657
+ return out;
658
+ }
659
+
660
+ /**
661
+ * Calculates the dot product of two dual quat's (The dot product of the real parts)
662
+ *
663
+ * @param {ReadonlyQuat2} a the first operand
664
+ * @param {ReadonlyQuat2} b the second operand
665
+ * @returns {Number} dot product of a and b
666
+ * @function
667
+ */
668
+ export const dot = quat.dot;
669
+
670
+ /**
671
+ * Performs a linear interpolation between two dual quats's
672
+ * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5)
673
+ *
674
+ * @param {quat2} out the receiving dual quat
675
+ * @param {ReadonlyQuat2} a the first operand
676
+ * @param {ReadonlyQuat2} b the second operand
677
+ * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
678
+ * @returns {quat2} out
679
+ */
680
+ export function lerp(out, a, b, t) {
681
+ let mt = 1 - t;
682
+ if (dot(a, b) < 0) t = -t;
683
+
684
+ out[0] = a[0] * mt + b[0] * t;
685
+ out[1] = a[1] * mt + b[1] * t;
686
+ out[2] = a[2] * mt + b[2] * t;
687
+ out[3] = a[3] * mt + b[3] * t;
688
+ out[4] = a[4] * mt + b[4] * t;
689
+ out[5] = a[5] * mt + b[5] * t;
690
+ out[6] = a[6] * mt + b[6] * t;
691
+ out[7] = a[7] * mt + b[7] * t;
692
+
693
+ return out;
694
+ }
695
+
696
+ /**
697
+ * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper
698
+ *
699
+ * @param {quat2} out the receiving dual quaternion
700
+ * @param {ReadonlyQuat2} a dual quat to calculate inverse of
701
+ * @returns {quat2} out
702
+ */
703
+ export function invert(out, a) {
704
+ let sqlen = squaredLength(a);
705
+ out[0] = -a[0] / sqlen;
706
+ out[1] = -a[1] / sqlen;
707
+ out[2] = -a[2] / sqlen;
708
+ out[3] = a[3] / sqlen;
709
+ out[4] = -a[4] / sqlen;
710
+ out[5] = -a[5] / sqlen;
711
+ out[6] = -a[6] / sqlen;
712
+ out[7] = a[7] / sqlen;
713
+ return out;
714
+ }
715
+
716
+ /**
717
+ * Calculates the conjugate of a dual quat
718
+ * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result.
719
+ *
720
+ * @param {quat2} out the receiving quaternion
721
+ * @param {ReadonlyQuat2} a quat to calculate conjugate of
722
+ * @returns {quat2} out
723
+ */
724
+ export function conjugate(out, a) {
725
+ out[0] = -a[0];
726
+ out[1] = -a[1];
727
+ out[2] = -a[2];
728
+ out[3] = a[3];
729
+ out[4] = -a[4];
730
+ out[5] = -a[5];
731
+ out[6] = -a[6];
732
+ out[7] = a[7];
733
+ return out;
734
+ }
735
+
736
+ /**
737
+ * Calculates the length of a dual quat
738
+ *
739
+ * @param {ReadonlyQuat2} a dual quat to calculate length of
740
+ * @returns {Number} length of a
741
+ * @function
742
+ */
743
+ export const length = quat.length;
744
+
745
+ /**
746
+ * Alias for {@link quat2.length}
747
+ * @function
748
+ */
749
+ export const len = length;
750
+
751
+ /**
752
+ * Calculates the squared length of a dual quat
753
+ *
754
+ * @param {ReadonlyQuat2} a dual quat to calculate squared length of
755
+ * @returns {Number} squared length of a
756
+ * @function
757
+ */
758
+ export const squaredLength = quat.squaredLength;
759
+
760
+ /**
761
+ * Alias for {@link quat2.squaredLength}
762
+ * @function
763
+ */
764
+ export const sqrLen = squaredLength;
765
+
766
+ /**
767
+ * Normalize a dual quat
768
+ *
769
+ * @param {quat2} out the receiving dual quaternion
770
+ * @param {ReadonlyQuat2} a dual quaternion to normalize
771
+ * @returns {quat2} out
772
+ * @function
773
+ */
774
+ export function normalize(out, a) {
775
+ let magnitude = squaredLength(a);
776
+ if (magnitude > 0) {
777
+ magnitude = Math.sqrt(magnitude);
778
+
779
+ let a0 = a[0] / magnitude;
780
+ let a1 = a[1] / magnitude;
781
+ let a2 = a[2] / magnitude;
782
+ let a3 = a[3] / magnitude;
783
+
784
+ let b0 = a[4];
785
+ let b1 = a[5];
786
+ let b2 = a[6];
787
+ let b3 = a[7];
788
+
789
+ let a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3;
790
+
791
+ out[0] = a0;
792
+ out[1] = a1;
793
+ out[2] = a2;
794
+ out[3] = a3;
795
+
796
+ out[4] = (b0 - a0 * a_dot_b) / magnitude;
797
+ out[5] = (b1 - a1 * a_dot_b) / magnitude;
798
+ out[6] = (b2 - a2 * a_dot_b) / magnitude;
799
+ out[7] = (b3 - a3 * a_dot_b) / magnitude;
800
+ }
801
+ return out;
802
+ }
803
+
804
+ /**
805
+ * Returns a string representation of a dual quaternion
806
+ *
807
+ * @param {ReadonlyQuat2} a dual quaternion to represent as a string
808
+ * @returns {String} string representation of the dual quat
809
+ */
810
+ export function str(a) {
811
+ return (
812
+ 'quat2(' +
813
+ a[0] +
814
+ ', ' +
815
+ a[1] +
816
+ ', ' +
817
+ a[2] +
818
+ ', ' +
819
+ a[3] +
820
+ ', ' +
821
+ a[4] +
822
+ ', ' +
823
+ a[5] +
824
+ ', ' +
825
+ a[6] +
826
+ ', ' +
827
+ a[7] +
828
+ ')'
829
+ );
830
+ }
831
+
832
+ /**
833
+ * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===)
834
+ *
835
+ * @param {ReadonlyQuat2} a the first dual quaternion.
836
+ * @param {ReadonlyQuat2} b the second dual quaternion.
837
+ * @returns {Boolean} true if the dual quaternions are equal, false otherwise.
838
+ */
839
+ export function exactEquals(a, b) {
840
+ return (
841
+ a[0] === b[0] &&
842
+ a[1] === b[1] &&
843
+ a[2] === b[2] &&
844
+ a[3] === b[3] &&
845
+ a[4] === b[4] &&
846
+ a[5] === b[5] &&
847
+ a[6] === b[6] &&
848
+ a[7] === b[7]
849
+ );
850
+ }
851
+
852
+ /**
853
+ * Returns whether or not the dual quaternions have approximately the same elements in the same position.
854
+ *
855
+ * @param {ReadonlyQuat2} a the first dual quat.
856
+ * @param {ReadonlyQuat2} b the second dual quat.
857
+ * @returns {Boolean} true if the dual quats are equal, false otherwise.
858
+ */
859
+ export function equals(a, b) {
860
+ let a0 = a[0],
861
+ a1 = a[1],
862
+ a2 = a[2],
863
+ a3 = a[3],
864
+ a4 = a[4],
865
+ a5 = a[5],
866
+ a6 = a[6],
867
+ a7 = a[7];
868
+ let b0 = b[0],
869
+ b1 = b[1],
870
+ b2 = b[2],
871
+ b3 = b[3],
872
+ b4 = b[4],
873
+ b5 = b[5],
874
+ b6 = b[6],
875
+ b7 = b[7];
876
+ return (
877
+ Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&
878
+ Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&
879
+ Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&
880
+ Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&
881
+ Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&
882
+ Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&
883
+ Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&
884
+ Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7))
885
+ );
886
+ }