@woosh/meep-engine 2.131.17 → 2.131.20
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/README.md +85 -101
- package/editor/ecs/component/editors/geom/QuaternionEditor.js +3 -3
- package/editor/tools/TransformTool.js +14 -3
- package/package.json +1 -1
- package/src/core/geom/Quaternion.d.ts +52 -19
- package/src/core/geom/Quaternion.d.ts.map +1 -1
- package/src/core/geom/Quaternion.js +77 -27
- package/src/core/geom/Vector3.d.ts +3 -0
- package/src/core/geom/Vector3.d.ts.map +1 -1
- package/src/core/geom/Vector3.js +16 -6
- package/src/core/math/spline/spline3_hermite.d.ts +1 -1
- package/src/core/math/spline/spline3_hermite.js +1 -1
- package/src/core/math/spline/spline3_hermite_bounds.d.ts +1 -1
- package/src/core/math/spline/spline3_hermite_bounds.js +2 -2
- package/src/core/math/spline/spline3_hermite_derivative.d.ts +8 -6
- package/src/core/math/spline/spline3_hermite_derivative.d.ts.map +1 -1
- package/src/core/math/spline/spline3_hermite_derivative.js +10 -7
- package/src/core/math/spline/spline3_hermite_integral.d.ts +14 -0
- package/src/core/math/spline/spline3_hermite_integral.d.ts.map +1 -0
- package/src/core/math/spline/spline3_hermite_integral.js +35 -0
- package/src/core/math/spline/spline3_hermite_subdivide.d.ts +1 -1
- package/src/core/math/spline/spline3_hermite_subdivide.js +1 -1
- package/src/core/model/node-graph/NodeGraph.d.ts +1 -0
- package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
- package/src/core/model/node-graph/NodeGraph.js +4 -0
- package/src/engine/animation/curve/animation_curve_fit.d.ts +17 -0
- package/src/engine/animation/curve/animation_curve_fit.d.ts.map +1 -0
- package/src/engine/animation/curve/animation_curve_fit.js +195 -0
- package/src/engine/animation/curve/animation_curve_optimize.d.ts.map +1 -1
- package/src/engine/animation/curve/animation_curve_optimize.js +65 -21
- package/src/engine/animation/curve/animation_curve_subdivide.d.ts +4 -2
- package/src/engine/animation/curve/animation_curve_subdivide.d.ts.map +1 -1
- package/src/engine/animation/curve/animation_curve_subdivide.js +4 -2
- package/src/engine/ecs/transform/Transform.d.ts +9 -6
- package/src/engine/ecs/transform/Transform.d.ts.map +1 -1
- package/src/engine/ecs/transform/Transform.js +15 -8
- package/src/engine/graphics/ecs/camera/topdown/ComputeCameraFacingVector.js +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -1
- package/src/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +1 -1
- package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +3 -3
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +5 -6
- package/src/view/View.d.ts +3 -3
|
@@ -517,6 +517,9 @@ export class Vector3 implements Iterable<number> {
|
|
|
517
517
|
_projectVectors(x0: number, y0: number, z0: number, x1: number, y1: number, z1: number): this;
|
|
518
518
|
/**
|
|
519
519
|
* Convert spherical coordinates to cartesian
|
|
520
|
+
*
|
|
521
|
+
* We assume Y-up coordinate system.
|
|
522
|
+
*
|
|
520
523
|
* @param {number} radius
|
|
521
524
|
* @param {number} phi Also known as Azimuth
|
|
522
525
|
* @param {number} theta Also known as Elevation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Vector3.d.ts","sourceRoot":"","sources":["../../../../src/core/geom/Vector3.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;GAcG;AACH,yCALwB,MAAM;
|
|
1
|
+
{"version":3,"file":"Vector3.d.ts","sourceRoot":"","sources":["../../../../src/core/geom/Vector3.js"],"names":[],"mappings":"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"}
|
package/src/core/geom/Vector3.js
CHANGED
|
@@ -39,11 +39,11 @@ export class Vector3 {
|
|
|
39
39
|
assert.isNumber(x, 'x');
|
|
40
40
|
assert.notNaN(x, 'x');
|
|
41
41
|
|
|
42
|
-
assert.isNumber(y, '
|
|
43
|
-
assert.notNaN(y, '
|
|
42
|
+
assert.isNumber(y, 'y');
|
|
43
|
+
assert.notNaN(y, 'y');
|
|
44
44
|
|
|
45
|
-
assert.isNumber(z, '
|
|
46
|
-
assert.notNaN(z, '
|
|
45
|
+
assert.isNumber(z, 'z');
|
|
46
|
+
assert.notNaN(z, 'z');
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
49
|
* Do not assign directly, use {@link set} method instead
|
|
@@ -141,6 +141,9 @@ export class Vector3 {
|
|
|
141
141
|
* @returns {this}
|
|
142
142
|
*/
|
|
143
143
|
fromArray(array, offset = 0) {
|
|
144
|
+
assert.defined(array, "array");
|
|
145
|
+
assert.isNonNegativeInteger(offset, "offset");
|
|
146
|
+
|
|
144
147
|
return this.set(
|
|
145
148
|
array[offset],
|
|
146
149
|
array[offset + 1],
|
|
@@ -154,6 +157,8 @@ export class Vector3 {
|
|
|
154
157
|
* @returns {number[]}
|
|
155
158
|
*/
|
|
156
159
|
toArray(array = [], offset = 0) {
|
|
160
|
+
assert.isNonNegativeInteger(offset, "offset");
|
|
161
|
+
|
|
157
162
|
array[offset] = this.x;
|
|
158
163
|
array[offset + 1] = this.y;
|
|
159
164
|
array[offset + 2] = this.z;
|
|
@@ -659,6 +664,8 @@ export class Vector3 {
|
|
|
659
664
|
* @returns {this}
|
|
660
665
|
*/
|
|
661
666
|
applyQuaternion(q) {
|
|
667
|
+
// NOTE: the logic is inlines for speed
|
|
668
|
+
|
|
662
669
|
//transform point into quaternion
|
|
663
670
|
|
|
664
671
|
const x = this.x;
|
|
@@ -936,9 +943,9 @@ export class Vector3 {
|
|
|
936
943
|
|
|
937
944
|
const d = v3_dot(x0, y0, z0, x1, y1, z1);
|
|
938
945
|
|
|
939
|
-
const
|
|
946
|
+
const length_sqr = (x1 * x1 + y1 * y1 + z1 * z1);
|
|
940
947
|
|
|
941
|
-
const m = d /
|
|
948
|
+
const m = d / length_sqr;
|
|
942
949
|
|
|
943
950
|
const x = x1 * m;
|
|
944
951
|
const y = y1 * m;
|
|
@@ -949,6 +956,9 @@ export class Vector3 {
|
|
|
949
956
|
|
|
950
957
|
/**
|
|
951
958
|
* Convert spherical coordinates to cartesian
|
|
959
|
+
*
|
|
960
|
+
* We assume Y-up coordinate system.
|
|
961
|
+
*
|
|
952
962
|
* @param {number} radius
|
|
953
963
|
* @param {number} phi Also known as Azimuth
|
|
954
964
|
* @param {number} theta Also known as Elevation
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Compute `y0,y1` bounds of a cubic
|
|
2
|
+
* Compute `y0,y1` bounds of a cubic Hermite spline.
|
|
3
3
|
* Lower bound will be written into result[offset], upper bounds will be written into result[offset+result_stride]
|
|
4
4
|
*
|
|
5
5
|
* @param {number[]|Float32Array} result output will be written here, only y0 and y1
|
|
@@ -4,7 +4,7 @@ import { min2 } from "../min2.js";
|
|
|
4
4
|
import { spline3_hermite } from "./spline3_hermite.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Compute `y0,y1` bounds of a cubic
|
|
7
|
+
* Compute `y0,y1` bounds of a cubic Hermite spline.
|
|
8
8
|
* Lower bound will be written into result[offset], upper bounds will be written into result[offset+result_stride]
|
|
9
9
|
*
|
|
10
10
|
* @param {number[]|Float32Array} result output will be written here, only y0 and y1
|
|
@@ -26,7 +26,7 @@ export function spline3_hermite_bounds(
|
|
|
26
26
|
|
|
27
27
|
/*
|
|
28
28
|
Solution is based on https://stackoverflow.com/questions/24809978/calculating-the-bounding-box-of-cubic-bezier-curve
|
|
29
|
-
Differentiation of
|
|
29
|
+
Differentiation of Hermite polynomial is done in WolframAlpha:
|
|
30
30
|
0 = 3 t^2 (m0 + m1 + 2 p0 - 2 p1) - 2 t (2 m0 + m1 + 3 p0 - 3 p1) + m0
|
|
31
31
|
*/
|
|
32
32
|
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Returns the first-order partial derivative of a
|
|
2
|
+
* Returns the first-order partial derivative of a Hermite curve with control points p0, m0, p1, m1 at the parameter t in [0,1].
|
|
3
3
|
*
|
|
4
|
-
* @param {number} t
|
|
5
|
-
* @param {number} p0
|
|
6
|
-
* @param {number} p1
|
|
7
|
-
* @param {number} m0
|
|
8
|
-
* @param {number} m1
|
|
4
|
+
* @param {number} t normalized interpolation position in interval [0,1]
|
|
5
|
+
* @param {number} p0 first value
|
|
6
|
+
* @param {number} p1 second value
|
|
7
|
+
* @param {number} m0 first tangent
|
|
8
|
+
* @param {number} m1 second tangent
|
|
9
9
|
* @returns {number}
|
|
10
|
+
*
|
|
11
|
+
* @see spline3_hermite_integral
|
|
10
12
|
*/
|
|
11
13
|
export function spline3_hermite_derivative(t: number, p0: number, p1: number, m0: number, m1: number): number;
|
|
12
14
|
//# sourceMappingURL=spline3_hermite_derivative.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spline3_hermite_derivative.d.ts","sourceRoot":"","sources":["../../../../../src/core/math/spline/spline3_hermite_derivative.js"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"spline3_hermite_derivative.d.ts","sourceRoot":"","sources":["../../../../../src/core/math/spline/spline3_hermite_derivative.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,8CATW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CAgBlB"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Returns the first-order partial derivative of a
|
|
2
|
+
* Returns the first-order partial derivative of a Hermite curve with control points p0, m0, p1, m1 at the parameter t in [0,1].
|
|
3
3
|
*
|
|
4
|
-
* @param {number} t
|
|
5
|
-
* @param {number} p0
|
|
6
|
-
* @param {number} p1
|
|
7
|
-
* @param {number} m0
|
|
8
|
-
* @param {number} m1
|
|
4
|
+
* @param {number} t normalized interpolation position in interval [0,1]
|
|
5
|
+
* @param {number} p0 first value
|
|
6
|
+
* @param {number} p1 second value
|
|
7
|
+
* @param {number} m0 first tangent
|
|
8
|
+
* @param {number} m1 second tangent
|
|
9
9
|
* @returns {number}
|
|
10
|
+
*
|
|
11
|
+
* @see spline3_hermite_integral
|
|
10
12
|
*/
|
|
11
13
|
export function spline3_hermite_derivative(t, p0, p1, m0, m1) {
|
|
12
14
|
|
|
@@ -20,4 +22,5 @@ export function spline3_hermite_derivative(t, p0, p1, m0, m1) {
|
|
|
20
22
|
|
|
21
23
|
return dcx1 * p0 + dcx2 * p1 + dcv1 * m0 + dcv2 * m1
|
|
22
24
|
|
|
23
|
-
}
|
|
25
|
+
}
|
|
26
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculates the integral (area under the curve) of a cubic hermite spline from 0 to t.
|
|
3
|
+
*
|
|
4
|
+
* @param {number} t normalized interpolation position in interval [0,1]
|
|
5
|
+
* @param {number} p0 first value
|
|
6
|
+
* @param {number} p1 second value
|
|
7
|
+
* @param {number} m0 first tangent
|
|
8
|
+
* @param {number} m1 second tangent
|
|
9
|
+
* @returns {number} The definite integral from 0 to t
|
|
10
|
+
*
|
|
11
|
+
* @see spline3_hermite_derivative
|
|
12
|
+
*/
|
|
13
|
+
export function spline3_hermite_integral(t: number, p0: number, p1: number, m0: number, m1: number): number;
|
|
14
|
+
//# sourceMappingURL=spline3_hermite_integral.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spline3_hermite_integral.d.ts","sourceRoot":"","sources":["../../../../../src/core/math/spline/spline3_hermite_integral.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,4CATW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CA0BlB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculates the integral (area under the curve) of a cubic hermite spline from 0 to t.
|
|
3
|
+
*
|
|
4
|
+
* @param {number} t normalized interpolation position in interval [0,1]
|
|
5
|
+
* @param {number} p0 first value
|
|
6
|
+
* @param {number} p1 second value
|
|
7
|
+
* @param {number} m0 first tangent
|
|
8
|
+
* @param {number} m1 second tangent
|
|
9
|
+
* @returns {number} The definite integral from 0 to t
|
|
10
|
+
*
|
|
11
|
+
* @see spline3_hermite_derivative
|
|
12
|
+
*/
|
|
13
|
+
export function spline3_hermite_integral(t, p0, p1, m0, m1) {
|
|
14
|
+
const t2 = t * t;
|
|
15
|
+
const t3 = t2 * t;
|
|
16
|
+
const t4 = t3 * t;
|
|
17
|
+
|
|
18
|
+
// Integral of (2t^3 - 3t^2 + 1)
|
|
19
|
+
// Result: 0.5t^4 - t^3 + t
|
|
20
|
+
const int_p0 = 0.5 * t4 - t3 + t;
|
|
21
|
+
|
|
22
|
+
// Integral of (t^3 - 2t^2 + t)
|
|
23
|
+
// Result: 0.25t^4 - (2/3)t^3 + 0.5t^2
|
|
24
|
+
const int_m0 = 0.25 * t4 - (2.0 / 3.0) * t3 + 0.5 * t2;
|
|
25
|
+
|
|
26
|
+
// Integral of (t^3 - t^2)
|
|
27
|
+
// Result: 0.25t^4 - (1/3)t^3
|
|
28
|
+
const int_m1 = 0.25 * t4 - (1.0 / 3.0) * t3;
|
|
29
|
+
|
|
30
|
+
// Integral of (3t^2 - 2t^3)
|
|
31
|
+
// Result: t^3 - 0.5t^4
|
|
32
|
+
const int_p1 = t3 - 0.5 * t4;
|
|
33
|
+
|
|
34
|
+
return int_p0 * p0 + int_m0 * m0 + int_m1 * m1 + int_p1 * p1;
|
|
35
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Subdivides a
|
|
2
|
+
* Subdivides a Hermite curve into two hermite curves.
|
|
3
3
|
* The result is written in form [a_p0, a_p1, a_m0, a_m1, b_p0, b_p1, b_m0, b_m1], note the stride and offset.
|
|
4
4
|
* @param {number[]} output where to write the result
|
|
5
5
|
* @param {number} output_offset where to start writing
|
|
@@ -3,7 +3,7 @@ import { spline3_hermite } from "./spline3_hermite.js";
|
|
|
3
3
|
import { spline3_hermite_derivative } from "./spline3_hermite_derivative.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Subdivides a
|
|
6
|
+
* Subdivides a Hermite curve into two hermite curves.
|
|
7
7
|
* The result is written in form [a_p0, a_p1, a_m0, a_m1, b_p0, b_p1, b_m0, b_m1], note the stride and offset.
|
|
8
8
|
* @param {number[]} output where to write the result
|
|
9
9
|
* @param {number} output_offset where to start writing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeGraph.d.ts","sourceRoot":"","sources":["../../../../../src/core/model/node-graph/NodeGraph.js"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AACH;IAEI;;;;OAIG;IACH,uBAAmB;IAEnB;;;;;OAKG;IACH,6BAAyB;IAEzB;;;;;OAKG;IACH,4BAA0B;IAE1B;;;;;OAKG;IACH,kCAAgC;IAQhC;;;;;OAKG;IACH,+BAEC;IAED;;OAEG;IACH;QACI;;;WAGG;;QAGH;;;WAGG;;QAGH;;;WAGG;;QAGH;;;WAGG;;MAEL;IAEF;;OAEG;IACH,cAQC;IAED;;;OAGG;IACH,YAFW,SAAS,QAYnB;IAED;;;OAGG;IACH,SAFa,SAAS,CAQrB;IAED;;;;;;OAMG;IACH,aAHW,SAAS,GACP;QAAC,WAAW,EAAC,UAAU,EAAE,CAAC;QAAC,KAAK,EAAC,YAAY,EAAE,CAAA;KAAC,CAe5D;IAED;;;;;;;;OAQG;IACH,sCAJW,YAAY,EAAE,GAEZ;QAAC,WAAW,EAAC,UAAU,EAAE,CAAC;QAAC,KAAK,EAAC,YAAY,EAAE,CAAA;KAAC,CAmF5D;IAED;;;;OAIG;IACH,8BAHoB,YAAY,+BAK/B;IAED;;;;OAIG;IACH,oCAHoB,UAAU,+BAK7B;IAED;;;;OAIG;IACH,YAFY,YAAY,EAAE,CAIzB;IAED;;;;OAIG;IACH,kBAFY,UAAU,EAAE,CAIvB;IAED;;;;OAIG;IACH,cAHW,YAAY,GACV,OAAO,CAgBnB;IAED;;;;OAIG;IACH,qDAFa,YAAY,EAAE,CAsB1B;IAED;;;;OAIG;IACH,0DAFa,YAAY,EAAE,CAqB1B;IAED;;;;OAIG;IACH,YAHW,MAAM,GACJ,YAAY,GAAC,SAAS,CAkBlC;IAED;;;;;OAKG;IACH,gBAJW,MAAM,GACJ,YAAY,CAWxB;IAED;;;;OAIG;IACH,kBAHW,MAAM,GACJ,UAAU,GAAC,SAAS,CAgBhC;IAED;;;;;OAKG;IACH,+BAJW,MAAM,WACN,MAAM,GACJ,4BAA0B,SAAS,CAY/C;IAED;;;;OAIG;IACH,mCAFa,MAAM,CAclB;IAED;;;OAGG;IACH,cAFW,YAAY,QAkBtB;IAED;;;;OAIG;IACH,eAHW,MAAM,GACJ,OAAO,CA8BnB;IAED;;;;;;;;OAQG;IACH,uCANW,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,GACJ,MAAM,CAqClB;IAED;;;;;;;;OAQG;IACH,6BAPW,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,GACJ,MAAM,CAuDlB;IAED;;;;OAIG;IACH,qBAHW,MAAM,GACJ,OAAO,CAyBnB;IAED;;;;;OAKG;IACH,iCAJW,MAAM,UACN,MAAM,EAAE,GACN,MAAM,CAyBlB;IAGL;;;;;;;;OAQG;IACH,sBAFU,OAAO,CAEc;;CAX9B;
|
|
1
|
+
{"version":3,"file":"NodeGraph.d.ts","sourceRoot":"","sources":["../../../../../src/core/model/node-graph/NodeGraph.js"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AACH;IAEI;;;;OAIG;IACH,uBAAmB;IAEnB;;;;;OAKG;IACH,6BAAyB;IAEzB;;;;;OAKG;IACH,4BAA0B;IAE1B;;;;;OAKG;IACH,kCAAgC;IAQhC;;;;;OAKG;IACH,+BAEC;IAED;;OAEG;IACH;QACI;;;WAGG;;QAGH;;;WAGG;;QAGH;;;WAGG;;QAGH;;;WAGG;;MAEL;IAEF;;OAEG;IACH,cAQC;IAED;;;OAGG;IACH,YAFW,SAAS,QAYnB;IAED;;;OAGG;IACH,SAFa,SAAS,CAQrB;IAED;;;;;;OAMG;IACH,aAHW,SAAS,GACP;QAAC,WAAW,EAAC,UAAU,EAAE,CAAC;QAAC,KAAK,EAAC,YAAY,EAAE,CAAA;KAAC,CAe5D;IAED;;;;;;;;OAQG;IACH,sCAJW,YAAY,EAAE,GAEZ;QAAC,WAAW,EAAC,UAAU,EAAE,CAAC;QAAC,KAAK,EAAC,YAAY,EAAE,CAAA;KAAC,CAmF5D;IAED;;;;OAIG;IACH,8BAHoB,YAAY,+BAK/B;IAED;;;;OAIG;IACH,oCAHoB,UAAU,+BAK7B;IAED;;;;OAIG;IACH,YAFY,YAAY,EAAE,CAIzB;IAED;;;;OAIG;IACH,kBAFY,UAAU,EAAE,CAIvB;IAED;;;;OAIG;IACH,cAHW,YAAY,GACV,OAAO,CAgBnB;IAED;;;;OAIG;IACH,qDAFa,YAAY,EAAE,CAsB1B;IAED;;;;OAIG;IACH,0DAFa,YAAY,EAAE,CAqB1B;IAED;;;;OAIG;IACH,YAHW,MAAM,GACJ,YAAY,GAAC,SAAS,CAkBlC;IAED;;;;;OAKG;IACH,gBAJW,MAAM,GACJ,YAAY,CAWxB;IAED;;;;OAIG;IACH,kBAHW,MAAM,GACJ,UAAU,GAAC,SAAS,CAgBhC;IAED;;;;;OAKG;IACH,+BAJW,MAAM,WACN,MAAM,GACJ,4BAA0B,SAAS,CAY/C;IAED;;;;OAIG;IACH,mCAFa,MAAM,CAclB;IAED;;;OAGG;IACH,cAFW,YAAY,QAkBtB;IAED;;;;OAIG;IACH,eAHW,MAAM,GACJ,OAAO,CA8BnB;IAED;;;;;;;;OAQG;IACH,uCANW,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,GACJ,MAAM,CAqClB;IAED;;;;;;;;OAQG;IACH,6BAPW,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,GACJ,MAAM,CAuDlB;IAED;;;;OAIG;IACH,qBAHW,MAAM,GACJ,OAAO,CAyBnB;IAED;;;;;OAKG;IACH,iCAJW,MAAM,UACN,MAAM,EAAE,GACN,MAAM,CAyBlB;IAED,mBAEC;IAGL;;;;;;;;OAQG;IACH,sBAFU,OAAO,CAEc;;CAX9B;6BA1qB4B,wBAAwB;2BAD1B,iBAAiB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fits a smooth {@link AnimationCurve} to a set of discrete 2D points using adaptive Cubic Hermite Spline fitting.
|
|
3
|
+
*
|
|
4
|
+
* This utility performs data reduction (lossy compression) on dense time-series data.
|
|
5
|
+
* It recursively subdivides the dataset, inserting {@link Keyframe}s only where the interpolated curve deviates from the original points by more than `maxError`.
|
|
6
|
+
*
|
|
7
|
+
* Tangents are automatically estimated based on the slope of the input data (Catmull-Rom style), ensuring smooth transitions between keyframes.
|
|
8
|
+
*
|
|
9
|
+
* @param {number[]} points flat array of coordinates [x0, y0, x1, y1, ... xn, yn]
|
|
10
|
+
* @param {number} [input_offset] flat offset into the input array where to start reading data
|
|
11
|
+
* @param {number} [input_count] number of points to fit, counted in points i.e., pairs of (x,y) values
|
|
12
|
+
* @param {number} [maxError] Maximum allowed deviation. Higher values produce fewer keys (more compression), lower values preserve more detail.
|
|
13
|
+
* @returns {AnimationCurve}
|
|
14
|
+
*/
|
|
15
|
+
export function animation_curve_fit(points: number[], input_offset?: number, input_count?: number, maxError?: number): AnimationCurve;
|
|
16
|
+
import { AnimationCurve } from "./AnimationCurve.js";
|
|
17
|
+
//# sourceMappingURL=animation_curve_fit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation_curve_fit.d.ts","sourceRoot":"","sources":["../../../../../src/engine/animation/curve/animation_curve_fit.js"],"names":[],"mappings":"AAkEA;;;;;;;;;;;;;GAaG;AACH,4CANW,MAAM,EAAE,iBACR,MAAM,gBACN,MAAM,aACN,MAAM,GACJ,cAAc,CAoH1B;+BA/L8B,qBAAqB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { spline3_hermite } from "../../../core/math/spline/spline3_hermite.js";
|
|
3
|
+
import { number_compare_ascending } from "../../../core/primitives/numbers/number_compare_ascending.js";
|
|
4
|
+
import { AnimationCurve } from "./AnimationCurve.js";
|
|
5
|
+
import { Keyframe } from "./Keyframe.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Calculates a Catmull-Rom style tangent (slope) for a point in the dataset.
|
|
9
|
+
* @param {number[]} points
|
|
10
|
+
* @param {number} points_offset
|
|
11
|
+
* @param {number} points_count
|
|
12
|
+
* @param {number} index
|
|
13
|
+
*/
|
|
14
|
+
function calculateTangent(
|
|
15
|
+
points,
|
|
16
|
+
points_offset,
|
|
17
|
+
points_count,
|
|
18
|
+
index
|
|
19
|
+
) {
|
|
20
|
+
|
|
21
|
+
const current = points_offset + index * 2;
|
|
22
|
+
|
|
23
|
+
// Handle boundaries: Linear slope to neighbor
|
|
24
|
+
if (index === 0) {
|
|
25
|
+
const next = points_offset + 2;
|
|
26
|
+
|
|
27
|
+
const dt = points[next] - points[current];
|
|
28
|
+
|
|
29
|
+
if (dt === 0) {
|
|
30
|
+
return 0;
|
|
31
|
+
} else {
|
|
32
|
+
return (points[next + 1] - points[current + 1]) / dt;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
if (index === points_count - 1) {
|
|
37
|
+
const prev = points_offset + (points_count - 2) * 2;
|
|
38
|
+
|
|
39
|
+
const dt = points[current] - points[prev];
|
|
40
|
+
|
|
41
|
+
if (dt === 0) {
|
|
42
|
+
return 0;
|
|
43
|
+
} else {
|
|
44
|
+
return (points[current + 1] - points[prev + 1]) / dt;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Handle internal points: Average slope between prev and next (Finite Difference)
|
|
50
|
+
const next = points_offset + (index + 1) * 2;
|
|
51
|
+
const prev = points_offset + (index - 1) * 2;
|
|
52
|
+
|
|
53
|
+
// A simpler approach is the slope between prev and next directly:
|
|
54
|
+
// return (next.value - prev.value) / (next.time - prev.time);
|
|
55
|
+
|
|
56
|
+
// However, weighted average often looks better for non-uniform time steps:
|
|
57
|
+
const dt0 = points[current] - points[prev];
|
|
58
|
+
const slope0 = dt0 === 0 ? 0 : (points[current + 1] - points[prev + 1]) / dt0;
|
|
59
|
+
|
|
60
|
+
const dt1 = points[next] - points[current];
|
|
61
|
+
const slope1 = dt1 === 0 ? 0 : (points[next + 1] - points[current + 1]) / dt1;
|
|
62
|
+
|
|
63
|
+
// Average the slopes
|
|
64
|
+
return (slope0 + slope1) * 0.5;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Fits a smooth {@link AnimationCurve} to a set of discrete 2D points using adaptive Cubic Hermite Spline fitting.
|
|
69
|
+
*
|
|
70
|
+
* This utility performs data reduction (lossy compression) on dense time-series data.
|
|
71
|
+
* It recursively subdivides the dataset, inserting {@link Keyframe}s only where the interpolated curve deviates from the original points by more than `maxError`.
|
|
72
|
+
*
|
|
73
|
+
* Tangents are automatically estimated based on the slope of the input data (Catmull-Rom style), ensuring smooth transitions between keyframes.
|
|
74
|
+
*
|
|
75
|
+
* @param {number[]} points flat array of coordinates [x0, y0, x1, y1, ... xn, yn]
|
|
76
|
+
* @param {number} [input_offset] flat offset into the input array where to start reading data
|
|
77
|
+
* @param {number} [input_count] number of points to fit, counted in points i.e., pairs of (x,y) values
|
|
78
|
+
* @param {number} [maxError] Maximum allowed deviation. Higher values produce fewer keys (more compression), lower values preserve more detail.
|
|
79
|
+
* @returns {AnimationCurve}
|
|
80
|
+
*/
|
|
81
|
+
export function animation_curve_fit(
|
|
82
|
+
points,
|
|
83
|
+
input_offset = 0,
|
|
84
|
+
input_count = ((points.length - input_offset) / 2),
|
|
85
|
+
maxError = 0.01
|
|
86
|
+
) {
|
|
87
|
+
assert.defined(points, 'points');
|
|
88
|
+
assert.isNonNegativeInteger(input_offset, 'input_offset');
|
|
89
|
+
assert.isNonNegativeInteger(input_count, 'input_count');
|
|
90
|
+
assert.notNaN(maxError, 'maxError');
|
|
91
|
+
assert.greaterThanOrEqual(maxError, 0, 'maxError must be non-negative');
|
|
92
|
+
|
|
93
|
+
if (input_count === 0) {
|
|
94
|
+
return new AnimationCurve();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (input_count === 1) {
|
|
98
|
+
return AnimationCurve.from([Keyframe.from(points[input_offset], points[input_offset + 1])]);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// 1. Identify which indices from the source array we need to keep as Keyframes
|
|
102
|
+
const keyIndices = new Set();
|
|
103
|
+
|
|
104
|
+
// Always keep first and last
|
|
105
|
+
keyIndices.add(0);
|
|
106
|
+
keyIndices.add(input_count - 1);
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Recursive function to find split points
|
|
110
|
+
* @param {number} firstIndex
|
|
111
|
+
* @param {number} lastIndex
|
|
112
|
+
*/
|
|
113
|
+
function fitSegment(firstIndex, lastIndex) {
|
|
114
|
+
if (lastIndex - firstIndex <= 1) {
|
|
115
|
+
// done
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// A. Estimate tangents for the start and end of this segment
|
|
120
|
+
// We calculate tangents based on the *original* dense data to ensure accurate slope
|
|
121
|
+
const m0 = calculateTangent(points, input_offset, input_count, firstIndex);
|
|
122
|
+
const m1 = calculateTangent(points, input_offset, input_count, lastIndex);
|
|
123
|
+
|
|
124
|
+
const address_0 = input_offset + firstIndex * 2;
|
|
125
|
+
const address_1 = input_offset + lastIndex * 2;
|
|
126
|
+
|
|
127
|
+
const tStart = points[address_0];
|
|
128
|
+
const tEnd = points[address_1];
|
|
129
|
+
const vStart = points[address_0 + 1];
|
|
130
|
+
const vEnd = points[address_1 + 1];
|
|
131
|
+
const duration = tEnd - tStart;
|
|
132
|
+
|
|
133
|
+
if (duration < 1e-12) {
|
|
134
|
+
// duration is very low, we're in division-by-zero territory
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// B. Find the point in this range with the greatest error vs the hypothetical curve
|
|
139
|
+
let maxSegmentError = 0;
|
|
140
|
+
let splitIndex = -1;
|
|
141
|
+
|
|
142
|
+
for (let i = firstIndex + 1; i < lastIndex; i++) {
|
|
143
|
+
const address = input_offset + i * 2;
|
|
144
|
+
|
|
145
|
+
// Normalize time t to [0, 1] for the Hermite formula
|
|
146
|
+
const t = (points[address] - tStart) / duration;
|
|
147
|
+
|
|
148
|
+
// Evaluate Cubic Hermite Spline
|
|
149
|
+
const evaluatedValue = spline3_hermite(t, vStart, vEnd, m0 * duration, m1 * duration);
|
|
150
|
+
|
|
151
|
+
const error = Math.abs(points[address + 1] - evaluatedValue);
|
|
152
|
+
|
|
153
|
+
if (error > maxSegmentError) {
|
|
154
|
+
maxSegmentError = error;
|
|
155
|
+
splitIndex = i;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// C. If error is too high, mark the split point as a Keyframe and recurse
|
|
160
|
+
if (maxSegmentError > maxError) {
|
|
161
|
+
keyIndices.add(splitIndex);
|
|
162
|
+
fitSegment(firstIndex, splitIndex);
|
|
163
|
+
fitSegment(splitIndex, lastIndex);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Start the recursion
|
|
168
|
+
fitSegment(0, input_count - 1);
|
|
169
|
+
|
|
170
|
+
// 2. Build the final curve from the selected indices
|
|
171
|
+
const sortedIndices = Array.from(keyIndices).sort(number_compare_ascending);
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
*
|
|
175
|
+
* @type {Keyframe[]}
|
|
176
|
+
*/
|
|
177
|
+
const resultKeys = [];
|
|
178
|
+
|
|
179
|
+
const fitted_key_count = sortedIndices.length;
|
|
180
|
+
|
|
181
|
+
for (let i = 0; i < fitted_key_count; i++) {
|
|
182
|
+
const idx = sortedIndices[i];
|
|
183
|
+
const address = input_offset + idx * 2;
|
|
184
|
+
|
|
185
|
+
// Calculate the smooth tangent for this key
|
|
186
|
+
// Note: For sharp transitions, you might want to break continuity,
|
|
187
|
+
// but for approximation, continuous slope is usually desired.
|
|
188
|
+
const tangent = calculateTangent(points, input_offset, input_count, idx);
|
|
189
|
+
|
|
190
|
+
// Create a keyframe. Assuming inTangent == outTangent for smooth fitting.
|
|
191
|
+
resultKeys.push(Keyframe.from(points[address], points[address + 1], tangent, tangent));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return AnimationCurve.from(resultKeys);
|
|
195
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animation_curve_optimize.d.ts","sourceRoot":"","sources":["../../../../../src/engine/animation/curve/animation_curve_optimize.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"animation_curve_optimize.d.ts","sourceRoot":"","sources":["../../../../../src/engine/animation/curve/animation_curve_optimize.js"],"names":[],"mappings":"AA+EA;;;;;;;;;;GAUG;AACH,kFANW,MAAM,GACJ,MAAM,CAoElB"}
|