@thi.ng/matrices 2.2.11 → 2.2.13

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 (60) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +1 -1
  3. package/add.js +10 -13
  4. package/addn.js +10 -13
  5. package/alignment-quat.js +10 -16
  6. package/api.js +0 -1
  7. package/column.js +21 -13
  8. package/compile/emit.js +20 -3
  9. package/concat.js +4 -11
  10. package/conjugate.js +4 -1
  11. package/constants.js +35 -13
  12. package/determinant.js +51 -27
  13. package/diag.js +12 -11
  14. package/div.js +10 -13
  15. package/divn.js +10 -13
  16. package/fit.js +16 -24
  17. package/frustum.js +38 -28
  18. package/identity.js +12 -8
  19. package/invert.js +100 -45
  20. package/lookat.js +26 -15
  21. package/m22-m23.js +4 -8
  22. package/m23-m22.js +4 -8
  23. package/m23-m44.js +26 -16
  24. package/m33-m44.js +26 -16
  25. package/m44-m33.js +4 -11
  26. package/matn.js +10 -4
  27. package/matv.js +10 -36
  28. package/mixq.js +18 -28
  29. package/mul.js +10 -15
  30. package/mulm.js +67 -45
  31. package/muln.js +10 -13
  32. package/mulq.js +13 -12
  33. package/mulv.js +58 -77
  34. package/mulvm.js +16 -46
  35. package/normal-mat.js +10 -23
  36. package/orthagonal.js +17 -25
  37. package/ortho.js +26 -17
  38. package/outer-product.js +48 -10
  39. package/package.json +10 -8
  40. package/perspective.js +6 -13
  41. package/project.js +20 -51
  42. package/quat-axis-angle.js +13 -23
  43. package/quat-euler.js +16 -18
  44. package/quat-m33.js +29 -21
  45. package/quat-m44.js +36 -22
  46. package/rotation-around-axis.js +27 -32
  47. package/rotation.js +41 -79
  48. package/row.js +12 -13
  49. package/scale-center.js +16 -16
  50. package/scale.js +32 -42
  51. package/set.js +13 -6
  52. package/shear.js +35 -18
  53. package/skew.js +52 -17
  54. package/sub.js +10 -13
  55. package/subn.js +10 -13
  56. package/trace.js +4 -6
  57. package/transform.js +19 -23
  58. package/translation.js +6 -14
  59. package/transpose.js +26 -24
  60. package/viewport.js +9 -16
package/invert.js CHANGED
@@ -5,53 +5,108 @@ import { vop } from "@thi.ng/vectors/vop";
5
5
  import { det44FromCoeffs, detCoeffs44 } from "./determinant.js";
6
6
  const dp4 = dotC4;
7
7
  const dp6 = dotC6;
8
- /**
9
- * Matrix inversion. Returns `undefined` if matrix is not invertible.
10
- * Mutates `mat` if `out` is `null`.
11
- *
12
- * @param out -
13
- * @param mat -
14
- */
15
- export const invert = vop(1);
16
- export const invert22 = invert.add(4, (out, m) => {
17
- const [m00, m01, m10, m11] = m;
18
- let det = dp4(m00, m11, -m01, m10);
19
- if (det === 0)
20
- return;
21
- det = 1.0 / det;
22
- return setC4(out || m, m11 * det, -m01 * det, -m10 * det, m00 * det);
8
+ const invert = vop(1);
9
+ const invert22 = invert.add(4, (out, m) => {
10
+ const [m00, m01, m10, m11] = m;
11
+ let det = dp4(m00, m11, -m01, m10);
12
+ if (det === 0)
13
+ return;
14
+ det = 1 / det;
15
+ return setC4(out || m, m11 * det, -m01 * det, -m10 * det, m00 * det);
23
16
  });
24
- export const invert23 = invert.add(6, (out, m) => {
25
- const [m00, m01, m10, m11, m20, m21] = m;
26
- let det = dp4(m00, m11, -m01, m10);
27
- if (det === 0)
28
- return;
29
- det = 1.0 / det;
30
- return setC6(out || m, m11 * det, -m01 * det, -m10 * det, m00 * det, dp4(m10, m21, -m11, m20) * det, dp4(m01, m20, -m00, m21) * det);
17
+ const invert23 = invert.add(6, (out, m) => {
18
+ const [m00, m01, m10, m11, m20, m21] = m;
19
+ let det = dp4(m00, m11, -m01, m10);
20
+ if (det === 0)
21
+ return;
22
+ det = 1 / det;
23
+ return setC6(
24
+ out || m,
25
+ m11 * det,
26
+ -m01 * det,
27
+ -m10 * det,
28
+ m00 * det,
29
+ dp4(m10, m21, -m11, m20) * det,
30
+ dp4(m01, m20, -m00, m21) * det
31
+ );
31
32
  });
32
- export const invert33 = invert.add(9, (out, m) => {
33
- const [m00, m01, m02, m10, m11, m12, m20, m21, m22] = m;
34
- const d01 = dp4(m22, m11, -m12, m21);
35
- const d11 = dp4(m12, m20, -m22, m10);
36
- const d21 = dp4(m21, m10, -m11, m20);
37
- let det = dp6(m00, d01, m01, d11, m02, d21);
38
- if (det === 0)
39
- return;
40
- det = 1.0 / det;
41
- return setC(out || m, d01 * det, dp4(-m22, m01, m02, m21) * det, dp4(m12, m01, -m02, m11) * det, d11 * det, dp4(m22, m00, -m02, m20) * det, dp4(-m12, m00, m02, m10) * det, d21 * det, dp4(-m21, m00, m01, m20) * det, dp4(m11, m00, -m01, m10) * det);
33
+ const invert33 = invert.add(9, (out, m) => {
34
+ const [m00, m01, m02, m10, m11, m12, m20, m21, m22] = m;
35
+ const d01 = dp4(m22, m11, -m12, m21);
36
+ const d11 = dp4(m12, m20, -m22, m10);
37
+ const d21 = dp4(m21, m10, -m11, m20);
38
+ let det = dp6(m00, d01, m01, d11, m02, d21);
39
+ if (det === 0)
40
+ return;
41
+ det = 1 / det;
42
+ return setC(
43
+ out || m,
44
+ d01 * det,
45
+ dp4(-m22, m01, m02, m21) * det,
46
+ dp4(m12, m01, -m02, m11) * det,
47
+ d11 * det,
48
+ dp4(m22, m00, -m02, m20) * det,
49
+ dp4(-m12, m00, m02, m10) * det,
50
+ d21 * det,
51
+ dp4(-m21, m00, m01, m20) * det,
52
+ dp4(m11, m00, -m01, m10) * det
53
+ );
42
54
  });
43
- export const invert44 = invert.add(16, (out, m) => {
44
- const coeffs = detCoeffs44(m);
45
- let det = det44FromCoeffs(coeffs);
46
- if (det === 0)
47
- return;
48
- det = 1.0 / det;
49
- const [m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33,] = m;
50
- const [d00, d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11] = coeffs;
51
- return setC(out || m, dp6(m11, d11, -m12, d10, m13, d09) * det, dp6(-m01, d11, m02, d10, -m03, d09) * det, dp6(m31, d05, -m32, d04, m33, d03) * det, dp6(-m21, d05, m22, d04, -m23, d03) * det, dp6(-m10, d11, m12, d08, -m13, d07) * det, dp6(m00, d11, -m02, d08, m03, d07) * det, dp6(-m30, d05, m32, d02, -m33, d01) * det, dp6(m20, d05, -m22, d02, m23, d01) * det, dp6(m10, d10, -m11, d08, m13, d06) * det, dp6(-m00, d10, m01, d08, -m03, d06) * det, dp6(m30, d04, -m31, d02, m33, d00) * det, dp6(-m20, d04, m21, d02, -m23, d00) * det, dp6(-m10, d09, m11, d07, -m12, d06) * det, dp6(m00, d09, -m01, d07, m02, d06) * det, dp6(-m30, d03, m31, d01, -m32, d00) * det, dp6(m20, d03, -m21, d01, m22, d00) * det);
55
+ const invert44 = invert.add(16, (out, m) => {
56
+ const coeffs = detCoeffs44(m);
57
+ let det = det44FromCoeffs(coeffs);
58
+ if (det === 0)
59
+ return;
60
+ det = 1 / det;
61
+ const [
62
+ m00,
63
+ m01,
64
+ m02,
65
+ m03,
66
+ m10,
67
+ m11,
68
+ m12,
69
+ m13,
70
+ m20,
71
+ m21,
72
+ m22,
73
+ m23,
74
+ m30,
75
+ m31,
76
+ m32,
77
+ m33
78
+ ] = m;
79
+ const [d00, d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11] = coeffs;
80
+ return setC(
81
+ out || m,
82
+ dp6(m11, d11, -m12, d10, m13, d09) * det,
83
+ dp6(-m01, d11, m02, d10, -m03, d09) * det,
84
+ dp6(m31, d05, -m32, d04, m33, d03) * det,
85
+ dp6(-m21, d05, m22, d04, -m23, d03) * det,
86
+ dp6(-m10, d11, m12, d08, -m13, d07) * det,
87
+ dp6(m00, d11, -m02, d08, m03, d07) * det,
88
+ dp6(-m30, d05, m32, d02, -m33, d01) * det,
89
+ dp6(m20, d05, -m22, d02, m23, d01) * det,
90
+ dp6(m10, d10, -m11, d08, m13, d06) * det,
91
+ dp6(-m00, d10, m01, d08, -m03, d06) * det,
92
+ dp6(m30, d04, -m31, d02, m33, d00) * det,
93
+ dp6(-m20, d04, m21, d02, -m23, d00) * det,
94
+ dp6(-m10, d09, m11, d07, -m12, d06) * det,
95
+ dp6(m00, d09, -m01, d07, m02, d06) * det,
96
+ dp6(-m30, d03, m31, d01, -m32, d00) * det,
97
+ dp6(m20, d03, -m21, d01, m22, d00) * det
98
+ );
52
99
  });
53
- export const invertQ = (out, a) => {
54
- let d = magSq4(a);
55
- d = d > 0 ? -1 / d : 0;
56
- return setC4(out || a, a[0] * d, a[1] * d, a[2] * d, a[3] * -d);
100
+ const invertQ = (out, a) => {
101
+ let d = magSq4(a);
102
+ d = d > 0 ? -1 / d : 0;
103
+ return setC4(out || a, a[0] * d, a[1] * d, a[2] * d, a[3] * -d);
104
+ };
105
+ export {
106
+ invert,
107
+ invert22,
108
+ invert23,
109
+ invert33,
110
+ invert44,
111
+ invertQ
57
112
  };
package/lookat.js CHANGED
@@ -3,19 +3,30 @@ import { dot3 } from "@thi.ng/vectors/dot";
3
3
  import { normalize3 } from "@thi.ng/vectors/normalize";
4
4
  import { setC } from "@thi.ng/vectors/setc";
5
5
  import { sub3 } from "@thi.ng/vectors/sub";
6
- /**
7
- * Constructs a 4x4 camera matrix for given `eye` position, look-at
8
- * `target` (both in world space) and normalized `up` vector. Creates
9
- * new matrix if `out` is `null`.
10
- *
11
- * @param out -
12
- * @param eye -
13
- * @param target -
14
- * @param up -
15
- */
16
- export const lookAt = (out, eye, target, up) => {
17
- const z = normalize3(null, sub3([], eye, target));
18
- const x = normalize3(null, cross3([], up, z));
19
- const y = normalize3(null, cross3([], z, x));
20
- return setC(out || [], x[0], y[0], z[0], 0, x[1], y[1], z[1], 0, x[2], y[2], z[2], 0, -dot3(eye, x), -dot3(eye, y), -dot3(eye, z), 1);
6
+ const lookAt = (out, eye, target, up) => {
7
+ const z = normalize3(null, sub3([], eye, target));
8
+ const x = normalize3(null, cross3([], up, z));
9
+ const y = normalize3(null, cross3([], z, x));
10
+ return setC(
11
+ out || [],
12
+ x[0],
13
+ y[0],
14
+ z[0],
15
+ 0,
16
+ x[1],
17
+ y[1],
18
+ z[1],
19
+ 0,
20
+ x[2],
21
+ y[2],
22
+ z[2],
23
+ 0,
24
+ -dot3(eye, x),
25
+ -dot3(eye, y),
26
+ -dot3(eye, z),
27
+ 1
28
+ );
29
+ };
30
+ export {
31
+ lookAt
21
32
  };
package/m22-m23.js CHANGED
@@ -1,9 +1,5 @@
1
1
  import { set4 } from "@thi.ng/vectors/set";
2
- /**
3
- * Converts 2x2 to 2x3 matrix and writes result to `out`. Creates new
4
- * matrix if `out` is `null`.
5
- *
6
- * @param out -
7
- * @param m22 -
8
- */
9
- export const mat22to23 = (out, m22) => (!out && (out = []), set4(out, m22), (out[4] = out[5] = 0), out);
2
+ const mat22to23 = (out, m22) => (!out && (out = []), set4(out, m22), out[4] = out[5] = 0, out);
3
+ export {
4
+ mat22to23
5
+ };
package/m23-m22.js CHANGED
@@ -1,9 +1,5 @@
1
1
  import { set4 } from "@thi.ng/vectors/set";
2
- /**
3
- * Converts 2x3 to 2x2 matrix and writes result to `out`. Creates new
4
- * matrix if `out` is `null`.
5
- *
6
- * @param out -
7
- * @param m23 -
8
- */
9
- export const mat23to22 = (out, m23) => set4(out || [], m23);
2
+ const mat23to22 = (out, m23) => set4(out || [], m23);
3
+ export {
4
+ mat23to22
5
+ };
package/m23-m44.js CHANGED
@@ -1,17 +1,27 @@
1
1
  import { setC } from "@thi.ng/vectors/setc";
2
- /**
3
- * Converts 2x3 to 4x4 matrix and writes result to `out`. Creates new
4
- * matrix if `out` is `null`.
5
- *
6
- * @param out -
7
- * @param m23 -
8
- */
9
- export const mat23to44 = (out, m23) => setC(out || [],
10
- // x
11
- m23[0], m23[1], 0, 0,
12
- // y
13
- m23[2], m23[3], 0, 0,
14
- // z
15
- 0, 0, 1, 0,
16
- // w
17
- m23[4], m23[5], 0, 1);
2
+ const mat23to44 = (out, m23) => setC(
3
+ out || [],
4
+ // x
5
+ m23[0],
6
+ m23[1],
7
+ 0,
8
+ 0,
9
+ // y
10
+ m23[2],
11
+ m23[3],
12
+ 0,
13
+ 0,
14
+ // z
15
+ 0,
16
+ 0,
17
+ 1,
18
+ 0,
19
+ // w
20
+ m23[4],
21
+ m23[5],
22
+ 0,
23
+ 1
24
+ );
25
+ export {
26
+ mat23to44
27
+ };
package/m33-m44.js CHANGED
@@ -1,17 +1,27 @@
1
1
  import { setC } from "@thi.ng/vectors/setc";
2
- /**
3
- * Converts 3x3 to 4x4 matrix and writes result to `out`. Creates new
4
- * matrix if `out` is `null`.
5
- *
6
- * @param out -
7
- * @param m33 -
8
- */
9
- export const mat33to44 = (out, m33) => setC(out || [],
10
- // x
11
- m33[0], m33[1], m33[2], 0,
12
- // y
13
- m33[3], m33[4], m33[5], 0,
14
- // z
15
- m33[6], m33[7], m33[8], 0,
16
- // w
17
- 0, 0, 0, 1);
2
+ const mat33to44 = (out, m33) => setC(
3
+ out || [],
4
+ // x
5
+ m33[0],
6
+ m33[1],
7
+ m33[2],
8
+ 0,
9
+ // y
10
+ m33[3],
11
+ m33[4],
12
+ m33[5],
13
+ 0,
14
+ // z
15
+ m33[6],
16
+ m33[7],
17
+ m33[8],
18
+ 0,
19
+ // w
20
+ 0,
21
+ 0,
22
+ 0,
23
+ 1
24
+ );
25
+ export {
26
+ mat33to44
27
+ };
package/m44-m33.js CHANGED
@@ -1,12 +1,5 @@
1
1
  import { setS3 } from "@thi.ng/vectors/sets";
2
- /**
3
- * Converts 4x4 to 3x3 matrix and writes result to `out`. Creates new
4
- * matrix if `out` is `null`.
5
- *
6
- * @param out -
7
- * @param m44 -
8
- */
9
- export const mat44to33 = (out, m44) => (!out && (out = []),
10
- setS3(out, m44),
11
- setS3(out, m44, 3, 4),
12
- setS3(out, m44, 6, 8));
2
+ const mat44to33 = (out, m44) => (!out && (out = []), setS3(out, m44), setS3(out, m44, 3, 4), setS3(out, m44, 6, 8));
3
+ export {
4
+ mat44to33
5
+ };
package/matn.js CHANGED
@@ -1,5 +1,11 @@
1
1
  import { scale22, scale23, scale33, scale44 } from "./scale.js";
2
- export const mat22n = (out, n) => scale22(out, n);
3
- export const mat23n = (out, n) => scale23(out, n);
4
- export const mat33n = (out, n) => scale33(out, n);
5
- export const mat44n = (out, n) => scale44(out, [n, n, n, n]);
2
+ const mat22n = (out, n) => scale22(out, n);
3
+ const mat23n = (out, n) => scale23(out, n);
4
+ const mat33n = (out, n) => scale33(out, n);
5
+ const mat44n = (out, n) => scale44(out, [n, n, n, n]);
6
+ export {
7
+ mat22n,
8
+ mat23n,
9
+ mat33n,
10
+ mat44n
11
+ };
package/matv.js CHANGED
@@ -1,37 +1,11 @@
1
1
  import { setVV16, setVV4, setVV6, setVV9 } from "@thi.ng/vectors/setvv";
2
- /**
3
- * Initializes 2x2 matrix from 2D column vectors.
4
- *
5
- * @param out -
6
- * @param x -
7
- * @param y -
8
- */
9
- export const mat22v = setVV4;
10
- /**
11
- * Initializes 2x3 matrix (affine transform) from 2D column vectors.
12
- *
13
- * @param out -
14
- * @param x -
15
- * @param y -
16
- * @param translate -
17
- */
18
- export const mat23v = setVV6;
19
- /**
20
- * Initializes 3x3 matrix from 3D column vectors.
21
- *
22
- * @param out -
23
- * @param x -
24
- * @param y -
25
- * @param z -
26
- */
27
- export const mat33v = setVV9;
28
- /**
29
- * Initializes 4x4 matrix from 4D column vectors.
30
- *
31
- * @param out -
32
- * @param x -
33
- * @param y -
34
- * @param z -
35
- * @param w -
36
- */
37
- export const mat44v = setVV16;
2
+ const mat22v = setVV4;
3
+ const mat23v = setVV6;
4
+ const mat33v = setVV9;
5
+ const mat44v = setVV16;
6
+ export {
7
+ mat22v,
8
+ mat23v,
9
+ mat33v,
10
+ mat44v
11
+ };
package/mixq.js CHANGED
@@ -2,33 +2,23 @@ import { dot4 } from "@thi.ng/vectors/dot";
2
2
  import { maddN4 } from "@thi.ng/vectors/maddn";
3
3
  import { mulN4 } from "@thi.ng/vectors/muln";
4
4
  import { set4 } from "@thi.ng/vectors/set";
5
- /**
6
- * Interpolates quaternion `a` to `b` by given amount `t` [0...1], using
7
- * SLERP. Writes result to `out`. The optional `eps` (default 1e-3) is
8
- * used to switch to linear interpolation if the angular difference is
9
- * very small.
10
- *
11
- * @param out -
12
- * @param a -
13
- * @param b -
14
- * @param t -
15
- * @param eps -
16
- */
17
- export const mixQ = (out, a, b, t, eps = 1e-3) => {
18
- const d = dot4(a, b);
19
- if (Math.abs(d) < 1.0) {
20
- const theta = Math.acos(d);
21
- const stheta = Math.sqrt(1 - d * d);
22
- let u, v;
23
- if (Math.abs(stheta) < eps) {
24
- u = v = 0.5;
25
- }
26
- else {
27
- u = Math.sin(theta * (1 - t)) / stheta;
28
- v = Math.sin(theta * t) / stheta;
29
- }
30
- !out && (out = a);
31
- return maddN4(out, b, v, mulN4(out, a, u));
5
+ const mixQ = (out, a, b, t, eps = 1e-3) => {
6
+ const d = dot4(a, b);
7
+ if (Math.abs(d) < 1) {
8
+ const theta = Math.acos(d);
9
+ const stheta = Math.sqrt(1 - d * d);
10
+ let u, v;
11
+ if (Math.abs(stheta) < eps) {
12
+ u = v = 0.5;
13
+ } else {
14
+ u = Math.sin(theta * (1 - t)) / stheta;
15
+ v = Math.sin(theta * t) / stheta;
32
16
  }
33
- return a !== out ? set4(out, a) : out;
17
+ !out && (out = a);
18
+ return maddN4(out, b, v, mulN4(out, a, u));
19
+ }
20
+ return a !== out ? set4(out, a) : out;
21
+ };
22
+ export {
23
+ mixQ
34
24
  };
package/mul.js CHANGED
@@ -1,17 +1,12 @@
1
1
  import { mul as _mul, mul4 } from "@thi.ng/vectors/mul";
2
2
  import { defMath } from "./compile/emit.js";
3
- /**
4
- * Componentwise matrix multiplication. Use {@link mulM} or
5
- * {@link concat} for actual matrix-matrix multiplication/concatenation.
6
- * If `out` is not given, writes result in `a`. Both input matrices MUST
7
- * be of same size.
8
- *
9
- * out = a * b
10
- *
11
- * @param out -
12
- * @param a -
13
- * @param b -
14
- */
15
- export const mul = _mul;
16
- export const mul22 = mul4;
17
- export const [mul23, mul33, mul44] = defMath(mul, "*");
3
+ const mul = _mul;
4
+ const mul22 = mul4;
5
+ const [mul23, mul33, mul44] = defMath(mul, "*");
6
+ export {
7
+ mul,
8
+ mul22,
9
+ mul23,
10
+ mul33,
11
+ mul44
12
+ };
package/mulm.js CHANGED
@@ -1,48 +1,70 @@
1
1
  import { dotS2, dotS3, dotS4 } from "@thi.ng/vectors/dots";
2
2
  import { setC, setC4, setC6 } from "@thi.ng/vectors/setc";
3
3
  import { vop } from "@thi.ng/vectors/vop";
4
- /**
5
- * Multi-method. Performs matrix-matrix multiplication. If `out` is not
6
- * given, writes result in `a`.
7
- *
8
- * @param out -
9
- * @param a -
10
- * @param b -
11
- */
12
- export const mulM = vop(1);
13
- /**
14
- * 2x2 matrix-matrix multiplication. If `out` is not given, writes
15
- * result in `a`.
16
- *
17
- * @param out -
18
- * @param a -
19
- * @param b -
20
- */
21
- export const mulM22 = mulM.add(4, (out, a, b) => setC4(out || a, dotS2(a, b, 0, 0, 2), dotS2(a, b, 1, 0, 2), dotS2(a, b, 0, 2, 2), dotS2(a, b, 1, 2, 2)));
22
- /**
23
- * 2x3 matrix-matrix multiplication. If `out` is not given, writes
24
- * result in `a`.
25
- *
26
- * @param out -
27
- * @param a -
28
- * @param b -
29
- */
30
- export const mulM23 = mulM.add(6, (out, a, b) => setC6(out || a, dotS2(a, b, 0, 0, 2), dotS2(a, b, 1, 0, 2), dotS2(a, b, 0, 2, 2), dotS2(a, b, 1, 2, 2), dotS2(a, b, 0, 4, 2) + a[4], dotS2(a, b, 1, 4, 2) + a[5]));
31
- /**
32
- * 3x3 matrix-matrix multiplication. If `out` is not given, writes
33
- * result in `a`.
34
- *
35
- * @param out -
36
- * @param a -
37
- * @param b -
38
- */
39
- export const mulM33 = mulM.add(9, (out, a, b) => setC(out || a, dotS3(a, b, 0, 0, 3), dotS3(a, b, 1, 0, 3), dotS3(a, b, 2, 0, 3), dotS3(a, b, 0, 3, 3), dotS3(a, b, 1, 3, 3), dotS3(a, b, 2, 3, 3), dotS3(a, b, 0, 6, 3), dotS3(a, b, 1, 6, 3), dotS3(a, b, 2, 6, 3)));
40
- /**
41
- * 4x4 matrix-matrix multiplication. If `out` is not given, writes
42
- * result in `a`.
43
- *
44
- * @param out -
45
- * @param a -
46
- * @param b -
47
- */
48
- export const mulM44 = mulM.add(16, (out, a, b) => setC(out || a, dotS4(a, b, 0, 0, 4), dotS4(a, b, 1, 0, 4), dotS4(a, b, 2, 0, 4), dotS4(a, b, 3, 0, 4), dotS4(a, b, 0, 4, 4), dotS4(a, b, 1, 4, 4), dotS4(a, b, 2, 4, 4), dotS4(a, b, 3, 4, 4), dotS4(a, b, 0, 8, 4), dotS4(a, b, 1, 8, 4), dotS4(a, b, 2, 8, 4), dotS4(a, b, 3, 8, 4), dotS4(a, b, 0, 12, 4), dotS4(a, b, 1, 12, 4), dotS4(a, b, 2, 12, 4), dotS4(a, b, 3, 12, 4)));
4
+ const mulM = vop(1);
5
+ const mulM22 = mulM.add(
6
+ 4,
7
+ (out, a, b) => setC4(
8
+ out || a,
9
+ dotS2(a, b, 0, 0, 2),
10
+ dotS2(a, b, 1, 0, 2),
11
+ dotS2(a, b, 0, 2, 2),
12
+ dotS2(a, b, 1, 2, 2)
13
+ )
14
+ );
15
+ const mulM23 = mulM.add(
16
+ 6,
17
+ (out, a, b) => setC6(
18
+ out || a,
19
+ dotS2(a, b, 0, 0, 2),
20
+ dotS2(a, b, 1, 0, 2),
21
+ dotS2(a, b, 0, 2, 2),
22
+ dotS2(a, b, 1, 2, 2),
23
+ dotS2(a, b, 0, 4, 2) + a[4],
24
+ dotS2(a, b, 1, 4, 2) + a[5]
25
+ )
26
+ );
27
+ const mulM33 = mulM.add(
28
+ 9,
29
+ (out, a, b) => setC(
30
+ out || a,
31
+ dotS3(a, b, 0, 0, 3),
32
+ dotS3(a, b, 1, 0, 3),
33
+ dotS3(a, b, 2, 0, 3),
34
+ dotS3(a, b, 0, 3, 3),
35
+ dotS3(a, b, 1, 3, 3),
36
+ dotS3(a, b, 2, 3, 3),
37
+ dotS3(a, b, 0, 6, 3),
38
+ dotS3(a, b, 1, 6, 3),
39
+ dotS3(a, b, 2, 6, 3)
40
+ )
41
+ );
42
+ const mulM44 = mulM.add(
43
+ 16,
44
+ (out, a, b) => setC(
45
+ out || a,
46
+ dotS4(a, b, 0, 0, 4),
47
+ dotS4(a, b, 1, 0, 4),
48
+ dotS4(a, b, 2, 0, 4),
49
+ dotS4(a, b, 3, 0, 4),
50
+ dotS4(a, b, 0, 4, 4),
51
+ dotS4(a, b, 1, 4, 4),
52
+ dotS4(a, b, 2, 4, 4),
53
+ dotS4(a, b, 3, 4, 4),
54
+ dotS4(a, b, 0, 8, 4),
55
+ dotS4(a, b, 1, 8, 4),
56
+ dotS4(a, b, 2, 8, 4),
57
+ dotS4(a, b, 3, 8, 4),
58
+ dotS4(a, b, 0, 12, 4),
59
+ dotS4(a, b, 1, 12, 4),
60
+ dotS4(a, b, 2, 12, 4),
61
+ dotS4(a, b, 3, 12, 4)
62
+ )
63
+ );
64
+ export {
65
+ mulM,
66
+ mulM22,
67
+ mulM23,
68
+ mulM33,
69
+ mulM44
70
+ };
package/muln.js CHANGED
@@ -1,15 +1,12 @@
1
1
  import { mulN as _mulN, mulN4 } from "@thi.ng/vectors/muln";
2
2
  import { defMathN } from "./compile/emit.js";
3
- /**
4
- * Multiplies matrix componentwise with single scalar. If `out` is not
5
- * given, writes result in `mat`.
6
- *
7
- * out = mat * n
8
- *
9
- * @param out -
10
- * @param mat -
11
- * @param n -
12
- */
13
- export const mulN = _mulN;
14
- export const mulN22 = mulN4;
15
- export const [mulN23, mulN33, mulN44] = defMathN(mulN, "*");
3
+ const mulN = _mulN;
4
+ const mulN22 = mulN4;
5
+ const [mulN23, mulN33, mulN44] = defMathN(mulN, "*");
6
+ export {
7
+ mulN,
8
+ mulN22,
9
+ mulN23,
10
+ mulN33,
11
+ mulN44
12
+ };
package/mulq.js CHANGED
@@ -1,14 +1,15 @@
1
1
  import { setC4 } from "@thi.ng/vectors/setc";
2
- /**
3
- * Performs quaternion multiplication of `a` and `b` and writes result
4
- * to `out`. If `out` is null, writes result into `a`.
5
- *
6
- * @param out -
7
- * @param a -
8
- * @param b -
9
- */
10
- export const mulQ = (out, a, b) => {
11
- const { 0: ax, 1: ay, 2: az, 3: aw } = a;
12
- const { 0: bx, 1: by, 2: bz, 3: bw } = b;
13
- return setC4(out || a, ax * bw + aw * bx + ay * bz - az * by, ay * bw + aw * by + az * bx - ax * bz, az * bw + aw * bz + ax * by - ay * bx, aw * bw - ax * bx - ay * by - az * bz);
2
+ const mulQ = (out, a, b) => {
3
+ const { 0: ax, 1: ay, 2: az, 3: aw } = a;
4
+ const { 0: bx, 1: by, 2: bz, 3: bw } = b;
5
+ return setC4(
6
+ out || a,
7
+ ax * bw + aw * bx + ay * bz - az * by,
8
+ ay * bw + aw * by + az * bx - ax * bz,
9
+ az * bw + aw * bz + ax * by - ay * bx,
10
+ aw * bw - ax * bx - ay * by - az * bz
11
+ );
12
+ };
13
+ export {
14
+ mulQ
14
15
  };