@flighthq/camera-controls 0.5.1-edge.1471.4e82419 → 0.5.1-edge.1685.dc0e23a
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 +2 -2
- package/dist/follow.d.ts +1 -1
- package/dist/follow.d.ts.map +1 -1
- package/dist/follow.js +2 -2
- package/dist/follow.js.map +1 -1
- package/package.json +6 -6
- package/src/follow.test.ts +11 -11
package/README.md
CHANGED
|
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/camera-controls`. Th
|
|
|
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/camera-controls@0.5.1-edge.
|
|
17
|
-
- [License](https://github.com/flighthq/flight/blob/
|
|
16
|
+
- [Source for @flighthq/camera-controls@0.5.1-edge.1685.dc0e23a](https://github.com/flighthq/flight/tree/dc0e23a17453ec75c20ccbf07058a57b5ef10c4c/packages/camera-controls)
|
|
17
|
+
- [License](https://github.com/flighthq/flight/blob/dc0e23a17453ec75c20ccbf07058a57b5ef10c4c/LICENSE.md)
|
package/dist/follow.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Camera2D, Camera2DFollowOptions } from '@flighthq/types/contract';
|
|
2
|
-
export declare function updateCamera2DFollow(camera: Camera2D, targetX: number, targetY: number, deltaTime: number, options?: Readonly<Camera2DFollowOptions>): void;
|
|
2
|
+
export declare function updateCamera2DFollow(camera: Camera2D, viewportWidth: number, viewportHeight: number, targetX: number, targetY: number, deltaTime: number, options?: Readonly<Camera2DFollowOptions>): void;
|
|
3
3
|
//# sourceMappingURL=follow.d.ts.map
|
package/dist/follow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../src/follow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAehF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GACxC,IAAI,CAkDN"}
|
|
1
|
+
{"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../src/follow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAehF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAChB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GACxC,IAAI,CAkDN"}
|
package/dist/follow.js
CHANGED
|
@@ -14,7 +14,7 @@ import { clamp, damp } from '@flighthq/math/contract';
|
|
|
14
14
|
// Camera3D inputs are read into locals before any write, so passing the same camera as target source is
|
|
15
15
|
// safe. The deadzone box is axis-aligned in world space (it aligns with the view only when
|
|
16
16
|
// `rotation` is 0).
|
|
17
|
-
export function updateCamera2DFollow(camera, targetX, targetY, deltaTime, options) {
|
|
17
|
+
export function updateCamera2DFollow(camera, viewportWidth, viewportHeight, targetX, targetY, deltaTime, options) {
|
|
18
18
|
const camX = camera.x;
|
|
19
19
|
const camY = camera.y;
|
|
20
20
|
const deadHalfW = options?.deadzoneHalfWidth ?? 0;
|
|
@@ -48,7 +48,7 @@ export function updateCamera2DFollow(camera, targetX, targetY, deltaTime, option
|
|
|
48
48
|
// The visible-bounds size is independent of camera position, so it is safe to read before the
|
|
49
49
|
// camera moves; the rectangle is centered on the camera, so clamping the center by its half-
|
|
50
50
|
// extents keeps the visible rect inside the level.
|
|
51
|
-
getCamera2DVisibleBounds(camera, scratchBounds);
|
|
51
|
+
getCamera2DVisibleBounds(camera, viewportWidth, viewportHeight, scratchBounds);
|
|
52
52
|
const halfVisW = scratchBounds.width * 0.5;
|
|
53
53
|
const halfVisH = scratchBounds.height * 0.5;
|
|
54
54
|
if (worldBounds.width <= scratchBounds.width) {
|
package/dist/follow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"follow.js","sourceRoot":"","sources":["../src/follow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAGtD,oFAAoF;AACpF,EAAE;AACF,kGAAkG;AAClG,qGAAqG;AACrG,qGAAqG;AACrG,oGAAoG;AACpG,+FAA+F;AAC/F,gGAAgG;AAChG,yEAAyE;AACzE,EAAE;AACF,wGAAwG;AACxG,2FAA2F;AAC3F,oBAAoB;AACpB,MAAM,UAAU,oBAAoB,CAClC,MAAgB,EAChB,OAAe,EACf,OAAe,EACf,SAAiB,EACjB,OAAyC;IAEzC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,OAAO,EAAE,iBAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,EAAE,kBAAkB,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC;IAEzC,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC;IAC1B,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,EAAE,GAAG,SAAS;QAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;SAC3C,IAAI,EAAE,GAAG,CAAC,SAAS;QAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;IAEtD,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC;IAC1B,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,EAAE,GAAG,SAAS;QAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;SAC3C,IAAI,EAAE,GAAG,CAAC,SAAS;QAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;IAEtD,IAAI,KAAa,CAAC;IAClB,IAAI,KAAa,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC;QAC9B,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7C,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,KAAK,CAAC;QACd,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,8FAA8F;QAC9F,6FAA6F;QAC7F,mDAAmD;QACnD,wBAAwB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"follow.js","sourceRoot":"","sources":["../src/follow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAGtD,oFAAoF;AACpF,EAAE;AACF,kGAAkG;AAClG,qGAAqG;AACrG,qGAAqG;AACrG,oGAAoG;AACpG,+FAA+F;AAC/F,gGAAgG;AAChG,yEAAyE;AACzE,EAAE;AACF,wGAAwG;AACxG,2FAA2F;AAC3F,oBAAoB;AACpB,MAAM,UAAU,oBAAoB,CAClC,MAAgB,EAChB,aAAqB,EACrB,cAAsB,EACtB,OAAe,EACf,OAAe,EACf,SAAiB,EACjB,OAAyC;IAEzC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,OAAO,EAAE,iBAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,EAAE,kBAAkB,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC;IAEzC,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC;IAC1B,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,EAAE,GAAG,SAAS;QAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;SAC3C,IAAI,EAAE,GAAG,CAAC,SAAS;QAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;IAEtD,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC;IAC1B,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,EAAE,GAAG,SAAS;QAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;SAC3C,IAAI,EAAE,GAAG,CAAC,SAAS;QAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;IAEtD,IAAI,KAAa,CAAC;IAClB,IAAI,KAAa,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC;QAC9B,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7C,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,KAAK,CAAC;QACd,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,8FAA8F;QAC9F,6FAA6F;QAC7F,mDAAmD;QACnD,wBAAwB,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,GAAG,GAAG,CAAC;QAC3C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,GAAG,GAAG,CAAC;QAC5C,IAAI,WAAW,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;YAC7C,KAAK,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,GAAG,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,QAAQ,EAAE,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YAC/C,KAAK,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,QAAQ,EAAE,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC;IACjB,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,aAAa,GAAG,eAAe,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/camera-controls",
|
|
3
|
-
"version": "0.5.1-edge.
|
|
3
|
+
"version": "0.5.1-edge.1685.dc0e23a",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/camera": "0.5.1-edge.
|
|
42
|
-
"@flighthq/entity": "0.5.1-edge.
|
|
43
|
-
"@flighthq/geometry": "0.5.1-edge.
|
|
44
|
-
"@flighthq/math": "0.5.1-edge.
|
|
45
|
-
"@flighthq/types": "0.5.1-edge.
|
|
41
|
+
"@flighthq/camera": "0.5.1-edge.1685.dc0e23a",
|
|
42
|
+
"@flighthq/entity": "0.5.1-edge.1685.dc0e23a",
|
|
43
|
+
"@flighthq/geometry": "0.5.1-edge.1685.dc0e23a",
|
|
44
|
+
"@flighthq/math": "0.5.1-edge.1685.dc0e23a",
|
|
45
|
+
"@flighthq/types": "0.5.1-edge.1685.dc0e23a"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"typescript": "^5.3.0"
|
package/src/follow.test.ts
CHANGED
|
@@ -7,37 +7,37 @@ import { updateCamera2DFollow } from './follow';
|
|
|
7
7
|
|
|
8
8
|
describe('updateCamera2DFollow', () => {
|
|
9
9
|
it('does not move when the target is inside the deadzone', () => {
|
|
10
|
-
const camera = createCamera2D(
|
|
11
|
-
updateCamera2DFollow(camera, 50, 30, 0.016, { deadzoneHalfWidth: 100, deadzoneHalfHeight: 100 });
|
|
10
|
+
const camera = createCamera2D();
|
|
11
|
+
updateCamera2DFollow(camera, 800, 600, 50, 30, 0.016, { deadzoneHalfWidth: 100, deadzoneHalfHeight: 100 });
|
|
12
12
|
expect(camera.x).toBe(0);
|
|
13
13
|
expect(camera.y).toBe(0);
|
|
14
14
|
});
|
|
15
15
|
|
|
16
16
|
it('moves partway toward the target with smoothing over one step', () => {
|
|
17
|
-
const camera = createCamera2D(
|
|
18
|
-
updateCamera2DFollow(camera, 100, 0, 0.016, { smoothTime: 0.1 });
|
|
17
|
+
const camera = createCamera2D();
|
|
18
|
+
updateCamera2DFollow(camera, 800, 600, 100, 0, 0.016, { smoothTime: 0.1 });
|
|
19
19
|
expect(camera.x).toBeGreaterThan(0);
|
|
20
20
|
expect(camera.x).toBeLessThan(100);
|
|
21
21
|
expect(camera.y).toBeCloseTo(0, 9);
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
it('snaps the target onto the deadzone edge when smoothTime is 0', () => {
|
|
25
|
-
const camera = createCamera2D(
|
|
26
|
-
updateCamera2DFollow(camera, 300, 0, 0.016, { deadzoneHalfWidth: 100, smoothTime: 0 });
|
|
25
|
+
const camera = createCamera2D();
|
|
26
|
+
updateCamera2DFollow(camera, 800, 600, 300, 0, 0.016, { deadzoneHalfWidth: 100, smoothTime: 0 });
|
|
27
27
|
// Goal moves the minimum so the target sits exactly on the deadzone edge (300 - 100).
|
|
28
28
|
expect(camera.x).toBe(200);
|
|
29
29
|
expect(camera.y).toBe(0);
|
|
30
30
|
});
|
|
31
31
|
|
|
32
32
|
it('clamps the camera so the visible bounds stay inside world bounds', () => {
|
|
33
|
-
const camera = createCamera2D(
|
|
33
|
+
const camera = createCamera2D();
|
|
34
34
|
const worldBounds = createRectangle(0, 0, 2000, 2000);
|
|
35
|
-
updateCamera2DFollow(camera, 1900, 1000, 0.016, { smoothTime: 0, worldBounds });
|
|
35
|
+
updateCamera2DFollow(camera, 800, 600, 1900, 1000, 0.016, { smoothTime: 0, worldBounds });
|
|
36
36
|
// Half view is 400x300, so the center clamps to [400, 1600] x [300, 1700].
|
|
37
37
|
expect(camera.x).toBe(1600);
|
|
38
38
|
expect(camera.y).toBe(1000);
|
|
39
39
|
const visible = createRectangle();
|
|
40
|
-
getCamera2DVisibleBounds(camera, visible);
|
|
40
|
+
getCamera2DVisibleBounds(camera, 800, 600, visible);
|
|
41
41
|
expect(visible.x).toBeGreaterThanOrEqual(worldBounds.x - 1e-9);
|
|
42
42
|
expect(visible.y).toBeGreaterThanOrEqual(worldBounds.y - 1e-9);
|
|
43
43
|
expect(visible.x + visible.width).toBeLessThanOrEqual(worldBounds.x + worldBounds.width + 1e-9);
|
|
@@ -45,10 +45,10 @@ describe('updateCamera2DFollow', () => {
|
|
|
45
45
|
});
|
|
46
46
|
|
|
47
47
|
it('centers the camera on an axis where the world is smaller than the view', () => {
|
|
48
|
-
const camera = createCamera2D(
|
|
48
|
+
const camera = createCamera2D();
|
|
49
49
|
// World is only 400 wide (< 800 view), so x centers on the world midpoint.
|
|
50
50
|
const worldBounds = createRectangle(0, 0, 400, 2000);
|
|
51
|
-
updateCamera2DFollow(camera, 1900, 1000, 0.016, { smoothTime: 0, worldBounds });
|
|
51
|
+
updateCamera2DFollow(camera, 800, 600, 1900, 1000, 0.016, { smoothTime: 0, worldBounds });
|
|
52
52
|
expect(camera.x).toBe(200);
|
|
53
53
|
expect(camera.y).toBe(1000);
|
|
54
54
|
});
|