@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.
Files changed (45) hide show
  1. package/README.md +85 -101
  2. package/editor/ecs/component/editors/geom/QuaternionEditor.js +3 -3
  3. package/editor/tools/TransformTool.js +14 -3
  4. package/package.json +1 -1
  5. package/src/core/geom/Quaternion.d.ts +52 -19
  6. package/src/core/geom/Quaternion.d.ts.map +1 -1
  7. package/src/core/geom/Quaternion.js +77 -27
  8. package/src/core/geom/Vector3.d.ts +3 -0
  9. package/src/core/geom/Vector3.d.ts.map +1 -1
  10. package/src/core/geom/Vector3.js +16 -6
  11. package/src/core/math/spline/spline3_hermite.d.ts +1 -1
  12. package/src/core/math/spline/spline3_hermite.js +1 -1
  13. package/src/core/math/spline/spline3_hermite_bounds.d.ts +1 -1
  14. package/src/core/math/spline/spline3_hermite_bounds.js +2 -2
  15. package/src/core/math/spline/spline3_hermite_derivative.d.ts +8 -6
  16. package/src/core/math/spline/spline3_hermite_derivative.d.ts.map +1 -1
  17. package/src/core/math/spline/spline3_hermite_derivative.js +10 -7
  18. package/src/core/math/spline/spline3_hermite_integral.d.ts +14 -0
  19. package/src/core/math/spline/spline3_hermite_integral.d.ts.map +1 -0
  20. package/src/core/math/spline/spline3_hermite_integral.js +35 -0
  21. package/src/core/math/spline/spline3_hermite_subdivide.d.ts +1 -1
  22. package/src/core/math/spline/spline3_hermite_subdivide.js +1 -1
  23. package/src/core/model/node-graph/NodeGraph.d.ts +1 -0
  24. package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
  25. package/src/core/model/node-graph/NodeGraph.js +4 -0
  26. package/src/engine/animation/curve/animation_curve_fit.d.ts +17 -0
  27. package/src/engine/animation/curve/animation_curve_fit.d.ts.map +1 -0
  28. package/src/engine/animation/curve/animation_curve_fit.js +195 -0
  29. package/src/engine/animation/curve/animation_curve_optimize.d.ts.map +1 -1
  30. package/src/engine/animation/curve/animation_curve_optimize.js +65 -21
  31. package/src/engine/animation/curve/animation_curve_subdivide.d.ts +4 -2
  32. package/src/engine/animation/curve/animation_curve_subdivide.d.ts.map +1 -1
  33. package/src/engine/animation/curve/animation_curve_subdivide.js +4 -2
  34. package/src/engine/ecs/transform/Transform.d.ts +9 -6
  35. package/src/engine/ecs/transform/Transform.d.ts.map +1 -1
  36. package/src/engine/ecs/transform/Transform.js +15 -8
  37. package/src/engine/graphics/ecs/camera/topdown/ComputeCameraFacingVector.js +1 -1
  38. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -1
  39. package/src/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +1 -1
  40. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +1 -1
  41. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
  42. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +3 -3
  43. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
  44. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +5 -6
  45. 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":"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"}
1
+ {"version":3,"file":"Vector3.d.ts","sourceRoot":"","sources":["../../../../src/core/geom/Vector3.js"],"names":[],"mappings":"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"}
@@ -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, 'x');
43
- assert.notNaN(y, 'x');
42
+ assert.isNumber(y, 'y');
43
+ assert.notNaN(y, 'y');
44
44
 
45
- assert.isNumber(z, 'x');
46
- assert.notNaN(z, 'x');
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 mag2 = (x1 * x1 + y1 * y1 + z1 * z1);
946
+ const length_sqr = (x1 * x1 + y1 * y1 + z1 * z1);
940
947
 
941
- const m = d / mag2;
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
- * Perform cubic hermite interpolation
2
+ * Perform cubic Hermite interpolation
3
3
  * @see https://en.wikipedia.org/wiki/Cubic_Hermite_spline
4
4
  * @param {number} t normalized interpolation position in interval [0,1]
5
5
  * @param {number} p0 first value
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Perform cubic hermite interpolation
2
+ * Perform cubic Hermite interpolation
3
3
  * @see https://en.wikipedia.org/wiki/Cubic_Hermite_spline
4
4
  * @param {number} t normalized interpolation position in interval [0,1]
5
5
  * @param {number} p0 first value
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Compute `y0,y1` bounds of a cubic hermite spline.
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 hermite spline.
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 hermite polynomial is done in WolframAlpha:
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 hermite curve with control points p0, m0, p1, m1 at the parameter t in [0,1].
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;;;;;;;;;GASG;AACH,8CAPW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CAclB"}
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 hermite curve with control points p0, m0, p1, m1 at the parameter t in [0,1].
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 hermite curve into two hermite curves.
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 hermite curve into two hermite curves.
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
@@ -223,6 +223,7 @@ export class NodeGraph {
223
223
  * @returns {number} number of found connections
224
224
  */
225
225
  getConnectionsAttachedToNode(id: number, result: number[]): number;
226
+ toString(): string;
226
227
  /**
227
228
  * Useful for type checks
228
229
  * @example
@@ -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;6BAtqB4B,wBAAwB;2BAD1B,iBAAiB"}
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"}
@@ -682,6 +682,10 @@ export class NodeGraph {
682
682
 
683
683
  return count;
684
684
  }
685
+
686
+ toString() {
687
+ return `NodeGraph{ nodes=${this.nodes.length}, connections=${this.connections.length}, version=${this.version} }`
688
+ }
685
689
  }
686
690
 
687
691
  /**
@@ -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":"AAkDA;;;;;;;;;;GAUG;AACH,kFANW,MAAM,GACJ,MAAM,CAqDlB"}
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"}