@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.
- package/build/meep.cjs +23 -1
- package/build/meep.min.js +1 -1
- package/build/meep.module.js +23 -1
- package/package.json +1 -1
- package/src/core/UUID.js +1 -1
- package/src/core/geom/2d/aabb/AABB2.d.ts.map +1 -1
- package/src/core/geom/2d/aabb/AABB2.js +27 -1
- package/src/core/geom/3d/tetrahedra/delaunay/tetrahedral_mesh_build_from_grid.spec.js +25 -2
- package/src/core/geom/3d/tetrahedra/get_tetrahedron_volume.d.ts +9 -0
- package/src/core/geom/3d/tetrahedra/get_tetrahedron_volume.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/get_tetrahedron_volume.js +18 -0
- package/src/core/geom/3d/tetrahedra/is_tetrahedron_degenerate.d.ts +9 -0
- package/src/core/geom/3d/tetrahedra/is_tetrahedron_degenerate.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/is_tetrahedron_degenerate.js +21 -0
- package/src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.d.ts +2 -10
- package/src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.d.ts.map +1 -1
- package/src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.js +3 -40
- package/src/core/geom/mat3/m3_cm_invert.d.ts +7 -0
- package/src/core/geom/mat3/m3_cm_invert.d.ts.map +1 -0
- package/src/core/geom/mat3/m3_cm_invert.js +45 -0
- package/src/core/geom/vec2/v2_matrix3_cm_multiply.d.ts +10 -0
- package/src/core/geom/vec2/v2_matrix3_cm_multiply.d.ts.map +1 -0
- package/src/core/geom/vec2/v2_matrix3_cm_multiply.js +20 -0
- package/src/core/geom/vec2/v2_matrix3_rm_multiply.d.ts +10 -0
- package/src/core/geom/vec2/v2_matrix3_rm_multiply.d.ts.map +1 -0
- package/src/core/geom/vec2/v2_matrix3_rm_multiply.js +21 -0
- package/src/core/math/spline/spline_hermite3.js +2 -1
- package/src/core/math/spline/spline_hermite3_to_bezier.d.ts +12 -0
- package/src/core/math/spline/spline_hermite3_to_bezier.d.ts.map +1 -0
- package/src/core/math/spline/spline_hermite3_to_bezier.js +24 -0
- package/src/engine/animation/clip/AnimationTrack.js +1 -1
- package/src/engine/animation/curve/AnimationCurve.d.ts +11 -0
- package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
- package/src/engine/animation/curve/AnimationCurve.js +51 -4
- package/src/engine/animation/curve/draw/build_curve_editor.d.ts.map +1 -1
- package/src/engine/animation/curve/draw/build_curve_editor.js +15 -9
- package/src/engine/animation/curve/view/AnimationCurveView.d.ts +47 -0
- package/src/engine/animation/curve/view/AnimationCurveView.d.ts.map +1 -0
- package/src/engine/animation/curve/view/AnimationCurveView.js +343 -0
- package/src/engine/animation/curve/view/prototype.d.ts +2 -0
- package/src/engine/animation/curve/view/prototype.d.ts.map +1 -0
- package/src/engine/animation/curve/view/prototype.js +86 -0
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.js +1 -1
- package/src/engine/ecs/guid/UUID.d.ts +10 -3
- package/src/engine/ecs/guid/UUID.d.ts.map +1 -1
- package/src/engine/ecs/guid/UUID.js +17 -5
- package/src/engine/ecs/guid/UUID.spec.js +7 -0
- package/src/engine/ecs/guid/UUIDSerializationAdapter.spec.d.ts +2 -0
- package/src/engine/ecs/guid/UUIDSerializationAdapter.spec.d.ts.map +1 -0
- package/src/view/elements/DropDownSelectionView.js +1 -1
- package/src/view/elements/tiles2d/Tile.d.ts +1 -1
- package/src/view/elements/tiles2d/Tile.d.ts.map +1 -1
- package/src/view/elements/tiles2d/Tile.js +2 -1
- package/src/engine/ecs/guid/GUIDSerializationAdapter.spec.d.ts +0 -2
- package/src/engine/ecs/guid/GUIDSerializationAdapter.spec.d.ts.map +0 -1
- /package/src/engine/ecs/guid/{GUIDSerializationAdapter.spec.js → UUIDSerializationAdapter.spec.js} +0 -0
package/build/meep.module.js
CHANGED
|
@@ -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
|
-
|
|
80411
|
+
|
|
80412
|
+
this.growWidth(size);
|
|
80413
|
+
this.growHeight(size);
|
|
80392
80414
|
}
|
|
80393
80415
|
|
|
80394
80416
|
/**
|
package/package.json
CHANGED
package/src/core/UUID.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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":"
|
|
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}
|
|
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 @@
|
|
|
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
|
+
|
|
@@ -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
|
+
}
|
|
@@ -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;
|
|
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
|
|
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
|
-
|
|
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 <
|
|
242
|
+
const has_next = index < last_index;
|
|
243
|
+
|
|
200
244
|
if (has_next) {
|
|
201
245
|
const key_next = keys[index + 1];
|
|
202
246
|
|
|
203
|
-
|
|
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":"
|
|
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"}
|