@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.
Files changed (55) hide show
  1. package/dist/ArcballControls.d.ts +92 -0
  2. package/dist/ArcballControls.d.ts.map +1 -0
  3. package/dist/ArcballControls.js +286 -0
  4. package/dist/ArcballControls.js.map +1 -0
  5. package/dist/DragControls.d.ts +13 -0
  6. package/dist/DragControls.d.ts.map +1 -1
  7. package/dist/DragControls.js +24 -1
  8. package/dist/DragControls.js.map +1 -1
  9. package/dist/FlyControls.d.ts +9 -0
  10. package/dist/FlyControls.d.ts.map +1 -1
  11. package/dist/FlyControls.js +20 -2
  12. package/dist/FlyControls.js.map +1 -1
  13. package/dist/FocusFrame.d.ts +34 -0
  14. package/dist/FocusFrame.d.ts.map +1 -0
  15. package/dist/FocusFrame.js +82 -0
  16. package/dist/FocusFrame.js.map +1 -0
  17. package/dist/HoverOutline.d.ts +46 -0
  18. package/dist/HoverOutline.d.ts.map +1 -0
  19. package/dist/HoverOutline.js +87 -0
  20. package/dist/HoverOutline.js.map +1 -0
  21. package/dist/InteractionControls.d.ts +7 -0
  22. package/dist/InteractionControls.d.ts.map +1 -1
  23. package/dist/InteractionControls.js +12 -1
  24. package/dist/InteractionControls.js.map +1 -1
  25. package/dist/NativeControlTypes.d.ts +17 -0
  26. package/dist/NativeControlTypes.d.ts.map +1 -1
  27. package/dist/NativeControlTypes.js.map +1 -1
  28. package/dist/OrbitControls.d.ts +9 -0
  29. package/dist/OrbitControls.d.ts.map +1 -1
  30. package/dist/OrbitControls.js +26 -6
  31. package/dist/OrbitControls.js.map +1 -1
  32. package/dist/Picking.d.ts +15 -0
  33. package/dist/Picking.d.ts.map +1 -1
  34. package/dist/Picking.js +62 -23
  35. package/dist/Picking.js.map +1 -1
  36. package/dist/PointerLockControls.d.ts.map +1 -1
  37. package/dist/PointerLockControls.js +4 -0
  38. package/dist/PointerLockControls.js.map +1 -1
  39. package/dist/SelectionManager.d.ts +8 -0
  40. package/dist/SelectionManager.d.ts.map +1 -1
  41. package/dist/SelectionManager.js +11 -0
  42. package/dist/SelectionManager.js.map +1 -1
  43. package/dist/TrackballControls.d.ts +7 -0
  44. package/dist/TrackballControls.d.ts.map +1 -1
  45. package/dist/TrackballControls.js +19 -5
  46. package/dist/TrackballControls.js.map +1 -1
  47. package/dist/TransformControls.d.ts +8 -0
  48. package/dist/TransformControls.d.ts.map +1 -1
  49. package/dist/TransformControls.js +15 -2
  50. package/dist/TransformControls.js.map +1 -1
  51. package/dist/index.d.ts +6 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +3 -0
  54. package/dist/index.js.map +1 -1
  55. 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":"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"}
@@ -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;gBAE3B,OAAO,GAAE,mBAAwB;IAI7C,KAAK,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAMxC,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAK9B,GAAG,IAAI,IAAI;CAIZ"}
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"}
@@ -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
@@ -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;IAEvC,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,iBAAiB,EAAE,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAA2B;QAC/B,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,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,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;CACF"}
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"}
@@ -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;gBAE1B,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,kBAAuB;IAepE,sFAAsF;IACtF,IAAI,WAAW,IAAI,IAAI,CAEtB;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,OAAO,IAAI,IAAI;IAKf,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAQxF,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"}
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"}
@@ -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);
@@ -1 +1 @@
1
- {"version":3,"file":"FlyControls.js","sourceRoot":"","sources":["../../../../packages/controls/src/FlyControls.ts"],"names":[],"mappings":"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"}
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"}