@flighthq/spring 0.5.1-next.685.f72fc7f → 0.5.1-next.704.19c91ec

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 CHANGED
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/spring`. The `@fligh
13
13
  This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
14
14
 
15
15
  - [Flight project](https://github.com/flighthq/flight)
16
- - [Source for @flighthq/spring@0.5.1-next.685.f72fc7f](https://github.com/flighthq/flight/tree/f72fc7feaa9653d950f39c7d2fe6365f48e82e51/packages/spring)
17
- - [License](https://github.com/flighthq/flight/blob/f72fc7feaa9653d950f39c7d2fe6365f48e82e51/LICENSE.md)
16
+ - [Source for @flighthq/spring@0.5.1-next.704.19c91ec](https://github.com/flighthq/flight/tree/19c91ec3e569d6b3b471682726465a79fba9f8cb/packages/spring)
17
+ - [License](https://github.com/flighthq/flight/blob/19c91ec3e569d6b3b471682726465a79fba9f8cb/LICENSE.md)
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { createSpring, createSpring2D, createSpring3D, createSpringConfig, createSpringConfigFromPhysical, isSpring2DSettled, isSpring3DSettled, isSpringSettled, resetSpring, updateSpring, updateSpring2D, updateSpring3D, } from './contract';
1
+ export { SpringPresetBouncy, SpringPresetGentle, SpringPresetStiff, applySpringImpulse, applySpringImpulse2D, applySpringImpulse3D, createSpring, createSpring2D, createSpring3D, createSpringConfig, createSpringConfigFromPhysical, isSpring2DSettled, isSpring3DSettled, isSpringSettled, resetSpring, resetSpring2D, resetSpring3D, updateSpring, updateSpring2D, updateSpring3D, updateSpringAngle, } from './contract';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { createSpring, createSpring2D, createSpring3D, createSpringConfig, createSpringConfigFromPhysical, isSpring2DSettled, isSpring3DSettled, isSpringSettled, resetSpring, updateSpring, updateSpring2D, updateSpring3D, } from './contract';
1
+ export { SpringPresetBouncy, SpringPresetGentle, SpringPresetStiff, applySpringImpulse, applySpringImpulse2D, applySpringImpulse3D, createSpring, createSpring2D, createSpring3D, createSpringConfig, createSpringConfigFromPhysical, isSpring2DSettled, isSpring3DSettled, isSpringSettled, resetSpring, resetSpring2D, resetSpring3D, updateSpring, updateSpring2D, updateSpring3D, updateSpringAngle, } from './contract';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
package/dist/spring.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import type { Spring, SpringConfig } from '@flighthq/types/contract';
2
+ export declare function applySpringImpulse(spring: Spring, velocity: number): void;
2
3
  export declare function createSpring(value?: number, velocity?: number): Spring;
3
4
  export declare function isSpringSettled(spring: Readonly<Spring>, target: number, positionEpsilon?: number, velocityEpsilon?: number): boolean;
4
5
  export declare function resetSpring(spring: Spring, value: number, velocity?: number): void;
5
6
  export declare function updateSpring(spring: Spring, target: number, config: Readonly<SpringConfig>, deltaTime: number): void;
7
+ export declare function updateSpringAngle(spring: Spring, target: number, fullTurn: number, config: Readonly<SpringConfig>, deltaTime: number): void;
6
8
  //# sourceMappingURL=spring.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spring.d.ts","sourceRoot":"","sources":["../src/spring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKrE,wBAAgB,YAAY,CAAC,KAAK,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAE5E;AASD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,MAA8B,EAC/C,eAAe,GAAE,MAA8B,GAC9C,OAAO,CAET;AASD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,IAAI,CAGrF;AAmBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA+DpH"}
1
+ {"version":3,"file":"spring.d.ts","sourceRoot":"","sources":["../src/spring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKrE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEzE;AAKD,wBAAgB,YAAY,CAAC,KAAK,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAE5E;AASD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,MAA8B,EAC/C,eAAe,GAAE,MAA8B,GAC9C,OAAO,CAET;AASD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,IAAI,CAGrF;AAmBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA+DpH;AAQD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,IAAI,CAQN"}
package/dist/spring.js CHANGED
@@ -1,4 +1,10 @@
1
1
  import { approxEqual, approxZero, TAU } from '@flighthq/math/contract';
2
+ // Add `velocity` to the spring's current velocity without changing its position. This is the
3
+ // allocation-free flick/throw control: repeated impulses compose additively, and the next analytic
4
+ // step carries their combined velocity into the motion.
5
+ export function applySpringImpulse(spring, velocity) {
6
+ spring.velocity += velocity;
7
+ }
2
8
  // Allocate a scalar spring at `value` (default 0) with `velocity` (default 0). This is the only
3
9
  // allocating function for scalar springs; `updateSpring`, `resetSpring`, and the settle query all
4
10
  // write into or read an existing spring.
@@ -100,6 +106,21 @@ export function updateSpring(spring, target, config, deltaTime) {
100
106
  spring.value = target + posPosCoef * c0 + posVelCoef * velocity;
101
107
  spring.velocity = velPosCoef * c0 + velVelCoef * velocity;
102
108
  }
109
+ // Advance an angular spring toward `target` along the shortest wrapped arc. `fullTurn` defines the
110
+ // caller's unit system — use 360 for degrees, `TAU` for radians, or 1 for turns; this function does
111
+ // no unit conversion. The chosen delta is in (-fullTurn / 2, fullTurn / 2], so exact half-turn ties
112
+ // consistently take the positive direction. The spring remains on its continuous, unwrapped branch
113
+ // to avoid position and velocity discontinuities; callers may normalize the value for presentation.
114
+ // A non-positive or non-finite `fullTurn` is an inert sentinel.
115
+ export function updateSpringAngle(spring, target, fullTurn, config, deltaTime) {
116
+ if (!(fullTurn > 0) || !Number.isFinite(fullTurn))
117
+ return;
118
+ const value = spring.value;
119
+ const halfTurn = fullTurn * 0.5;
120
+ const wrappedDelta = (((target - value) % fullTurn) + fullTurn) % fullTurn;
121
+ const shortestDelta = wrappedDelta > halfTurn ? wrappedDelta - fullTurn : wrappedDelta;
122
+ updateSpring(spring, value + shortestDelta, config, deltaTime);
123
+ }
103
124
  // Half-width of the damping-ratio band around 1 treated as critically damped. Inside it the
104
125
  // over/under-damped closed forms divide by a vanishing root separation, so the critical form is both
105
126
  // numerically safer and physically indistinguishable this close to 1.
@@ -1 +1 @@
1
- {"version":3,"file":"spring.js","sourceRoot":"","sources":["../src/spring.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spring.js","sourceRoot":"","sources":["../src/spring.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { Spring2D, SpringConfig } from '@flighthq/types/contract';
2
+ export declare function applySpringImpulse2D(spring2D: Spring2D, velocityX: number, velocityY: number): void;
2
3
  export declare function createSpring2D(valueX?: number, valueY?: number, velocityX?: number, velocityY?: number): Spring2D;
3
4
  export declare function isSpring2DSettled(spring2D: Readonly<Spring2D>, targetX: number, targetY: number, positionEpsilon?: number, velocityEpsilon?: number): boolean;
5
+ export declare function resetSpring2D(spring2D: Spring2D, valueX: number, valueY: number, velocityX?: number, velocityY?: number): void;
4
6
  export declare function updateSpring2D(spring2D: Spring2D, targetX: number, targetY: number, config: Readonly<SpringConfig>, deltaTime: number): void;
5
7
  //# sourceMappingURL=spring2D.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spring2D.d.ts","sourceRoot":"","sources":["../src/spring2D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMvE,wBAAgB,cAAc,CAC5B,MAAM,GAAE,MAAU,EAClB,MAAM,GAAE,MAAU,EAClB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,GACpB,QAAQ,CAEV;AAID,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,EACxB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAKT;AAKD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,IAAI,CAGN"}
1
+ {"version":3,"file":"spring2D.d.ts","sourceRoot":"","sources":["../src/spring2D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKvE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGnG;AAID,wBAAgB,cAAc,CAC5B,MAAM,GAAE,MAAU,EAClB,MAAM,GAAE,MAAU,EAClB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,GACpB,QAAQ,CAEV;AAID,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,EACxB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAKT;AAID,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,GACpB,IAAI,CAGN;AAKD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,IAAI,CAGN"}
package/dist/spring2D.js CHANGED
@@ -1,4 +1,9 @@
1
- import { createSpring, isSpringSettled, updateSpring } from './spring';
1
+ import { applySpringImpulse, createSpring, isSpringSettled, resetSpring, updateSpring } from './spring';
2
+ // Add independent velocity impulses to both axes without allocating or changing either value.
3
+ export function applySpringImpulse2D(spring2D, velocityX, velocityY) {
4
+ applySpringImpulse(spring2D.x, velocityX);
5
+ applySpringImpulse(spring2D.y, velocityY);
6
+ }
2
7
  // Allocate a 2D spring as a pair of scalar springs, each at its `value*` (default 0) and `velocity*`
3
8
  // (default 0).
4
9
  export function createSpring2D(valueX = 0, valueY = 0, velocityX = 0, velocityY = 0) {
@@ -10,6 +15,12 @@ export function isSpring2DSettled(spring2D, targetX, targetY, positionEpsilon, v
10
15
  return (isSpringSettled(spring2D.x, targetX, positionEpsilon, velocityEpsilon) &&
11
16
  isSpringSettled(spring2D.y, targetY, positionEpsilon, velocityEpsilon));
12
17
  }
18
+ // Snap both axes to the supplied values and velocities. Velocities default independently to zero,
19
+ // mirroring `resetSpring` while preserving the vector spring's existing axis objects.
20
+ export function resetSpring2D(spring2D, valueX, valueY, velocityX = 0, velocityY = 0) {
21
+ resetSpring(spring2D.x, valueX, velocityX);
22
+ resetSpring(spring2D.y, valueY, velocityY);
23
+ }
13
24
  // Advance both axes of `spring2D` one `deltaTime` step toward (`targetX`, `targetY`) under the same
14
25
  // `config`, applying the scalar `updateSpring` per component. The axes are independent; sharing one
15
26
  // config just gives them the same response.
@@ -1 +1 @@
1
- {"version":3,"file":"spring2D.js","sourceRoot":"","sources":["../src/spring2D.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEvE,qGAAqG;AACrG,eAAe;AACf,MAAM,UAAU,cAAc,CAC5B,SAAiB,CAAC,EAClB,SAAiB,CAAC,EAClB,YAAoB,CAAC,EACrB,YAAoB,CAAC;IAErB,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,oGAAoG;AACpG,gGAAgG;AAChG,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,OAAe,EACf,OAAe,EACf,eAAwB,EACxB,eAAwB;IAExB,OAAO,CACL,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC;QACtE,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,oGAAoG;AACpG,oGAAoG;AACpG,4CAA4C;AAC5C,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,OAAe,EACf,OAAe,EACf,MAA8B,EAC9B,SAAiB;IAEjB,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"spring2D.js","sourceRoot":"","sources":["../src/spring2D.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExG,8FAA8F;AAC9F,MAAM,UAAU,oBAAoB,CAAC,QAAkB,EAAE,SAAiB,EAAE,SAAiB;IAC3F,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,qGAAqG;AACrG,eAAe;AACf,MAAM,UAAU,cAAc,CAC5B,SAAiB,CAAC,EAClB,SAAiB,CAAC,EAClB,YAAoB,CAAC,EACrB,YAAoB,CAAC;IAErB,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,oGAAoG;AACpG,gGAAgG;AAChG,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,OAAe,EACf,OAAe,EACf,eAAwB,EACxB,eAAwB;IAExB,OAAO,CACL,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC;QACtE,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAC3B,QAAkB,EAClB,MAAc,EACd,MAAc,EACd,YAAoB,CAAC,EACrB,YAAoB,CAAC;IAErB,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,oGAAoG;AACpG,oGAAoG;AACpG,4CAA4C;AAC5C,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,OAAe,EACf,OAAe,EACf,MAA8B,EAC9B,SAAiB;IAEjB,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import type { Spring3D, SpringConfig } from '@flighthq/types/contract';
2
+ export declare function applySpringImpulse3D(spring3D: Spring3D, velocityX: number, velocityY: number, velocityZ: number): void;
2
3
  export declare function createSpring3D(valueX?: number, valueY?: number, valueZ?: number, velocityX?: number, velocityY?: number, velocityZ?: number): Spring3D;
3
4
  export declare function isSpring3DSettled(spring3D: Readonly<Spring3D>, targetX: number, targetY: number, targetZ: number, positionEpsilon?: number, velocityEpsilon?: number): boolean;
5
+ export declare function resetSpring3D(spring3D: Spring3D, valueX: number, valueY: number, valueZ: number, velocityX?: number, velocityY?: number, velocityZ?: number): void;
4
6
  export declare function updateSpring3D(spring3D: Spring3D, targetX: number, targetY: number, targetZ: number, config: Readonly<SpringConfig>, deltaTime: number): void;
5
7
  //# sourceMappingURL=spring3D.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spring3D.d.ts","sourceRoot":"","sources":["../src/spring3D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMvE,wBAAgB,cAAc,CAC5B,MAAM,GAAE,MAAU,EAClB,MAAM,GAAE,MAAU,EAClB,MAAM,GAAE,MAAU,EAClB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,GACpB,QAAQ,CAMV;AAID,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,EACxB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAMT;AAID,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,IAAI,CAIN"}
1
+ {"version":3,"file":"spring3D.d.ts","sourceRoot":"","sources":["../src/spring3D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKvE,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,IAAI,CAIN;AAID,wBAAgB,cAAc,CAC5B,MAAM,GAAE,MAAU,EAClB,MAAM,GAAE,MAAU,EAClB,MAAM,GAAE,MAAU,EAClB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,GACpB,QAAQ,CAMV;AAID,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,EACxB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAMT;AAID,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,GACpB,IAAI,CAIN;AAID,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,IAAI,CAIN"}
package/dist/spring3D.js CHANGED
@@ -1,4 +1,10 @@
1
- import { createSpring, isSpringSettled, updateSpring } from './spring';
1
+ import { applySpringImpulse, createSpring, isSpringSettled, resetSpring, updateSpring } from './spring';
2
+ // Add independent velocity impulses to all three axes without allocating or changing their values.
3
+ export function applySpringImpulse3D(spring3D, velocityX, velocityY, velocityZ) {
4
+ applySpringImpulse(spring3D.x, velocityX);
5
+ applySpringImpulse(spring3D.y, velocityY);
6
+ applySpringImpulse(spring3D.z, velocityZ);
7
+ }
2
8
  // Allocate a 3D spring as three scalar springs, each at its `value*` (default 0) and `velocity*`
3
9
  // (default 0).
4
10
  export function createSpring3D(valueX = 0, valueY = 0, valueZ = 0, velocityX = 0, velocityY = 0, velocityZ = 0) {
@@ -15,6 +21,13 @@ export function isSpring3DSettled(spring3D, targetX, targetY, targetZ, positionE
15
21
  isSpringSettled(spring3D.y, targetY, positionEpsilon, velocityEpsilon) &&
16
22
  isSpringSettled(spring3D.z, targetZ, positionEpsilon, velocityEpsilon));
17
23
  }
24
+ // Snap all three axes to the supplied values and velocities. Velocities default independently to
25
+ // zero, mirroring `resetSpring` while preserving the vector spring's existing axis objects.
26
+ export function resetSpring3D(spring3D, valueX, valueY, valueZ, velocityX = 0, velocityY = 0, velocityZ = 0) {
27
+ resetSpring(spring3D.x, valueX, velocityX);
28
+ resetSpring(spring3D.y, valueY, velocityY);
29
+ resetSpring(spring3D.z, valueZ, velocityZ);
30
+ }
18
31
  // Advance all three axes of `spring3D` one `deltaTime` step toward (`targetX`, `targetY`, `targetZ`)
19
32
  // under the same `config`, applying the scalar `updateSpring` per component.
20
33
  export function updateSpring3D(spring3D, targetX, targetY, targetZ, config, deltaTime) {
@@ -1 +1 @@
1
- {"version":3,"file":"spring3D.js","sourceRoot":"","sources":["../src/spring3D.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEvE,iGAAiG;AACjG,eAAe;AACf,MAAM,UAAU,cAAc,CAC5B,SAAiB,CAAC,EAClB,SAAiB,CAAC,EAClB,SAAiB,CAAC,EAClB,YAAoB,CAAC,EACrB,YAAoB,CAAC,EACrB,YAAoB,CAAC;IAErB,OAAO;QACL,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;QAClC,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;QAClC,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,OAAe,EACf,OAAe,EACf,OAAe,EACf,eAAwB,EACxB,eAAwB;IAExB,OAAO,CACL,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC;QACtE,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC;QACtE,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,OAAe,EACf,OAAe,EACf,OAAe,EACf,MAA8B,EAC9B,SAAiB;IAEjB,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"spring3D.js","sourceRoot":"","sources":["../src/spring3D.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExG,mGAAmG;AACnG,MAAM,UAAU,oBAAoB,CAClC,QAAkB,EAClB,SAAiB,EACjB,SAAiB,EACjB,SAAiB;IAEjB,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,iGAAiG;AACjG,eAAe;AACf,MAAM,UAAU,cAAc,CAC5B,SAAiB,CAAC,EAClB,SAAiB,CAAC,EAClB,SAAiB,CAAC,EAClB,YAAoB,CAAC,EACrB,YAAoB,CAAC,EACrB,YAAoB,CAAC;IAErB,OAAO;QACL,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;QAClC,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;QAClC,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,OAAe,EACf,OAAe,EACf,OAAe,EACf,eAAwB,EACxB,eAAwB;IAExB,OAAO,CACL,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC;QACtE,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC;QACtE,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,4FAA4F;AAC5F,MAAM,UAAU,aAAa,CAC3B,QAAkB,EAClB,MAAc,EACd,MAAc,EACd,MAAc,EACd,YAAoB,CAAC,EACrB,YAAoB,CAAC,EACrB,YAAoB,CAAC;IAErB,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,qGAAqG;AACrG,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,OAAe,EACf,OAAe,EACf,OAAe,EACf,MAA8B,EAC9B,SAAiB;IAEjB,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC"}
@@ -1,4 +1,7 @@
1
1
  import type { SpringConfig } from '@flighthq/types/contract';
2
+ export declare const SpringPresetBouncy: Readonly<SpringConfig>;
3
+ export declare const SpringPresetGentle: Readonly<SpringConfig>;
4
+ export declare const SpringPresetStiff: Readonly<SpringConfig>;
2
5
  export declare function createSpringConfig(frequency: number, dampingRatio: number): SpringConfig;
3
6
  export declare function createSpringConfigFromPhysical(stiffness: number, damping: number, mass: number): SpringConfig;
4
7
  //# sourceMappingURL=springConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"springConfig.d.ts","sourceRoot":"","sources":["../src/springConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAK7D,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CAExF;AAMD,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAK7G"}
1
+ {"version":3,"file":"springConfig.d.ts","sourceRoot":"","sources":["../src/springConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,YAAY,CAAuD,CAAC;AAG9G,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,YAAY,CAAwD,CAAC;AAG/G,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,YAAY,CAAoD,CAAC;AAK1G,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CAExF;AAMD,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAK7G"}
@@ -1,4 +1,11 @@
1
1
  import { TAU } from '@flighthq/math/contract';
2
+ // Frozen plain-data presets: spread one into a mutable object to customize it without changing the
3
+ // shared profile. Bouncy is quick and underdamped for visible overshoot.
4
+ export const SpringPresetBouncy = Object.freeze({ dampingRatio: 0.35, frequency: 2 });
5
+ // A slower, well-damped profile for soft UI movement with only a restrained overshoot.
6
+ export const SpringPresetGentle = Object.freeze({ dampingRatio: 0.8, frequency: 1.5 });
7
+ // A high-frequency critical profile for a fast response without overshoot.
8
+ export const SpringPresetStiff = Object.freeze({ dampingRatio: 1, frequency: 4 });
2
9
  // Allocate a `SpringConfig` from the designer-intuitive `frequency` (Hz) and `dampingRatio`
3
10
  // (0 undamped, <1 underdamped/overshoots, 1 critical/fastest-no-overshoot, >1 overdamped). This is
4
11
  // the primary constructor; use `createSpringConfigFromPhysical` when starting from raw physics.
@@ -1 +1 @@
1
- {"version":3,"file":"springConfig.js","sourceRoot":"","sources":["../src/springConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAG9C,4FAA4F;AAC5F,mGAAmG;AACnG,gGAAgG;AAChG,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,YAAoB;IACxE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AACrC,CAAC;AAED,oGAAoG;AACpG,qFAAqF;AACrF,sFAAsF;AACtF,qEAAqE;AACrE,MAAM,UAAU,8BAA8B,CAAC,SAAiB,EAAE,OAAe,EAAE,IAAY;IAC7F,OAAO;QACL,YAAY,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACzD,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG;KAC7C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"springConfig.js","sourceRoot":"","sources":["../src/springConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAG9C,mGAAmG;AACnG,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAA2B,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;AAE9G,uFAAuF;AACvF,MAAM,CAAC,MAAM,kBAAkB,GAA2B,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;AAE/G,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAA2B,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;AAE1G,4FAA4F;AAC5F,mGAAmG;AACnG,gGAAgG;AAChG,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,YAAoB;IACxE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AACrC,CAAC;AAED,oGAAoG;AACpG,qFAAqF;AACrF,sFAAsF;AACtF,qEAAqE;AACrE,MAAM,UAAU,8BAA8B,CAAC,SAAiB,EAAE,OAAe,EAAE,IAAY;IAC7F,OAAO;QACL,YAAY,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACzD,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG;KAC7C,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/spring",
3
- "version": "0.5.1-next.685.f72fc7f",
3
+ "version": "0.5.1-next.704.19c91ec",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,8 +38,8 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/math": "0.5.1-next.685.f72fc7f",
42
- "@flighthq/types": "0.5.1-next.685.f72fc7f"
41
+ "@flighthq/math": "0.5.1-next.704.19c91ec",
42
+ "@flighthq/types": "0.5.1-next.704.19c91ec"
43
43
  },
44
44
  "devDependencies": {
45
45
  "typescript": "^5.3.0"
@@ -1,6 +1,25 @@
1
- import { createSpring, isSpringSettled, resetSpring, updateSpring } from './spring';
1
+ import {
2
+ applySpringImpulse,
3
+ createSpring,
4
+ isSpringSettled,
5
+ resetSpring,
6
+ updateSpring,
7
+ updateSpringAngle,
8
+ } from './spring';
2
9
  import { createSpringConfig } from './springConfig';
3
10
 
11
+ describe('applySpringImpulse', () => {
12
+ it('adds velocity without changing position and composes repeated impulses', () => {
13
+ const spring = createSpring(12, 3);
14
+
15
+ applySpringImpulse(spring, 4);
16
+ applySpringImpulse(spring, -1.5);
17
+
18
+ expect(spring.value).toBe(12);
19
+ expect(spring.velocity).toBe(5.5);
20
+ });
21
+ });
22
+
4
23
  describe('createSpring', () => {
5
24
  it('defaults value and velocity to 0', () => {
6
25
  const spring = createSpring();
@@ -192,3 +211,34 @@ describe('updateSpring', () => {
192
211
  expect(spring.velocity).not.toBe(2);
193
212
  });
194
213
  });
214
+
215
+ describe('updateSpringAngle', () => {
216
+ it('takes the shortest path across a degree seam in both directions', () => {
217
+ const config = createSpringConfig(2, 1);
218
+ const forward = createSpring(359);
219
+ const forwardReference = createSpring(359);
220
+ updateSpringAngle(forward, 1, 360, config, 1 / 60);
221
+ updateSpring(forwardReference, 361, config, 1 / 60);
222
+ expect(forward.value).toBeCloseTo(forwardReference.value, 12);
223
+ expect(forward.velocity).toBeCloseTo(forwardReference.velocity, 12);
224
+
225
+ const reverse = createSpring(1);
226
+ const reverseReference = createSpring(1);
227
+ updateSpringAngle(reverse, 359, 360, config, 1 / 60);
228
+ updateSpring(reverseReference, -1, config, 1 / 60);
229
+ expect(reverse.value).toBeCloseTo(reverseReference.value, 12);
230
+ expect(reverse.velocity).toBeCloseTo(reverseReference.velocity, 12);
231
+ });
232
+
233
+ it('uses caller-selected units and resolves exact half-turn ties positively', () => {
234
+ const config = createSpringConfig(2, 1);
235
+ const spring = createSpring(0);
236
+ const reference = createSpring(0);
237
+
238
+ updateSpringAngle(spring, -0.5, 1, config, 1 / 60);
239
+ updateSpring(reference, 0.5, config, 1 / 60);
240
+
241
+ expect(spring.value).toBeCloseTo(reference.value, 12);
242
+ expect(spring.velocity).toBeCloseTo(reference.velocity, 12);
243
+ });
244
+ });
@@ -1,8 +1,19 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
- import { createSpring2D, isSpring2DSettled, updateSpring2D } from './spring2D';
3
+ import { applySpringImpulse2D, createSpring2D, isSpring2DSettled, resetSpring2D, updateSpring2D } from './spring2D';
4
4
  import { createSpringConfig } from './springConfig';
5
5
 
6
+ describe('applySpringImpulse2D', () => {
7
+ it('adds each velocity component without changing either value', () => {
8
+ const spring = createSpring2D(10, 20, 1, 2);
9
+
10
+ applySpringImpulse2D(spring, 3, -5);
11
+
12
+ expect(spring.x).toEqual({ value: 10, velocity: 4 });
13
+ expect(spring.y).toEqual({ value: 20, velocity: -3 });
14
+ });
15
+ });
16
+
6
17
  describe('createSpring2D', () => {
7
18
  it('defaults both axes to value 0 and velocity 0', () => {
8
19
  const spring = createSpring2D();
@@ -31,6 +42,24 @@ describe('isSpring2DSettled', () => {
31
42
  });
32
43
  });
33
44
 
45
+ describe('resetSpring2D', () => {
46
+ it('mirrors scalar reset for values, explicit velocities, and zero defaults', () => {
47
+ const spring = createSpring2D(1, 2, 3, 4);
48
+ const x = spring.x;
49
+ const y = spring.y;
50
+
51
+ resetSpring2D(spring, 10, 20, 30, 40);
52
+ expect(spring.x).toBe(x);
53
+ expect(spring.y).toBe(y);
54
+ expect(spring.x).toEqual({ value: 10, velocity: 30 });
55
+ expect(spring.y).toEqual({ value: 20, velocity: 40 });
56
+
57
+ resetSpring2D(spring, -10, -20);
58
+ expect(spring.x).toEqual({ value: -10, velocity: 0 });
59
+ expect(spring.y).toEqual({ value: -20, velocity: 0 });
60
+ });
61
+ });
62
+
34
63
  describe('updateSpring2D', () => {
35
64
  it('moves both components toward their targets', () => {
36
65
  const spring = createSpring2D(0, 0);
@@ -1,8 +1,20 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
- import { createSpring3D, isSpring3DSettled, updateSpring3D } from './spring3D';
3
+ import { applySpringImpulse3D, createSpring3D, isSpring3DSettled, resetSpring3D, updateSpring3D } from './spring3D';
4
4
  import { createSpringConfig } from './springConfig';
5
5
 
6
+ describe('applySpringImpulse3D', () => {
7
+ it('adds each velocity component without changing any value', () => {
8
+ const spring = createSpring3D(10, 20, 30, 1, 2, 3);
9
+
10
+ applySpringImpulse3D(spring, 3, -5, 7);
11
+
12
+ expect(spring.x).toEqual({ value: 10, velocity: 4 });
13
+ expect(spring.y).toEqual({ value: 20, velocity: -3 });
14
+ expect(spring.z).toEqual({ value: 30, velocity: 10 });
15
+ });
16
+ });
17
+
6
18
  describe('createSpring3D', () => {
7
19
  it('defaults all axes to value 0 and velocity 0', () => {
8
20
  const spring = createSpring3D();
@@ -35,6 +47,28 @@ describe('isSpring3DSettled', () => {
35
47
  });
36
48
  });
37
49
 
50
+ describe('resetSpring3D', () => {
51
+ it('mirrors scalar reset for values, explicit velocities, and zero defaults', () => {
52
+ const spring = createSpring3D(1, 2, 3, 4, 5, 6);
53
+ const x = spring.x;
54
+ const y = spring.y;
55
+ const z = spring.z;
56
+
57
+ resetSpring3D(spring, 10, 20, 30, 40, 50, 60);
58
+ expect(spring.x).toBe(x);
59
+ expect(spring.y).toBe(y);
60
+ expect(spring.z).toBe(z);
61
+ expect(spring.x).toEqual({ value: 10, velocity: 40 });
62
+ expect(spring.y).toEqual({ value: 20, velocity: 50 });
63
+ expect(spring.z).toEqual({ value: 30, velocity: 60 });
64
+
65
+ resetSpring3D(spring, -10, -20, -30);
66
+ expect(spring.x).toEqual({ value: -10, velocity: 0 });
67
+ expect(spring.y).toEqual({ value: -20, velocity: 0 });
68
+ expect(spring.z).toEqual({ value: -30, velocity: 0 });
69
+ });
70
+ });
71
+
38
72
  describe('updateSpring3D', () => {
39
73
  it('moves all three components toward their targets', () => {
40
74
  const spring = createSpring3D(0, 0, 0);
@@ -1,7 +1,13 @@
1
1
  import { TAU } from '@flighthq/math/contract';
2
2
  import { describe, expect, it } from 'vitest';
3
3
 
4
- import { createSpringConfig, createSpringConfigFromPhysical } from './springConfig';
4
+ import {
5
+ createSpringConfig,
6
+ createSpringConfigFromPhysical,
7
+ SpringPresetBouncy,
8
+ SpringPresetGentle,
9
+ SpringPresetStiff,
10
+ } from './springConfig';
5
11
 
6
12
  describe('createSpringConfig', () => {
7
13
  it('stores frequency and dampingRatio verbatim', () => {
@@ -25,3 +31,22 @@ describe('createSpringConfigFromPhysical', () => {
25
31
  expect(config.dampingRatio).toBeCloseTo(0.5, 12);
26
32
  });
27
33
  });
34
+
35
+ describe('spring presets', () => {
36
+ it('exports frozen plain-data configs that can be customized by spreading', () => {
37
+ expect(Object.isFrozen(SpringPresetBouncy)).toBe(true);
38
+ expect(Object.isFrozen(SpringPresetGentle)).toBe(true);
39
+ expect(Object.isFrozen(SpringPresetStiff)).toBe(true);
40
+ expect(Reflect.set(SpringPresetBouncy, 'frequency', 100)).toBe(false);
41
+
42
+ const customized = { ...SpringPresetGentle, frequency: 3 };
43
+ expect(customized).toEqual({ dampingRatio: SpringPresetGentle.dampingRatio, frequency: 3 });
44
+ expect(SpringPresetGentle.frequency).not.toBe(3);
45
+ });
46
+
47
+ it('provides distinct bouncy, gentle, and stiff response profiles', () => {
48
+ expect(SpringPresetBouncy.dampingRatio).toBeLessThan(SpringPresetGentle.dampingRatio);
49
+ expect(SpringPresetGentle.frequency).toBeLessThan(SpringPresetStiff.frequency);
50
+ expect(SpringPresetStiff.dampingRatio).toBeGreaterThanOrEqual(1);
51
+ });
52
+ });