@aura3d/controls 2.0.3 → 3.0.0
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/dist/ArcballControls.d.ts +92 -0
- package/dist/ArcballControls.d.ts.map +1 -0
- package/dist/ArcballControls.js +286 -0
- package/dist/ArcballControls.js.map +1 -0
- package/dist/DragControls.d.ts +13 -0
- package/dist/DragControls.d.ts.map +1 -1
- package/dist/DragControls.js +24 -1
- package/dist/DragControls.js.map +1 -1
- package/dist/FlyControls.d.ts +9 -0
- package/dist/FlyControls.d.ts.map +1 -1
- package/dist/FlyControls.js +20 -2
- package/dist/FlyControls.js.map +1 -1
- package/dist/FocusFrame.d.ts +34 -0
- package/dist/FocusFrame.d.ts.map +1 -0
- package/dist/FocusFrame.js +82 -0
- package/dist/FocusFrame.js.map +1 -0
- package/dist/HoverOutline.d.ts +46 -0
- package/dist/HoverOutline.d.ts.map +1 -0
- package/dist/HoverOutline.js +87 -0
- package/dist/HoverOutline.js.map +1 -0
- package/dist/InteractionControls.d.ts +7 -0
- package/dist/InteractionControls.d.ts.map +1 -1
- package/dist/InteractionControls.js +12 -1
- package/dist/InteractionControls.js.map +1 -1
- package/dist/NativeControlTypes.d.ts +17 -0
- package/dist/NativeControlTypes.d.ts.map +1 -1
- package/dist/NativeControlTypes.js.map +1 -1
- package/dist/OrbitControls.d.ts +9 -0
- package/dist/OrbitControls.d.ts.map +1 -1
- package/dist/OrbitControls.js +26 -6
- package/dist/OrbitControls.js.map +1 -1
- package/dist/Picking.d.ts +15 -0
- package/dist/Picking.d.ts.map +1 -1
- package/dist/Picking.js +62 -23
- package/dist/Picking.js.map +1 -1
- package/dist/PointerLockControls.d.ts.map +1 -1
- package/dist/PointerLockControls.js +4 -0
- package/dist/PointerLockControls.js.map +1 -1
- package/dist/SelectionManager.d.ts +8 -0
- package/dist/SelectionManager.d.ts.map +1 -1
- package/dist/SelectionManager.js +11 -0
- package/dist/SelectionManager.js.map +1 -1
- package/dist/TrackballControls.d.ts +7 -0
- package/dist/TrackballControls.d.ts.map +1 -1
- package/dist/TrackballControls.js +19 -5
- package/dist/TrackballControls.js.map +1 -1
- package/dist/TransformControls.d.ts +8 -0
- package/dist/TransformControls.d.ts.map +1 -1
- package/dist/TransformControls.js +15 -2
- package/dist/TransformControls.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arcball controls (muse3jsparity-PRD N2).
|
|
3
|
+
*
|
|
4
|
+
* The r185 addon baseline ships `ArcballControls` alongside
|
|
5
|
+
* Orbit/Map/Trackball/Fly/FirstPerson; Aura3D had every neighbor but not
|
|
6
|
+
* this one. Like its siblings in this package it owns no DOM listeners —
|
|
7
|
+
* input arrives through `rotate`/`pan`/`dolly`/`applyPointer` calls (or the
|
|
8
|
+
* input-system snapshots the route already forwards) — so `dispose()` means
|
|
9
|
+
* detach + disable + drain velocities, idempotent, with no leaked listeners
|
|
10
|
+
* by construction (F1 hygiene standard).
|
|
11
|
+
*
|
|
12
|
+
* ## Parity vs three.js `ArcballControls` (r185)
|
|
13
|
+
*
|
|
14
|
+
* | Option / behavior | three.js ArcballControls | This implementation |
|
|
15
|
+
* |--------------------------------|--------------------------|---------------------|
|
|
16
|
+
* | Free rotation (no polar clamp) | yes | yes (`rotate`) |
|
|
17
|
+
* | Pan (screen-space truck) | yes (`mouseActions.PAN`) | yes (`pan`) |
|
|
18
|
+
* | Dolly with min/max distance | yes | yes (`dolly`) |
|
|
19
|
+
* | Damping (`enableDamping`) | yes | yes (`update(dt)`) |
|
|
20
|
+
* | Roll about the view axis | via touch gestures | yes (`roll`) |
|
|
21
|
+
* | `cursorZoom` (zoom to cursor) | yes | GAP — listed, not claimed (needs a projecting camera; the `OrbitCameraLike` surface here carries position only) |
|
|
22
|
+
* | Touch two-finger gestures | yes | GAP — routes forward snapshots; pinch maps to `dolly`, two-finger drag to `pan` |
|
|
23
|
+
* | `adjustNearPlane` | yes | GAP — near-plane ownership stays with the scene camera |
|
|
24
|
+
*
|
|
25
|
+
* No `three` imports: all vector math below is local.
|
|
26
|
+
*/
|
|
27
|
+
import { type ThreeCompatControlState } from "./ControlState.js";
|
|
28
|
+
import type { Vector3Like } from "./NativeControlTypes.js";
|
|
29
|
+
export interface ArcballCameraLike {
|
|
30
|
+
position: Vector3Like;
|
|
31
|
+
lookAt?(target: Vector3Like): void;
|
|
32
|
+
}
|
|
33
|
+
export interface ArcballControlsOptions {
|
|
34
|
+
readonly minDistance?: number;
|
|
35
|
+
readonly maxDistance?: number;
|
|
36
|
+
readonly enableDamping?: boolean;
|
|
37
|
+
readonly dampingFactor?: number;
|
|
38
|
+
readonly rotateSpeed?: number;
|
|
39
|
+
readonly panSpeed?: number;
|
|
40
|
+
readonly zoomSpeed?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Camera-attached operation is the supported path: rotation orbits a real
|
|
44
|
+
* camera around `state.target` with no polar clamp (the Arcball distinction
|
|
45
|
+
* from Orbit). Detached operation (`new ArcballControls()`) accumulates
|
|
46
|
+
* yaw/pitch/roll bookkeeping on `state.rotation` and dolly on
|
|
47
|
+
* `state.position.z`, matching the sibling detached convention.
|
|
48
|
+
*/
|
|
49
|
+
export declare class ArcballControls {
|
|
50
|
+
readonly state: ThreeCompatControlState;
|
|
51
|
+
enableDamping: boolean;
|
|
52
|
+
dampingFactor: number;
|
|
53
|
+
rotateSpeed: number;
|
|
54
|
+
panSpeed: number;
|
|
55
|
+
zoomSpeed: number;
|
|
56
|
+
minDistance: number;
|
|
57
|
+
maxDistance: number;
|
|
58
|
+
private camera;
|
|
59
|
+
private yawVelocity;
|
|
60
|
+
private pitchVelocity;
|
|
61
|
+
private rollVelocity;
|
|
62
|
+
private panVelocity;
|
|
63
|
+
private dollyVelocity;
|
|
64
|
+
private disposed;
|
|
65
|
+
constructor(camera?: ArcballCameraLike, options?: ArcballControlsOptions);
|
|
66
|
+
/** True when a camera is attached and motion moves a real pose. */
|
|
67
|
+
get isCameraAttached(): boolean;
|
|
68
|
+
/** True after `dispose()`; every mutator is a no-op past this point. */
|
|
69
|
+
get isDisposed(): boolean;
|
|
70
|
+
getDistance(): number;
|
|
71
|
+
rotate(deltaX: number, deltaY: number): void;
|
|
72
|
+
roll(delta: number): void;
|
|
73
|
+
pan(deltaX: number, deltaY: number): void;
|
|
74
|
+
dolly(scale: number): void;
|
|
75
|
+
/**
|
|
76
|
+
* Damping tick. Returns true while velocity remains. With damping off this
|
|
77
|
+
* is a no-op returning false (mirrors the `TrackballControls` contract).
|
|
78
|
+
*/
|
|
79
|
+
update(deltaSeconds?: number): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* F1-standard disposal: disables the instance, detaches the camera so no
|
|
82
|
+
* further mutation is possible, drains pending velocity, and owns zero DOM
|
|
83
|
+
* listeners (input arrives via method calls), so nothing can leak.
|
|
84
|
+
* Idempotent.
|
|
85
|
+
*/
|
|
86
|
+
dispose(): void;
|
|
87
|
+
private applyRotation;
|
|
88
|
+
private applyDolly;
|
|
89
|
+
private clampOffset;
|
|
90
|
+
private panShift;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=ArcballControls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArcballControls.d.ts","sourceRoot":"","sources":["../../../../packages/controls/src/ArcballControls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAA6B,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAyCD;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAA+B;IACtE,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAEpB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,CAAC,EAAE,iBAAiB,EAAE,OAAO,GAAE,sBAA2B;IAkB5E,mEAAmE;IACnE,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,wEAAwE;IACxE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,WAAW,IAAI,MAAM;IAWrB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAW5C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOzB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAkBzC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B;;;OAGG;IACH,MAAM,CAAC,YAAY,SAAS,GAAG,OAAO;IA8BtC;;;;;OAKG;IACH,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,QAAQ;CAejB"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arcball controls (muse3jsparity-PRD N2).
|
|
3
|
+
*
|
|
4
|
+
* The r185 addon baseline ships `ArcballControls` alongside
|
|
5
|
+
* Orbit/Map/Trackball/Fly/FirstPerson; Aura3D had every neighbor but not
|
|
6
|
+
* this one. Like its siblings in this package it owns no DOM listeners —
|
|
7
|
+
* input arrives through `rotate`/`pan`/`dolly`/`applyPointer` calls (or the
|
|
8
|
+
* input-system snapshots the route already forwards) — so `dispose()` means
|
|
9
|
+
* detach + disable + drain velocities, idempotent, with no leaked listeners
|
|
10
|
+
* by construction (F1 hygiene standard).
|
|
11
|
+
*
|
|
12
|
+
* ## Parity vs three.js `ArcballControls` (r185)
|
|
13
|
+
*
|
|
14
|
+
* | Option / behavior | three.js ArcballControls | This implementation |
|
|
15
|
+
* |--------------------------------|--------------------------|---------------------|
|
|
16
|
+
* | Free rotation (no polar clamp) | yes | yes (`rotate`) |
|
|
17
|
+
* | Pan (screen-space truck) | yes (`mouseActions.PAN`) | yes (`pan`) |
|
|
18
|
+
* | Dolly with min/max distance | yes | yes (`dolly`) |
|
|
19
|
+
* | Damping (`enableDamping`) | yes | yes (`update(dt)`) |
|
|
20
|
+
* | Roll about the view axis | via touch gestures | yes (`roll`) |
|
|
21
|
+
* | `cursorZoom` (zoom to cursor) | yes | GAP — listed, not claimed (needs a projecting camera; the `OrbitCameraLike` surface here carries position only) |
|
|
22
|
+
* | Touch two-finger gestures | yes | GAP — routes forward snapshots; pinch maps to `dolly`, two-finger drag to `pan` |
|
|
23
|
+
* | `adjustNearPlane` | yes | GAP — near-plane ownership stays with the scene camera |
|
|
24
|
+
*
|
|
25
|
+
* No `three` imports: all vector math below is local.
|
|
26
|
+
*/
|
|
27
|
+
import { createDefaultControlState } from "./ControlState.js";
|
|
28
|
+
const UP = { x: 0, y: 1, z: 0 };
|
|
29
|
+
function assertFinite(value, field) {
|
|
30
|
+
if (!Number.isFinite(value)) {
|
|
31
|
+
throw new RangeError(`ArcballControls ${field} must be finite (received ${String(value)}).`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function sub(a, b) {
|
|
35
|
+
return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };
|
|
36
|
+
}
|
|
37
|
+
function cross(a, b) {
|
|
38
|
+
return {
|
|
39
|
+
x: a.y * b.z - a.z * b.y,
|
|
40
|
+
y: a.z * b.x - a.x * b.z,
|
|
41
|
+
z: a.x * b.y - a.y * b.x
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function normalize(v) {
|
|
45
|
+
const length = Math.hypot(v.x, v.y, v.z);
|
|
46
|
+
if (!(length > 1e-12))
|
|
47
|
+
return { x: 0, y: 0, z: 0 };
|
|
48
|
+
return { x: v.x / length, y: v.y / length, z: v.z / length };
|
|
49
|
+
}
|
|
50
|
+
/** Rodrigues rotation of `v` about unit axis `k` by `angle` radians. */
|
|
51
|
+
function rotateAboutAxis(v, k, angle) {
|
|
52
|
+
const cos = Math.cos(angle);
|
|
53
|
+
const sin = Math.sin(angle);
|
|
54
|
+
const dot = v.x * k.x + v.y * k.y + v.z * k.z;
|
|
55
|
+
const crossed = cross(k, v);
|
|
56
|
+
return {
|
|
57
|
+
x: v.x * cos + crossed.x * sin + k.x * dot * (1 - cos),
|
|
58
|
+
y: v.y * cos + crossed.y * sin + k.y * dot * (1 - cos),
|
|
59
|
+
z: v.z * cos + crossed.z * sin + k.z * dot * (1 - cos)
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Camera-attached operation is the supported path: rotation orbits a real
|
|
64
|
+
* camera around `state.target` with no polar clamp (the Arcball distinction
|
|
65
|
+
* from Orbit). Detached operation (`new ArcballControls()`) accumulates
|
|
66
|
+
* yaw/pitch/roll bookkeeping on `state.rotation` and dolly on
|
|
67
|
+
* `state.position.z`, matching the sibling detached convention.
|
|
68
|
+
*/
|
|
69
|
+
export class ArcballControls {
|
|
70
|
+
state = createDefaultControlState();
|
|
71
|
+
enableDamping;
|
|
72
|
+
dampingFactor;
|
|
73
|
+
rotateSpeed;
|
|
74
|
+
panSpeed;
|
|
75
|
+
zoomSpeed;
|
|
76
|
+
minDistance;
|
|
77
|
+
maxDistance;
|
|
78
|
+
camera;
|
|
79
|
+
yawVelocity = 0;
|
|
80
|
+
pitchVelocity = 0;
|
|
81
|
+
rollVelocity = 0;
|
|
82
|
+
panVelocity = { x: 0, y: 0 };
|
|
83
|
+
dollyVelocity = 0;
|
|
84
|
+
disposed = false;
|
|
85
|
+
constructor(camera, options = {}) {
|
|
86
|
+
this.minDistance = options.minDistance ?? 0.5;
|
|
87
|
+
this.maxDistance = options.maxDistance ?? 60;
|
|
88
|
+
this.enableDamping = options.enableDamping ?? false;
|
|
89
|
+
this.dampingFactor = options.dampingFactor ?? 0.08;
|
|
90
|
+
this.rotateSpeed = options.rotateSpeed ?? 0.005;
|
|
91
|
+
this.panSpeed = options.panSpeed ?? 0.01;
|
|
92
|
+
this.zoomSpeed = options.zoomSpeed ?? 1;
|
|
93
|
+
if (this.minDistance < 0)
|
|
94
|
+
throw new RangeError("ArcballControls minDistance must be >= 0.");
|
|
95
|
+
if (this.maxDistance < this.minDistance) {
|
|
96
|
+
throw new RangeError("ArcballControls maxDistance must be >= minDistance.");
|
|
97
|
+
}
|
|
98
|
+
if (camera) {
|
|
99
|
+
this.camera = camera;
|
|
100
|
+
this.state.position.set(camera.position.x, camera.position.y, camera.position.z);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** True when a camera is attached and motion moves a real pose. */
|
|
104
|
+
get isCameraAttached() {
|
|
105
|
+
return this.camera !== undefined;
|
|
106
|
+
}
|
|
107
|
+
/** True after `dispose()`; every mutator is a no-op past this point. */
|
|
108
|
+
get isDisposed() {
|
|
109
|
+
return this.disposed;
|
|
110
|
+
}
|
|
111
|
+
getDistance() {
|
|
112
|
+
if (this.camera) {
|
|
113
|
+
return Math.hypot(this.camera.position.x - this.state.target.x, this.camera.position.y - this.state.target.y, this.camera.position.z - this.state.target.z);
|
|
114
|
+
}
|
|
115
|
+
return this.state.position.z;
|
|
116
|
+
}
|
|
117
|
+
rotate(deltaX, deltaY) {
|
|
118
|
+
assertFinite(deltaX, "deltaX");
|
|
119
|
+
assertFinite(deltaY, "deltaY");
|
|
120
|
+
if (this.disposed || !this.state.enabled)
|
|
121
|
+
return;
|
|
122
|
+
const yaw = -deltaX * this.rotateSpeed;
|
|
123
|
+
const pitch = -deltaY * this.rotateSpeed;
|
|
124
|
+
this.applyRotation(yaw, pitch, 0);
|
|
125
|
+
this.yawVelocity += yaw;
|
|
126
|
+
this.pitchVelocity += pitch;
|
|
127
|
+
}
|
|
128
|
+
roll(delta) {
|
|
129
|
+
assertFinite(delta, "roll delta");
|
|
130
|
+
if (this.disposed || !this.state.enabled)
|
|
131
|
+
return;
|
|
132
|
+
this.applyRotation(0, 0, delta);
|
|
133
|
+
this.rollVelocity += delta;
|
|
134
|
+
}
|
|
135
|
+
pan(deltaX, deltaY) {
|
|
136
|
+
assertFinite(deltaX, "pan deltaX");
|
|
137
|
+
assertFinite(deltaY, "pan deltaY");
|
|
138
|
+
if (this.disposed || !this.state.enabled)
|
|
139
|
+
return;
|
|
140
|
+
const shift = this.panShift(deltaX, deltaY);
|
|
141
|
+
this.state.target.x += shift.x;
|
|
142
|
+
this.state.target.y += shift.y;
|
|
143
|
+
this.state.target.z += shift.z;
|
|
144
|
+
if (this.camera) {
|
|
145
|
+
this.camera.position.x += shift.x;
|
|
146
|
+
this.camera.position.y += shift.y;
|
|
147
|
+
this.camera.position.z += shift.z;
|
|
148
|
+
this.camera.lookAt?.(this.state.target);
|
|
149
|
+
}
|
|
150
|
+
this.panVelocity.x += deltaX;
|
|
151
|
+
this.panVelocity.y += deltaY;
|
|
152
|
+
}
|
|
153
|
+
dolly(scale) {
|
|
154
|
+
assertFinite(scale, "dolly scale");
|
|
155
|
+
if (this.disposed || !this.state.enabled)
|
|
156
|
+
return;
|
|
157
|
+
if (scale <= 0)
|
|
158
|
+
throw new RangeError("ArcballControls dolly scale must be > 0.");
|
|
159
|
+
this.applyDolly(scale);
|
|
160
|
+
this.dollyVelocity += scale - 1;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Damping tick. Returns true while velocity remains. With damping off this
|
|
164
|
+
* is a no-op returning false (mirrors the `TrackballControls` contract).
|
|
165
|
+
*/
|
|
166
|
+
update(deltaSeconds = 1 / 60) {
|
|
167
|
+
if (this.disposed || !this.enableDamping)
|
|
168
|
+
return false;
|
|
169
|
+
assertFinite(deltaSeconds, "deltaSeconds");
|
|
170
|
+
const damping = Math.max(0, Math.min(1, this.dampingFactor * deltaSeconds * 60));
|
|
171
|
+
this.applyRotation(this.yawVelocity * damping, this.pitchVelocity * damping, this.rollVelocity * damping);
|
|
172
|
+
const pan = this.panShift(this.panVelocity.x * damping, this.panVelocity.y * damping);
|
|
173
|
+
this.state.target.x += pan.x;
|
|
174
|
+
this.state.target.y += pan.y;
|
|
175
|
+
this.state.target.z += pan.z;
|
|
176
|
+
if (this.camera) {
|
|
177
|
+
this.camera.position.x += pan.x;
|
|
178
|
+
this.camera.position.y += pan.y;
|
|
179
|
+
this.camera.position.z += pan.z;
|
|
180
|
+
}
|
|
181
|
+
this.applyDolly(1 + this.dollyVelocity * damping);
|
|
182
|
+
this.yawVelocity -= this.yawVelocity * damping;
|
|
183
|
+
this.pitchVelocity -= this.pitchVelocity * damping;
|
|
184
|
+
this.rollVelocity -= this.rollVelocity * damping;
|
|
185
|
+
this.panVelocity.x -= this.panVelocity.x * damping;
|
|
186
|
+
this.panVelocity.y -= this.panVelocity.y * damping;
|
|
187
|
+
this.dollyVelocity -= this.dollyVelocity * damping;
|
|
188
|
+
if (this.camera)
|
|
189
|
+
this.camera.lookAt?.(this.state.target);
|
|
190
|
+
return Math.abs(this.yawVelocity) + Math.abs(this.pitchVelocity) + Math.abs(this.rollVelocity) +
|
|
191
|
+
Math.abs(this.panVelocity.x) + Math.abs(this.panVelocity.y) + Math.abs(this.dollyVelocity) > 1e-6;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* F1-standard disposal: disables the instance, detaches the camera so no
|
|
195
|
+
* further mutation is possible, drains pending velocity, and owns zero DOM
|
|
196
|
+
* listeners (input arrives via method calls), so nothing can leak.
|
|
197
|
+
* Idempotent.
|
|
198
|
+
*/
|
|
199
|
+
dispose() {
|
|
200
|
+
if (this.disposed)
|
|
201
|
+
return;
|
|
202
|
+
this.disposed = true;
|
|
203
|
+
this.state.enabled = false;
|
|
204
|
+
this.camera = undefined;
|
|
205
|
+
this.yawVelocity = 0;
|
|
206
|
+
this.pitchVelocity = 0;
|
|
207
|
+
this.rollVelocity = 0;
|
|
208
|
+
this.panVelocity = { x: 0, y: 0 };
|
|
209
|
+
this.dollyVelocity = 0;
|
|
210
|
+
}
|
|
211
|
+
applyRotation(yaw, pitch, roll) {
|
|
212
|
+
if (yaw === 0 && pitch === 0 && roll === 0)
|
|
213
|
+
return;
|
|
214
|
+
const camera = this.camera;
|
|
215
|
+
if (!camera) {
|
|
216
|
+
this.state.rotation.y += yaw;
|
|
217
|
+
this.state.rotation.x += pitch;
|
|
218
|
+
this.state.rotation.z += roll;
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
let offset = sub(camera.position, this.state.target);
|
|
222
|
+
if (yaw !== 0)
|
|
223
|
+
offset = rotateAboutAxis(offset, UP, yaw);
|
|
224
|
+
if (pitch !== 0 || roll !== 0) {
|
|
225
|
+
const viewDir = normalize({ x: -offset.x, y: -offset.y, z: -offset.z });
|
|
226
|
+
const right = normalize(cross(viewDir, UP));
|
|
227
|
+
if (pitch !== 0 && (right.x !== 0 || right.y !== 0 || right.z !== 0)) {
|
|
228
|
+
offset = rotateAboutAxis(offset, right, pitch);
|
|
229
|
+
}
|
|
230
|
+
if (roll !== 0)
|
|
231
|
+
offset = rotateAboutAxis(offset, viewDir, roll);
|
|
232
|
+
}
|
|
233
|
+
offset = this.clampOffset(offset);
|
|
234
|
+
camera.position.x = this.state.target.x + offset.x;
|
|
235
|
+
camera.position.y = this.state.target.y + offset.y;
|
|
236
|
+
camera.position.z = this.state.target.z + offset.z;
|
|
237
|
+
this.state.position.set(camera.position.x, camera.position.y, camera.position.z);
|
|
238
|
+
this.state.rotation.y += yaw;
|
|
239
|
+
this.state.rotation.x += pitch;
|
|
240
|
+
this.state.rotation.z += roll;
|
|
241
|
+
camera.lookAt?.(this.state.target);
|
|
242
|
+
}
|
|
243
|
+
applyDolly(scale) {
|
|
244
|
+
const camera = this.camera;
|
|
245
|
+
if (!camera) {
|
|
246
|
+
this.state.position.z = Math.min(this.maxDistance, Math.max(this.minDistance, this.state.position.z * scale));
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const offset = this.clampOffset(sub(camera.position, this.state.target));
|
|
250
|
+
const scaled = {
|
|
251
|
+
x: offset.x * scale,
|
|
252
|
+
y: offset.y * scale,
|
|
253
|
+
z: offset.z * scale
|
|
254
|
+
};
|
|
255
|
+
const clamped = this.clampOffset(scaled);
|
|
256
|
+
camera.position.x = this.state.target.x + clamped.x;
|
|
257
|
+
camera.position.y = this.state.target.y + clamped.y;
|
|
258
|
+
camera.position.z = this.state.target.z + clamped.z;
|
|
259
|
+
this.state.position.set(camera.position.x, camera.position.y, camera.position.z);
|
|
260
|
+
camera.lookAt?.(this.state.target);
|
|
261
|
+
}
|
|
262
|
+
clampOffset(offset) {
|
|
263
|
+
const length = Math.hypot(offset.x, offset.y, offset.z);
|
|
264
|
+
if (!(length > 1e-12))
|
|
265
|
+
return { x: 0, y: 0, z: this.minDistance };
|
|
266
|
+
const clamped = Math.min(this.maxDistance, Math.max(this.minDistance, length));
|
|
267
|
+
return { x: offset.x / length * clamped, y: offset.y / length * clamped, z: offset.z / length * clamped };
|
|
268
|
+
}
|
|
269
|
+
panShift(deltaX, deltaY) {
|
|
270
|
+
const distance = Math.max(this.minDistance, this.getDistance());
|
|
271
|
+
const scale = this.panSpeed * distance * 0.12;
|
|
272
|
+
const camera = this.camera;
|
|
273
|
+
if (!camera)
|
|
274
|
+
return { x: deltaX * scale, y: -deltaY * scale, z: 0 };
|
|
275
|
+
const offset = sub(camera.position, this.state.target);
|
|
276
|
+
const viewDir = normalize({ x: -offset.x, y: -offset.y, z: -offset.z });
|
|
277
|
+
const right = normalize(cross(viewDir, UP));
|
|
278
|
+
const up = normalize(cross(right, viewDir));
|
|
279
|
+
return {
|
|
280
|
+
x: (right.x * -deltaX + up.x * deltaY) * scale,
|
|
281
|
+
y: (right.y * -deltaX + up.y * deltaY) * scale,
|
|
282
|
+
z: (right.z * -deltaX + up.z * deltaY) * scale
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=ArcballControls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArcballControls.js","sourceRoot":"","sources":["../../../../packages/controls/src/ArcballControls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,yBAAyB,EAAgC,MAAM,gBAAgB,CAAC;AAkBzF,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAEhC,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,mBAAmB,KAAK,6BAA6B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,CAAc,EAAE,CAAc;IACzC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,KAAK,CAAC,CAAc,EAAE,CAAc;IAC3C,OAAO;QACL,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,CAAc;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnD,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;AAC/D,CAAC;AAED,wEAAwE;AACxE,SAAS,eAAe,CAAC,CAAc,EAAE,CAAc,EAAE,KAAa;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO;QACL,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACtD,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACtD,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;KACvD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IACjB,KAAK,GAA4B,yBAAyB,EAAE,CAAC;IACtE,aAAa,CAAU;IACvB,aAAa,CAAS;IACtB,WAAW,CAAS;IACpB,QAAQ,CAAS;IACjB,SAAS,CAAS;IAClB,WAAW,CAAS;IACpB,WAAW,CAAS;IAEZ,MAAM,CAAgC;IACtC,WAAW,GAAG,CAAC,CAAC;IAChB,aAAa,GAAG,CAAC,CAAC;IAClB,YAAY,GAAG,CAAC,CAAC;IACjB,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC7B,aAAa,GAAG,CAAC,CAAC;IAClB,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,MAA0B,EAAE,UAAkC,EAAE;QAC1E,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,IAAI,UAAU,CAAC,qDAAqD,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IACnC,CAAC;IAED,wEAAwE;IACxE,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,KAAK,CACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAC7C,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,MAAc;QACnC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/B,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO;QACjD,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QACzC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC;QACxB,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,KAAa;QAChB,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO;QACjD,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,MAAc,EAAE,MAAc;QAChC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACnC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO;QACjD,IAAI,KAAK,IAAI,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,0CAA0C,CAAC,CAAC;QACjF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,aAAa,IAAI,KAAK,GAAG,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,GAAG,CAAC,GAAG,EAAE;QAC1B,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QACvD,YAAY,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,aAAa,CAChB,IAAI,CAAC,WAAW,GAAG,OAAO,EAC1B,IAAI,CAAC,aAAa,GAAG,OAAO,EAC5B,IAAI,CAAC,YAAY,GAAG,OAAO,CAC5B,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC/C,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QACnD,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC;QACnD,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QACnD,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAC5F,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IACtG,CAAC;IAED;;;;;OAKG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IACzB,CAAC;IAEO,aAAa,CAAC,GAAW,EAAE,KAAa,EAAE,IAAY;QAC5D,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,GAAG,KAAK,CAAC;YAAE,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5C,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACrE,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,IAAI,KAAK,CAAC;gBAAE,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAC9B,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAC1D,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,KAAK;YACnB,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,KAAK;YACnB,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,KAAK;SACpB,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAEO,WAAW,CAAC,MAAmB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/E,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC;IAC5G,CAAC;IAEO,QAAQ,CAAC,MAAc,EAAE,MAAc;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5C,OAAO;YACL,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK;YAC9C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK;YAC9C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK;SAC/C,CAAC;IACJ,CAAC;CACF"}
|
package/dist/DragControls.d.ts
CHANGED
|
@@ -20,9 +20,22 @@ export interface DragControlsOptions {
|
|
|
20
20
|
export declare class DragControls {
|
|
21
21
|
dragging: ControlObject3DLike | null;
|
|
22
22
|
readonly transforms: TransformControls;
|
|
23
|
+
private disposed;
|
|
24
|
+
private readonly ownsTransforms;
|
|
23
25
|
constructor(options?: DragControlsOptions);
|
|
26
|
+
/** True after `dispose()`; `start`/`drag` are no-ops past this point. */
|
|
27
|
+
get isDisposed(): boolean;
|
|
24
28
|
start(object: ControlObject3DLike): void;
|
|
25
29
|
drag(delta: Vector3Like): void;
|
|
26
30
|
end(): void;
|
|
31
|
+
/**
|
|
32
|
+
* F1-standard disposal: ends any active drag, detaches the object, and
|
|
33
|
+
* disposes the owned transform helper (a caller-supplied `transforms`
|
|
34
|
+
* instance is left undisposed — its owner disposes it). Idempotent. Owns
|
|
35
|
+
* zero DOM listeners, so nothing can leak.
|
|
36
|
+
*/
|
|
37
|
+
dispose(options?: {
|
|
38
|
+
readonly disposeTransforms?: boolean;
|
|
39
|
+
}): void;
|
|
27
40
|
}
|
|
28
41
|
//# sourceMappingURL=DragControls.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragControls.d.ts","sourceRoot":"","sources":["../../../../packages/controls/src/DragControls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,6EAA6E,CAAC;IACpG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,yBAAyB,EAAE,uBAItC,CAAC;AAEH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAQ;IAC5C,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"DragControls.d.ts","sourceRoot":"","sources":["../../../../packages/controls/src/DragControls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,6EAA6E,CAAC;IACpG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,yBAAyB,EAAE,uBAItC,CAAC;AAEH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAQ;IAC5C,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;gBAE7B,OAAO,GAAE,mBAAwB;IAK7C,yEAAyE;IACzE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,KAAK,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAOxC,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAK9B,GAAG,IAAI,IAAI;IAKX;;;;;OAKG;IACH,OAAO,CAAC,OAAO,GAAE;QAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI;CAMtE"}
|
package/dist/DragControls.js
CHANGED
|
@@ -15,16 +15,25 @@ export const DRAG_CONTROLS_DEPRECATION = Object.freeze({
|
|
|
15
15
|
export class DragControls {
|
|
16
16
|
dragging = null;
|
|
17
17
|
transforms;
|
|
18
|
+
disposed = false;
|
|
19
|
+
ownsTransforms;
|
|
18
20
|
constructor(options = {}) {
|
|
19
21
|
this.transforms = options.transforms ?? new TransformControls();
|
|
22
|
+
this.ownsTransforms = options.transforms === undefined;
|
|
23
|
+
}
|
|
24
|
+
/** True after `dispose()`; `start`/`drag` are no-ops past this point. */
|
|
25
|
+
get isDisposed() {
|
|
26
|
+
return this.disposed;
|
|
20
27
|
}
|
|
21
28
|
start(object) {
|
|
29
|
+
if (this.disposed)
|
|
30
|
+
return;
|
|
22
31
|
this.dragging = object;
|
|
23
32
|
this.transforms.attach(object);
|
|
24
33
|
this.transforms.setMode("translate");
|
|
25
34
|
}
|
|
26
35
|
drag(delta) {
|
|
27
|
-
if (!this.dragging)
|
|
36
|
+
if (this.disposed || !this.dragging)
|
|
28
37
|
return;
|
|
29
38
|
this.transforms.apply(delta);
|
|
30
39
|
}
|
|
@@ -32,5 +41,19 @@ export class DragControls {
|
|
|
32
41
|
this.dragging = null;
|
|
33
42
|
this.transforms.detach();
|
|
34
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* F1-standard disposal: ends any active drag, detaches the object, and
|
|
46
|
+
* disposes the owned transform helper (a caller-supplied `transforms`
|
|
47
|
+
* instance is left undisposed — its owner disposes it). Idempotent. Owns
|
|
48
|
+
* zero DOM listeners, so nothing can leak.
|
|
49
|
+
*/
|
|
50
|
+
dispose(options = {}) {
|
|
51
|
+
if (this.disposed)
|
|
52
|
+
return;
|
|
53
|
+
this.disposed = true;
|
|
54
|
+
this.end();
|
|
55
|
+
if ((options.disposeTransforms ?? this.ownsTransforms))
|
|
56
|
+
this.transforms.dispose();
|
|
57
|
+
}
|
|
35
58
|
}
|
|
36
59
|
//# sourceMappingURL=DragControls.js.map
|
package/dist/DragControls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragControls.js","sourceRoot":"","sources":["../../../../packages/controls/src/DragControls.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAQxD,MAAM,CAAC,MAAM,yBAAyB,GAA4B,MAAM,CAAC,MAAM,CAAC;IAC9E,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE,6EAA6E;IAC1F,UAAU,EAAE,0JAA0J;CACvK,CAAC,CAAC;AAMH;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACvB,QAAQ,GAA+B,IAAI,CAAC;IACnC,UAAU,CAAoB;
|
|
1
|
+
{"version":3,"file":"DragControls.js","sourceRoot":"","sources":["../../../../packages/controls/src/DragControls.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAQxD,MAAM,CAAC,MAAM,yBAAyB,GAA4B,MAAM,CAAC,MAAM,CAAC;IAC9E,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE,6EAA6E;IAC1F,UAAU,EAAE,0JAA0J;CACvK,CAAC,CAAC;AAMH;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACvB,QAAQ,GAA+B,IAAI,CAAC;IACnC,UAAU,CAAoB;IAC/B,QAAQ,GAAG,KAAK,CAAC;IACR,cAAc,CAAU;IAEzC,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,iBAAiB,EAAE,CAAC;QAChE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC;IACzD,CAAC;IAED,yEAAyE;IACzE,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAA2B;QAC/B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,KAAkB;QACrB,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC5C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,UAAoD,EAAE;QAC5D,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,IAAI,CAAC,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc,CAAC;YAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACpF,CAAC;CACF"}
|
package/dist/FlyControls.d.ts
CHANGED
|
@@ -31,15 +31,24 @@ export declare class FlyControls {
|
|
|
31
31
|
protected readonly controlledCamera: FlyCameraLike;
|
|
32
32
|
protected pointerLookSpeed: number;
|
|
33
33
|
private delegate;
|
|
34
|
+
private disposed;
|
|
34
35
|
constructor(camera?: FlyCameraLike, options?: FlyControlsOptions);
|
|
35
36
|
/** True for every instance: even the no-camera form owns a delegated state camera. */
|
|
36
37
|
get isDelegated(): true;
|
|
38
|
+
/** True after `dispose()`; every mutator is a no-op past this point. */
|
|
39
|
+
get isDisposed(): boolean;
|
|
37
40
|
get enabled(): boolean;
|
|
38
41
|
set enabled(value: boolean);
|
|
39
42
|
applyInput(snapshot: InputSnapshot, deltaSeconds: number): void;
|
|
40
43
|
moveForward(distance: number): void;
|
|
41
44
|
strafe(distance: number): void;
|
|
42
45
|
lift(distance: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* F1-standard disposal: disables the instance and delegates (the input
|
|
48
|
+
* engine owns zero DOM listeners — motion arrives via snapshots — so
|
|
49
|
+
* nothing can leak). Idempotent; mutators stay no-ops afterwards even if
|
|
50
|
+
* `enabled` is reassigned.
|
|
51
|
+
*/
|
|
43
52
|
dispose(): void;
|
|
44
53
|
protected replaceDelegate(delegate: FlyControlsDelegate, pointerLookSpeed: number): void;
|
|
45
54
|
protected lookByRadians(deltaYaw: number, deltaPitch: number, button: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlyControls.d.ts","sourceRoot":"","sources":["../../../../packages/controls/src/FlyControls.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,EAA6B,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;CACjC;AAED,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,wBAAwB,EAAE,WAAW,CAAC;IACrF;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAA+B;IACtE,aAAa,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,aAAa,CAAC;IACnD,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAsB;
|
|
1
|
+
{"version":3,"file":"FlyControls.d.ts","sourceRoot":"","sources":["../../../../packages/controls/src/FlyControls.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,EAA6B,KAAK,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;CACjC;AAED,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,wBAAwB,EAAE,WAAW,CAAC;IACrF;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAA+B;IACtE,aAAa,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,aAAa,CAAC;IACnD,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,kBAAuB;IAepE,sFAAsF;IACtF,IAAI,WAAW,IAAI,IAAI,CAEtB;IAED,wEAAwE;IACxE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAI/D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAYnC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAU9B,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAU5B;;;;;OAKG;IACH,OAAO,IAAI,IAAI;IAOf,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAYxF,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBnF,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,SAAS;CAKlB"}
|
package/dist/FlyControls.js
CHANGED
|
@@ -14,6 +14,7 @@ export class FlyControls {
|
|
|
14
14
|
controlledCamera;
|
|
15
15
|
pointerLookSpeed;
|
|
16
16
|
delegate;
|
|
17
|
+
disposed = false;
|
|
17
18
|
constructor(camera, options = {}) {
|
|
18
19
|
this.movementSpeed = options.movementSpeed ?? 1;
|
|
19
20
|
this.pointerLookSpeed = options.lookSpeed ?? 0.0025;
|
|
@@ -32,6 +33,10 @@ export class FlyControls {
|
|
|
32
33
|
get isDelegated() {
|
|
33
34
|
return true;
|
|
34
35
|
}
|
|
36
|
+
/** True after `dispose()`; every mutator is a no-op past this point. */
|
|
37
|
+
get isDisposed() {
|
|
38
|
+
return this.disposed;
|
|
39
|
+
}
|
|
35
40
|
get enabled() {
|
|
36
41
|
return this.state.enabled;
|
|
37
42
|
}
|
|
@@ -65,11 +70,24 @@ export class FlyControls {
|
|
|
65
70
|
return;
|
|
66
71
|
this.updateDelegate(keySnapshot(movement > 0 ? "KeyE" : "KeyQ"), Math.abs(movement));
|
|
67
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* F1-standard disposal: disables the instance and delegates (the input
|
|
75
|
+
* engine owns zero DOM listeners — motion arrives via snapshots — so
|
|
76
|
+
* nothing can leak). Idempotent; mutators stay no-ops afterwards even if
|
|
77
|
+
* `enabled` is reassigned.
|
|
78
|
+
*/
|
|
68
79
|
dispose() {
|
|
80
|
+
if (this.disposed)
|
|
81
|
+
return;
|
|
82
|
+
this.disposed = true;
|
|
69
83
|
this.state.enabled = false;
|
|
70
84
|
this.delegate.dispose();
|
|
71
85
|
}
|
|
72
86
|
replaceDelegate(delegate, pointerLookSpeed) {
|
|
87
|
+
if (this.disposed) {
|
|
88
|
+
delegate.dispose();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
73
91
|
this.delegate.dispose();
|
|
74
92
|
this.delegate = delegate;
|
|
75
93
|
this.pointerLookSpeed = pointerLookSpeed;
|
|
@@ -79,7 +97,7 @@ export class FlyControls {
|
|
|
79
97
|
lookByRadians(deltaYaw, deltaPitch, button) {
|
|
80
98
|
assertFinite(deltaYaw, "yaw delta");
|
|
81
99
|
assertFinite(deltaPitch, "pitch delta");
|
|
82
|
-
if (!this.state.enabled || (deltaYaw === 0 && deltaPitch === 0))
|
|
100
|
+
if (this.disposed || !this.state.enabled || (deltaYaw === 0 && deltaPitch === 0))
|
|
83
101
|
return;
|
|
84
102
|
const speed = Math.abs(this.pointerLookSpeed) > Number.EPSILON ? this.pointerLookSpeed : 1;
|
|
85
103
|
this.updateDelegate(new InputSnapshot({
|
|
@@ -92,7 +110,7 @@ export class FlyControls {
|
|
|
92
110
|
}
|
|
93
111
|
updateDelegate(snapshot, deltaSeconds) {
|
|
94
112
|
assertFinite(deltaSeconds, "delta seconds");
|
|
95
|
-
if (!this.state.enabled)
|
|
113
|
+
if (this.disposed || !this.state.enabled)
|
|
96
114
|
return;
|
|
97
115
|
this.delegate.enabled = true;
|
|
98
116
|
this.delegate.update(snapshot, deltaSeconds);
|
package/dist/FlyControls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlyControls.js","sourceRoot":"","sources":["../../../../packages/controls/src/FlyControls.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,IAAI,gBAAgB,EACrC,aAAa,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAgC,MAAM,gBAAgB,CAAC;AAsBzF;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IACb,KAAK,GAA4B,yBAAyB,EAAE,CAAC;IACtE,aAAa,CAAS;IAEH,gBAAgB,CAAgB;IACzC,gBAAgB,CAAS;IAC3B,QAAQ,CAAsB;
|
|
1
|
+
{"version":3,"file":"FlyControls.js","sourceRoot":"","sources":["../../../../packages/controls/src/FlyControls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ControlObject3DLike, Vector3Like } from "./NativeControlTypes.js";
|
|
2
|
+
export interface FocusFrameTarget {
|
|
3
|
+
readonly center: Vector3Like;
|
|
4
|
+
readonly radius: number;
|
|
5
|
+
}
|
|
6
|
+
export interface FocusFrameOptions {
|
|
7
|
+
/** Vertical field of view in degrees. */
|
|
8
|
+
readonly fovDegrees?: number;
|
|
9
|
+
/** Margin multiplier around the framing sphere (>= 1). */
|
|
10
|
+
readonly margin?: number;
|
|
11
|
+
/** Clamp for the resulting distance. */
|
|
12
|
+
readonly minDistance?: number;
|
|
13
|
+
readonly maxDistance?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface FocusFrameResult {
|
|
16
|
+
readonly target: Vector3Like;
|
|
17
|
+
readonly distance: number;
|
|
18
|
+
readonly radius: number;
|
|
19
|
+
readonly objectCount: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Focus framing for editor/viewport selection (F4).
|
|
23
|
+
*
|
|
24
|
+
* Computes the orbit target and camera distance that frames a set of picked
|
|
25
|
+
* objects given a vertical field of view: the bounding sphere of the object
|
|
26
|
+
* centers (expanded by each object's pick radius) is placed at `target`, and
|
|
27
|
+
* `distance` fits that sphere with `margin` headroom. Pure math — a viewport
|
|
28
|
+
* applies the result to its own camera, and the browser proof asserts the
|
|
29
|
+
* framed object lands centered with the expected apparent size.
|
|
30
|
+
*/
|
|
31
|
+
export declare function frameSelection(objects: readonly ControlObject3DLike[], options?: FocusFrameOptions): FocusFrameResult | undefined;
|
|
32
|
+
/** Builds a focus target from an explicit center/radius pair (e.g. bounds math). */
|
|
33
|
+
export declare function frameTarget(target: FocusFrameTarget, options?: FocusFrameOptions): FocusFrameResult;
|
|
34
|
+
//# sourceMappingURL=FocusFrame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FocusFrame.d.ts","sourceRoot":"","sources":["../../../../packages/controls/src/FocusFrame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,mBAAmB,EAAE,EACvC,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,GAAG,SAAS,CAmD9B;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAQvG"}
|