@woosh/meep-engine 2.110.9 → 2.110.10

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 (56) hide show
  1. package/build/meep.cjs +23 -1
  2. package/build/meep.min.js +1 -1
  3. package/build/meep.module.js +23 -1
  4. package/package.json +1 -1
  5. package/src/core/UUID.js +1 -1
  6. package/src/core/geom/2d/aabb/AABB2.d.ts.map +1 -1
  7. package/src/core/geom/2d/aabb/AABB2.js +27 -1
  8. package/src/core/geom/3d/tetrahedra/delaunay/tetrahedral_mesh_build_from_grid.spec.js +25 -2
  9. package/src/core/geom/3d/tetrahedra/get_tetrahedron_volume.d.ts +9 -0
  10. package/src/core/geom/3d/tetrahedra/get_tetrahedron_volume.d.ts.map +1 -0
  11. package/src/core/geom/3d/tetrahedra/get_tetrahedron_volume.js +18 -0
  12. package/src/core/geom/3d/tetrahedra/is_tetrahedron_degenerate.d.ts +9 -0
  13. package/src/core/geom/3d/tetrahedra/is_tetrahedron_degenerate.d.ts.map +1 -0
  14. package/src/core/geom/3d/tetrahedra/is_tetrahedron_degenerate.js +21 -0
  15. package/src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.d.ts +2 -10
  16. package/src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.d.ts.map +1 -1
  17. package/src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.js +3 -40
  18. package/src/core/geom/mat3/m3_cm_invert.d.ts +7 -0
  19. package/src/core/geom/mat3/m3_cm_invert.d.ts.map +1 -0
  20. package/src/core/geom/mat3/m3_cm_invert.js +45 -0
  21. package/src/core/geom/vec2/v2_matrix3_cm_multiply.d.ts +10 -0
  22. package/src/core/geom/vec2/v2_matrix3_cm_multiply.d.ts.map +1 -0
  23. package/src/core/geom/vec2/v2_matrix3_cm_multiply.js +20 -0
  24. package/src/core/geom/vec2/v2_matrix3_rm_multiply.d.ts +10 -0
  25. package/src/core/geom/vec2/v2_matrix3_rm_multiply.d.ts.map +1 -0
  26. package/src/core/geom/vec2/v2_matrix3_rm_multiply.js +21 -0
  27. package/src/core/math/spline/spline_hermite3.js +2 -1
  28. package/src/core/math/spline/spline_hermite3_to_bezier.d.ts +12 -0
  29. package/src/core/math/spline/spline_hermite3_to_bezier.d.ts.map +1 -0
  30. package/src/core/math/spline/spline_hermite3_to_bezier.js +24 -0
  31. package/src/engine/animation/clip/AnimationTrack.js +1 -1
  32. package/src/engine/animation/curve/AnimationCurve.d.ts +11 -0
  33. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  34. package/src/engine/animation/curve/AnimationCurve.js +51 -4
  35. package/src/engine/animation/curve/draw/build_curve_editor.d.ts.map +1 -1
  36. package/src/engine/animation/curve/draw/build_curve_editor.js +15 -9
  37. package/src/engine/animation/curve/view/AnimationCurveView.d.ts +47 -0
  38. package/src/engine/animation/curve/view/AnimationCurveView.d.ts.map +1 -0
  39. package/src/engine/animation/curve/view/AnimationCurveView.js +343 -0
  40. package/src/engine/animation/curve/view/prototype.d.ts +2 -0
  41. package/src/engine/animation/curve/view/prototype.d.ts.map +1 -0
  42. package/src/engine/animation/curve/view/prototype.js +86 -0
  43. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.js +1 -1
  44. package/src/engine/ecs/guid/UUID.d.ts +10 -3
  45. package/src/engine/ecs/guid/UUID.d.ts.map +1 -1
  46. package/src/engine/ecs/guid/UUID.js +17 -5
  47. package/src/engine/ecs/guid/UUID.spec.js +7 -0
  48. package/src/engine/ecs/guid/UUIDSerializationAdapter.spec.d.ts +2 -0
  49. package/src/engine/ecs/guid/UUIDSerializationAdapter.spec.d.ts.map +1 -0
  50. package/src/view/elements/DropDownSelectionView.js +1 -1
  51. package/src/view/elements/tiles2d/Tile.d.ts +1 -1
  52. package/src/view/elements/tiles2d/Tile.d.ts.map +1 -1
  53. package/src/view/elements/tiles2d/Tile.js +2 -1
  54. package/src/engine/ecs/guid/GUIDSerializationAdapter.spec.d.ts +0 -2
  55. package/src/engine/ecs/guid/GUIDSerializationAdapter.spec.d.ts.map +0 -1
  56. /package/src/engine/ecs/guid/{GUIDSerializationAdapter.spec.js → UUIDSerializationAdapter.spec.js} +0 -0
@@ -80383,12 +80383,34 @@ class AABB2 {
80383
80383
  this.y1 = y1;
80384
80384
  }
80385
80385
 
80386
+ /**
80387
+ *
80388
+ * @param {number} size
80389
+ */
80390
+ growWidth(size){
80391
+
80392
+ this.x0 -= size;
80393
+ this.x1 += size;
80394
+ }
80395
+
80396
+ /**
80397
+ *
80398
+ * @param {number} size
80399
+ */
80400
+ growHeight(size){
80401
+
80402
+ this.y0 -= size;
80403
+ this.y1 += size;
80404
+ }
80405
+
80386
80406
  /**
80387
80407
  * Expands box in every direction by a given amount
80388
80408
  * @param {number} size
80389
80409
  */
80390
80410
  grow(size) {
80391
- this.set(this.x0 - size, this.y0 - size, this.x1 + size, this.y1 + size);
80411
+
80412
+ this.growWidth(size);
80413
+ this.growHeight(size);
80392
80414
  }
80393
80415
 
80394
80416
  /**
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "description": "Fully featured ECS game engine written in JavaScript",
6
6
  "type": "module",
7
7
  "author": "Alexander Goldring",
8
- "version": "2.110.9",
8
+ "version": "2.110.10",
9
9
  "main": "build/meep.module.js",
10
10
  "module": "build/meep.module.js",
11
11
  "exports": {
package/src/core/UUID.js CHANGED
@@ -7,7 +7,7 @@ import { UUID } from "../engine/ecs/guid/UUID.js";
7
7
  * @returns {string}
8
8
  */
9
9
  function uuid() {
10
- return UUID.v4().toString();
10
+ return UUID.string();
11
11
  }
12
12
 
13
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AABB2.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/2d/aabb/AABB2.js"],"names":[],"mappings":";AAYA;;;GAGG;AACH;IACI;;;;;;OAMG;IACH,gEA+BC;IApBG;;;OAGG;IACH,WAAY;IACZ;;;OAGG;IACH,WAAY;IACZ;;;OAGG;IACH,WAAY;IACZ;;;OAGG;IACH,WAAY;IAGhB;;;OAGG;IACH,WAFW,MAAM,QAIhB;IAED;;;OAGG;IACH,aAFW,MAAM,QAIhB;IAED;;;OAGG;IACH,gBAFW,MAAM,EAAE,QA8BlB;IAED;;;OAGG;IACH,sBAFW,MAAM,QAShB;IAED;;;;;OAKG;IACH,sBAJW,KAAK,UACL,KAAK,GACH,OAAO,CAcnB;IAED;;;;OAIG;IACH,qBAHW,KAAK,GACH,OAAO,CAcnB;IAED;;;;;;;OAOG;IACH,0EAMC;IAED;;;;OAIG;IACH,qBAHW,MAAM,KACN,MAAM,QAKhB;IAED;;;OAGG;IACH,QAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,QAFa,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,0BALW,OAAO,MACP,OAAO,UACP,OAAO,GACL,OAAO,CA0BnB;IAED;;;;OAIG;IACH,kCAHW,OAAO,UACP,OAAO,QAmBjB;IAED;;;;OAIG;IACH,wBAHW,KAAK,GACH,MAAM,CAIlB;IAED;;;;;;;OAOG;IACH,sBANW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CA4BlB;IAED;;;OAGG;IACH,eAFa,MAAM,CASlB;IAED;;;OAGG;IACH,sBAFY,MAAM,CAYjB;IAED;;;;;OAKG;IACH,iBAJW,MAAM,KACN,MAAM,GACJ,OAAO,CAInB;IAED;;;OAGG;IACH,mBAFW,KAAK,QAIf;IAED;;;OAGG;IACH,mBAFW,OAAO,WAMjB;IAED;;;OAGG;IACH,sBAEC;IAED;;;OAGG;IACH,sBAGC;IAED;;;OAGG;IACH,YAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,oBAEC;IAED;;;OAGG;IACH,aAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,qBAEC;IAED;;;;;;;OAOG;IACH,0DAiBC;IAED;;;;OAIG;IACH,eAHW,MAAM,KACN,MAAM,QAOhB;IAED;;;;OAIG;IACH,aAHW,MAAM,UACN,MAAM,QAIhB;IAED;;;OAGG;IACH,SAFa,KAAK,CAIjB;IAED;;;;OAIG;IACH,YAHW,KAAK,GACH,KAAK,CAIjB;IAED;;;;OAIG;IACH,cAHW,KAAK,GACH,OAAO,CAOnB;IAED;;;;;;OAMG;IACH,UALW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAQhB;IAED;;;;;;OAMG;IACH,uBALW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAsBhB;IAED;;OAEG;IACH,oCAEC;IAED,mBAEC;IAED;;;;;MAOC;IAED,0BAEC;CACJ;;;qBAqCS,KAAK;qBAML,KAAK;;oBAhlBK,kBAAkB;AAwiBtC;;;;;;;GAOG;AACH,gDANW,KAAK,MACL,KAAK,MACL,OAAO,MACP,OAAO,GACL,OAAO,CAsBnB"}
1
+ {"version":3,"file":"AABB2.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/2d/aabb/AABB2.js"],"names":[],"mappings":";AAYA;;;GAGG;AACH;IACI;;;;;;OAMG;IACH,gEA+BC;IApBG;;;OAGG;IACH,WAAY;IACZ;;;OAGG;IACH,WAAY;IACZ;;;OAGG;IACH,WAAY;IACZ;;;OAGG;IACH,WAAY;IAGhB;;;OAGG;IACH,gBAFW,MAAM,QAQhB;IAED;;;OAGG;IACH,iBAFW,MAAM,QAQhB;IAED;;;OAGG;IACH,WAFW,MAAM,QAMhB;IAED;;;OAGG;IACH,aAFW,MAAM,QAIhB;IAED;;;OAGG;IACH,gBAFW,MAAM,EAAE,QA8BlB;IAED;;;OAGG;IACH,sBAFW,MAAM,QAShB;IAED;;;;;OAKG;IACH,sBAJW,KAAK,UACL,KAAK,GACH,OAAO,CAcnB;IAED;;;;OAIG;IACH,qBAHW,KAAK,GACH,OAAO,CAcnB;IAED;;;;;;;OAOG;IACH,0EAMC;IAED;;;;OAIG;IACH,qBAHW,MAAM,KACN,MAAM,QAKhB;IAED;;;OAGG;IACH,QAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,QAFa,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,0BALW,OAAO,MACP,OAAO,UACP,OAAO,GACL,OAAO,CA0BnB;IAED;;;;OAIG;IACH,kCAHW,OAAO,UACP,OAAO,QAmBjB;IAED;;;;OAIG;IACH,wBAHW,KAAK,GACH,MAAM,CAIlB;IAED;;;;;;;OAOG;IACH,sBANW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CA4BlB;IAED;;;OAGG;IACH,eAFa,MAAM,CASlB;IAED;;;OAGG;IACH,sBAFY,MAAM,CAYjB;IAED;;;;;OAKG;IACH,iBAJW,MAAM,KACN,MAAM,GACJ,OAAO,CAInB;IAED;;;OAGG;IACH,mBAFW,KAAK,QAIf;IAED;;;OAGG;IACH,mBAFW,OAAO,WAMjB;IAED;;;OAGG;IACH,sBAEC;IAED;;;OAGG;IACH,sBAGC;IAED;;;OAGG;IACH,YAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,oBAEC;IAED;;;OAGG;IACH,aAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,qBAEC;IAED;;;;;;;OAOG;IACH,0DAiBC;IAED;;;;OAIG;IACH,eAHW,MAAM,KACN,MAAM,QAOhB;IAED;;;;OAIG;IACH,aAHW,MAAM,UACN,MAAM,QAIhB;IAED;;;OAGG;IACH,SAFa,KAAK,CAIjB;IAED;;;;OAIG;IACH,YAHW,KAAK,GACH,KAAK,CAIjB;IAED;;;;OAIG;IACH,cAHW,KAAK,GACH,OAAO,CAOnB;IAED;;;;;;OAMG;IACH,UALW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAQhB;IAED;;;;;;OAMG;IACH,uBALW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAsBhB;IAED;;OAEG;IACH,oCAEC;IAED,mBAEC;IAED;;;;;MAOC;IAED,0BAEC;CACJ;;;qBAqCS,KAAK;qBAML,KAAK;;oBA1mBK,kBAAkB;AAkkBtC;;;;;;;GAOG;AACH,gDANW,KAAK,MACL,KAAK,MACL,OAAO,MACP,OAAO,GACL,OAAO,CAsBnB"}
@@ -55,12 +55,38 @@ class AABB2 {
55
55
  this.y1 = y1;
56
56
  }
57
57
 
58
+ /**
59
+ *
60
+ * @param {number} size
61
+ */
62
+ growWidth(size){
63
+ assert.isNumber(size,'size');
64
+ assert.notNaN(size,'size');
65
+
66
+ this.x0 -= size;
67
+ this.x1 += size;
68
+ }
69
+
70
+ /**
71
+ *
72
+ * @param {number} size
73
+ */
74
+ growHeight(size){
75
+ assert.isNumber(size,'size');
76
+ assert.notNaN(size,'size');
77
+
78
+ this.y0 -= size;
79
+ this.y1 += size;
80
+ }
81
+
58
82
  /**
59
83
  * Expands box in every direction by a given amount
60
84
  * @param {number} size
61
85
  */
62
86
  grow(size) {
63
- this.set(this.x0 - size, this.y0 - size, this.x1 + size, this.y1 + size);
87
+
88
+ this.growWidth(size);
89
+ this.growHeight(size);
64
90
  }
65
91
 
66
92
  /**
@@ -1,11 +1,17 @@
1
1
  import { AABB3 } from "../../aabb/AABB3.js";
2
+ import { get_tetrahedron_volume } from "../get_tetrahedron_volume.js";
2
3
  import { TetrahedralMesh } from "../TetrahedralMesh.js";
4
+ import { validate_tetrahedral_mesh } from "../validate_tetrahedral_mesh.js";
3
5
  import { tetrahedral_mesh_build_from_grid } from "./tetrahedral_mesh_build_from_grid.js";
4
6
 
5
7
  test("Single cube", () => {
6
8
 
7
9
  const mesh = new TetrahedralMesh();
8
10
 
11
+ /**
12
+ *
13
+ * @type {number[]}
14
+ */
9
15
  const points = [];
10
16
 
11
17
  tetrahedral_mesh_build_from_grid(
@@ -25,14 +31,31 @@ test("Single cube", () => {
25
31
  const tetrahedrons = mesh.getLive();
26
32
 
27
33
  for (let i = 0; i < tetrahedrons.length; i++) {
28
- const tet = tetrahedrons[i];
34
+ const tet_index = tetrahedrons[i];
29
35
 
30
36
  for (let vertex_index = 0; vertex_index < 4; vertex_index++) {
31
37
 
32
- const vert = mesh.getVertexIndex(tet, vertex_index);
38
+ const vert = mesh.getVertexIndex(tet_index, vertex_index);
33
39
 
34
40
  expect(vert).toBeGreaterThanOrEqual(0);
35
41
  expect(vert).toBeLessThan(8);
36
42
  }
43
+
44
+ // tetrahedrons should have positive volume
45
+ const volume = get_tetrahedron_volume(mesh, points, tet_index);
46
+
47
+ expect(volume).toBeGreaterThan(0);
48
+ }
49
+
50
+ // do full validation
51
+ const problems = [];
52
+
53
+ const is_valid = validate_tetrahedral_mesh(mesh, points, (problem) => problems.push(problem));
54
+
55
+ if (!is_valid) {
56
+ console.error(problems.join('\n'));
37
57
  }
58
+
59
+ expect(is_valid).toBe(true);
60
+
38
61
  });
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ * @param {TetrahedralMesh} mesh
4
+ * @param {ArrayLike<number>|number[]} points
5
+ * @param {number} tet_index
6
+ * @return {number}
7
+ */
8
+ export function get_tetrahedron_volume(mesh: TetrahedralMesh, points: ArrayLike<number> | number[], tet_index: number): number;
9
+ //# sourceMappingURL=get_tetrahedron_volume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get_tetrahedron_volume.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/get_tetrahedron_volume.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,sEAJW,UAAU,MAAM,CAAC,GAAC,MAAM,EAAE,aAC1B,MAAM,GACL,MAAM,CAUjB"}
@@ -0,0 +1,18 @@
1
+ import { tetrahedron_compute_signed_volume } from "./tetrahedron_compute_signed_volume.js";
2
+
3
+ /**
4
+ *
5
+ * @param {TetrahedralMesh} mesh
6
+ * @param {ArrayLike<number>|number[]} points
7
+ * @param {number} tet_index
8
+ * @return {number}
9
+ */
10
+ export function get_tetrahedron_volume(mesh, points, tet_index) {
11
+
12
+ const a = mesh.getVertexIndex(tet_index, 0);
13
+ const b = mesh.getVertexIndex(tet_index, 1);
14
+ const c = mesh.getVertexIndex(tet_index, 2);
15
+ const d = mesh.getVertexIndex(tet_index, 3);
16
+
17
+ return tetrahedron_compute_signed_volume(points, a, b, c, d);
18
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Vertices must be unique inside a single tetrahedron, that is - no repetitions are allowed
3
+ * If vertices are repeated - volume will be 0 and tetrahedron will be degenerate
4
+ * @param {TetrahedralMesh} mesh
5
+ * @param {number} tet
6
+ * @returns {boolean}
7
+ */
8
+ export function is_tetrahedron_degenerate(mesh: TetrahedralMesh, tet: number): boolean;
9
+ //# sourceMappingURL=is_tetrahedron_degenerate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is_tetrahedron_degenerate.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/is_tetrahedron_degenerate.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,sEAHW,MAAM,GACJ,OAAO,CAenB"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Vertices must be unique inside a single tetrahedron, that is - no repetitions are allowed
3
+ * If vertices are repeated - volume will be 0 and tetrahedron will be degenerate
4
+ * @param {TetrahedralMesh} mesh
5
+ * @param {number} tet
6
+ * @returns {boolean}
7
+ */
8
+ export function is_tetrahedron_degenerate(mesh, tet) {
9
+
10
+ for (let i0 = 0; i0 < 4; i0++) {
11
+ const v0 = mesh.getVertexIndex(tet, i0);
12
+ for (let i1 = i0 + 1; i1 < 4; i1++) {
13
+ if (v0 === mesh.getVertexIndex(tet, i1)) {
14
+ // identical vertices
15
+ return true;
16
+ }
17
+ }
18
+ }
19
+
20
+ return false;
21
+ }
@@ -1,11 +1,3 @@
1
- /**
2
- *
3
- * @param {TetrahedralMesh} mesh
4
- * @param {ArrayLike<number>|number[]} points
5
- * @param {number} tet
6
- * @return {number}
7
- */
8
- export function get_tetrahedron_volume(mesh: TetrahedralMesh, points: ArrayLike<number> | number[], tet: number): number;
9
1
  /**
10
2
  *
11
3
  * @param {TetrahedralMesh} mesh
@@ -25,10 +17,10 @@ export function validate_tetrahedron_neighbourhood(mesh: TetrahedralMesh, tet: n
25
17
  /**
26
18
  *
27
19
  * @param {TetrahedralMesh} mesh
28
- * @param {ArrayLike<number>} points
20
+ * @param {ArrayLike<number>|number[]|Float32Array} points
29
21
  * @param {function(problem:string):*} [consumer]
30
22
  * @returns {boolean}
31
23
  */
32
- export function validate_tetrahedral_mesh(mesh: TetrahedralMesh, points: ArrayLike<number>, consumer?: typeof noop): boolean;
24
+ export function validate_tetrahedral_mesh(mesh: TetrahedralMesh, points: ArrayLike<number> | number[] | Float32Array, consumer?: typeof noop): boolean;
33
25
  import { noop } from "../../../function/noop.js";
34
26
  //# sourceMappingURL=validate_tetrahedral_mesh.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate_tetrahedral_mesh.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,sEAJW,UAAU,MAAM,CAAC,GAAC,MAAM,EAAE,OAC1B,MAAM,GACL,MAAM,CAUjB;AAED;;;;;;;GAOG;AACH,+DALW,MAAM,gBACN,MAAM,mBACG,MAAM,WACd,OAAO,CA6DlB;AAGD;;;;;GAKG;AACH,+EAHW,MAAM,mCAehB;AAuBD;;;;;;GAMG;AACH,yEAJW,UAAU,MAAM,CAAC,2BAEf,OAAO,CA4BnB;qBArKoB,2BAA2B"}
1
+ {"version":3,"file":"validate_tetrahedral_mesh.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.js"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,+DALW,MAAM,gBACN,MAAM,mBACG,MAAM,WACd,OAAO,CA6DlB;AAGD;;;;;GAKG;AACH,+EAHW,MAAM,mCAehB;AAED;;;;;;GAMG;AACH,yEAJW,UAAU,MAAM,CAAC,GAAC,MAAM,EAAE,GAAC,YAAY,2BAErC,OAAO,CA4BnB;qBAhIoB,2BAA2B"}
@@ -1,23 +1,7 @@
1
1
  import { noop } from "../../../function/noop.js";
2
+ import { get_tetrahedron_volume } from "./get_tetrahedron_volume.js";
3
+ import { is_tetrahedron_degenerate } from "./is_tetrahedron_degenerate.js";
2
4
  import { INVALID_NEIGHBOUR } from "./TetrahedralMesh.js";
3
- import { tetrahedron_compute_signed_volume } from "./tetrahedron_compute_signed_volume.js";
4
-
5
- /**
6
- *
7
- * @param {TetrahedralMesh} mesh
8
- * @param {ArrayLike<number>|number[]} points
9
- * @param {number} tet
10
- * @return {number}
11
- */
12
- export function get_tetrahedron_volume(mesh, points, tet) {
13
-
14
- const a = mesh.getVertexIndex(tet, 0);
15
- const b = mesh.getVertexIndex(tet, 1);
16
- const c = mesh.getVertexIndex(tet, 2);
17
- const d = mesh.getVertexIndex(tet, 3);
18
-
19
- return tetrahedron_compute_signed_volume(points, a, b, c, d);
20
- }
21
5
 
22
6
  /**
23
7
  *
@@ -112,28 +96,7 @@ export function validate_tetrahedron_neighbourhood(mesh, tet, consumer = noop) {
112
96
  /**
113
97
  *
114
98
  * @param {TetrahedralMesh} mesh
115
- * @param {number} tet
116
- * @returns {boolean}
117
- */
118
- function is_tetrahedron_degenerate(mesh, tet) {
119
-
120
- for (let i0 = 0; i0 < 4; i0++) {
121
- const v0 = mesh.getVertexIndex(tet, i0);
122
- for (let i1 = i0 + 1; i1 < 4; i1++) {
123
- if (v0 === mesh.getVertexIndex(tet, i1)) {
124
- // identical vertices
125
- return true;
126
- }
127
- }
128
- }
129
-
130
- return false;
131
- }
132
-
133
- /**
134
- *
135
- * @param {TetrahedralMesh} mesh
136
- * @param {ArrayLike<number>} points
99
+ * @param {ArrayLike<number>|number[]|Float32Array} points
137
100
  * @param {function(problem:string):*} [consumer]
138
101
  * @returns {boolean}
139
102
  */
@@ -0,0 +1,7 @@
1
+ /**
2
+ *
3
+ * @param {Float32Array} out
4
+ * @param {Float32Array} a
5
+ */
6
+ export function m3_cm_invert(out: Float32Array, a: Float32Array): boolean;
7
+ //# sourceMappingURL=m3_cm_invert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"m3_cm_invert.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/mat3/m3_cm_invert.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,kCAHW,YAAY,KACZ,YAAY,WAyCtB"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ *
3
+ * @param {Float32Array} out
4
+ * @param {Float32Array} a
5
+ */
6
+ export function m3_cm_invert(out, a) {
7
+ // adapted from gl-matrix
8
+
9
+ const a00 = a[0],
10
+ a01 = a[1],
11
+ a02 = a[2];
12
+
13
+ const a10 = a[3],
14
+ a11 = a[4],
15
+ a12 = a[5];
16
+
17
+ const a20 = a[6],
18
+ a21 = a[7],
19
+ a22 = a[8];
20
+
21
+ const b01 = a22 * a11 - a12 * a21;
22
+ const b11 = -a22 * a10 + a12 * a20;
23
+ const b21 = a21 * a10 - a11 * a20;
24
+
25
+ // Calculate the determinant
26
+ let det = a00 * b01 + a01 * b11 + a02 * b21;
27
+
28
+ if (!det) {
29
+ return false;
30
+ }
31
+
32
+ det = 1.0 / det;
33
+
34
+ out[0] = b01 * det;
35
+ out[1] = (-a22 * a01 + a02 * a21) * det;
36
+ out[2] = (a12 * a01 - a02 * a11) * det;
37
+ out[3] = b11 * det;
38
+ out[4] = (a22 * a00 - a02 * a20) * det;
39
+ out[5] = (-a12 * a00 + a02 * a10) * det;
40
+ out[6] = b21 * det;
41
+ out[7] = (-a21 * a00 + a01 * a20) * det;
42
+ out[8] = (a11 * a00 - a01 * a10) * det;
43
+
44
+ return true;
45
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Column-major ( OpenGL style) matrix multiplication
3
+ * @param {Float32Array|number[]} out
4
+ * @param {number} out_offset
5
+ * @param {number} x
6
+ * @param {number} y
7
+ * @param {Float32Array|number[]} m3
8
+ */
9
+ export function v2_matrix3_cm_multiply(out: Float32Array | number[], out_offset: number, x: number, y: number, m3: Float32Array | number[]): void;
10
+ //# sourceMappingURL=v2_matrix3_cm_multiply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2_matrix3_cm_multiply.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/vec2/v2_matrix3_cm_multiply.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,4CANW,YAAY,GAAC,MAAM,EAAE,cACrB,MAAM,KACN,MAAM,KACN,MAAM,MACN,YAAY,GAAC,MAAM,EAAE,QAa/B"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Column-major ( OpenGL style) matrix multiplication
3
+ * @param {Float32Array|number[]} out
4
+ * @param {number} out_offset
5
+ * @param {number} x
6
+ * @param {number} y
7
+ * @param {Float32Array|number[]} m3
8
+ */
9
+ export function v2_matrix3_cm_multiply(
10
+ out, out_offset,
11
+ x, y,
12
+ m3
13
+ ) {
14
+
15
+ const tx = m3[0] * x + m3[1] * y + m3[2];
16
+ const ty = m3[3] * x + m3[4] * y + m3[5];
17
+
18
+ out[out_offset] = tx;
19
+ out[out_offset + 1] = ty;
20
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Row-major ( OpenGL style) matrix multiplication
3
+ * @param {Float32Array|number[]} out
4
+ * @param {number} out_offset
5
+ * @param {number} x
6
+ * @param {number} y
7
+ * @param {Float32Array|number[]} m3
8
+ */
9
+ export function v2_matrix3_rm_multiply(out: Float32Array | number[], out_offset: number, x: number, y: number, m3: Float32Array | number[]): void;
10
+ //# sourceMappingURL=v2_matrix3_rm_multiply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2_matrix3_rm_multiply.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/vec2/v2_matrix3_rm_multiply.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,4CANW,YAAY,GAAC,MAAM,EAAE,cACrB,MAAM,KACN,MAAM,KACN,MAAM,MACN,YAAY,GAAC,MAAM,EAAE,QAa/B"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Row-major ( OpenGL style) matrix multiplication
3
+ * @param {Float32Array|number[]} out
4
+ * @param {number} out_offset
5
+ * @param {number} x
6
+ * @param {number} y
7
+ * @param {Float32Array|number[]} m3
8
+ */
9
+ export function v2_matrix3_rm_multiply(
10
+ out, out_offset,
11
+ x, y,
12
+ m3
13
+ ) {
14
+
15
+ const tx = m3[0] * x + m3[3] * y + m3[6];
16
+ const ty = m3[1] * x + m3[4] * y + m3[7];
17
+
18
+ out[out_offset] = tx;
19
+ out[out_offset + 1] = ty;
20
+ }
21
+
@@ -19,4 +19,5 @@ export function spline_hermite3(t, p0, p1, m0, m1) {
19
19
  const d = -2 * t3 + 3 * t2;
20
20
 
21
21
  return a * p0 + b * m0 + c * m1 + d * p1;
22
- }
22
+ }
23
+
@@ -0,0 +1,12 @@
1
+ /**
2
+ * TODO: not tested
3
+ * @param {Float32Array|number[]} result
4
+ * @param {number} result_offset
5
+ * @param {number} result_stride
6
+ * @param {number} p0
7
+ * @param {number} p1
8
+ * @param {number} m0
9
+ * @param {number} m1
10
+ */
11
+ export function spline_hermite3_to_bezier(result: Float32Array | number[], result_offset: number, result_stride: number, p0: number, p1: number, m0: number, m1: number): void;
12
+ //# sourceMappingURL=spline_hermite3_to_bezier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spline_hermite3_to_bezier.d.ts","sourceRoot":"","sources":["../../../../../src/core/math/spline/spline_hermite3_to_bezier.js"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,kDARW,YAAY,GAAC,MAAM,EAAE,iBACrB,MAAM,iBACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAehB"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * TODO: not tested
3
+ * @param {Float32Array|number[]} result
4
+ * @param {number} result_offset
5
+ * @param {number} result_stride
6
+ * @param {number} p0
7
+ * @param {number} p1
8
+ * @param {number} m0
9
+ * @param {number} m1
10
+ */
11
+ export function spline_hermite3_to_bezier(result, result_offset, result_stride, p0, p1, m0, m1) {
12
+
13
+ // see https://stackoverflow.com/questions/42574940/draw-hermite-curve-on-browser-canvas-javascript
14
+ // see https://pomax.github.io/bezierinfo/#catmullconv
15
+
16
+ const tension = 1;
17
+ const tension_factor = 2 * tension;
18
+
19
+ result[result_offset + 0 * result_stride] = p0;
20
+ result[result_offset + 1 * result_stride] = p0 + m0 / tension_factor;
21
+ result[result_offset + 2 * result_stride] = p1 - m1 / tension_factor;
22
+ result[result_offset + 3 * result_stride] = p1;
23
+
24
+ }
@@ -43,7 +43,7 @@ export class AnimationTrack {
43
43
  for (let i = 0; i < curve_count; i++) {
44
44
  const curve = curves[i];
45
45
 
46
- r = max2(r, curve.duration);
46
+ r = max2(r, curve.end_time);
47
47
  }
48
48
 
49
49
  return r;
@@ -66,10 +66,20 @@ export class AnimationCurve {
66
66
  * @returns {number}
67
67
  */
68
68
  get length(): number;
69
+ /**
70
+ * Time of the first keyframe, returns 0 if there are no keys
71
+ * @returns {number}
72
+ */
73
+ get start_time(): number;
69
74
  /**
70
75
  * Time of the last chronological key in the curve
71
76
  * @return {number}
72
77
  */
78
+ get end_time(): number;
79
+ /**
80
+ * Time difference between first and last frame
81
+ * @returns {number}
82
+ */
73
83
  get duration(): number;
74
84
  /**
75
85
  *
@@ -79,6 +89,7 @@ export class AnimationCurve {
79
89
  evaluate(time: number): number;
80
90
  /**
81
91
  * Set tangents of a key to match surrounding keys
92
+ * Produces a smoother looking curve
82
93
  * @param {number} index index of keyframe
83
94
  */
84
95
  alignTangents(index: number): void;
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationCurve.d.ts","sourceRoot":"","sources":["../../../../../src/engine/animation/curve/AnimationCurve.js"],"names":[],"mappings":"AAqBA;;;GAGG;AACH;IAkFI;;;;OAIG;IACH,kBAHW,QAAQ,EAAE,GACR,cAAc,CAQ1B;IA2KD;;;;;;;OAOG;IACH,6BANW,MAAM,eACN,MAAM,YACN,MAAM,aACN,MAAM,GACL,cAAc,CAUzB;IAED;;;;;;OAMG;IACH,4BALW,MAAM,YACN,MAAM,UACN,MAAM,GACL,cAAc,CAOzB;IAED;;;;;;;OAOG;IACH,0BANW,MAAM,eACN,MAAM,YACN,MAAM,aACN,MAAM,GACL,cAAc,CAYzB;IAzTD;;;OAGG;IACH,eAFU,QAAQ,EAAE,CAEV;IAEV;;;;OAIG;IACH,SAHW,QAAQ,GACN,MAAM,CAgClB;IAED;;;OAGG;IACH,cAFW,QAAQ,EAAE,QAUpB;IAED;;;;OAIG;IACH,YAHW,QAAQ,GACN,OAAO,CAYnB;IAED;;OAEG;IACH,cAEC;IAeD;;;OAGG;IACH,qBAEC;IAED;;;OAGG;IACH,uBAUC;IAED;;;;OAIG;IACH,eAHW,MAAM,GACL,MAAM,CAiCjB;IAED;;;OAGG;IACH,qBAFW,MAAM,QAoBhB;IAED;;;;OAIG;IACH,sBAHW,MAAM,UACN,MAAM,QAWhB;IAED,0BAKC;IAED;;;;OAIG;IACH,cAHW,cAAc,GACb,OAAO,CAIlB;IAED;;;OAGG;IACH,YAFW,cAAc,QAIxB;IAED;;;OAGG;IACH,SAFY,cAAc,CAQzB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED;;MAIC;IAED;;aAeC;CAqDJ;yBA3UwB,eAAe"}
1
+ {"version":3,"file":"AnimationCurve.d.ts","sourceRoot":"","sources":["../../../../../src/engine/animation/curve/AnimationCurve.js"],"names":[],"mappings":"AAqBA;;;GAGG;AACH;IAkFI;;;;OAIG;IACH,kBAHW,QAAQ,EAAE,GACR,cAAc,CAQ1B;IA0ND;;;;;;;OAOG;IACH,6BANW,MAAM,eACN,MAAM,YACN,MAAM,aACN,MAAM,GACL,cAAc,CAUzB;IAED;;;;;;OAMG;IACH,4BALW,MAAM,YACN,MAAM,UACN,MAAM,GACL,cAAc,CAOzB;IAED;;;;;;;OAOG;IACH,0BANW,MAAM,eACN,MAAM,YACN,MAAM,aACN,MAAM,GACL,cAAc,CAYzB;IAxWD;;;OAGG;IACH,eAFU,QAAQ,EAAE,CAEV;IAEV;;;;OAIG;IACH,SAHW,QAAQ,GACN,MAAM,CAgClB;IAED;;;OAGG;IACH,cAFW,QAAQ,EAAE,QAUpB;IAED;;;;OAIG;IACH,YAHW,QAAQ,GACN,OAAO,CAYnB;IAED;;OAEG;IACH,cAEC;IAeD;;;OAGG;IACH,qBAEC;IAED;;;OAGG;IACH,yBAUC;IAED;;;OAGG;IACH,uBAUC;IAED;;;OAGG;IACH,uBAaC;IAED;;;;OAIG;IACH,eAHW,MAAM,GACL,MAAM,CAiCjB;IAED;;;;OAIG;IACH,qBAFW,MAAM,QA+BhB;IAED;;;;OAIG;IACH,sBAHW,MAAM,UACN,MAAM,QAWhB;IAED,0BAKC;IAED;;;;OAIG;IACH,cAHW,cAAc,GACb,OAAO,CAIlB;IAED;;;OAGG;IACH,YAFW,cAAc,QAIxB;IAED;;;OAGG;IACH,SAFY,cAAc,CAQzB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED;;MAIC;IAED;;aAeC;CAqDJ;yBA1XwB,eAAe"}
@@ -126,11 +126,27 @@ export class AnimationCurve {
126
126
  return this.keys.length;
127
127
  }
128
128
 
129
+ /**
130
+ * Time of the first keyframe, returns 0 if there are no keys
131
+ * @returns {number}
132
+ */
133
+ get start_time() {
134
+ const keys = this.keys;
135
+
136
+ if (keys.length === 0) {
137
+ return 0;
138
+ }
139
+
140
+ const first = keys[0];
141
+
142
+ return first.time;
143
+ }
144
+
129
145
  /**
130
146
  * Time of the last chronological key in the curve
131
147
  * @return {number}
132
148
  */
133
- get duration() {
149
+ get end_time() {
134
150
  const keys = this.keys;
135
151
  const key_count = keys.length;
136
152
 
@@ -142,6 +158,25 @@ export class AnimationCurve {
142
158
  return keys[key_count - 1].time;
143
159
  }
144
160
 
161
+ /**
162
+ * Time difference between first and last frame
163
+ * @returns {number}
164
+ */
165
+ get duration() {
166
+
167
+ const keys = this.keys;
168
+ const key_count = keys.length;
169
+
170
+ if (key_count < 2) {
171
+ return 0;
172
+ }
173
+
174
+ const first = keys[0];
175
+ const last = keys[key_count - 1];
176
+
177
+ return last.time - first.time;
178
+ }
179
+
145
180
  /**
146
181
  *
147
182
  * @param {number} time time in seconds
@@ -182,10 +217,15 @@ export class AnimationCurve {
182
217
 
183
218
  /**
184
219
  * Set tangents of a key to match surrounding keys
220
+ * Produces a smoother looking curve
185
221
  * @param {number} index index of keyframe
186
222
  */
187
223
  alignTangents(index) {
188
224
  const keys = this.keys;
225
+ const last_index = keys.length - 1;
226
+
227
+ assert.isNonNegativeInteger(index, "index");
228
+ assert.lessThanOrEqual(index, last_index, "index overflow");
189
229
 
190
230
  const key_main = keys[index];
191
231
 
@@ -193,14 +233,21 @@ export class AnimationCurve {
193
233
  if (has_previous) {
194
234
  const key_previous = keys[index - 1];
195
235
 
196
- key_main.inTangent = key_main.value - key_previous.value;
236
+ const time_span = key_main.time - key_previous.time;
237
+ const value_span = key_main.value - key_previous.value;
238
+
239
+ key_main.inTangent = value_span / time_span;
197
240
  }
198
241
 
199
- const has_next = index < keys.length - 1;
242
+ const has_next = index < last_index;
243
+
200
244
  if (has_next) {
201
245
  const key_next = keys[index + 1];
202
246
 
203
- key_main.outTangent = key_next.value - key_main.value;
247
+ const time_span = key_next.time - key_main.time;
248
+ const value_span = key_next.value - key_main.value;
249
+
250
+ key_main.outTangent = value_span / time_span;
204
251
  }
205
252
  }
206
253
 
@@ -1 +1 @@
1
- {"version":3,"file":"build_curve_editor.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/animation/curve/draw/build_curve_editor.js"],"names":[],"mappings":"AAgEA;;;;;;GAMG;AACH,kFA4RC"}
1
+ {"version":3,"file":"build_curve_editor.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/animation/curve/draw/build_curve_editor.js"],"names":[],"mappings":"AAiEA;;;;;;GAMG;AACH,kFAiSC"}