From 5500624ad93678e0b04276eebecf826c9a354b24 Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Fri, 13 Mar 2026 13:02:34 -0400 Subject: [PATCH 01/39] cmd key and shift key --- .../Cameras/Inputs/geospatialCameraKeyboardInput.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index 65cc7b2ccf7..4be0a84a8fa 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -105,9 +105,17 @@ export class GeospatialCameraKeyboardInput implements ICameraInput { const evt = info.event; - if (!evt.metaKey) { + const isArrowKey = + this.keysUp.indexOf(evt.keyCode) !== -1 || + this.keysDown.indexOf(evt.keyCode) !== -1 || + this.keysLeft.indexOf(evt.keyCode) !== -1 || + this.keysRight.indexOf(evt.keyCode) !== -1; + // Allow metaKey (Cmd on Mac) through for arrow keys so Cmd+Arrow + // works as the Mac equivalent of Ctrl+Arrow for rotation. + // Block metaKey for other keys to avoid capturing browser shortcuts (e.g., Cmd+=/Cmd+-). + if (!evt.metaKey || isArrowKey) { if (info.type === KeyboardEventTypes.KEYDOWN) { - this._ctrlPressed = evt.ctrlKey; + this._ctrlPressed = evt.ctrlKey || evt.metaKey || evt.shiftKey; if ( this.keysUp.indexOf(evt.keyCode) !== -1 || From 7502ed65ff35f33a72fe0d94ada89c04d56b7e13 Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Fri, 13 Mar 2026 13:05:37 -0400 Subject: [PATCH 02/39] alt --- .../src/Cameras/Inputs/geospatialCameraKeyboardInput.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index 4be0a84a8fa..97109843a5e 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -12,6 +12,9 @@ import type { AbstractEngine } from "../../Engines/abstractEngine"; /** * Manage the keyboard inputs to control the movement of a geospatial camera. + * Arrow keys + Modifier key (ctrl/alt, cmd/option on mac): rotate + * Arrow keys alone: pan + * + / - keys: zoom in/out * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs */ export class GeospatialCameraKeyboardInput implements ICameraInput { @@ -78,7 +81,7 @@ export class GeospatialCameraKeyboardInput implements ICameraInput(); - private _ctrlPressed: boolean; + private _modifierPressed: boolean; private _onCanvasBlurObserver: Nullable>; private _onKeyboardObserver: Nullable>; private _engine: AbstractEngine; @@ -115,7 +118,7 @@ export class GeospatialCameraKeyboardInput implements ICameraInput Date: Wed, 25 Mar 2026 13:04:35 -0400 Subject: [PATCH 03/39] input plan --- camera-input-architecture-proposal.md | 567 ++++++++++++++++++++++++++ 1 file changed, 567 insertions(+) create mode 100644 camera-input-architecture-proposal.md diff --git a/camera-input-architecture-proposal.md b/camera-input-architecture-proposal.md new file mode 100644 index 00000000000..ad1a5cdc251 --- /dev/null +++ b/camera-input-architecture-proposal.md @@ -0,0 +1,567 @@ +# Camera Input Architecture Proposal + +## Problem Statement + +Camera input configuration is handled through scattered, ad-hoc boolean flags: + +| Flag | Location | What it controls | +|---|---|---| +| `useCtrlForPanning` | `ArcRotateCamera.attachControl()` | Whether ctrl+arrows pan instead of rotate | +| `multiTouchPanAndZoom` | `OrbitCameraPointersInput` | Whether two-finger gestures can pan and zoom simultaneously | +| `allowZoomWhilePointerRotating` (PR #18150) | `GeospatialCameraMouseWheelInput` | Whether wheel zoom works during pointer rotation | + +Each new configuration need adds another boolean, another conditional, and often requires one input to inspect a sibling input's state. This doesn't scale, and the flag combinatorics become hard to reason about. + +**Motivating examples:** +- [PR #18150](https://github.com/BabylonJS/Babylon.js/pull/18150): Geo camera wheel zoom during rotation. The wheel input reaches into the pointer input via `this.camera.inputs.attached["pointers"]` with a string key + cast. +- [Forum thread](https://forum.babylonjs.com/t/panning-arcrotatecamera-with-keyboard-without-using-ctrl-key/19878): Community request to swap pan/rotate on ArcRotateCamera. Currently requires modifying `attachControl` signature. +- Post-9.0 camera input rework (georgie/amoebachant) for framerate-independent movement. + +## Proposed Architecture + +Three composable layers, each answering one question: + +``` +┌───────────────────────────────────────────────────────┐ +│ Physical Input (mouse, keyboard, touch) │ +│ ↓ │ +│ [Layer 1: Input Mapping] │ +│ "What interaction does this gesture mean?" │ +│ Produces: InteractionType + InputSource │ +│ ↓ │ +│ [Layer 2: Conflict Matrix] │ +│ "Can these interactions happen at the same time?" │ +│ Checks: type + source against conflict rules │ +│ ↓ │ +│ [Layer 3: Interaction Handlers] │ +│ "What does this interaction do to the camera?" │ +│ Keyed by: InteractionType only (source-agnostic) │ +│ ↓ │ +│ Camera state updated │ +│ ↓ │ +│ onAfterCheckInputsObservable fires │ ← EXISTING +│ ↓ │ +│ [Behavior] → post-input modifications │ ← EXISTING (unchanged) +│ (AutoRotation, Bouncing, Framing, Clipping) │ +└───────────────────────────────────────────────────────┘ +``` + +### Terminology + +| Term | Means | Example | +|---|---|---| +| **Input** | Physical device event processor (existing concept) | `GeospatialCameraPointersInput` | +| **Interaction** | Semantic action type + input source (new) | `{ type: Rotate, source: Pointer }` | +| **Interaction Handler** | Executes a semantic action on the camera (new, typed per interaction) | `GlobeDragHandler`, `TiltHandler` | +| **Behavior** | Post-input reactive modifier (existing, unchanged) | `AutoRotationBehavior` | + +--- + +## Core Types + +```ts +/** What the camera is doing (semantic action) */ +enum InteractionType { + None, + Pan, + Rotate, + Zoom, + FlyTo, + // extensible per camera type +} + +/** Where the interaction originated (physical device) */ +enum InputSource { + Pointer, // mouse buttons + Wheel, // scroll wheel + Touch, // touch screen + Keyboard, // arrow keys, etc. +} + +/** A specific active interaction: what + who */ +interface ActiveInteraction { + type: InteractionType; + source: InputSource; +} +``` + +### Where source matters + +| Layer | Uses source? | Why | +|---|---|---| +| Input Mapping | Produces it | Physical event → type + source | +| Conflict Matrix | **Yes** | Different sources have different coexistence rules | +| Active Interactions Set | **Yes** | Tracks what's active with source | +| Interaction Handlers | **No** | Handlers care about *what*, not *who* | + +--- + +## Layer 1: Input Mapping + +Maps physical gestures to semantic interactions. Replaces hardcoded `switch (evt.button)` blocks and `_ctrlPressed` booleans. + +### Interface + +```ts +interface InputContext { + device: InputSource; + button?: number; // mouse button (0=left, 1=middle, 2=right) + key?: string; // keyboard key + modifiers: { + ctrl: boolean; + shift: boolean; + alt: boolean; + }; + touchCount?: number; // number of active touches +} + +/** Returns the interaction type; source is inferred from context.device */ +type InputMappingFunction = (context: InputContext) => InteractionType; +``` + +The mapping function returns `InteractionType`. The `InputSource` is automatically derived from `context.device`, so the resulting `ActiveInteraction` is `{ type: mapping(ctx), source: ctx.device }`. + +### Default mappings (per camera type) + +**Geospatial camera:** +```ts +const geoDefault: InputMappingFunction = (ctx) => { + if (ctx.device === InputSource.Pointer) { + if (ctx.button === 0) return InteractionType.Pan; + if (ctx.button === 1 || ctx.button === 2) return InteractionType.Rotate; + } + if (ctx.device === InputSource.Touch) { + if (ctx.touchCount === 1) return InteractionType.Pan; + } + if (ctx.device === InputSource.Wheel) { + return InteractionType.Zoom; + } + return InteractionType.None; +}; +``` + +**ArcRotateCamera (current behavior):** +```ts +const arcRotateDefault: InputMappingFunction = (ctx) => { + if (ctx.device === InputSource.Keyboard) { + return ctx.modifiers.ctrl ? InteractionType.Pan : InteractionType.Rotate; + } + if (ctx.device === InputSource.Pointer) { + if (ctx.button === 0) return InteractionType.Rotate; + if (ctx.button === 2) return InteractionType.Pan; + } + return InteractionType.None; +}; +``` + +### User override (forum thread ask) +```ts +// "I want default arrows to pan, ctrl+arrows to rotate" +camera.inputMapping = (ctx) => { + if (ctx.device === InputSource.Keyboard) { + return ctx.modifiers.ctrl ? InteractionType.Rotate : InteractionType.Pan; + } + return arcRotateDefault(ctx); // everything else unchanged +}; +``` + +### What it replaces +- `useCtrlForPanning` parameter on `attachControl()` +- Hardcoded `switch (evt.button)` in input classes +- `_ctrlPressed` internal state tracking + +--- + +## Layer 2: Conflict Matrix + +Declares which interactions cannot coexist. Supports source-specific rules to distinguish e.g. wheel zoom during pointer rotation (allowed) from touch zoom during touch rotation (blocked). + +### Interface + +```ts +/** A pattern that matches active interactions. Omitting source = wildcard (any source). */ +interface InteractionPattern { + type: InteractionType; + source?: InputSource; // undefined = matches any source +} + +/** Two interaction patterns that cannot coexist. Symmetric. */ +interface InteractionConflict { + a: InteractionPattern; + b: InteractionPattern; +} + +class CameraMovement { + /** Currently active interactions (gesture-level state, not frame deltas) */ + public activeInteractions = new Set(); + + /** Pairs of interactions that cannot coexist */ + public interactionConflicts: InteractionConflict[] = []; + + /** Check if an interaction is allowed given current active interactions */ + public canPerform(interaction: ActiveInteraction): boolean { + for (const active of this.activeInteractions) { + for (const conflict of this.interactionConflicts) { + if ((this._matches(active, conflict.a) && this._matches(interaction, conflict.b)) || + (this._matches(active, conflict.b) && this._matches(interaction, conflict.a))) { + return false; + } + } + } + return true; + } + + private _matches(interaction: ActiveInteraction, pattern: InteractionPattern): boolean { + return interaction.type === pattern.type && + (pattern.source === undefined || interaction.source === pattern.source); + } +} +``` + +### Default conflicts (geospatial camera) + +```ts +this.movement.interactionConflicts = [ + // Pan blocks all zoom (regardless of source) + { a: { type: InteractionType.Pan }, b: { type: InteractionType.Zoom } }, + + // Touch rotation blocks touch zoom (no pinch-zoom while two-finger rotating) + { a: { type: InteractionType.Rotate, source: InputSource.Touch }, + b: { type: InteractionType.Zoom, source: InputSource.Touch } }, + + // Pointer rotation blocks wheel zoom (current default behavior) + { a: { type: InteractionType.Rotate, source: InputSource.Pointer }, + b: { type: InteractionType.Zoom, source: InputSource.Wheel } }, +]; +``` + +### User override (PR #18150 ask) + +```ts +// "Allow wheel zoom while pointer-rotating" +// Just remove the pointer-rotate ↔ wheel-zoom entry: +camera.movement.interactionConflicts = [ + { a: { type: InteractionType.Pan }, b: { type: InteractionType.Zoom } }, + { a: { type: InteractionType.Rotate, source: InputSource.Touch }, + b: { type: InteractionType.Zoom, source: InputSource.Touch } }, + // pointer-rotate ↔ wheel-zoom conflict gone +]; +``` + +### How `multiTouchPanAndZoom` maps +```ts +// multiTouchPanAndZoom = false (blocks simultaneous touch pan + touch zoom) +{ a: { type: InteractionType.Pan, source: InputSource.Touch }, + b: { type: InteractionType.Zoom, source: InputSource.Touch } } + +// multiTouchPanAndZoom = true → omit this entry +``` + +### How inputs participate + +Inputs register/deregister gesture state on the movement class. They no longer inspect each other. + +```ts +// Pointer input +onButtonDown(evt) { + const interactionType = this.camera.inputMapping({ + device: InputSource.Pointer, button: evt.button, modifiers: { ... } + }); + const interaction = { type: interactionType, source: InputSource.Pointer }; + this.camera.movement.activeInteractions.add(interaction); + this._activeInteraction = interaction; // track for cleanup +} + +onButtonUp(evt) { + if (this._activeInteraction) { + this.camera.movement.activeInteractions.delete(this._activeInteraction); + this._activeInteraction = null; + } +} + +// Wheel input +checkInputs() { + const interaction = { type: InteractionType.Zoom, source: InputSource.Wheel }; + if (this.camera.movement.canPerform(interaction)) { + const handler = this.camera.movement.getHandler(InteractionType.Zoom); + handler?.zoomByDelta(this._wheelDeltaY, cursorX, cursorY); + } + super.checkInputs(); +} +``` + +### What it replaces +- `allowZoomWhilePointerRotating` on wheel input +- `multiTouchPanAndZoom` on pointer input +- `if (this.isDragging || this.rotationAccumulatedPixels.lengthSquared() > Epsilon)` in movement class +- Any input reaching into a sibling via `this.camera.inputs.attached["..."]` + +### Key design decision: gesture state, not frame deltas + +The current code checks `rotationAccumulatedPixels.lengthSquared() > Epsilon` per frame. If a user holds right-click but pauses mouse motion, the delta goes to zero and zoom re-enables mid-gesture. `activeInteractions` tracks button-down/button-up state, which correctly represents "the user is in a rotation gesture" regardless of per-frame motion. + +--- + +## Layer 3: Interaction Handlers + +Defines what each interaction actually does to the camera. Each interaction type has its own typed handler interface, because different interactions have fundamentally different data shapes (pan takes screen coords, zoom is scalar, flyTo is async). + +### Typed handler interfaces + +```ts +interface PanHandler { + /** Begin a pan gesture at screen position */ + start(screenX: number, screenY: number): void; + /** Continue panning to new screen position */ + update(screenX: number, screenY: number): void; + /** End the pan gesture */ + stop(): void; +} + +interface RotateHandler { + /** Apply rotation from pixel deltas */ + update(deltaX: number, deltaY: number): void; +} + +interface ZoomHandler { + /** Zoom by a scroll/pinch delta, optionally toward a screen position */ + zoomByDelta(delta: number, cursorScreenX?: number, cursorScreenY?: number): void; + /** Zoom toward a specific world point by a distance */ + zoomToPoint(point: Vector3, distance: number): void; +} + +interface FlyToHandler { + /** Animate the camera to a target point */ + flyTo(target: Vector3): Promise; +} +``` + +### Type-safe registry + +```ts +/** Maps interaction types to their typed handler interfaces */ +interface InteractionHandlerMap { + [InteractionType.Pan]: PanHandler; + [InteractionType.Rotate]: RotateHandler; + [InteractionType.Zoom]: ZoomHandler; + [InteractionType.FlyTo]: FlyToHandler; +} + +class CameraMovement { + private _handlers = new Map(); + + public setHandler( + interaction: K, + handler: InteractionHandlerMap[K] + ): void { + this._handlers.set(interaction, handler); + } + + public getHandler( + interaction: K + ): InteractionHandlerMap[K] | undefined { + return this._handlers.get(interaction) as InteractionHandlerMap[K] | undefined; + } +} +``` + +### Handlers are keyed by InteractionType only (not source) + +A `PanHandler` doesn't care whether the pan was triggered by a mouse drag or a keyboard arrow press — it just knows how to pan the camera. The source distinction is handled entirely by the input mapping and conflict matrix layers. + +### Default handlers (geospatial camera) + +```ts +camera.movement.setHandler(InteractionType.Pan, new GlobeDragHandler(camera)); +camera.movement.setHandler(InteractionType.Rotate, new TiltHandler(camera)); +camera.movement.setHandler(InteractionType.Zoom, new ZoomToPointHandler(camera)); +camera.movement.setHandler(InteractionType.FlyTo, new FlyToPointHandler(camera)); +``` + +### How inputs call handlers + +Inputs know the physical shape of their data and call the appropriate handler method: + +```ts +// Pointer input — pan gesture +onButtonDown(evt) { + const type = this.camera.inputMapping({ device: InputSource.Pointer, button: evt.button, ... }); + if (type === InteractionType.Pan) { + this.camera.movement.getHandler(InteractionType.Pan)?.start(scene.pointerX, scene.pointerY); + } +} + +onTouch(point, offsetX, offsetY) { + if (this._activeType === InteractionType.Pan) { + this.camera.movement.getHandler(InteractionType.Pan)?.update(scene.pointerX, scene.pointerY); + } else if (this._activeType === InteractionType.Rotate) { + this.camera.movement.getHandler(InteractionType.Rotate)?.update(offsetX, offsetY); + } +} + +onButtonUp(evt) { + if (this._activeType === InteractionType.Pan) { + this.camera.movement.getHandler(InteractionType.Pan)?.stop(); + } +} + +// Double-tap — flyTo +onDoubleTap() { + const pickResult = scene.pick(scene.pointerX, scene.pointerY); + if (pickResult.pickedPoint) { + this.camera.movement.getHandler(InteractionType.FlyTo)?.flyTo(pickResult.pickedPoint); + } +} +``` + +### User override (custom mechanics) + +```ts +// "I want right-click to orbit around the picked point, not the camera target" +camera.movement.setHandler(InteractionType.Rotate, new OrbitAroundPickPointHandler(camera)); +// Input mapping and conflict matrix unchanged +``` + +```ts +// "I want pan to have inertia" +camera.movement.setHandler(InteractionType.Pan, new InertiaPanHandler(camera)); +// Same PanHandler interface, different implementation +``` + +### What it replaces +- Hardcoded `handleDrag()`, `handleZoom()`, `_handleTilt()` scattered across input classes +- Movement logic that's split between inputs and the movement class + +--- + +## Relationship to Existing Behavior\ System + +The existing `Behavior` system is **unchanged and complementary**. Behaviors attach to cameras via `addBehavior()`, run after `onAfterCheckInputsObservable`, and apply secondary effects (auto-rotate when idle, bounce at limits, frame a mesh, adjust clip planes). + +The three-layer system runs *before* behaviors — it produces the core camera movement that behaviors then react to. + +Existing behaviors may benefit from the conflict matrix: +```ts +// AutoRotationBehavior currently tracks pointer events independently to detect idle. +// With activeInteractions, it could simply check: +if (movement.activeInteractions.size === 0) { + // No user interaction — start auto-rotate countdown +} +``` + +--- + +## Migration Examples + +### Example 1: PR #18150 (wheel zoom during pointer rotation) + +**Before (PR approach):** New `allowZoomWhilePointerRotating` boolean on wheel input + wheel input queries pointer input via `this.camera.inputs.attached["pointers"]` string-keyed lookup + cast. + +**After:** Remove one source-specific entry from the conflict matrix. +```ts +camera.movement.interactionConflicts = [ + { a: { type: Pan }, b: { type: Zoom } }, + { a: { type: Rotate, source: Touch }, b: { type: Zoom, source: Touch } }, + // pointer-rotate ↔ wheel-zoom conflict was here, now removed +]; +``` + +### Example 2: Forum thread (swap pan/rotate for ArcRotateCamera) + +**Before:** Modify `attachControl()` signature, add `CtrlKeyBehaviours` enum. + +**After:** Override the input mapping function. +```ts +camera.inputMapping = (ctx) => { + if (ctx.device === InputSource.Keyboard) { + return ctx.modifiers.ctrl ? InteractionType.Rotate : InteractionType.Pan; + } + return arcRotateDefault(ctx); +}; +``` + +### Example 3: Map-style navigation + +**Before:** Subclass pointer input, override `onButtonDown`/`onTouch`. + +**After:** Override the input mapping function. +```ts +camera.inputMapping = (ctx) => { + if (ctx.device === InputSource.Pointer && ctx.button === 0) return InteractionType.Pan; + if (ctx.device === InputSource.Pointer && ctx.button === 2) return InteractionType.Rotate; + return defaultMapping(ctx); +}; +``` + +### Example 4: Custom orbit-around-pick-point + +**Before:** Subclass input class, override movement methods. + +**After:** Swap one interaction handler (type-safe). +```ts +camera.movement.setHandler(InteractionType.Rotate, new OrbitAroundPickPointHandler(camera)); +``` + +### Example 5: Allow multitouch pan + zoom on orbit camera + +**Before:** Set `multiTouchPanAndZoom = true` on pointer input. + +**After:** Remove the touch-pan ↔ touch-zoom conflict entry. + +--- + +## Implementation Staging + +The three layers are independent and can be shipped incrementally. + +### Phase 1: Conflict Matrix (smallest, unblocks PR #18150) + +**Scope:** Movement class gets `activeInteractions`, `interactionConflicts`, `canPerform()` with source-aware matching. Existing inputs register/deregister gesture state. Movement class uses `canPerform()` instead of hardcoded conditionals. + +**Changes:** +- `InteractionType` enum, `InputSource` enum, `ActiveInteraction` interface, `InteractionPattern` interface, `InteractionConflict` interface (new file) +- `CameraMovement` / `GeospatialCameraMovement`: add `activeInteractions`, `interactionConflicts`, `canPerform()`, `_matches()` +- `GeospatialCameraPointersInput`: register/deregister interactions on button down/up/lost-focus +- `GeospatialCameraMouseWheelInput`: check `canPerform({ type: Zoom, source: Wheel })` before applying +- Remove `rotationAccumulatedPixels.lengthSquared() > Epsilon` check from movement class + +**Backward compat:** Fully backward compatible. New API is additive. Default conflict list preserves current behavior. + +### Phase 2: Input Mapping (addresses forum thread, post-9.0) + +**Scope:** Extract gesture→interaction mapping from hardcoded switch statements into a configurable function. Each camera type provides a default. + +**Changes:** +- `InputContext` interface, `InputMappingFunction` type (new) +- Camera base class or movement class gets `inputMapping` property +- Refactor existing input classes to call mapping function instead of hardcoding button→action +- Deprecate `useCtrlForPanning` on `attachControl()` + +**Backward compat:** Default mapping functions reproduce current behavior. `useCtrlForPanning` sets the mapping function internally during deprecation period. + +### Phase 3: Interaction Handlers (largest refactor) + +**Scope:** Extract movement logic from input classes and movement class into pluggable, typed, per-interaction handlers. + +**Changes:** +- Typed handler interfaces: `PanHandler`, `RotateHandler`, `ZoomHandler`, `FlyToHandler` (new) +- `InteractionHandlerMap` type mapping, type-safe `setHandler()` / `getHandler()` on movement class +- Concrete handlers extracted from existing code (`GlobeDragHandler`, `TiltHandler`, `ZoomToPointHandler`, etc.) +- Movement class becomes a thin coordinator: routes interactions to handlers, manages state +- Input classes become thin: map events, register gestures, call typed handler methods + +**Backward compat:** Internal refactor. Public API surface of inputs and movement class preserved via delegation. + +--- + +## Open Questions + +1. **Where does the mapping function live?** On the camera, on the movement class, or on the inputs manager? + +2. **Multi-touch classification:** Two-finger gestures can be pinch (zoom) or pan (rotate) depending on finger movement. This classification currently happens inside the pointer input. Does it move to the mapping layer or stay in the input? + +3. **Backward compatibility for `multiTouchPanAndZoom`:** This flag on `OrbitCameraPointersInput` controls both the mapping (two-finger = pan+zoom vs pan-only) and the conflict (can they coexist). In the new model these are separate layers. Migration path needs care. + +4. **Extensibility of InteractionHandlerMap:** If a camera type adds a new `InteractionType`, how does it extend the handler map type? Module augmentation, or a more open-ended registry? + +5. **Conflict matrix mutability:** Should the conflict list be mutable at runtime (e.g. toggling a conflict during a session), or set once at init? If mutable, do we need eviction of active interactions that become conflicted? From 81fe85284382a7eaab55a9bf87b7e3de15c1f105 Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Wed, 25 Mar 2026 16:03:29 -0400 Subject: [PATCH 04/39] architecture plan and adopting to geocam --- camera-input-architecture-proposal.md | 598 ++++++++---------- .../Inputs/geospatialCameraKeyboardInput.ts | 73 ++- .../Inputs/geospatialCameraMouseWheelInput.ts | 2 +- .../Inputs/geospatialCameraPointersInput.ts | 49 +- .../core/src/Cameras/cameraInteractions.ts | 80 +++ .../dev/core/src/Cameras/cameraMovement.ts | 77 +++ .../dev/core/src/Cameras/geospatialCamera.ts | 3 + .../src/Cameras/geospatialCameraMovement.ts | 105 +++ packages/dev/core/src/Cameras/index.ts | 2 + 9 files changed, 601 insertions(+), 388 deletions(-) create mode 100644 packages/dev/core/src/Cameras/cameraInteractions.ts diff --git a/camera-input-architecture-proposal.md b/camera-input-architecture-proposal.md index ad1a5cdc251..3586642e981 100644 --- a/camera-input-architecture-proposal.md +++ b/camera-input-architecture-proposal.md @@ -4,22 +4,23 @@ Camera input configuration is handled through scattered, ad-hoc boolean flags: -| Flag | Location | What it controls | -|---|---|---| -| `useCtrlForPanning` | `ArcRotateCamera.attachControl()` | Whether ctrl+arrows pan instead of rotate | -| `multiTouchPanAndZoom` | `OrbitCameraPointersInput` | Whether two-finger gestures can pan and zoom simultaneously | -| `allowZoomWhilePointerRotating` (PR #18150) | `GeospatialCameraMouseWheelInput` | Whether wheel zoom works during pointer rotation | +| Flag | Location | What it controls | +| ------------------------------------------- | --------------------------------- | ----------------------------------------------------------- | +| `useCtrlForPanning` | `ArcRotateCamera.attachControl()` | Whether ctrl+arrows pan instead of rotate | +| `multiTouchPanAndZoom` | `OrbitCameraPointersInput` | Whether two-finger gestures can pan and zoom simultaneously | +| `allowZoomWhilePointerRotating` (PR #18150) | `GeospatialCameraMouseWheelInput` | Whether wheel zoom works during pointer rotation | Each new configuration need adds another boolean, another conditional, and often requires one input to inspect a sibling input's state. This doesn't scale, and the flag combinatorics become hard to reason about. **Motivating examples:** + - [PR #18150](https://github.com/BabylonJS/Babylon.js/pull/18150): Geo camera wheel zoom during rotation. The wheel input reaches into the pointer input via `this.camera.inputs.attached["pointers"]` with a string key + cast. - [Forum thread](https://forum.babylonjs.com/t/panning-arcrotatecamera-with-keyboard-without-using-ctrl-key/19878): Community request to swap pan/rotate on ArcRotateCamera. Currently requires modifying `attachControl` signature. - Post-9.0 camera input rework (georgie/amoebachant) for framerate-independent movement. ## Proposed Architecture -Three composable layers, each answering one question: +Two composable layers, each answering one question: ``` ┌───────────────────────────────────────────────────────┐ @@ -27,15 +28,11 @@ Three composable layers, each answering one question: │ ↓ │ │ [Layer 1: Input Mapping] │ │ "What interaction does this gesture mean?" │ -│ Produces: InteractionType + InputSource │ -│ ↓ │ -│ [Layer 2: Conflict Matrix] │ -│ "Can these interactions happen at the same time?" │ -│ Checks: type + source against conflict rules │ +│ Declarative map: source + condition → interaction │ │ ↓ │ -│ [Layer 3: Interaction Handlers] │ +│ [Layer 2: Interaction Handlers] │ │ "What does this interaction do to the camera?" │ -│ Keyed by: InteractionType only (source-agnostic) │ +│ Keyed by: interaction name only (source-agnostic) │ │ ↓ │ │ Camera state updated │ │ ↓ │ @@ -48,360 +45,323 @@ Three composable layers, each answering one question: ### Terminology -| Term | Means | Example | -|---|---|---| -| **Input** | Physical device event processor (existing concept) | `GeospatialCameraPointersInput` | -| **Interaction** | Semantic action type + input source (new) | `{ type: Rotate, source: Pointer }` | -| **Interaction Handler** | Executes a semantic action on the camera (new, typed per interaction) | `GlobeDragHandler`, `TiltHandler` | -| **Behavior** | Post-input reactive modifier (existing, unchanged) | `AutoRotationBehavior` | +| Term | Means | Example | +| ----------------------- | --------------------------------------------------------------------- | -------------------------------------------------- | +| **Input** | Physical device event processor (existing concept) | `GeospatialCameraPointersInput` | +| **Interaction** | Semantic action the camera performs (new) | `"rotate"`, `"pan"`, `"zoom"` | +| **Input Map Entry** | Declarative rule: source + condition → interaction (new) | `{ source: Pointer, button: 0, interaction: Pan }` | +| **Interaction Handler** | Executes a semantic action on the camera (new, typed per interaction) | `GlobeDragHandler`, `TiltHandler` | +| **Behavior** | Post-input reactive modifier (existing, unchanged) | `AutoRotationBehavior` | --- ## Core Types ```ts -/** What the camera is doing (semantic action) */ -enum InteractionType { - None, - Pan, - Rotate, - Zoom, - FlyTo, - // extensible per camera type -} - /** Where the interaction originated (physical device) */ -enum InputSource { - Pointer, // mouse buttons - Wheel, // scroll wheel - Touch, // touch screen - Keyboard, // arrow keys, etc. -} +type InputSource = "pointer" | "wheel" | "touch" | "keyboard"; -/** A specific active interaction: what + who */ -interface ActiveInteraction { - type: InteractionType; - source: InputSource; -} +type InputModifiers = { ctrl?: boolean; shift?: boolean; alt?: boolean }; + +/** + * InputMapEntry is a discriminated union on `source`. + * Each variant only exposes fields relevant to that source — e.g. `button` only + * exists on pointer entries, `touchCount` only on touch entries. + */ +type PointerInputMapEntry = { + source: "pointer"; interaction: T; button?: number; modifiers?: InputModifiers; +}; +type WheelInputMapEntry = { + source: "wheel"; interaction: T; modifiers?: InputModifiers; +}; +type TouchInputMapEntry = { + source: "touch"; interaction: T; touchCount?: number; +}; +type KeyboardInputMapEntry = { + source: "keyboard"; interaction: T; modifiers?: InputModifiers; +}; + +type InputMapEntry = + | PointerInputMapEntry + | WheelInputMapEntry + | TouchInputMapEntry + | KeyboardInputMapEntry; +// { source: "pointer", button: 0, touchCount: 1 } → compile error (touchCount not on pointer) ``` -### Where source matters +The base `CameraMovement` class provides the `inputMap` and `resolveInteraction()` infrastructure. It does not define `handlers` — each camera's movement subclass declares its own typed `handlers` property. -| Layer | Uses source? | Why | -|---|---|---| -| Input Mapping | Produces it | Physical event → type + source | -| Conflict Matrix | **Yes** | Different sources have different coexistence rules | -| Active Interactions Set | **Yes** | Tracks what's active with source | -| Interaction Handlers | **No** | Handlers care about *what*, not *who* | +```ts +class CameraMovement { + /** Ordered list of input-to-interaction rules. First match wins. */ + public inputMap: InputMapEntry[] = []; + + /** Find the interaction type for a given source and conditions */ + public resolveInteraction(source: InputSource, conditions?: InputConditions): string { + for (const entry of this.inputMap) { + if (entry.source !== source) continue; + // switch narrows the union — each case only checks fields that exist on that variant + switch (entry.source) { + case "pointer": + if (entry.button !== undefined && entry.button !== conditions?.button) continue; + if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) continue; + break; + case "wheel": + if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) continue; + break; + case "touch": + if (entry.touchCount !== undefined && entry.touchCount !== conditions?.touchCount) continue; + break; + case "keyboard": + if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) continue; + break; + } + return entry.interaction; + } + return "none"; + } +} +``` --- -## Layer 1: Input Mapping +## Camera-Specific Handler Types -Maps physical gestures to semantic interactions. Replaces hardcoded `switch (evt.button)` blocks and `_ctrlPressed` booleans. +Each camera's movement subclass defines its own `handlers` property with its own typed handler types. Different cameras can have completely different handler APIs — the base class doesn't constrain them. TypeScript enforces the correct types per camera because input classes reference the concrete movement type. -### Interface +### Geospatial camera ```ts -interface InputContext { - device: InputSource; - button?: number; // mouse button (0=left, 1=middle, 2=right) - key?: string; // keyboard key - modifiers: { - ctrl: boolean; - shift: boolean; - alt: boolean; - }; - touchCount?: number; // number of active touches -} +type GeospatialPanHandler = { + start(screenX: number, screenY: number): void; + update(screenX: number, screenY: number): void; + stop(): void; +}; -/** Returns the interaction type; source is inferred from context.device */ -type InputMappingFunction = (context: InputContext) => InteractionType; -``` +type GeospatialRotateHandler = { + update(deltaX: number, deltaY: number): void; +}; -The mapping function returns `InteractionType`. The `InputSource` is automatically derived from `context.device`, so the resulting `ActiveInteraction` is `{ type: mapping(ctx), source: ctx.device }`. +type GeospatialZoomHandler = { + zoomByDelta(delta: number, toCursor: boolean): void; +}; -### Default mappings (per camera type) +type GeospatialFlyToHandler = { + flyTo(target: Vector3): Promise; +}; -**Geospatial camera:** -```ts -const geoDefault: InputMappingFunction = (ctx) => { - if (ctx.device === InputSource.Pointer) { - if (ctx.button === 0) return InteractionType.Pan; - if (ctx.button === 1 || ctx.button === 2) return InteractionType.Rotate; - } - if (ctx.device === InputSource.Touch) { - if (ctx.touchCount === 1) return InteractionType.Pan; - } - if (ctx.device === InputSource.Wheel) { - return InteractionType.Zoom; - } - return InteractionType.None; +type GeospatialHandlers = { + pan: GeospatialPanHandler; + rotate: GeospatialRotateHandler; + zoom: GeospatialZoomHandler; + flyTo: GeospatialFlyToHandler; }; + +class GeospatialCameraMovement extends CameraMovement { + public override inputMap: InputMapEntry[] = []; + public handlers: Partial = {}; +} +// inputMap interaction field only accepts "pan" | "rotate" | "zoom" | "flyTo" +// { interaction: "typo" } is a compile error ``` -**ArcRotateCamera (current behavior):** +### ArcRotateCamera (different handler APIs) + ```ts -const arcRotateDefault: InputMappingFunction = (ctx) => { - if (ctx.device === InputSource.Keyboard) { - return ctx.modifiers.ctrl ? InteractionType.Pan : InteractionType.Rotate; - } - if (ctx.device === InputSource.Pointer) { - if (ctx.button === 0) return InteractionType.Rotate; - if (ctx.button === 2) return InteractionType.Pan; - } - return InteractionType.None; +type ArcRotatePanHandler = { + pan(deltaAlpha: number, deltaBeta: number): void; }; -``` -### User override (forum thread ask) -```ts -// "I want default arrows to pan, ctrl+arrows to rotate" -camera.inputMapping = (ctx) => { - if (ctx.device === InputSource.Keyboard) { - return ctx.modifiers.ctrl ? InteractionType.Rotate : InteractionType.Pan; - } - return arcRotateDefault(ctx); // everything else unchanged +type ArcRotateRotateHandler = { + orbit(deltaAlpha: number, deltaBeta: number): void; }; -``` -### What it replaces -- `useCtrlForPanning` parameter on `attachControl()` -- Hardcoded `switch (evt.button)` in input classes -- `_ctrlPressed` internal state tracking +type ArcRotateZoomHandler = { + zoomByRadius(deltaRadius: number): void; +}; ---- +type ArcRotateHandlers = { + pan: ArcRotatePanHandler; + rotate: ArcRotateRotateHandler; + zoom: ArcRotateZoomHandler; +}; -## Layer 2: Conflict Matrix +class ArcRotateCameraMovement extends CameraMovement { + public override inputMap: InputMapEntry[] = []; + public handlers: Partial = {}; +} +// inputMap interaction field only accepts "pan" | "rotate" | "zoom" +``` -Declares which interactions cannot coexist. Supports source-specific rules to distinguish e.g. wheel zoom during pointer rotation (allowed) from touch zoom during touch rotation (blocked). +The same `"pan"` string in the input map means different things for different cameras — geospatial pan drags the globe with screen coordinates, arc-rotate pan moves by angular offsets. TypeScript ensures each camera's input classes call the correct handler methods. -### Interface +## Layer 1: Input Mapping -```ts -/** A pattern that matches active interactions. Omitting source = wildcard (any source). */ -interface InteractionPattern { - type: InteractionType; - source?: InputSource; // undefined = matches any source -} +Maps physical gestures to semantic interactions via a declarative data structure on the movement class. Each entry says "when _this source_ fires with _these conditions_, it means _this interaction_." First matching entry wins. -/** Two interaction patterns that cannot coexist. Symmetric. */ -interface InteractionConflict { - a: InteractionPattern; - b: InteractionPattern; -} +### Default input maps (per camera type) -class CameraMovement { - /** Currently active interactions (gesture-level state, not frame deltas) */ - public activeInteractions = new Set(); - - /** Pairs of interactions that cannot coexist */ - public interactionConflicts: InteractionConflict[] = []; - - /** Check if an interaction is allowed given current active interactions */ - public canPerform(interaction: ActiveInteraction): boolean { - for (const active of this.activeInteractions) { - for (const conflict of this.interactionConflicts) { - if ((this._matches(active, conflict.a) && this._matches(interaction, conflict.b)) || - (this._matches(active, conflict.b) && this._matches(interaction, conflict.a))) { - return false; - } - } - } - return true; - } +**Geospatial camera:** - private _matches(interaction: ActiveInteraction, pattern: InteractionPattern): boolean { - return interaction.type === pattern.type && - (pattern.source === undefined || interaction.source === pattern.source); - } -} +```ts +camera.movement.inputMap = [ + { source: "pointer", button: 0, interaction: "pan" }, + { source: "pointer", button: 1, interaction: "rotate" }, + { source: "pointer", button: 2, interaction: "rotate" }, + { source: "touch", touchCount: 1, interaction: "pan" }, + { source: "wheel", interaction: "zoom" }, + { source: "keyboard", modifiers: { ctrl: true }, interaction: "rotate" }, + { source: "keyboard", modifiers: { alt: true }, interaction: "rotate" }, + { source: "keyboard", interaction: "pan" }, +]; ``` -### Default conflicts (geospatial camera) +**ArcRotateCamera (current behavior):** ```ts -this.movement.interactionConflicts = [ - // Pan blocks all zoom (regardless of source) - { a: { type: InteractionType.Pan }, b: { type: InteractionType.Zoom } }, - - // Touch rotation blocks touch zoom (no pinch-zoom while two-finger rotating) - { a: { type: InteractionType.Rotate, source: InputSource.Touch }, - b: { type: InteractionType.Zoom, source: InputSource.Touch } }, - - // Pointer rotation blocks wheel zoom (current default behavior) - { a: { type: InteractionType.Rotate, source: InputSource.Pointer }, - b: { type: InteractionType.Zoom, source: InputSource.Wheel } }, +camera.movement.inputMap = [ + { source: "pointer", button: 0, interaction: "rotate" }, + { source: "pointer", button: 2, interaction: "pan" }, + { source: "wheel", interaction: "zoom" }, + { source: "keyboard", modifiers: { ctrl: true }, interaction: "pan" }, + { source: "keyboard", interaction: "rotate" }, ]; ``` -### User override (PR #18150 ask) +Note: more-specific entries (with modifiers) must come **before** less-specific entries for the same source, since first match wins. + +### User override examples ```ts -// "Allow wheel zoom while pointer-rotating" -// Just remove the pointer-rotate ↔ wheel-zoom entry: -camera.movement.interactionConflicts = [ - { a: { type: InteractionType.Pan }, b: { type: InteractionType.Zoom } }, - { a: { type: InteractionType.Rotate, source: InputSource.Touch }, - b: { type: InteractionType.Zoom, source: InputSource.Touch } }, - // pointer-rotate ↔ wheel-zoom conflict gone +// "I want left-click to pan, right-click to rotate" (map-style navigation) +// Just reassign the pointer entries: +camera.movement.inputMap = [ + { source: "pointer", button: 0, interaction: "pan" }, + { source: "pointer", button: 2, interaction: "rotate" }, + { source: "wheel", interaction: "zoom" }, + { source: "keyboard", interaction: "rotate" }, ]; ``` -### How `multiTouchPanAndZoom` maps ```ts -// multiTouchPanAndZoom = false (blocks simultaneous touch pan + touch zoom) -{ a: { type: InteractionType.Pan, source: InputSource.Touch }, - b: { type: InteractionType.Zoom, source: InputSource.Touch } } - -// multiTouchPanAndZoom = true → omit this entry +// "I want default arrows to pan, ctrl+arrows to rotate" (forum thread ask) +// Just reorder the keyboard entries: +camera.movement.inputMap = [ + ...camera.movement.inputMap.filter((e) => e.source !== "keyboard"), + { source: "keyboard", modifiers: { ctrl: true }, interaction: "rotate" }, + { source: "keyboard", interaction: "pan" }, +]; ``` -### How inputs participate - -Inputs register/deregister gesture state on the movement class. They no longer inspect each other. +### How inputs use the map ```ts // Pointer input onButtonDown(evt) { - const interactionType = this.camera.inputMapping({ - device: InputSource.Pointer, button: evt.button, modifiers: { ... } + this._activeType = this.camera.movement.resolveInteraction("pointer", { + button: evt.button, modifiers: { ctrl: evt.ctrlKey, ... } }); - const interaction = { type: interactionType, source: InputSource.Pointer }; - this.camera.movement.activeInteractions.add(interaction); - this._activeInteraction = interaction; // track for cleanup + if (this._activeType === "pan") { + this.camera.movement.handlers.pan?.start(scene.pointerX, scene.pointerY); + } } -onButtonUp(evt) { - if (this._activeInteraction) { - this.camera.movement.activeInteractions.delete(this._activeInteraction); - this._activeInteraction = null; +onTouch(point, offsetX, offsetY) { + if (this._activeType === "pan") { + this.camera.movement.handlers.pan?.update(scene.pointerX, scene.pointerY); + } else if (this._activeType === "rotate") { + this.camera.movement.handlers.rotate?.update(offsetX, offsetY); } } // Wheel input checkInputs() { - const interaction = { type: InteractionType.Zoom, source: InputSource.Wheel }; - if (this.camera.movement.canPerform(interaction)) { - const handler = this.camera.movement.getHandler(InteractionType.Zoom); - handler?.zoomByDelta(this._wheelDeltaY, cursorX, cursorY); - } - super.checkInputs(); + this.camera.movement.handlers.zoom?.zoomByDelta(this._wheelDeltaY, true); } ``` ### What it replaces + +- `useCtrlForPanning` parameter on `attachControl()` +- Hardcoded `switch (evt.button)` in input classes +- `_ctrlPressed` internal state tracking - `allowZoomWhilePointerRotating` on wheel input - `multiTouchPanAndZoom` on pointer input -- `if (this.isDragging || this.rotationAccumulatedPixels.lengthSquared() > Epsilon)` in movement class - Any input reaching into a sibling via `this.camera.inputs.attached["..."]` -### Key design decision: gesture state, not frame deltas +### Performance: avoiding allocations in the render loop -The current code checks `rotationAccumulatedPixels.lengthSquared() > Epsilon` per frame. If a user holds right-click but pauses mouse motion, the delta goes to zero and zoom re-enables mid-gesture. `activeInteractions` tracks button-down/button-up state, which correctly represents "the user is in a rotation gesture" regardless of per-frame motion. - ---- - -## Layer 3: Interaction Handlers - -Defines what each interaction actually does to the camera. Each interaction type has its own typed handler interface, because different interactions have fundamentally different data shapes (pan takes screen coords, zoom is scalar, flyTo is async). - -### Typed handler interfaces +`resolveInteraction()` accepts an `InputConditions` object. For event-driven inputs (pointer `onButtonDown`, `onButtonUp`), allocating this inline is fine — these don't run per frame. But for inputs whose `checkInputs()` runs every frame (keyboard with held keys), the conditions object must be **cached and mutated**, not allocated: ```ts -interface PanHandler { - /** Begin a pan gesture at screen position */ - start(screenX: number, screenY: number): void; - /** Continue panning to new screen position */ - update(screenX: number, screenY: number): void; - /** End the pan gesture */ - stop(): void; -} - -interface RotateHandler { - /** Apply rotation from pixel deltas */ - update(deltaX: number, deltaY: number): void; +// ❌ Bad: allocates every frame +checkInputs() { + const interaction = this.camera.movement.resolveInteraction("keyboard", { + modifiers: { ctrl: this._modifierPressed, alt: this._modifierPressed } + }); } -interface ZoomHandler { - /** Zoom by a scroll/pinch delta, optionally toward a screen position */ - zoomByDelta(delta: number, cursorScreenX?: number, cursorScreenY?: number): void; - /** Zoom toward a specific world point by a distance */ - zoomToPoint(point: Vector3, distance: number): void; -} +// ✅ Good: cache once, mutate per frame +private _keyboardConditions: InputConditions = { modifiers: { ctrl: false, alt: false } }; -interface FlyToHandler { - /** Animate the camera to a target point */ - flyTo(target: Vector3): Promise; +checkInputs() { + this._keyboardConditions.modifiers!.ctrl = this._modifierPressed; + this._keyboardConditions.modifiers!.alt = this._modifierPressed; + const interaction = this.camera.movement.resolveInteraction("keyboard", this._keyboardConditions); } ``` -### Type-safe registry - -```ts -/** Maps interaction types to their typed handler interfaces */ -interface InteractionHandlerMap { - [InteractionType.Pan]: PanHandler; - [InteractionType.Rotate]: RotateHandler; - [InteractionType.Zoom]: ZoomHandler; - [InteractionType.FlyTo]: FlyToHandler; -} +This follows the existing Babylon.js pattern (e.g. `TmpVectors`) of pre-allocating reusable objects to avoid GC pressure in the render loop. The `resolveInteraction()` scan itself (6–8 string comparisons) is negligible. -class CameraMovement { - private _handlers = new Map(); +--- - public setHandler( - interaction: K, - handler: InteractionHandlerMap[K] - ): void { - this._handlers.set(interaction, handler); - } +## Layer 2: Interaction Handlers - public getHandler( - interaction: K - ): InteractionHandlerMap[K] | undefined { - return this._handlers.get(interaction) as InteractionHandlerMap[K] | undefined; - } -} -``` +Defines what each interaction actually does to the camera. Handler types are defined per camera type (see Camera-Specific Handler Types above). The `handlers` property lives on each movement subclass — the base class provides the input map infrastructure, each subclass provides its own typed handlers. -### Handlers are keyed by InteractionType only (not source) +### Handlers are keyed by interaction name (not source) -A `PanHandler` doesn't care whether the pan was triggered by a mouse drag or a keyboard arrow press — it just knows how to pan the camera. The source distinction is handled entirely by the input mapping and conflict matrix layers. +A `PanHandler` doesn't care whether the pan was triggered by a mouse drag or a keyboard arrow press — it just knows how to pan the camera. The source distinction is handled entirely by the input mapping layer. ### Default handlers (geospatial camera) ```ts -camera.movement.setHandler(InteractionType.Pan, new GlobeDragHandler(camera)); -camera.movement.setHandler(InteractionType.Rotate, new TiltHandler(camera)); -camera.movement.setHandler(InteractionType.Zoom, new ZoomToPointHandler(camera)); -camera.movement.setHandler(InteractionType.FlyTo, new FlyToPointHandler(camera)); +// Pan, rotate, zoom handlers set up by GeospatialCameraMovement constructor +// (delegates to existing movement methods: startDrag, handleDrag, stopDrag, handleZoom, etc.) + +// flyTo handler wired up by GeospatialCamera constructor +// (lives on camera because it calls camera.flyToPointAsync, avoiding circular dependency) +camera.movement.handlers.flyTo = { + flyTo: (target) => camera.flyToPointAsync(target), +}; ``` ### How inputs call handlers -Inputs know the physical shape of their data and call the appropriate handler method: +Inputs resolve their interaction type via `resolveInteraction()` (Layer 1), then call the appropriate handler via `handlers.*`: ```ts // Pointer input — pan gesture onButtonDown(evt) { - const type = this.camera.inputMapping({ device: InputSource.Pointer, button: evt.button, ... }); - if (type === InteractionType.Pan) { - this.camera.movement.getHandler(InteractionType.Pan)?.start(scene.pointerX, scene.pointerY); + this._activeType = this.camera.movement.resolveInteraction("pointer", { + button: evt.button, modifiers: { ctrl: evt.ctrlKey, ... } + }); + if (this._activeType === "pan") { + this.camera.movement.handlers.pan?.start(scene.pointerX, scene.pointerY); } } onTouch(point, offsetX, offsetY) { - if (this._activeType === InteractionType.Pan) { - this.camera.movement.getHandler(InteractionType.Pan)?.update(scene.pointerX, scene.pointerY); - } else if (this._activeType === InteractionType.Rotate) { - this.camera.movement.getHandler(InteractionType.Rotate)?.update(offsetX, offsetY); + if (this._activeType === "pan") { + this.camera.movement.handlers.pan?.update(scene.pointerX, scene.pointerY); + } else if (this._activeType === "rotate") { + this.camera.movement.handlers.rotate?.update(offsetX, offsetY); } } onButtonUp(evt) { - if (this._activeType === InteractionType.Pan) { - this.camera.movement.getHandler(InteractionType.Pan)?.stop(); + if (this._activeType === "pan") { + this.camera.movement.handlers.pan?.stop(); } } @@ -409,7 +369,7 @@ onButtonUp(evt) { onDoubleTap() { const pickResult = scene.pick(scene.pointerX, scene.pointerY); if (pickResult.pickedPoint) { - this.camera.movement.getHandler(InteractionType.FlyTo)?.flyTo(pickResult.pickedPoint); + this.camera.movement.handlers.flyTo?.flyTo(pickResult.pickedPoint); } } ``` @@ -418,17 +378,19 @@ onDoubleTap() { ```ts // "I want right-click to orbit around the picked point, not the camera target" -camera.movement.setHandler(InteractionType.Rotate, new OrbitAroundPickPointHandler(camera)); -// Input mapping and conflict matrix unchanged +camera.movement.handlers.rotate = new OrbitAroundPickPointHandler(camera); +// Input mapping unchanged — still maps right-click to "rotate" +// OrbitAroundPickPointHandler must implement GeospatialRotateHandler ``` ```ts // "I want pan to have inertia" -camera.movement.setHandler(InteractionType.Pan, new InertiaPanHandler(camera)); -// Same PanHandler interface, different implementation +camera.movement.handlers.pan = new InertiaPanHandler(camera); +// Must implement GeospatialPanHandler (start/update/stop with screen coords) ``` ### What it replaces + - Hardcoded `handleDrag()`, `handleZoom()`, `_handleTilt()` scattered across input classes - Movement logic that's split between inputs and the movement class @@ -438,16 +400,7 @@ camera.movement.setHandler(InteractionType.Pan, new InertiaPanHandler(camera)); The existing `Behavior` system is **unchanged and complementary**. Behaviors attach to cameras via `addBehavior()`, run after `onAfterCheckInputsObservable`, and apply secondary effects (auto-rotate when idle, bounce at limits, frame a mesh, adjust clip planes). -The three-layer system runs *before* behaviors — it produces the core camera movement that behaviors then react to. - -Existing behaviors may benefit from the conflict matrix: -```ts -// AutoRotationBehavior currently tracks pointer events independently to detect idle. -// With activeInteractions, it could simply check: -if (movement.activeInteractions.size === 0) { - // No user interaction — start auto-rotate countdown -} -``` +The two-layer system runs _before_ behaviors — it produces the core camera movement that behaviors then react to. --- @@ -457,40 +410,38 @@ if (movement.activeInteractions.size === 0) { **Before (PR approach):** New `allowZoomWhilePointerRotating` boolean on wheel input + wheel input queries pointer input via `this.camera.inputs.attached["pointers"]` string-keyed lookup + cast. -**After:** Remove one source-specific entry from the conflict matrix. -```ts -camera.movement.interactionConflicts = [ - { a: { type: Pan }, b: { type: Zoom } }, - { a: { type: Rotate, source: Touch }, b: { type: Zoom, source: Touch } }, - // pointer-rotate ↔ wheel-zoom conflict was here, now removed -]; -``` +**After:** The wheel input resolves its interaction type through the input map and calls the zoom handler directly. No cross-input inspection needed — whether zoom is allowed during rotation is an input-level concern (the wheel input simply doesn't know or care what the pointer input is doing). ### Example 2: Forum thread (swap pan/rotate for ArcRotateCamera) **Before:** Modify `attachControl()` signature, add `CtrlKeyBehaviours` enum. -**After:** Override the input mapping function. +**After:** Update the input map. + ```ts -camera.inputMapping = (ctx) => { - if (ctx.device === InputSource.Keyboard) { - return ctx.modifiers.ctrl ? InteractionType.Rotate : InteractionType.Pan; - } - return arcRotateDefault(ctx); -}; +camera.movement.inputMap = [ + { source: "pointer", button: 0, interaction: "rotate" }, + { source: "pointer", button: 2, interaction: "pan" }, + { source: "wheel", interaction: "zoom" }, + // Swapped: ctrl+arrows = rotate, plain arrows = pan + { source: "keyboard", modifiers: { ctrl: true }, interaction: "rotate" }, + { source: "keyboard", interaction: "pan" }, +]; ``` ### Example 3: Map-style navigation **Before:** Subclass pointer input, override `onButtonDown`/`onTouch`. -**After:** Override the input mapping function. +**After:** Update two entries in the input map. + ```ts -camera.inputMapping = (ctx) => { - if (ctx.device === InputSource.Pointer && ctx.button === 0) return InteractionType.Pan; - if (ctx.device === InputSource.Pointer && ctx.button === 2) return InteractionType.Rotate; - return defaultMapping(ctx); -}; +camera.movement.inputMap = [ + { source: "pointer", button: 0, interaction: "pan" }, + { source: "pointer", button: 2, interaction: "rotate" }, + { source: "wheel", interaction: "zoom" }, + { source: "keyboard", interaction: "rotate" }, +]; ``` ### Example 4: Custom orbit-around-pick-point @@ -498,57 +449,46 @@ camera.inputMapping = (ctx) => { **Before:** Subclass input class, override movement methods. **After:** Swap one interaction handler (type-safe). + ```ts -camera.movement.setHandler(InteractionType.Rotate, new OrbitAroundPickPointHandler(camera)); +camera.movement.handlers.rotate = new OrbitAroundPickPointHandler(camera); ``` ### Example 5: Allow multitouch pan + zoom on orbit camera **Before:** Set `multiTouchPanAndZoom = true` on pointer input. -**After:** Remove the touch-pan ↔ touch-zoom conflict entry. +**After:** Multi-touch classification stays inside the pointer input (it's a gesture-detection concern, not a mapping concern). The pointer input determines whether a two-finger gesture is a pan, zoom, or both, and calls the appropriate handler(s). --- ## Implementation Staging -The three layers are independent and can be shipped incrementally. +The two layers are independent and can be shipped incrementally. -### Phase 1: Conflict Matrix (smallest, unblocks PR #18150) +### Phase 1: Input Mapping (unblocks forum thread, simplifies PR #18150) -**Scope:** Movement class gets `activeInteractions`, `interactionConflicts`, `canPerform()` with source-aware matching. Existing inputs register/deregister gesture state. Movement class uses `canPerform()` instead of hardcoded conditionals. +**Scope:** Movement class gets `inputMap` array and `resolveInteraction()`. Each movement subclass defines its own typed `handlers` property. Existing inputs use them instead of hardcoding button→action logic. **Changes:** -- `InteractionType` enum, `InputSource` enum, `ActiveInteraction` interface, `InteractionPattern` interface, `InteractionConflict` interface (new file) -- `CameraMovement` / `GeospatialCameraMovement`: add `activeInteractions`, `interactionConflicts`, `canPerform()`, `_matches()` -- `GeospatialCameraPointersInput`: register/deregister interactions on button down/up/lost-focus -- `GeospatialCameraMouseWheelInput`: check `canPerform({ type: Zoom, source: Wheel })` before applying -- Remove `rotationAccumulatedPixels.lengthSquared() > Epsilon` check from movement class - -**Backward compat:** Fully backward compatible. New API is additive. Default conflict list preserves current behavior. - -### Phase 2: Input Mapping (addresses forum thread, post-9.0) -**Scope:** Extract gesture→interaction mapping from hardcoded switch statements into a configurable function. Each camera type provides a default. - -**Changes:** -- `InputContext` interface, `InputMappingFunction` type (new) -- Camera base class or movement class gets `inputMapping` property -- Refactor existing input classes to call mapping function instead of hardcoding button→action +- `InputSource` (string literal union), `InputMapEntry` type (new file) +- `CameraMovement`: add `inputMap`, `resolveInteraction()` +- Each camera movement subclass: define `handlers` property with camera-specific handler types (e.g. `GeospatialHandlers`, `ArcRotateHandlers`) +- Refactor existing input classes to call `resolveInteraction()` and `handlers.*` instead of hardcoded switch/if chains - Deprecate `useCtrlForPanning` on `attachControl()` -**Backward compat:** Default mapping functions reproduce current behavior. `useCtrlForPanning` sets the mapping function internally during deprecation period. +**Backward compat:** Fully backward compatible. Default input maps and handlers reproduce current behavior. `useCtrlForPanning` sets the map internally during deprecation period. -### Phase 3: Interaction Handlers (largest refactor) +### Phase 2: Handler extraction (largest refactor) -**Scope:** Extract movement logic from input classes and movement class into pluggable, typed, per-interaction handlers. +**Scope:** Extract movement logic from movement class into standalone handler classes that can be composed and reused across camera types. **Changes:** -- Typed handler interfaces: `PanHandler`, `RotateHandler`, `ZoomHandler`, `FlyToHandler` (new) -- `InteractionHandlerMap` type mapping, type-safe `setHandler()` / `getHandler()` on movement class -- Concrete handlers extracted from existing code (`GlobeDragHandler`, `TiltHandler`, `ZoomToPointHandler`, etc.) -- Movement class becomes a thin coordinator: routes interactions to handlers, manages state -- Input classes become thin: map events, register gestures, call typed handler methods + +- Concrete handler classes extracted from existing code (`GlobeDragHandler`, `TiltHandler`, `ZoomToPointHandler`, etc.) +- Movement class becomes a thin coordinator: owns `inputMap`, `handlers`, accumulated pixel state, inertia +- Input classes become thin: map events via `resolveInteraction()`, call handler methods **Backward compat:** Internal refactor. Public API surface of inputs and movement class preserved via delegation. @@ -556,12 +496,10 @@ The three layers are independent and can be shipped incrementally. ## Open Questions -1. **Where does the mapping function live?** On the camera, on the movement class, or on the inputs manager? - -2. **Multi-touch classification:** Two-finger gestures can be pinch (zoom) or pan (rotate) depending on finger movement. This classification currently happens inside the pointer input. Does it move to the mapping layer or stay in the input? +1. **Multi-touch classification:** Two-finger gestures can be pinch (zoom) or pan depending on finger movement. This classification currently happens inside the pointer input. Does it move to the mapping layer (via `touchCount` or similar) or stay in the input as gesture detection? -3. **Backward compatibility for `multiTouchPanAndZoom`:** This flag on `OrbitCameraPointersInput` controls both the mapping (two-finger = pan+zoom vs pan-only) and the conflict (can they coexist). In the new model these are separate layers. Migration path needs care. +2. **Backward compatibility for `multiTouchPanAndZoom`:** This flag on `OrbitCameraPointersInput` controls both what a two-finger gesture means (pan vs zoom vs both) and whether they can happen simultaneously. Migration path needs care. -4. **Extensibility of InteractionHandlerMap:** If a camera type adds a new `InteractionType`, how does it extend the handler map type? Module augmentation, or a more open-ended registry? +3. **Extensibility:** If a camera type adds a new interaction (e.g. `tilt`), it just adds a property to its own handlers type. No base class changes needed. -5. **Conflict matrix mutability:** Should the conflict list be mutable at runtime (e.g. toggling a conflict during a session), or set once at init? If mutable, do we need eviction of active interactions that become conflicted? +4. **Interaction coexistence:** Without a conflict matrix, cross-input blocking (e.g. "don't zoom while panning") stays inside individual inputs or the movement class. If this becomes a recurring need, a lightweight conflict mechanism could be added later without changing the input map or handler layers. diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index aed4f07efc2..12eb83e8dde 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -9,6 +9,7 @@ import type { KeyboardInfo } from "../../Events/keyboardEvents"; import { KeyboardEventTypes } from "../../Events/keyboardEvents"; import { Tools } from "../../Misc/tools"; import type { AbstractEngine } from "../../Engines/abstractEngine"; +import type { InputConditions } from "../cameraInteractions"; /** * Manage the keyboard inputs to control the movement of a geospatial camera. @@ -87,6 +88,9 @@ export class GeospatialCameraKeyboardInput implements ICameraInput = null; + /** The resolved interaction type for the current pointer gesture */ + private _activeType: string = "none"; + /** * Defines the rotation sensitivity of the pointer when rotating camera around the x axis (pitch) * (Multiplied by the true pixel delta of pointer input, before rotation speed factor is applied by movement class) @@ -45,27 +47,21 @@ export class GeospatialCameraPointersInput extends OrbitCameraPointersInput { public override onButtonDown(evt: IPointerEvent): void { this.camera.movement.activeInput = true; const scene = this.camera.getScene(); - switch (evt.button) { - case 0: // Left button - drag/pan globe under cursor - this.camera.movement.startDrag(scene.pointerX, scene.pointerY); - break; - default: - break; + + this._activeType = this.camera.movement.resolveInteraction("pointer", { button: evt.button }); + + if (this._activeType === "pan") { + this.camera.movement.handlers.pan?.start(scene.pointerX, scene.pointerY); } } public override onTouch(point: Nullable, offsetX: number, offsetY: number): void { - // Single finger touch (no button property) or left button (button 0) = drag - const button = point?.button ?? 0; // Default to button 0 (drag) if undefined const scene = this.camera.getScene(); - switch (button) { - case 0: // Left button / single touch - drag/pan globe under cursor - this.camera.movement.handleDrag(scene.pointerX, scene.pointerY); - break; - case 1: // Middle button - tilt camera - case 2: // Right button - tilt camera - this._handleTilt(offsetX, offsetY); - break; + + if (this._activeType === "pan") { + this.camera.movement.handlers.pan?.update(scene.pointerX, scene.pointerY); + } else if (this._activeType === "rotate") { + this.camera.movement.handlers.rotate?.update(offsetX * this.yawSensitivity, -offsetY * this.pitchSensitivity); } } @@ -121,14 +117,14 @@ export class GeospatialCameraPointersInput extends OrbitCameraPointersInput { if (previousMultiTouchPanPosition && multiTouchPanPosition) { const moveDeltaX = multiTouchPanPosition.x - previousMultiTouchPanPosition.x; const moveDeltaY = multiTouchPanPosition.y - previousMultiTouchPanPosition.y; - this._handleTilt(moveDeltaX, moveDeltaY); + this.camera.movement.handlers.rotate?.update(moveDeltaX * this.yawSensitivity, -moveDeltaY * this.pitchSensitivity); } } public override onDoubleTap(type: string): void { const pickResult = this.camera._scene.pick(this.camera._scene.pointerX, this.camera._scene.pointerY, this.camera.movement.pickPredicate); if (pickResult.pickedPoint) { - void this.camera.flyToPointAsync(pickResult.pickedPoint); + this.camera.movement.handlers.flyTo?.flyTo(pickResult.pickedPoint); } } @@ -164,7 +160,10 @@ export class GeospatialCameraPointersInput extends OrbitCameraPointersInput { } public override onButtonUp(_evt: IPointerEvent): void { - this.camera.movement.stopDrag(); + if (this._activeType === "pan") { + this.camera.movement.handlers.pan?.stop(); + } + this._activeType = "none"; this.camera.movement.activeInput = false; this._initialPinchSquaredDistance = 0; this._pinchCentroid = null; @@ -172,13 +171,9 @@ export class GeospatialCameraPointersInput extends OrbitCameraPointersInput { } public override onLostFocus(): void { + this._activeType = "none"; this._initialPinchSquaredDistance = 0; this._pinchCentroid = null; super.onLostFocus(); } - - private _handleTilt(deltaX: number, deltaY: number): void { - this.camera.movement.rotationAccumulatedPixels.y += deltaX * this.yawSensitivity; // yaw - looking side to side - this.camera.movement.rotationAccumulatedPixels.x -= deltaY * this.pitchSensitivity; // pitch - look up towards sky / down towards ground - } } diff --git a/packages/dev/core/src/Cameras/cameraInteractions.ts b/packages/dev/core/src/Cameras/cameraInteractions.ts new file mode 100644 index 00000000000..c4b7d7b8ba2 --- /dev/null +++ b/packages/dev/core/src/Cameras/cameraInteractions.ts @@ -0,0 +1,80 @@ +/** + * Physical input source that generated an interaction. + */ +export type InputSource = "pointer" | "wheel" | "touch" | "keyboard"; + +/** + * Modifier key state, shared across input sources that support modifiers. + */ +export type InputModifiers = { + ctrl?: boolean; + shift?: boolean; + alt?: boolean; +}; + +/** + * Mapping rule for pointer (mouse button) inputs. + */ +export type PointerInputMapEntry = { + source: "pointer"; + interaction: TInteraction; + /** Mouse button filter (0=left, 1=middle, 2=right). Omit to match any button. */ + button?: number; + /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ + modifiers?: InputModifiers; +}; + +/** + * Mapping rule for mouse wheel inputs. + */ +export type WheelInputMapEntry = { + source: "wheel"; + interaction: TInteraction; + /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ + modifiers?: InputModifiers; +}; + +/** + * Mapping rule for touch inputs. + */ +export type TouchInputMapEntry = { + source: "touch"; + interaction: TInteraction; + /** Number of active touch points. Omit to match any count. */ + touchCount?: number; +}; + +/** + * Mapping rule for keyboard inputs. + */ +export type KeyboardInputMapEntry = { + source: "keyboard"; + interaction: TInteraction; + /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ + modifiers?: InputModifiers; +}; + +/** + * A single mapping rule: source + optional conditions → interaction type. + * The inputMap is an ordered array on the movement class; first matching entry wins. + * The interaction string should match a handler property name on the camera's movement subclass. + * + * Discriminated union by `source` — only fields relevant to that source are available. + */ +export type InputMapEntry = + | PointerInputMapEntry + | WheelInputMapEntry + | TouchInputMapEntry + | KeyboardInputMapEntry; + +/** + * Conditions from a physical input event, passed to resolveInteraction(). + */ +export type InputConditions = { + /** Mouse button (0=left, 1=middle, 2=right) */ + button?: number; + /** Modifier key state */ + modifiers?: InputModifiers; + /** Number of active touch points */ + touchCount?: number; +}; diff --git a/packages/dev/core/src/Cameras/cameraMovement.ts b/packages/dev/core/src/Cameras/cameraMovement.ts index 8e1a336e5b2..1d9aeac39d7 100644 --- a/packages/dev/core/src/Cameras/cameraMovement.ts +++ b/packages/dev/core/src/Cameras/cameraMovement.ts @@ -2,6 +2,7 @@ import type { Scene } from "../scene"; import { Vector3 } from "../Maths/math.vector"; import { Epsilon } from "../Maths/math.constants"; import type { InterpolatingBehavior } from "../Behaviors/Cameras/interpolatingBehavior"; +import type { InputMapEntry, InputConditions, InputSource, InputModifiers } from "./cameraInteractions"; const FrameDurationAt60FPS = 1000 / 60; /** @@ -17,6 +18,82 @@ export class CameraMovement { */ public activeInput: boolean = false; + /** + * Ordered list of input-to-interaction mapping rules. First matching entry wins. + * Each entry maps a physical input source (+ optional conditions like button or modifier keys) to a semantic interaction type. + * + * Override this array to reconfigure which physical inputs trigger which camera interactions. + * @example + * ```ts + * // Map-style navigation: left-click pans, right-click rotates + * camera.movement.inputMap = [ + * { source: "pointer", button: 0, interaction: "pan" }, + * { source: "pointer", button: 2, interaction: "rotate" }, + * { source: "wheel", interaction: "zoom" }, + * ]; + * ``` + */ + public inputMap: InputMapEntry[] = []; + + /** + * Resolves a physical input event to a semantic interaction type by walking the inputMap. + * Returns the interaction string of the first matching entry, or "none" if no entry matches. + * The returned string corresponds to a handler property name on the camera's movement subclass. + * @param source - The physical input source (e.g. "pointer", "keyboard") + * @param conditions - Optional conditions to match against (button, modifiers, touchCount) + * @returns The resolved interaction type string, or "none" + */ + public resolveInteraction(source: InputSource, conditions?: InputConditions): string { + for (const entry of this.inputMap) { + if (entry.source !== source) { + continue; + } + switch (entry.source) { + case "pointer": + if (entry.button !== undefined && entry.button !== conditions?.button) { + continue; + } + if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) { + continue; + } + break; + case "wheel": + if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) { + continue; + } + break; + case "touch": + if (entry.touchCount !== undefined && entry.touchCount !== conditions?.touchCount) { + continue; + } + break; + case "keyboard": + if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) { + continue; + } + break; + } + return entry.interaction; + } + return "none"; + } + + private _matchModifiers(entryModifiers?: InputModifiers, conditionModifiers?: InputModifiers): boolean { + if (!entryModifiers) { + return true; + } + if (entryModifiers.ctrl !== undefined && entryModifiers.ctrl !== (conditionModifiers?.ctrl ?? false)) { + return false; + } + if (entryModifiers.shift !== undefined && entryModifiers.shift !== (conditionModifiers?.shift ?? false)) { + return false; + } + if (entryModifiers.alt !== undefined && entryModifiers.alt !== (conditionModifiers?.alt ?? false)) { + return false; + } + return true; + } + /** * ------------ Speed ---------------- * Speed defines the amount of camera movement expected per input pixel movement diff --git a/packages/dev/core/src/Cameras/geospatialCamera.ts b/packages/dev/core/src/Cameras/geospatialCamera.ts index 486cf2d0abf..90babb0ff7a 100644 --- a/packages/dev/core/src/Cameras/geospatialCamera.ts +++ b/packages/dev/core/src/Cameras/geospatialCamera.ts @@ -69,6 +69,9 @@ export class GeospatialCamera extends Camera { this.addBehavior(this._flyingBehavior); this.movement = new GeospatialCameraMovement(scene, this._limits, this.position, this.center, this._lookAtVector, options.pickPredicate, this._flyingBehavior); + this.movement.handlers.flyTo = { + flyTo: (target) => this.flyToPointAsync(target), + }; this._resetToDefault(this._limits); this.inputs = new GeospatialCameraInputsManager(this); diff --git a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts index febc41592fa..645eae3103b 100644 --- a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts +++ b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts @@ -12,6 +12,65 @@ import type { PickingInfo } from "../Collisions/pickingInfo"; import type { Nullable } from "../types"; import type { InterpolatingBehavior } from "../Behaviors/Cameras/interpolatingBehavior"; import type { GeospatialCamera } from "./geospatialCamera"; +import type { InputMapEntry } from "./cameraInteractions"; + +// ── Geospatial handler types ──────────────────────────────────────── + +/** + * Handler for geospatial pan (globe drag) interactions. + * Pan uses screen coordinates because the geospatial camera anchors the cursor to the globe surface. + */ +export type GeospatialPanHandler = { + /** Begin a pan gesture at screen position */ + start(screenX: number, screenY: number): void; + /** Continue panning to new screen position */ + update(screenX: number, screenY: number): void; + /** End the pan gesture */ + stop(): void; +}; + +/** + * Handler for geospatial rotate (tilt) interactions. + * Accepts pre-scaled pixel deltas for yaw and pitch. + */ +export type GeospatialRotateHandler = { + /** Apply rotation from pixel deltas (pre-scaled by input sensitivity) */ + update(deltaX: number, deltaY: number): void; +}; + +/** + * Handler for geospatial zoom interactions. + */ +export type GeospatialZoomHandler = { + /** Zoom by a delta value, optionally toward cursor position */ + zoomByDelta(delta: number, toCursor: boolean): void; +}; + +/** + * Handler for geospatial fly-to interactions. + */ +export type GeospatialFlyToHandler = { + /** Animate the camera to a target point on the globe */ + flyTo(target: Vector3): Promise; +}; + +/** + * Handler shape for geospatial camera interactions. + * Property names are the canonical interaction type strings used in inputMap entries. + */ +export type GeospatialHandlers = { + /** Handler for pan (globe drag) interactions */ + pan: GeospatialPanHandler; + /** Handler for rotate (tilt) interactions */ + rotate: GeospatialRotateHandler; + /** Handler for zoom interactions */ + zoom: GeospatialZoomHandler; + /** Handler for fly-to interactions */ + flyTo: GeospatialFlyToHandler; +}; + +/** Interaction type string for geospatial camera, derived from handler property names */ +export type GeospatialInteraction = keyof GeospatialHandlers; /** * Geospatial-specific camera movement system that extends the base movement with @@ -34,6 +93,17 @@ export class GeospatialCameraMovement extends CameraMovement { public zoomToCursor: boolean = true; + /** + * Interaction handlers for geospatial camera. + * Override individual handlers to customize camera behavior without changing input mapping. + */ + public handlers: Partial = {}; + + /** + * Input-to-interaction mapping rules, constrained to valid geospatial interaction types. + */ + public override inputMap: InputMapEntry[] = []; + private _tempPickingRay: Ray; private _hitPointRadius?: number = undefined; @@ -60,6 +130,41 @@ export class GeospatialCameraMovement extends CameraMovement { this.rotationXSpeed = Math.PI / 500; // Move 1/500th of a half circle per pixel this.rotationYSpeed = Math.PI / 500; // Move 1/500th of a half circle per pixel this.zoomSpeed = 2; // Base zoom speed; actual speed is scaled based on altitude + + this.handlers = { + pan: { + start: (screenX, screenY) => { + this.startDrag(screenX, screenY); + }, + update: (screenX, screenY) => { + this.handleDrag(screenX, screenY); + }, + stop: () => { + this.stopDrag(); + }, + }, + rotate: { + update: (deltaX, deltaY) => { + this.rotationAccumulatedPixels.y += deltaX; + this.rotationAccumulatedPixels.x += deltaY; + }, + }, + zoom: { + zoomByDelta: (delta, toCursor) => { + this.handleZoom(delta, toCursor); + }, + }, + }; + + this.inputMap = [ + { source: "pointer", button: 0, interaction: "pan" }, + { source: "pointer", button: 1, interaction: "rotate" }, + { source: "pointer", button: 2, interaction: "rotate" }, + { source: "wheel", interaction: "zoom" }, + { source: "keyboard", modifiers: { ctrl: true }, interaction: "rotate" }, + { source: "keyboard", modifiers: { alt: true }, interaction: "rotate" }, + { source: "keyboard", interaction: "pan" }, + ]; } /** diff --git a/packages/dev/core/src/Cameras/index.ts b/packages/dev/core/src/Cameras/index.ts index 3cf6cc26722..b871d858f6c 100644 --- a/packages/dev/core/src/Cameras/index.ts +++ b/packages/dev/core/src/Cameras/index.ts @@ -20,3 +20,5 @@ export * from "./virtualJoysticksCamera"; export * from "./VR/index"; export * from "./RigModes/index"; export * from "./geospatialCamera"; +export * from "./cameraInteractions"; +export * from "./geospatialCameraMovement"; From 885289e9293aaec9f842debf0e37f075d7c039a7 Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Wed, 25 Mar 2026 16:46:52 -0400 Subject: [PATCH 05/39] introduce arcrotate and simplify handlers api --- camera-input-architecture-proposal.md | 155 ++++++++++-------- .../arcRotateCameraKeyboardMoveInput.ts | 113 +++++++++---- .../Inputs/arcRotateCameraMouseWheelInput.ts | 6 +- .../Inputs/arcRotateCameraPointersInput.ts | 53 ++++-- .../Inputs/geospatialCameraKeyboardInput.ts | 12 +- .../Inputs/geospatialCameraMouseWheelInput.ts | 2 +- .../Inputs/geospatialCameraPointersInput.ts | 6 +- .../dev/core/src/Cameras/arcRotateCamera.ts | 4 + .../src/Cameras/arcRotateCameraMovement.ts | 74 +++++++++ .../dev/core/src/Cameras/geospatialCamera.ts | 4 +- .../src/Cameras/geospatialCameraMovement.ts | 57 ++----- packages/dev/core/src/Cameras/index.ts | 1 + 12 files changed, 319 insertions(+), 168 deletions(-) create mode 100644 packages/dev/core/src/Cameras/arcRotateCameraMovement.ts diff --git a/camera-input-architecture-proposal.md b/camera-input-architecture-proposal.md index 3586642e981..65a229c4ccd 100644 --- a/camera-input-architecture-proposal.md +++ b/camera-input-architecture-proposal.md @@ -96,26 +96,11 @@ class CameraMovement { /** Ordered list of input-to-interaction rules. First match wins. */ public inputMap: InputMapEntry[] = []; - /** Find the interaction type for a given source and conditions */ + /** Find the interaction type for a given source and conditions. Returns "none" if no match. */ public resolveInteraction(source: InputSource, conditions?: InputConditions): string { for (const entry of this.inputMap) { if (entry.source !== source) continue; - // switch narrows the union — each case only checks fields that exist on that variant - switch (entry.source) { - case "pointer": - if (entry.button !== undefined && entry.button !== conditions?.button) continue; - if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) continue; - break; - case "wheel": - if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) continue; - break; - case "touch": - if (entry.touchCount !== undefined && entry.touchCount !== conditions?.touchCount) continue; - break; - case "keyboard": - if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) continue; - break; - } + if (!this._matchEntry(entry, conditions)) continue; return entry.interaction; } return "none"; @@ -132,68 +117,94 @@ Each camera's movement subclass defines its own `handlers` property with its own ### Geospatial camera ```ts +/** Pan needs a lifecycle (start/update/stop) for globe drag plane setup/teardown */ type GeospatialPanHandler = { start(screenX: number, screenY: number): void; update(screenX: number, screenY: number): void; stop(): void; }; -type GeospatialRotateHandler = { - update(deltaX: number, deltaY: number): void; -}; - -type GeospatialZoomHandler = { - zoomByDelta(delta: number, toCursor: boolean): void; -}; - -type GeospatialFlyToHandler = { - flyTo(target: Vector3): Promise; -}; - +/** Single-method handlers are plain functions */ type GeospatialHandlers = { - pan: GeospatialPanHandler; - rotate: GeospatialRotateHandler; - zoom: GeospatialZoomHandler; - flyTo: GeospatialFlyToHandler; + pan: GeospatialPanHandler; // object — needs lifecycle + rotate: (deltaX: number, deltaY: number) => void; // function — single operation + zoom: (delta: number, toCursor: boolean) => void; // function — single operation + flyTo: (target: Vector3) => Promise; // function — single operation }; class GeospatialCameraMovement extends CameraMovement { public override inputMap: InputMapEntry[] = []; public handlers: Partial = {}; } -// inputMap interaction field only accepts "pan" | "rotate" | "zoom" | "flyTo" -// { interaction: "typo" } is a compile error ``` -### ArcRotateCamera (different handler APIs) +### ArcRotateCamera -```ts -type ArcRotatePanHandler = { - pan(deltaAlpha: number, deltaBeta: number): void; -}; - -type ArcRotateRotateHandler = { - orbit(deltaAlpha: number, deltaBeta: number): void; -}; - -type ArcRotateZoomHandler = { - zoomByRadius(deltaRadius: number): void; -}; +ArcRotateCamera currently has no movement class — inertial offsets (`inertialAlphaOffset`, `inertialBetaOffset`, etc.) live directly on the camera and are applied/decayed in `_checkInputs()`. Introducing `ArcRotateCameraMovement` migrates this to the framerate-independent movement system (PR #18030) while adding the input map + handlers pattern. +```ts +/** All handlers are plain functions — no lifecycle needed */ type ArcRotateHandlers = { - pan: ArcRotatePanHandler; - rotate: ArcRotateRotateHandler; - zoom: ArcRotateZoomHandler; + pan: (deltaX: number, deltaY: number) => void; + rotate: (deltaX: number, deltaY: number) => void; + zoom: (delta: number) => void; }; class ArcRotateCameraMovement extends CameraMovement { public override inputMap: InputMapEntry[] = []; public handlers: Partial = {}; + + constructor(scene: Scene, cameraPosition: Vector3) { + super(scene, cameraPosition); + + this.handlers = { + pan: (deltaX, deltaY) => { + this.panAccumulatedPixels.x += deltaX; + this.panAccumulatedPixels.y += deltaY; + }, + rotate: (deltaX, deltaY) => { + this.rotationAccumulatedPixels.x += deltaX; + this.rotationAccumulatedPixels.y += deltaY; + }, + zoom: (delta) => { + this.zoomAccumulatedPixels += delta; + }, + }; + + this.inputMap = [ + { source: "pointer", button: 0, interaction: "rotate" }, + { source: "pointer", button: 2, interaction: "pan" }, + { source: "wheel", interaction: "zoom" }, + { source: "keyboard", modifiers: { ctrl: true }, interaction: "pan" }, + { source: "keyboard", modifiers: { alt: true }, interaction: "zoom" }, + { source: "keyboard", interaction: "rotate" }, + ]; + } } -// inputMap interaction field only accepts "pan" | "rotate" | "zoom" ``` -The same `"pan"` string in the input map means different things for different cameras — geospatial pan drags the globe with screen coordinates, arc-rotate pan moves by angular offsets. TypeScript ensures each camera's input classes call the correct handler methods. +This is a significant shift from the current ArcRotateCamera: inputs no longer write directly to `camera.inertialAlphaOffset` etc. Instead they write pixel deltas to the movement class's accumulators (`panAccumulatedPixels`, `rotationAccumulatedPixels`, `zoomAccumulatedPixels`), and `computeCurrentFrameDeltas()` converts those to framerate-independent deltas with proper inertia. The camera's `_checkInputs()` reads the resulting `panDeltaCurrentFrame`, `rotationDeltaCurrentFrame`, `zoomDeltaCurrentFrame` and applies them to `alpha`, `beta`, `radius`, and `target`. + +**What this replaces:** +- `_useCtrlForPanning` boolean on `attachControl()` +- `_panningMouseButton` configuration +- `_isPanClick` internal state +- `_ctrlKey && camera._useCtrlForPanning` checks in `onTouch()` +- `useAltToZoom` boolean on keyboard input +- Hardcoded `switch/if` chains in every input class +- The legacy per-frame inertia system (replaced by `CameraMovement.computeCurrentFrameDeltas()`) + +**User override (the forum thread ask — swap pan/rotate):** +```ts +camera.movement.inputMap = [ + { source: "pointer", button: 0, interaction: "pan" }, + { source: "pointer", button: 2, interaction: "rotate" }, + { source: "wheel", interaction: "zoom" }, + { source: "keyboard", modifiers: { ctrl: true }, interaction: "rotate" }, + { source: "keyboard", interaction: "pan" }, +]; +// No new booleans, no CtrlKeyBehaviours enum, no code changes — just data +``` ## Layer 1: Input Mapping @@ -258,9 +269,7 @@ camera.movement.inputMap = [ ```ts // Pointer input onButtonDown(evt) { - this._activeType = this.camera.movement.resolveInteraction("pointer", { - button: evt.button, modifiers: { ctrl: evt.ctrlKey, ... } - }); + this._activeType = this.camera.movement.resolveInteraction("pointer", { button: evt.button }); if (this._activeType === "pan") { this.camera.movement.handlers.pan?.start(scene.pointerX, scene.pointerY); } @@ -270,13 +279,13 @@ onTouch(point, offsetX, offsetY) { if (this._activeType === "pan") { this.camera.movement.handlers.pan?.update(scene.pointerX, scene.pointerY); } else if (this._activeType === "rotate") { - this.camera.movement.handlers.rotate?.update(offsetX, offsetY); + this.camera.movement.handlers.rotate?.(offsetX, offsetY); } } // Wheel input checkInputs() { - this.camera.movement.handlers.zoom?.zoomByDelta(this._wheelDeltaY, true); + this.camera.movement.handlers.zoom?.(this._wheelDeltaY, true); } ``` @@ -331,21 +340,17 @@ A `PanHandler` doesn't care whether the pan was triggered by a mouse drag or a k // flyTo handler wired up by GeospatialCamera constructor // (lives on camera because it calls camera.flyToPointAsync, avoiding circular dependency) -camera.movement.handlers.flyTo = { - flyTo: (target) => camera.flyToPointAsync(target), -}; +camera.movement.handlers.flyTo = (target) => camera.flyToPointAsync(target); ``` ### How inputs call handlers -Inputs resolve their interaction type via `resolveInteraction()` (Layer 1), then call the appropriate handler via `handlers.*`: +Inputs resolve their interaction type via `resolveInteraction()` (Layer 1), then call the appropriate handler via `handlers.*`. Single-method handlers are called directly as functions; multi-method handlers (pan) use their method names: ```ts -// Pointer input — pan gesture +// Pointer input — pan gesture (object handler with lifecycle) onButtonDown(evt) { - this._activeType = this.camera.movement.resolveInteraction("pointer", { - button: evt.button, modifiers: { ctrl: evt.ctrlKey, ... } - }); + this._activeType = this.camera.movement.resolveInteraction("pointer", { button: evt.button }); if (this._activeType === "pan") { this.camera.movement.handlers.pan?.start(scene.pointerX, scene.pointerY); } @@ -355,7 +360,7 @@ onTouch(point, offsetX, offsetY) { if (this._activeType === "pan") { this.camera.movement.handlers.pan?.update(scene.pointerX, scene.pointerY); } else if (this._activeType === "rotate") { - this.camera.movement.handlers.rotate?.update(offsetX, offsetY); + this.camera.movement.handlers.rotate?.(offsetX, offsetY); // direct function call } } @@ -365,11 +370,16 @@ onButtonUp(evt) { } } -// Double-tap — flyTo +// Wheel input — direct function call +checkInputs() { + this.camera.movement.handlers.zoom?.(this._wheelDeltaY, true); +} + +// Double-tap — direct function call onDoubleTap() { const pickResult = scene.pick(scene.pointerX, scene.pointerY); if (pickResult.pickedPoint) { - this.camera.movement.handlers.flyTo?.flyTo(pickResult.pickedPoint); + this.camera.movement.handlers.flyTo?.(pickResult.pickedPoint); } } ``` @@ -378,13 +388,16 @@ onDoubleTap() { ```ts // "I want right-click to orbit around the picked point, not the camera target" -camera.movement.handlers.rotate = new OrbitAroundPickPointHandler(camera); +// Just assign a function that implements (deltaX, deltaY) => void +camera.movement.handlers.rotate = (deltaX, deltaY) => { + myCustomOrbitLogic(camera, deltaX, deltaY); +}; // Input mapping unchanged — still maps right-click to "rotate" -// OrbitAroundPickPointHandler must implement GeospatialRotateHandler ``` ```ts // "I want pan to have inertia" +// Pan is an object with start/update/stop — replace the whole object camera.movement.handlers.pan = new InertiaPanHandler(camera); // Must implement GeospatialPanHandler (start/update/stop with screen coords) ``` diff --git a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts index 17660aa0388..65352fdb2e9 100644 --- a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts @@ -9,6 +9,7 @@ import type { KeyboardInfo } from "../../Events/keyboardEvents"; import { KeyboardEventTypes } from "../../Events/keyboardEvents"; import { Tools } from "../../Misc/tools"; import type { AbstractEngine } from "../../Engines/abstractEngine"; +import type { InputConditions } from "../cameraInteractions"; /** * Manage the keyboard inputs to control the movement of an arc rotate camera. @@ -86,6 +87,9 @@ export class ArcRotateCameraKeyboardMoveInput implements ICameraInput, offsetX: number, offsetY: number): void { - if (this.panningSensibility !== 0 && ((this._ctrlKey && this.camera._useCtrlForPanning) || this._isPanClick)) { - this.camera.inertialPanningX += -offsetX / this.panningSensibility; - this.camera.inertialPanningY += offsetY / this.panningSensibility; + if (this.camera.movement) { + if (this._activeType === "pan" && this.panningSensibility !== 0) { + this.camera.movement.handlers.pan?.(-offsetX / this.panningSensibility, offsetY / this.panningSensibility); + } else if (this._activeType === "rotate") { + this.camera.movement.handlers.rotate?.(-offsetX / this.angularSensibilityX, -offsetY / this.angularSensibilityY); + } } else { - this.camera.inertialAlphaOffset -= offsetX / this.angularSensibilityX; - this.camera.inertialBetaOffset -= offsetY / this.angularSensibilityY; + if (this.panningSensibility !== 0 && ((this._ctrlKey && this.camera._useCtrlForPanning) || this._isPanClick)) { + this.camera.inertialPanningX += -offsetX / this.panningSensibility; + this.camera.inertialPanningY += offsetY / this.panningSensibility; + } else { + this.camera.inertialAlphaOffset -= offsetX / this.angularSensibilityX; + this.camera.inertialBetaOffset -= offsetY / this.angularSensibilityY; + } } } @@ -171,7 +197,11 @@ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput { * @param evt Defines the event to track */ public override onButtonDown(evt: IPointerEvent): void { - this._isPanClick = evt.button === this.camera._panningMouseButton; + if (this.camera.movement) { + this._activeType = this.camera.movement.resolveInteraction("pointer", { button: evt.button }); + } else { + this._isPanClick = evt.button === this.camera._panningMouseButton; + } super.onButtonDown(evt); } @@ -181,6 +211,8 @@ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput { * @param _evt Defines the event to track */ public override onButtonUp(_evt: IPointerEvent): void { + this._activeType = "none"; + this._isPanClick = false; super.onButtonUp(_evt); } @@ -188,6 +220,7 @@ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput { * Called when window becomes inactive. */ public override onLostFocus(): void { + this._activeType = "none"; this._isPanClick = false; super.onLostFocus(); } diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index 12eb83e8dde..bd6985721a4 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -198,11 +198,11 @@ export class GeospatialCameraKeyboardInput implements ICameraInput void; diff --git a/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts new file mode 100644 index 00000000000..8ad0abf7a91 --- /dev/null +++ b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts @@ -0,0 +1,74 @@ +import { CameraMovement } from "./cameraMovement"; +import type { Scene } from "../scene"; +import type { Vector3 } from "../Maths/math.vector"; +import type { InterpolatingBehavior } from "../Behaviors/Cameras/interpolatingBehavior"; +import type { ArcRotateCamera } from "./arcRotateCamera"; +import type { InputMapEntry } from "./cameraInteractions"; + +// ── ArcRotate handler types ──────────────────────────────────────── + +/** + * Handler shape for arc-rotate camera interactions. + * Property names are the canonical interaction type strings used in inputMap entries. + * All handlers are plain functions since none need multi-method lifecycle. + */ +export type ArcRotateHandlers = { + /** Pan by pre-scaled pixel deltas */ + pan: (deltaX: number, deltaY: number) => void; + /** Orbit by pre-scaled pixel deltas */ + rotate: (deltaX: number, deltaY: number) => void; + /** Zoom by a pre-computed delta (already scaled by input) */ + zoom: (delta: number) => void; +}; + +/** Interaction type string for arc-rotate camera, derived from handler property names */ +export type ArcRotateInteraction = keyof ArcRotateHandlers; + +/** + * Arc-rotate camera movement system that extends the base movement with + * the input mapping and handler pattern. + * + * Default handlers accumulate pixel deltas into the base class accumulators + * (panAccumulatedPixels, rotationAccumulatedPixels, zoomAccumulatedPixels). + * The base class's computeCurrentFrameDeltas() converts these to framerate-independent + * deltas with proper inertia, which the camera reads each frame. + */ +export class ArcRotateCameraMovement extends CameraMovement { + /** + * Interaction handlers for arc-rotate camera. + * Override individual handlers to customize camera behavior without changing input mapping. + */ + public handlers: Partial = {}; + + /** + * Input-to-interaction mapping rules, constrained to valid arc-rotate interaction types. + */ + public override inputMap: InputMapEntry[] = []; + + constructor(scene: Scene, cameraPosition: Vector3, behavior?: InterpolatingBehavior) { + super(scene, cameraPosition, behavior); + + this.handlers = { + pan: (deltaX, deltaY) => { + this.panAccumulatedPixels.x += deltaX; + this.panAccumulatedPixels.y += deltaY; + }, + rotate: (deltaX, deltaY) => { + this.rotationAccumulatedPixels.x += deltaX; + this.rotationAccumulatedPixels.y += deltaY; + }, + zoom: (delta) => { + this.zoomAccumulatedPixels += delta; + }, + }; + + this.inputMap = [ + { source: "pointer", button: 0, interaction: "rotate" }, + { source: "pointer", button: 2, interaction: "pan" }, + { source: "wheel", interaction: "zoom" }, + { source: "keyboard", modifiers: { ctrl: true }, interaction: "pan" }, + { source: "keyboard", modifiers: { alt: true }, interaction: "zoom" }, + { source: "keyboard", interaction: "rotate" }, + ]; + } +} diff --git a/packages/dev/core/src/Cameras/geospatialCamera.ts b/packages/dev/core/src/Cameras/geospatialCamera.ts index 90babb0ff7a..c35d046ecb5 100644 --- a/packages/dev/core/src/Cameras/geospatialCamera.ts +++ b/packages/dev/core/src/Cameras/geospatialCamera.ts @@ -69,9 +69,7 @@ export class GeospatialCamera extends Camera { this.addBehavior(this._flyingBehavior); this.movement = new GeospatialCameraMovement(scene, this._limits, this.position, this.center, this._lookAtVector, options.pickPredicate, this._flyingBehavior); - this.movement.handlers.flyTo = { - flyTo: (target) => this.flyToPointAsync(target), - }; + this.movement.handlers.flyTo = (target) => this.flyToPointAsync(target); this._resetToDefault(this._limits); this.inputs = new GeospatialCameraInputsManager(this); diff --git a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts index 645eae3103b..56d4fbc1e57 100644 --- a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts +++ b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts @@ -18,7 +18,8 @@ import type { InputMapEntry } from "./cameraInteractions"; /** * Handler for geospatial pan (globe drag) interactions. - * Pan uses screen coordinates because the geospatial camera anchors the cursor to the globe surface. + * Pan uses screen coordinates and needs a lifecycle (start/update/stop) because + * it establishes a drag plane on the globe surface to anchor the cursor. */ export type GeospatialPanHandler = { /** Begin a pan gesture at screen position */ @@ -29,44 +30,20 @@ export type GeospatialPanHandler = { stop(): void; }; -/** - * Handler for geospatial rotate (tilt) interactions. - * Accepts pre-scaled pixel deltas for yaw and pitch. - */ -export type GeospatialRotateHandler = { - /** Apply rotation from pixel deltas (pre-scaled by input sensitivity) */ - update(deltaX: number, deltaY: number): void; -}; - -/** - * Handler for geospatial zoom interactions. - */ -export type GeospatialZoomHandler = { - /** Zoom by a delta value, optionally toward cursor position */ - zoomByDelta(delta: number, toCursor: boolean): void; -}; - -/** - * Handler for geospatial fly-to interactions. - */ -export type GeospatialFlyToHandler = { - /** Animate the camera to a target point on the globe */ - flyTo(target: Vector3): Promise; -}; - /** * Handler shape for geospatial camera interactions. * Property names are the canonical interaction type strings used in inputMap entries. + * Single-method handlers are plain functions; multi-method handlers (pan) are objects. */ export type GeospatialHandlers = { - /** Handler for pan (globe drag) interactions */ + /** Handler for pan (globe drag) interactions — object because it needs start/update/stop lifecycle */ pan: GeospatialPanHandler; - /** Handler for rotate (tilt) interactions */ - rotate: GeospatialRotateHandler; - /** Handler for zoom interactions */ - zoom: GeospatialZoomHandler; - /** Handler for fly-to interactions */ - flyTo: GeospatialFlyToHandler; + /** Handler for rotate (tilt) interactions — accepts pre-scaled pixel deltas (deltaX, deltaY) */ + rotate: (deltaX: number, deltaY: number) => void; + /** Handler for zoom interactions — accepts delta and whether to zoom toward cursor */ + zoom: (delta: number, toCursor: boolean) => void; + /** Handler for fly-to interactions — animates camera to target point */ + flyTo: (target: Vector3) => Promise; }; /** Interaction type string for geospatial camera, derived from handler property names */ @@ -143,16 +120,12 @@ export class GeospatialCameraMovement extends CameraMovement { this.stopDrag(); }, }, - rotate: { - update: (deltaX, deltaY) => { - this.rotationAccumulatedPixels.y += deltaX; - this.rotationAccumulatedPixels.x += deltaY; - }, + rotate: (deltaX, deltaY) => { + this.rotationAccumulatedPixels.y += deltaX; + this.rotationAccumulatedPixels.x += deltaY; }, - zoom: { - zoomByDelta: (delta, toCursor) => { - this.handleZoom(delta, toCursor); - }, + zoom: (delta, toCursor) => { + this.handleZoom(delta, toCursor); }, }; diff --git a/packages/dev/core/src/Cameras/index.ts b/packages/dev/core/src/Cameras/index.ts index b871d858f6c..0ab309d83f8 100644 --- a/packages/dev/core/src/Cameras/index.ts +++ b/packages/dev/core/src/Cameras/index.ts @@ -22,3 +22,4 @@ export * from "./RigModes/index"; export * from "./geospatialCamera"; export * from "./cameraInteractions"; export * from "./geospatialCameraMovement"; +export * from "./arcRotateCameraMovement"; From 744b7f1335f29928d70a2be7fc4d39984f5529e8 Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Wed, 25 Mar 2026 17:00:33 -0400 Subject: [PATCH 06/39] nonpartial --- packages/dev/core/src/Cameras/arcRotateCameraMovement.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts index 8ad0abf7a91..9edc7ac603b 100644 --- a/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts +++ b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts @@ -38,7 +38,7 @@ export class ArcRotateCameraMovement extends CameraMovement { * Interaction handlers for arc-rotate camera. * Override individual handlers to customize camera behavior without changing input mapping. */ - public handlers: Partial = {}; + public handlers: ArcRotateHandlers; /** * Input-to-interaction mapping rules, constrained to valid arc-rotate interaction types. From 055df6f70a33c5c1f9d61cadac0cd18252be727e Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Wed, 25 Mar 2026 17:34:02 -0400 Subject: [PATCH 07/39] remove partial --- camera-input-architecture-proposal.md | 63 +++++++++---------- .../arcRotateCameraKeyboardMoveInput.ts | 20 +++--- .../Inputs/arcRotateCameraMouseWheelInput.ts | 2 +- .../Inputs/arcRotateCameraPointersInput.ts | 10 +-- .../Inputs/geospatialCameraKeyboardInput.ts | 24 +++---- .../Inputs/geospatialCameraMouseWheelInput.ts | 2 +- .../Inputs/geospatialCameraPointersInput.ts | 12 ++-- .../dev/core/src/Cameras/geospatialCamera.ts | 1 - .../src/Cameras/geospatialCameraMovement.ts | 4 +- 9 files changed, 65 insertions(+), 73 deletions(-) diff --git a/camera-input-architecture-proposal.md b/camera-input-architecture-proposal.md index 65a229c4ccd..903d8d16077 100644 --- a/camera-input-architecture-proposal.md +++ b/camera-input-architecture-proposal.md @@ -69,23 +69,28 @@ type InputModifiers = { ctrl?: boolean; shift?: boolean; alt?: boolean }; * exists on pointer entries, `touchCount` only on touch entries. */ type PointerInputMapEntry = { - source: "pointer"; interaction: T; button?: number; modifiers?: InputModifiers; + source: "pointer"; + interaction: T; + button?: number; + modifiers?: InputModifiers; }; type WheelInputMapEntry = { - source: "wheel"; interaction: T; modifiers?: InputModifiers; + source: "wheel"; + interaction: T; + modifiers?: InputModifiers; }; type TouchInputMapEntry = { - source: "touch"; interaction: T; touchCount?: number; + source: "touch"; + interaction: T; + touchCount?: number; }; type KeyboardInputMapEntry = { - source: "keyboard"; interaction: T; modifiers?: InputModifiers; + source: "keyboard"; + interaction: T; + modifiers?: InputModifiers; }; -type InputMapEntry = - | PointerInputMapEntry - | WheelInputMapEntry - | TouchInputMapEntry - | KeyboardInputMapEntry; +type InputMapEntry = PointerInputMapEntry | WheelInputMapEntry | TouchInputMapEntry | KeyboardInputMapEntry; // { source: "pointer", button: 0, touchCount: 1 } → compile error (touchCount not on pointer) ``` @@ -126,15 +131,14 @@ type GeospatialPanHandler = { /** Single-method handlers are plain functions */ type GeospatialHandlers = { - pan: GeospatialPanHandler; // object — needs lifecycle - rotate: (deltaX: number, deltaY: number) => void; // function — single operation - zoom: (delta: number, toCursor: boolean) => void; // function — single operation - flyTo: (target: Vector3) => Promise; // function — single operation + pan: GeospatialPanHandler; // object — needs lifecycle + rotate: (deltaX: number, deltaY: number) => void; // function — single operation + zoom: (delta: number, toCursor: boolean) => void; // function — single operation }; class GeospatialCameraMovement extends CameraMovement { public override inputMap: InputMapEntry[] = []; - public handlers: Partial = {}; + public handlers: GeospatialHandlers; } ``` @@ -172,12 +176,12 @@ class ArcRotateCameraMovement extends CameraMovement { }; this.inputMap = [ - { source: "pointer", button: 0, interaction: "rotate" }, - { source: "pointer", button: 2, interaction: "pan" }, - { source: "wheel", interaction: "zoom" }, + { source: "pointer", button: 0, interaction: "rotate" }, + { source: "pointer", button: 2, interaction: "pan" }, + { source: "wheel", interaction: "zoom" }, { source: "keyboard", modifiers: { ctrl: true }, interaction: "pan" }, - { source: "keyboard", modifiers: { alt: true }, interaction: "zoom" }, - { source: "keyboard", interaction: "rotate" }, + { source: "keyboard", modifiers: { alt: true }, interaction: "zoom" }, + { source: "keyboard", interaction: "rotate" }, ]; } } @@ -186,6 +190,7 @@ class ArcRotateCameraMovement extends CameraMovement { This is a significant shift from the current ArcRotateCamera: inputs no longer write directly to `camera.inertialAlphaOffset` etc. Instead they write pixel deltas to the movement class's accumulators (`panAccumulatedPixels`, `rotationAccumulatedPixels`, `zoomAccumulatedPixels`), and `computeCurrentFrameDeltas()` converts those to framerate-independent deltas with proper inertia. The camera's `_checkInputs()` reads the resulting `panDeltaCurrentFrame`, `rotationDeltaCurrentFrame`, `zoomDeltaCurrentFrame` and applies them to `alpha`, `beta`, `radius`, and `target`. **What this replaces:** + - `_useCtrlForPanning` boolean on `attachControl()` - `_panningMouseButton` configuration - `_isPanClick` internal state @@ -195,13 +200,14 @@ This is a significant shift from the current ArcRotateCamera: inputs no longer w - The legacy per-frame inertia system (replaced by `CameraMovement.computeCurrentFrameDeltas()`) **User override (the forum thread ask — swap pan/rotate):** + ```ts camera.movement.inputMap = [ - { source: "pointer", button: 0, interaction: "pan" }, - { source: "pointer", button: 2, interaction: "rotate" }, - { source: "wheel", interaction: "zoom" }, + { source: "pointer", button: 0, interaction: "pan" }, + { source: "pointer", button: 2, interaction: "rotate" }, + { source: "wheel", interaction: "zoom" }, { source: "keyboard", modifiers: { ctrl: true }, interaction: "rotate" }, - { source: "keyboard", interaction: "pan" }, + { source: "keyboard", interaction: "pan" }, ]; // No new booleans, no CtrlKeyBehaviours enum, no code changes — just data ``` @@ -337,10 +343,6 @@ A `PanHandler` doesn't care whether the pan was triggered by a mouse drag or a k ```ts // Pan, rotate, zoom handlers set up by GeospatialCameraMovement constructor // (delegates to existing movement methods: startDrag, handleDrag, stopDrag, handleZoom, etc.) - -// flyTo handler wired up by GeospatialCamera constructor -// (lives on camera because it calls camera.flyToPointAsync, avoiding circular dependency) -camera.movement.handlers.flyTo = (target) => camera.flyToPointAsync(target); ``` ### How inputs call handlers @@ -375,13 +377,6 @@ checkInputs() { this.camera.movement.handlers.zoom?.(this._wheelDeltaY, true); } -// Double-tap — direct function call -onDoubleTap() { - const pickResult = scene.pick(scene.pointerX, scene.pointerY); - if (pickResult.pickedPoint) { - this.camera.movement.handlers.flyTo?.(pickResult.pickedPoint); - } -} ``` ### User override (custom mechanics) diff --git a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts index 65352fdb2e9..7a9627804fa 100644 --- a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts @@ -198,29 +198,29 @@ export class ArcRotateCameraKeyboardMoveInput implements ICameraInput, offsetX: number, offsetY: number): void { if (this.camera.movement) { if (this._activeType === "pan" && this.panningSensibility !== 0) { - this.camera.movement.handlers.pan?.(-offsetX / this.panningSensibility, offsetY / this.panningSensibility); + this.camera.movement.handlers.pan(-offsetX / this.panningSensibility, offsetY / this.panningSensibility); } else if (this._activeType === "rotate") { - this.camera.movement.handlers.rotate?.(-offsetX / this.angularSensibilityX, -offsetY / this.angularSensibilityY); + this.camera.movement.handlers.rotate(-offsetX / this.angularSensibilityX, -offsetY / this.angularSensibilityY); } } else { if (this.panningSensibility !== 0 && ((this._ctrlKey && this.camera._useCtrlForPanning) || this._isPanClick)) { diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index bd6985721a4..bae1f8ad4a6 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -198,11 +198,11 @@ export class GeospatialCameraKeyboardInput implements ICameraInput this.flyToPointAsync(target); this._resetToDefault(this._limits); this.inputs = new GeospatialCameraInputsManager(this); diff --git a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts index 56d4fbc1e57..ff97f09eddd 100644 --- a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts +++ b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts @@ -42,8 +42,6 @@ export type GeospatialHandlers = { rotate: (deltaX: number, deltaY: number) => void; /** Handler for zoom interactions — accepts delta and whether to zoom toward cursor */ zoom: (delta: number, toCursor: boolean) => void; - /** Handler for fly-to interactions — animates camera to target point */ - flyTo: (target: Vector3) => Promise; }; /** Interaction type string for geospatial camera, derived from handler property names */ @@ -74,7 +72,7 @@ export class GeospatialCameraMovement extends CameraMovement { * Interaction handlers for geospatial camera. * Override individual handlers to customize camera behavior without changing input mapping. */ - public handlers: Partial = {}; + public handlers: GeospatialHandlers; /** * Input-to-interaction mapping rules, constrained to valid geospatial interaction types. From 3711be50c9fee71a8b91ab7bb3103ff85a75d5af Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Wed, 25 Mar 2026 17:39:46 -0400 Subject: [PATCH 08/39] update doc --- camera-input-architecture-proposal.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/camera-input-architecture-proposal.md b/camera-input-architecture-proposal.md index 903d8d16077..d7076211c87 100644 --- a/camera-input-architecture-proposal.md +++ b/camera-input-architecture-proposal.md @@ -49,7 +49,7 @@ Two composable layers, each answering one question: | ----------------------- | --------------------------------------------------------------------- | -------------------------------------------------- | | **Input** | Physical device event processor (existing concept) | `GeospatialCameraPointersInput` | | **Interaction** | Semantic action the camera performs (new) | `"rotate"`, `"pan"`, `"zoom"` | -| **Input Map Entry** | Declarative rule: source + condition → interaction (new) | `{ source: Pointer, button: 0, interaction: Pan }` | +| **Input Map Entry** | Declarative rule: source + condition → interaction (new) | `{ source: "pointer", button: 0, interaction: "pan" }` | | **Interaction Handler** | Executes a semantic action on the camera (new, typed per interaction) | `GlobeDragHandler`, `TiltHandler` | | **Behavior** | Post-input reactive modifier (existing, unchanged) | `AutoRotationBehavior` | @@ -156,7 +156,7 @@ type ArcRotateHandlers = { class ArcRotateCameraMovement extends CameraMovement { public override inputMap: InputMapEntry[] = []; - public handlers: Partial = {}; + public handlers: ArcRotateHandlers; constructor(scene: Scene, cameraPosition: Vector3) { super(scene, cameraPosition); @@ -277,21 +277,21 @@ camera.movement.inputMap = [ onButtonDown(evt) { this._activeType = this.camera.movement.resolveInteraction("pointer", { button: evt.button }); if (this._activeType === "pan") { - this.camera.movement.handlers.pan?.start(scene.pointerX, scene.pointerY); + this.camera.movement.handlers.pan.start(scene.pointerX, scene.pointerY); } } onTouch(point, offsetX, offsetY) { if (this._activeType === "pan") { - this.camera.movement.handlers.pan?.update(scene.pointerX, scene.pointerY); + this.camera.movement.handlers.pan.update(scene.pointerX, scene.pointerY); } else if (this._activeType === "rotate") { - this.camera.movement.handlers.rotate?.(offsetX, offsetY); + this.camera.movement.handlers.rotate(offsetX, offsetY); } } // Wheel input checkInputs() { - this.camera.movement.handlers.zoom?.(this._wheelDeltaY, true); + this.camera.movement.handlers.zoom(this._wheelDeltaY, true); } ``` @@ -354,27 +354,27 @@ Inputs resolve their interaction type via `resolveInteraction()` (Layer 1), then onButtonDown(evt) { this._activeType = this.camera.movement.resolveInteraction("pointer", { button: evt.button }); if (this._activeType === "pan") { - this.camera.movement.handlers.pan?.start(scene.pointerX, scene.pointerY); + this.camera.movement.handlers.pan.start(scene.pointerX, scene.pointerY); } } onTouch(point, offsetX, offsetY) { if (this._activeType === "pan") { - this.camera.movement.handlers.pan?.update(scene.pointerX, scene.pointerY); + this.camera.movement.handlers.pan.update(scene.pointerX, scene.pointerY); } else if (this._activeType === "rotate") { - this.camera.movement.handlers.rotate?.(offsetX, offsetY); // direct function call + this.camera.movement.handlers.rotate(offsetX, offsetY); // direct function call } } onButtonUp(evt) { if (this._activeType === "pan") { - this.camera.movement.handlers.pan?.stop(); + this.camera.movement.handlers.pan.stop(); } } // Wheel input — direct function call checkInputs() { - this.camera.movement.handlers.zoom?.(this._wheelDeltaY, true); + this.camera.movement.handlers.zoom(this._wheelDeltaY, true); } ``` From 078af0e850ec12b349544841e8ee5dd50725ff37 Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Tue, 31 Mar 2026 12:59:21 -0400 Subject: [PATCH 09/39] Task 01: Add resetInputMap() to CameraMovement base class and subclasses Add a public resetInputMap() method to the CameraMovement base class (resets to empty array) and override it in ArcRotateCameraMovement and GeospatialCameraMovement to restore their camera-type default inputMap configurations. Extract default inputMap construction into private _createDefaultInputMap() methods to avoid duplication between constructors and resetInputMap(). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../core/src/Cameras/arcRotateCameraMovement.ts | 14 +++++++++++++- packages/dev/core/src/Cameras/cameraMovement.ts | 9 +++++++++ .../core/src/Cameras/geospatialCameraMovement.ts | 14 +++++++++++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts index 9edc7ac603b..f656f525ef4 100644 --- a/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts +++ b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts @@ -62,7 +62,19 @@ export class ArcRotateCameraMovement extends CameraMovement { }, }; - this.inputMap = [ + this.resetInputMap(); + } + + /** + * Restores the inputMap to the default ArcRotateCamera configuration: + * left-click rotate, right-click pan, wheel zoom, ctrl+keyboard pan, alt+keyboard zoom, keyboard rotate. + */ + public override resetInputMap(): void { + this.inputMap = this._createDefaultInputMap(); + } + + private _createDefaultInputMap(): InputMapEntry[] { + return [ { source: "pointer", button: 0, interaction: "rotate" }, { source: "pointer", button: 2, interaction: "pan" }, { source: "wheel", interaction: "zoom" }, diff --git a/packages/dev/core/src/Cameras/cameraMovement.ts b/packages/dev/core/src/Cameras/cameraMovement.ts index 1d9aeac39d7..3291003aa46 100644 --- a/packages/dev/core/src/Cameras/cameraMovement.ts +++ b/packages/dev/core/src/Cameras/cameraMovement.ts @@ -78,6 +78,15 @@ export class CameraMovement { return "none"; } + /** + * Restores the inputMap to the default configuration for this camera type. + * The base class resets to an empty array. Subclasses override this to restore + * their camera-specific default mappings. + */ + public resetInputMap(): void { + this.inputMap = []; + } + private _matchModifiers(entryModifiers?: InputModifiers, conditionModifiers?: InputModifiers): boolean { if (!entryModifiers) { return true; diff --git a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts index ff97f09eddd..eb2eb06eb15 100644 --- a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts +++ b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts @@ -127,7 +127,19 @@ export class GeospatialCameraMovement extends CameraMovement { }, }; - this.inputMap = [ + this.resetInputMap(); + } + + /** + * Restores the inputMap to the default GeospatialCamera configuration: + * left-click pan, middle/right-click rotate, wheel zoom, ctrl/alt+keyboard rotate, keyboard pan. + */ + public override resetInputMap(): void { + this.inputMap = this._createDefaultInputMap(); + } + + private _createDefaultInputMap(): InputMapEntry[] { + return [ { source: "pointer", button: 0, interaction: "pan" }, { source: "pointer", button: 1, interaction: "rotate" }, { source: "pointer", button: 2, interaction: "rotate" }, From 4016fa6d905bf85e83e40c54f0fd262f4168d9b4 Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Tue, 31 Mar 2026 13:06:40 -0400 Subject: [PATCH 10/39] Task 02: Add useMovementSystem flag to ArcRotateCamera and wire computeCurrentFrameDeltas Add useMovementSystem getter/setter that creates ArcRotateCameraMovement on demand. Modify _checkInputs() to branch on this.movement: when enabled, call computeCurrentFrameDeltas() and apply rotation/zoom/pan deltas to alpha/beta/radius/target; when disabled (default), use the unchanged legacy inertial offset path. The panning logic mirrors the legacy path (view matrix inverse, panningAxis, mapPanning, panningDistanceLimit). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../dev/core/src/Cameras/arcRotateCamera.ts | 206 ++++++++++++------ 1 file changed, 145 insertions(+), 61 deletions(-) diff --git a/packages/dev/core/src/Cameras/arcRotateCamera.ts b/packages/dev/core/src/Cameras/arcRotateCamera.ts index c5bd68b4d7f..cfcc1733034 100644 --- a/packages/dev/core/src/Cameras/arcRotateCamera.ts +++ b/packages/dev/core/src/Cameras/arcRotateCamera.ts @@ -601,6 +601,27 @@ export class ArcRotateCamera extends TargetCamera { /** Movement controller that turns input pixel deltas into framerate-independent deltas. When undefined, legacy inertial system is used. */ public movement?: ArcRotateCameraMovement; + private _useMovementSystem: boolean = false; + + /** + * When set to true, creates an ArcRotateCameraMovement instance and enables the declarative + * input mapping system (inputMap + resolveInteraction + handlers). When false (default), + * the camera uses the legacy inertial offset system. + */ + public get useMovementSystem(): boolean { + return this._useMovementSystem; + } + + public set useMovementSystem(value: boolean) { + if (value && !this.movement) { + this.movement = new ArcRotateCameraMovement(this.getScene(), this._position); + this._useMovementSystem = true; + } else if (!value) { + this.movement = undefined; + this._useMovementSystem = false; + } + } + /** @internal */ public override _reset: () => void; @@ -1046,83 +1067,146 @@ export class ArcRotateCamera extends TargetCamera { this.inputs.checkInputs(); let hasUserInteractions = false; - // Inertia - if (this.inertialAlphaOffset !== 0 || this.inertialBetaOffset !== 0 || this.inertialRadiusOffset !== 0) { - hasUserInteractions = true; + if (this.movement) { + // Movement system path: framerate-independent deltas + this.movement.computeCurrentFrameDeltas(); - const directionModifier = this.invertRotation ? -1 : 1; - const handednessMultiplier = this._calculateHandednessMultiplier(); - let inertialAlphaOffset = this.inertialAlphaOffset * handednessMultiplier; + const rotDelta = this.movement.rotationDeltaCurrentFrame; + const zoomDelta = this.movement.zoomDeltaCurrentFrame; + const panDelta = this.movement.panDeltaCurrentFrame; - if (this.beta < 0) { - inertialAlphaOffset *= -1; - } + if (rotDelta.x !== 0 || rotDelta.y !== 0 || zoomDelta !== 0 || panDelta.x !== 0 || panDelta.y !== 0) { + hasUserInteractions = true; - this.alpha += inertialAlphaOffset * directionModifier; - this.beta += this.inertialBetaOffset * directionModifier; + // Apply rotation + const directionModifier = this.invertRotation ? -1 : 1; + const handednessMultiplier = this._calculateHandednessMultiplier(); + let alphaOffset = rotDelta.x * handednessMultiplier; - this.radius -= this.inertialRadiusOffset; - this.inertialAlphaOffset *= this.inertia; - this.inertialBetaOffset *= this.inertia; - this.inertialRadiusOffset *= this.inertia; - if (Math.abs(this.inertialAlphaOffset) < this._rotationEpsilon) { - this.inertialAlphaOffset = 0; - } - if (Math.abs(this.inertialBetaOffset) < this._rotationEpsilon) { - this.inertialBetaOffset = 0; - } - if (Math.abs(this.inertialRadiusOffset) < this.speed * this._rotationEpsilon) { - this.inertialRadiusOffset = 0; - } - } + if (this.beta < 0) { + alphaOffset *= -1; + } - // Panning inertia - if (this.inertialPanningX !== 0 || this.inertialPanningY !== 0) { - hasUserInteractions = true; + this.alpha += alphaOffset * directionModifier; + this.beta += rotDelta.y * directionModifier; - const localDirection = new Vector3(this.inertialPanningX, this.inertialPanningY, this.inertialPanningY); + // Apply zoom + this.radius -= zoomDelta; - this._viewMatrix.invertToRef(this._cameraTransformMatrix); - localDirection.multiplyInPlace(this.panningAxis); - Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection); + // Apply panning + if (panDelta.x !== 0 || panDelta.y !== 0) { + const localDirection = TmpVectors.Vector3[0].copyFromFloats(panDelta.x, panDelta.y, panDelta.y); - // If mapPanning is enabled, we need to take the upVector into account and - // make sure we're not panning in the y direction - if (this.mapPanning) { - const up = this.upVector; - const right = Vector3.CrossToRef(this._transformedDirection, up, this._transformedDirection); - Vector3.CrossToRef(up, right, this._transformedDirection); - } else if (!this.panningAxis.y) { - this._transformedDirection.y = 0; - } + this._viewMatrix.invertToRef(this._cameraTransformMatrix); + localDirection.multiplyInPlace(this.panningAxis); + Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection); - if (!this._targetHost) { - if (this.panningDistanceLimit) { - this._transformedDirection.addInPlace(this._target); - const distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget); - if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) { - this._target.copyFrom(this._transformedDirection); + if (this.mapPanning) { + const up = this.upVector; + const right = Vector3.CrossToRef(this._transformedDirection, up, this._transformedDirection); + Vector3.CrossToRef(up, right, this._transformedDirection); + } else if (!this.panningAxis.y) { + this._transformedDirection.y = 0; } - } else { - if (this.parent) { - const m = TmpVectors.Matrix[0]; - this.parent.getWorldMatrix().getRotationMatrixToRef(m); - m.transposeToRef(m); - Vector3.TransformCoordinatesToRef(this._transformedDirection, m, this._transformedDirection); + + if (!this._targetHost) { + if (this.panningDistanceLimit) { + this._transformedDirection.addInPlace(this._target); + const distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget); + if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) { + this._target.copyFrom(this._transformedDirection); + } + } else { + if (this.parent) { + const m = TmpVectors.Matrix[0]; + this.parent.getWorldMatrix().getRotationMatrixToRef(m); + m.transposeToRef(m); + Vector3.TransformCoordinatesToRef(this._transformedDirection, m, this._transformedDirection); + } + this._target.addInPlace(this._transformedDirection); + } } - this._target.addInPlace(this._transformedDirection); } } + } else { + // Legacy inertia path + if (this.inertialAlphaOffset !== 0 || this.inertialBetaOffset !== 0 || this.inertialRadiusOffset !== 0) { + hasUserInteractions = true; - this.inertialPanningX *= this.panningInertia; - this.inertialPanningY *= this.panningInertia; + const directionModifier = this.invertRotation ? -1 : 1; + const handednessMultiplier = this._calculateHandednessMultiplier(); + let inertialAlphaOffset = this.inertialAlphaOffset * handednessMultiplier; - const inertialPanningLimit = this.speed * this._panningEpsilon; - if (Math.abs(this.inertialPanningX) < inertialPanningLimit) { - this.inertialPanningX = 0; + if (this.beta < 0) { + inertialAlphaOffset *= -1; + } + + this.alpha += inertialAlphaOffset * directionModifier; + this.beta += this.inertialBetaOffset * directionModifier; + + this.radius -= this.inertialRadiusOffset; + this.inertialAlphaOffset *= this.inertia; + this.inertialBetaOffset *= this.inertia; + this.inertialRadiusOffset *= this.inertia; + if (Math.abs(this.inertialAlphaOffset) < this._rotationEpsilon) { + this.inertialAlphaOffset = 0; + } + if (Math.abs(this.inertialBetaOffset) < this._rotationEpsilon) { + this.inertialBetaOffset = 0; + } + if (Math.abs(this.inertialRadiusOffset) < this.speed * this._rotationEpsilon) { + this.inertialRadiusOffset = 0; + } } - if (Math.abs(this.inertialPanningY) < inertialPanningLimit) { - this.inertialPanningY = 0; + + // Panning inertia + if (this.inertialPanningX !== 0 || this.inertialPanningY !== 0) { + hasUserInteractions = true; + + const localDirection = new Vector3(this.inertialPanningX, this.inertialPanningY, this.inertialPanningY); + + this._viewMatrix.invertToRef(this._cameraTransformMatrix); + localDirection.multiplyInPlace(this.panningAxis); + Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection); + + // If mapPanning is enabled, we need to take the upVector into account and + // make sure we're not panning in the y direction + if (this.mapPanning) { + const up = this.upVector; + const right = Vector3.CrossToRef(this._transformedDirection, up, this._transformedDirection); + Vector3.CrossToRef(up, right, this._transformedDirection); + } else if (!this.panningAxis.y) { + this._transformedDirection.y = 0; + } + + if (!this._targetHost) { + if (this.panningDistanceLimit) { + this._transformedDirection.addInPlace(this._target); + const distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget); + if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) { + this._target.copyFrom(this._transformedDirection); + } + } else { + if (this.parent) { + const m = TmpVectors.Matrix[0]; + this.parent.getWorldMatrix().getRotationMatrixToRef(m); + m.transposeToRef(m); + Vector3.TransformCoordinatesToRef(this._transformedDirection, m, this._transformedDirection); + } + this._target.addInPlace(this._transformedDirection); + } + } + + this.inertialPanningX *= this.panningInertia; + this.inertialPanningY *= this.panningInertia; + + const inertialPanningLimit = this.speed * this._panningEpsilon; + if (Math.abs(this.inertialPanningX) < inertialPanningLimit) { + this.inertialPanningX = 0; + } + if (Math.abs(this.inertialPanningY) < inertialPanningLimit) { + this.inertialPanningY = 0; + } } } From d5cb4fe86b7937d379788ffb635fd7edab77901c Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Tue, 31 Mar 2026 13:08:51 -0400 Subject: [PATCH 11/39] Task 03: Map legacy deprecated flags to inputMap modifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add _syncLegacyFlagsToInputMap() to ArcRotateCamera that applies legacy flag values (_useCtrlForPanning, _panningMouseButton, useAltToZoom) to the movement system's inputMap. Called when useMovementSystem is enabled and when attachControl is called with legacy flag arguments. This ensures backward compatibility: setting _useCtrlForPanning=false before enabling the movement system correctly removes the ctrl+keyboard→pan entry. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../dev/core/src/Cameras/arcRotateCamera.ts | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/packages/dev/core/src/Cameras/arcRotateCamera.ts b/packages/dev/core/src/Cameras/arcRotateCamera.ts index cfcc1733034..839302bf4f7 100644 --- a/packages/dev/core/src/Cameras/arcRotateCamera.ts +++ b/packages/dev/core/src/Cameras/arcRotateCamera.ts @@ -616,12 +616,55 @@ export class ArcRotateCamera extends TargetCamera { if (value && !this.movement) { this.movement = new ArcRotateCameraMovement(this.getScene(), this._position); this._useMovementSystem = true; + this._syncLegacyFlagsToInputMap(); } else if (!value) { this.movement = undefined; this._useMovementSystem = false; } } + /** + * Applies legacy flag values (_useCtrlForPanning, _panningMouseButton, useAltToZoom) + * to the movement system's inputMap. Called when the movement system is enabled or + * when attachControl is called with legacy flag arguments. + */ + private _syncLegacyFlagsToInputMap(): void { + if (!this.movement) { + return; + } + + this.movement.resetInputMap(); + + // Handle _useCtrlForPanning: remove ctrl+keyboard→pan entry when false + if (!this._useCtrlForPanning) { + const idx = this.movement.inputMap.findIndex( + (e) => e.source === "keyboard" && "modifiers" in e && e.modifiers?.ctrl === true && e.interaction === "pan" + ); + if (idx !== -1) { + this.movement.inputMap.splice(idx, 1); + } + } + + // Handle _panningMouseButton: update pointer→pan entry's button when not default (2) + if (this._panningMouseButton !== 2) { + const entry = this.movement.inputMap.find((e) => e.source === "pointer" && e.interaction === "pan"); + if (entry && entry.source === "pointer") { + (entry as { button?: number }).button = this._panningMouseButton; + } + } + + // Handle useAltToZoom: remove alt+keyboard→zoom entry when false + const keyboardInput = this.inputs.attached["keyboard"] as ArcRotateCameraKeyboardMoveInput | undefined; + if (keyboardInput && !keyboardInput.useAltToZoom) { + const idx = this.movement.inputMap.findIndex( + (e) => e.source === "keyboard" && "modifiers" in e && e.modifiers?.alt === true && e.interaction === "zoom" + ); + if (idx !== -1) { + this.movement.inputMap.splice(idx, 1); + } + } + } + /** @internal */ public override _reset: () => void; @@ -1035,6 +1078,10 @@ export class ArcRotateCamera extends TargetCamera { } } + if (this.movement) { + this._syncLegacyFlagsToInputMap(); + } + this.inputs.attachElement(noPreventDefault); this._reset = () => { From 990302621f9ab54755fc97c2437f162f99471b44 Mon Sep 17 00:00:00 2001 From: Georgina Halpern Date: Tue, 31 Mar 2026 13:47:39 -0400 Subject: [PATCH 12/39] Task 04: Add unit tests for CameraMovement base class and ArcRotateCameraMovement Add cameraMovement.test.ts with tests for: - resolveInteraction: source matching, first-match-wins, modifier matching (exact/absent/partial), button matching, touch count, 'none' fallback, empty inputMap - computeCurrentFrameDeltas: accumulator reset, speed multipliers, per-axis rotation speeds, inertia decay, zero inertia, zero-delta Add arcRotateCameraMovement.test.ts with tests for: - Default inputMap (6 entries with correct interaction mappings) - Default handlers (accumulate into base class accumulators) - resetInputMap (restores defaults after modification) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Cameras/arcRotateCameraMovement.test.ts | 102 +++++++++ .../test/unit/Cameras/cameraMovement.test.ts | 202 ++++++++++++++++++ 2 files changed, 304 insertions(+) create mode 100644 packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts create mode 100644 packages/dev/core/test/unit/Cameras/cameraMovement.test.ts diff --git a/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts b/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts new file mode 100644 index 00000000000..c01ddb21d7a --- /dev/null +++ b/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts @@ -0,0 +1,102 @@ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { ArcRotateCameraMovement } from "core/Cameras/arcRotateCameraMovement"; +import { Vector3 } from "core/Maths/math.vector"; +import { NullEngine } from "core/Engines/nullEngine"; +import { Scene } from "core/scene"; +import type { Nullable } from "core/types"; + +describe("ArcRotateCameraMovement", () => { + let engine: Nullable = null; + let scene: Nullable = null; + let movement: ArcRotateCameraMovement; + + beforeEach(() => { + engine = new NullEngine({ + renderHeight: 256, + renderWidth: 256, + textureSize: 256, + deterministicLockstep: false, + lockstepMaxSteps: 1, + }); + scene = new Scene(engine); + movement = new ArcRotateCameraMovement(scene, Vector3.Zero()); + }); + + afterEach(() => { + scene?.dispose(); + engine?.dispose(); + }); + + describe("default inputMap", () => { + it("should have exactly 6 entries", () => { + expect(movement.inputMap).toHaveLength(6); + }); + + it("should map left-click to rotate", () => { + expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("rotate"); + }); + + it("should map right-click to pan", () => { + expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("pan"); + }); + + it("should map wheel to zoom", () => { + expect(movement.resolveInteraction("wheel")).toBe("zoom"); + }); + + it("should map ctrl+keyboard to pan", () => { + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("pan"); + }); + + it("should map alt+keyboard to zoom", () => { + expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })).toBe("zoom"); + }); + + it("should map plain keyboard to rotate", () => { + expect(movement.resolveInteraction("keyboard", { modifiers: {} })).toBe("rotate"); + }); + }); + + describe("default handlers", () => { + it("should accumulate pan deltas", () => { + movement.handlers.pan(5, 10); + expect(movement.panAccumulatedPixels.x).toBe(5); + expect(movement.panAccumulatedPixels.y).toBe(10); + }); + + it("should accumulate rotation deltas", () => { + movement.handlers.rotate(3, 7); + expect(movement.rotationAccumulatedPixels.x).toBe(3); + expect(movement.rotationAccumulatedPixels.y).toBe(7); + }); + + it("should accumulate zoom deltas", () => { + movement.handlers.zoom(4); + expect(movement.zoomAccumulatedPixels).toBe(4); + }); + + it("should accumulate multiple calls", () => { + movement.handlers.pan(1, 2); + movement.handlers.pan(1, 2); + expect(movement.panAccumulatedPixels.x).toBe(2); + expect(movement.panAccumulatedPixels.y).toBe(4); + }); + }); + + describe("resetInputMap", () => { + it("should restore default inputMap after modification", () => { + movement.inputMap = []; + expect(movement.inputMap).toHaveLength(0); + + movement.resetInputMap(); + expect(movement.inputMap).toHaveLength(6); + + expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("pan"); + expect(movement.resolveInteraction("wheel")).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("pan"); + expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { modifiers: {} })).toBe("rotate"); + }); + }); +}); diff --git a/packages/dev/core/test/unit/Cameras/cameraMovement.test.ts b/packages/dev/core/test/unit/Cameras/cameraMovement.test.ts new file mode 100644 index 00000000000..1db9d913f2d --- /dev/null +++ b/packages/dev/core/test/unit/Cameras/cameraMovement.test.ts @@ -0,0 +1,202 @@ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { CameraMovement } from "core/Cameras/cameraMovement"; +import { Vector3 } from "core/Maths/math.vector"; +import { NullEngine } from "core/Engines/nullEngine"; +import { Scene } from "core/scene"; +import type { Nullable } from "core/types"; + +describe("CameraMovement", () => { + let engine: Nullable = null; + let scene: Nullable = null; + let movement: CameraMovement; + + beforeEach(() => { + engine = new NullEngine({ + renderHeight: 256, + renderWidth: 256, + textureSize: 256, + deterministicLockstep: false, + lockstepMaxSteps: 1, + }); + scene = new Scene(engine); + movement = new CameraMovement(scene, Vector3.Zero()); + }); + + afterEach(() => { + scene?.dispose(); + engine?.dispose(); + }); + + describe("resolveInteraction", () => { + it("should match by source type", () => { + movement.inputMap = [ + { source: "pointer", button: 0, interaction: "rotate" }, + { source: "keyboard", interaction: "translate" }, + { source: "wheel", interaction: "zoom" }, + { source: "touch", interaction: "pan" }, + ]; + + expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("rotate"); + expect(movement.resolveInteraction("keyboard")).toBe("translate"); + expect(movement.resolveInteraction("wheel")).toBe("zoom"); + expect(movement.resolveInteraction("touch")).toBe("pan"); + }); + + it("should return first match when multiple entries exist for same source", () => { + movement.inputMap = [ + { source: "pointer", button: 0, interaction: "rotate" }, + { source: "pointer", button: 0, interaction: "pan" }, + ]; + + expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("rotate"); + }); + + it("should match exact modifiers", () => { + movement.inputMap = [{ source: "keyboard", modifiers: { ctrl: true }, interaction: "pan" }]; + + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("pan"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: false } })).toBe("none"); + }); + + it("should match when entry has no modifiers (matches anything)", () => { + movement.inputMap = [{ source: "keyboard", interaction: "rotate" }]; + + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("rotate"); + expect(movement.resolveInteraction("keyboard")).toBe("rotate"); + }); + + it("should match partial modifiers (only check specified keys)", () => { + movement.inputMap = [{ source: "keyboard", modifiers: { ctrl: true }, interaction: "pan" }]; + + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true, shift: true } })).toBe("pan"); + }); + + it("should match pointer button", () => { + movement.inputMap = [{ source: "pointer", button: 2, interaction: "pan" }]; + + expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("pan"); + expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("none"); + }); + + it("should match touch count", () => { + movement.inputMap = [{ source: "touch", touchCount: 2, interaction: "zoom" }]; + + expect(movement.resolveInteraction("touch", { touchCount: 2 })).toBe("zoom"); + expect(movement.resolveInteraction("touch", { touchCount: 1 })).toBe("none"); + }); + + it("should return 'none' when no entry matches", () => { + movement.inputMap = [{ source: "pointer", button: 0, interaction: "rotate" }]; + + expect(movement.resolveInteraction("keyboard")).toBe("none"); + }); + + it("should return 'none' with empty inputMap", () => { + movement.inputMap = []; + expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("none"); + }); + }); + + describe("computeCurrentFrameDeltas", () => { + it("should reset accumulators after computation", () => { + movement.panAccumulatedPixels.x = 10; + movement.rotationAccumulatedPixels.y = 5; + movement.zoomAccumulatedPixels = 3; + movement.activeInput = true; + + movement.computeCurrentFrameDeltas(); + + expect(movement.panAccumulatedPixels.x).toBe(0); + expect(movement.rotationAccumulatedPixels.y).toBe(0); + expect(movement.zoomAccumulatedPixels).toBe(0); + }); + + it("should apply panSpeed multiplier", () => { + movement.panSpeed = 2; + movement.panAccumulatedPixels.x = 10; + movement.activeInput = true; + + movement.computeCurrentFrameDeltas(); + const firstDelta = movement.panDeltaCurrentFrame.x; + + movement.panSpeed = 4; + movement.panAccumulatedPixels.x = 10; + movement.activeInput = true; + + movement.computeCurrentFrameDeltas(); + const secondDelta = movement.panDeltaCurrentFrame.x; + + expect(Math.abs(secondDelta / firstDelta - 2)).toBeLessThan(0.01); + }); + + it("should use per-axis rotation speeds", () => { + movement.rotationXSpeed = 0.5; + movement.rotationYSpeed = 2.0; + movement.rotationAccumulatedPixels.x = 10; + movement.rotationAccumulatedPixels.y = 10; + movement.activeInput = true; + + movement.computeCurrentFrameDeltas(); + + const ratio = movement.rotationDeltaCurrentFrame.y / movement.rotationDeltaCurrentFrame.x; + expect(Math.abs(ratio - 4)).toBeLessThan(0.01); // 2.0 / 0.5 = 4 + }); + + it("should compute zoom delta with zoomSpeed", () => { + movement.zoomSpeed = 3; + movement.zoomAccumulatedPixels = 5; + movement.activeInput = true; + + movement.computeCurrentFrameDeltas(); + + expect(movement.zoomDeltaCurrentFrame).not.toBe(0); + }); + + it("should decay velocity with inertia when no input", () => { + movement.panInertia = 0.9; + movement.panAccumulatedPixels.x = 100; + movement.activeInput = true; + movement.computeCurrentFrameDeltas(); + const firstDelta = Math.abs(movement.panDeltaCurrentFrame.x); + + movement.panAccumulatedPixels.x = 0; + movement.activeInput = false; + movement.computeCurrentFrameDeltas(); + const secondDelta = Math.abs(movement.panDeltaCurrentFrame.x); + + expect(secondDelta).toBeGreaterThan(0); + expect(secondDelta).toBeLessThan(firstDelta); + }); + + it("should stop instantly with zero inertia", () => { + movement.panInertia = 0; + movement.panAccumulatedPixels.x = 100; + movement.activeInput = true; + movement.computeCurrentFrameDeltas(); + + movement.panAccumulatedPixels.x = 0; + movement.activeInput = false; + movement.computeCurrentFrameDeltas(); + + expect(movement.panDeltaCurrentFrame.x).toBe(0); + }); + + it("should produce zero deltas with no input", () => { + movement.computeCurrentFrameDeltas(); + + expect(movement.panDeltaCurrentFrame.x).toBe(0); + expect(movement.panDeltaCurrentFrame.y).toBe(0); + expect(movement.rotationDeltaCurrentFrame.x).toBe(0); + expect(movement.rotationDeltaCurrentFrame.y).toBe(0); + expect(movement.zoomDeltaCurrentFrame).toBe(0); + }); + }); + + describe("resetInputMap", () => { + it("should reset to empty array in base class", () => { + movement.inputMap = [{ source: "pointer", button: 0, interaction: "rotate" }]; + movement.resetInputMap(); + expect(movement.inputMap).toEqual([]); + }); + }); +}); From c4e41e7fd3e0de58273e7116c7d272dbf04cca8d Mon Sep 17 00:00:00 2001 From: Georgina Date: Mon, 13 Apr 2026 13:17:23 -0400 Subject: [PATCH 13/39] add shift, separate modifiers --- .../arcRotateCameraKeyboardMoveInput.ts | 76 ++++++++++++++++--- .../Inputs/arcRotateCameraPointersInput.ts | 49 +++++++++--- .../Inputs/geospatialCameraKeyboardInput.ts | 21 +++-- .../dev/core/src/Cameras/cameraMovement.ts | 8 +- 4 files changed, 121 insertions(+), 33 deletions(-) diff --git a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts index 4b004893297..688cbf6af69 100644 --- a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts @@ -50,6 +50,20 @@ export class ArcRotateCameraKeyboardMoveInput implements ICameraInput(); private _ctrlPressed: boolean; private _altPressed: boolean; @@ -119,7 +157,9 @@ export class ArcRotateCameraKeyboardMoveInput implements ICameraInput, multiTouchPanPosition: Nullable): void { - if (this.panningSensibility !== 0 && previousMultiTouchPanPosition && multiTouchPanPosition) { + if (previousMultiTouchPanPosition && multiTouchPanPosition) { const moveDeltaX = multiTouchPanPosition.x - previousMultiTouchPanPosition.x; const moveDeltaY = multiTouchPanPosition.y - previousMultiTouchPanPosition.y; if (this.camera.movement) { - this.camera.movement.handlers.pan(-moveDeltaX / this.panningSensibility, moveDeltaY / this.panningSensibility); - } else { + this.camera.movement.activeInput = true; + this.camera.movement.handlers.pan(-moveDeltaX * this.panSensitivity, moveDeltaY * this.panSensitivity); + } else if (this.panningSensibility !== 0) { this.camera.inertialPanningX += -moveDeltaX / this.panningSensibility; this.camera.inertialPanningY += moveDeltaY / this.panningSensibility; } @@ -120,6 +147,7 @@ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput { } else if (this.pinchDeltaPercentage) { const delta = (pinchSquaredDistance - previousPinchSquaredDistance) * 0.001 * radius * this.pinchDeltaPercentage; if (this.camera.movement) { + this.camera.movement.activeInput = true; this.camera.movement.handlers.zoom(delta); } else { this.camera.inertialRadiusOffset += delta; @@ -129,6 +157,7 @@ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput { (pinchSquaredDistance - previousPinchSquaredDistance) / ((this.pinchPrecision * (this.pinchInwards ? 1 : -1) * (this.angularSensibilityX + this.angularSensibilityY)) / 2); if (this.camera.movement) { + this.camera.movement.activeInput = true; this.camera.movement.handlers.zoom(delta); } else { this.camera.inertialRadiusOffset += delta; @@ -144,10 +173,12 @@ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput { */ public override onTouch(point: Nullable, offsetX: number, offsetY: number): void { if (this.camera.movement) { - if (this._activeType === "pan" && this.panningSensibility !== 0) { - this.camera.movement.handlers.pan(-offsetX / this.panningSensibility, offsetY / this.panningSensibility); + if (this._activeType === "pan") { + this.camera.movement.activeInput = true; + this.camera.movement.handlers.pan(-offsetX * this.panSensitivity, offsetY * this.panSensitivity); } else if (this._activeType === "rotate") { - this.camera.movement.handlers.rotate(-offsetX / this.angularSensibilityX, -offsetY / this.angularSensibilityY); + this.camera.movement.activeInput = true; + this.camera.movement.handlers.rotate(-offsetX * this.rotationSensitivityX, -offsetY * this.rotationSensitivityY); } } else { if (this.panningSensibility !== 0 && ((this._ctrlKey && this.camera._useCtrlForPanning) || this._isPanClick)) { diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index a5a1bf9b5c4..fc94dae925d 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -80,14 +80,16 @@ export class GeospatialCameraKeyboardInput implements ICameraInput(); - private _modifierPressed: boolean; + private _ctrlPressed: boolean; + private _altPressed: boolean; + private _shiftPressed: boolean; private _onCanvasBlurObserver: Nullable>; private _onKeyboardObserver: Nullable>; private _engine: AbstractEngine; private _scene: Scene; /** Cached conditions object to avoid per-frame allocations in checkInputs */ - private _keyboardConditions: InputConditions = { modifiers: { ctrl: false, alt: false } }; + private _keyboardConditions: InputConditions = { modifiers: { ctrl: false, alt: false, shift: false } }; /** * Attach the input controls to a specific dom element to get the input from. @@ -120,7 +122,9 @@ export class GeospatialCameraKeyboardInput implements ICameraInput Date: Mon, 13 Apr 2026 14:42:19 -0400 Subject: [PATCH 14/39] allow for configurable modifiers --- .../arcRotateCameraKeyboardMoveInput.ts | 21 ++---- .../Inputs/arcRotateCameraPointersInput.ts | 5 +- .../Inputs/geospatialCameraKeyboardInput.ts | 27 ++++---- .../Inputs/geospatialCameraPointersInput.ts | 5 +- .../src/Cameras/arcRotateCameraMovement.ts | 1 + .../core/src/Cameras/cameraInteractions.ts | 65 +++++++++++++++---- .../dev/core/src/Cameras/cameraMovement.ts | 9 ++- .../src/Cameras/geospatialCameraMovement.ts | 1 + 8 files changed, 90 insertions(+), 44 deletions(-) diff --git a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts index 688cbf6af69..6566aca1445 100644 --- a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts @@ -7,7 +7,7 @@ import { type ICameraInput, CameraInputTypes } from "../../Cameras/cameraInputsM import { type KeyboardInfo, KeyboardEventTypes } from "../../Events/keyboardEvents"; import { Tools } from "../../Misc/tools"; import { type AbstractEngine } from "../../Engines/abstractEngine"; -import { type InputConditions } from "../cameraInteractions"; +import { type KeyboardConditions } from "../cameraInteractions"; /** * Manage the keyboard inputs to control the movement of an arc rotate camera. @@ -124,7 +124,7 @@ export class ArcRotateCameraKeyboardMoveInput implements ICameraInput = { - source: "pointer"; - interaction: TInteraction; - /** Mouse button filter (0=left, 1=middle, 2=right). Omit to match any button. */ +export type PointerConditions = { + /** Mouse button (0=left, 1=middle, 2=right). Omit to match any button. */ button?: number; /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ modifiers?: InputModifiers; }; +/** + * Conditions for mouse wheel inputs. + */ +export type WheelConditions = { + /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ + modifiers?: InputModifiers; +}; + +/** + * Conditions for touch inputs. + */ +export type TouchConditions = { + /** Number of active touch points. Omit to match any count. */ + touchCount?: number; +}; + +/** + * Conditions for keyboard inputs. + */ +export type KeyboardConditions = { + /** Key code of the current key being resolved. Omit to match any key. */ + key?: number; + /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ + modifiers?: InputModifiers; +}; + +// ── Per-source inputMap entry types ──────────────────────────────── + +/** + * Mapping rule for pointer (mouse button) inputs. + */ +export type PointerInputMapEntry = { + source: "pointer"; + interaction: TInteraction; +} & PointerConditions; + /** * Mapping rule for mouse wheel inputs. */ export type WheelInputMapEntry = { source: "wheel"; interaction: TInteraction; - /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ - modifiers?: InputModifiers; -}; +} & WheelConditions; /** * Mapping rule for touch inputs. @@ -40,16 +74,18 @@ export type WheelInputMapEntry = { export type TouchInputMapEntry = { source: "touch"; interaction: TInteraction; - /** Number of active touch points. Omit to match any count. */ - touchCount?: number; -}; +} & TouchConditions; /** * Mapping rule for keyboard inputs. + * The `key` field on the entry supports a single key code or an array of key codes for matching. + * When resolving, the condition's `key` is checked against the entry's `key` value(s). */ export type KeyboardInputMapEntry = { source: "keyboard"; interaction: TInteraction; + /** Key code filter(s). Supports a single code or an array. Omit to match any key. */ + key?: number | number[]; /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ modifiers?: InputModifiers; }; @@ -68,7 +104,10 @@ export type InputMapEntry = | KeyboardInputMapEntry; /** - * Conditions from a physical input event, passed to resolveInteraction(). + * Flat conditions object passed to resolveInteraction(). + * Only the fields relevant to the source type need to be set. + * Per-source condition types (PointerConditions, KeyboardConditions, etc.) are subtypes + * of this and should be used at call sites for clarity. */ export type InputConditions = { /** Mouse button (0=left, 1=middle, 2=right) */ @@ -77,4 +116,6 @@ export type InputConditions = { modifiers?: InputModifiers; /** Number of active touch points */ touchCount?: number; + /** Key code of the current key being resolved */ + key?: number; }; diff --git a/packages/dev/core/src/Cameras/cameraMovement.ts b/packages/dev/core/src/Cameras/cameraMovement.ts index 21755231dd4..7e018690b42 100644 --- a/packages/dev/core/src/Cameras/cameraMovement.ts +++ b/packages/dev/core/src/Cameras/cameraMovement.ts @@ -1,6 +1,6 @@ import { type Scene } from "../scene"; import { Vector3 } from "../Maths/math.vector"; -import type { InputMapEntry, InputConditions, InputSource, InputModifiers } from "./cameraInteractions"; +import type { InputMapEntry, InputModifiers, InputConditions, InputSource } from "./cameraInteractions"; import { type InterpolatingBehavior } from "../Behaviors/Cameras/interpolatingBehavior"; const FrameDurationAt60FPS = 1000 / 60; @@ -39,7 +39,7 @@ export class CameraMovement { * Returns the interaction string of the first matching entry, or "none" if no entry matches. * The returned string corresponds to a handler property name on the camera's movement subclass. * @param source - The physical input source (e.g. "pointer", "keyboard") - * @param conditions - Optional conditions to match against (button, modifiers, touchCount) + * @param conditions - Conditions to match against, specific to the source type * @returns The resolved interaction type string, or "none" */ public resolveInteraction(source: InputSource, conditions?: InputConditions): string { @@ -67,6 +67,11 @@ export class CameraMovement { } break; case "keyboard": + if (entry.key !== undefined) { + if (Array.isArray(entry.key) ? entry.key.indexOf(conditions?.key ?? -1) === -1 : entry.key !== conditions?.key) { + continue; + } + } if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) { continue; } diff --git a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts index ecdb49baf73..b6942e9f207 100644 --- a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts +++ b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts @@ -144,6 +144,7 @@ export class GeospatialCameraMovement extends CameraMovement { { source: "pointer", button: 1, interaction: "rotate" }, { source: "pointer", button: 2, interaction: "rotate" }, { source: "wheel", interaction: "zoom" }, + { source: "keyboard", key: [187, 107, 189, 109], interaction: "zoom" }, // +/-/numpad+/numpad- { source: "keyboard", modifiers: { ctrl: true }, interaction: "rotate" }, { source: "keyboard", modifiers: { alt: true }, interaction: "rotate" }, { source: "keyboard", interaction: "pan" }, From cee59d040a2532083d57c2c8d8541bcc7f167038 Mon Sep 17 00:00:00 2001 From: Georgina Date: Mon, 13 Apr 2026 14:52:15 -0400 Subject: [PATCH 15/39] negation confusion --- .../Cameras/Inputs/geospatialCameraKeyboardInput.ts | 4 ++-- .../Cameras/Inputs/geospatialCameraPointersInput.ts | 2 +- .../dev/core/src/Cameras/geospatialCameraMovement.ts | 11 ++++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index 5f34e89e49f..54be9b8dd2f 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -219,9 +219,9 @@ export class GeospatialCameraKeyboardInput implements ICameraInput void; + /** Handler for rotate (tilt) interactions — accepts yaw (horizontal) and pitch (vertical) deltas */ + rotate: (yaw: number, pitch: number) => void; /** Handler for zoom interactions — accepts delta and whether to zoom toward cursor */ zoom: (delta: number, toCursor: boolean) => void; }; @@ -118,9 +118,10 @@ export class GeospatialCameraMovement extends CameraMovement { this.stopDrag(); }, }, - rotate: (deltaX, deltaY) => { - this.rotationAccumulatedPixels.y += deltaX; - this.rotationAccumulatedPixels.x += deltaY; + rotate: (yaw, pitch) => { + this.rotationAccumulatedPixels.y += yaw; + // Negate pitch: screen Y increases downward, but pitch-up should be positive + this.rotationAccumulatedPixels.x -= pitch; }, zoom: (delta, toCursor) => { this.handleZoom(delta, toCursor); From 261412f08eee63c6dd28798ef47f6256a404a0fb Mon Sep 17 00:00:00 2001 From: Georgina Date: Mon, 13 Apr 2026 17:24:35 -0400 Subject: [PATCH 16/39] rotate direction changes --- .../Inputs/geospatialCameraKeyboardInput.ts | 4 +- .../Inputs/geospatialCameraPointersInput.ts | 2 +- .../src/Cameras/geospatialCameraMovement.ts | 3 +- .../Cameras/arcRotateCameraMovement.test.ts | 18 +- .../Cameras/geospatialCameraMovement.test.ts | 236 ++++++++++++++++++ 5 files changed, 255 insertions(+), 8 deletions(-) create mode 100644 packages/dev/core/test/unit/Cameras/geospatialCameraMovement.test.ts diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index 54be9b8dd2f..5f34e89e49f 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -219,9 +219,9 @@ export class GeospatialCameraKeyboardInput implements ICameraInput { this.rotationAccumulatedPixels.y += yaw; - // Negate pitch: screen Y increases downward, but pitch-up should be positive - this.rotationAccumulatedPixels.x -= pitch; + this.rotationAccumulatedPixels.x += pitch; }, zoom: (delta, toCursor) => { this.handleZoom(delta, toCursor); diff --git a/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts b/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts index c01ddb21d7a..be37f272e70 100644 --- a/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts +++ b/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts @@ -28,8 +28,8 @@ describe("ArcRotateCameraMovement", () => { }); describe("default inputMap", () => { - it("should have exactly 6 entries", () => { - expect(movement.inputMap).toHaveLength(6); + it("should have exactly 7 entries", () => { + expect(movement.inputMap).toHaveLength(7); }); it("should map left-click to rotate", () => { @@ -44,6 +44,17 @@ describe("ArcRotateCameraMovement", () => { expect(movement.resolveInteraction("wheel")).toBe("zoom"); }); + it("should map +/- keys to zoom", () => { + expect(movement.resolveInteraction("keyboard", { key: 187 })).toBe("zoom"); // + key + expect(movement.resolveInteraction("keyboard", { key: 107 })).toBe("zoom"); // numpad + + expect(movement.resolveInteraction("keyboard", { key: 189 })).toBe("zoom"); // - key + expect(movement.resolveInteraction("keyboard", { key: 109 })).toBe("zoom"); // numpad - + }); + + it("should map zoom keys with ctrl to zoom (key match wins over modifier match)", () => { + expect(movement.resolveInteraction("keyboard", { key: 187, modifiers: { ctrl: true } })).toBe("zoom"); + }); + it("should map ctrl+keyboard to pan", () => { expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("pan"); }); @@ -89,11 +100,12 @@ describe("ArcRotateCameraMovement", () => { expect(movement.inputMap).toHaveLength(0); movement.resetInputMap(); - expect(movement.inputMap).toHaveLength(6); + expect(movement.inputMap).toHaveLength(7); expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("rotate"); expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("pan"); expect(movement.resolveInteraction("wheel")).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { key: 187 })).toBe("zoom"); expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("pan"); expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })).toBe("zoom"); expect(movement.resolveInteraction("keyboard", { modifiers: {} })).toBe("rotate"); diff --git a/packages/dev/core/test/unit/Cameras/geospatialCameraMovement.test.ts b/packages/dev/core/test/unit/Cameras/geospatialCameraMovement.test.ts new file mode 100644 index 00000000000..10e92ed2b21 --- /dev/null +++ b/packages/dev/core/test/unit/Cameras/geospatialCameraMovement.test.ts @@ -0,0 +1,236 @@ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { GeospatialCameraMovement } from "core/Cameras/geospatialCameraMovement"; +import { GeospatialLimits } from "core/Cameras/Limits/geospatialLimits"; +import { Vector3 } from "core/Maths/math.vector"; +import { NullEngine } from "core/Engines/nullEngine"; +import { Scene } from "core/scene"; +import type { Nullable } from "core/types"; + +describe("GeospatialCameraMovement", () => { + let engine: Nullable = null; + let scene: Nullable = null; + let movement: GeospatialCameraMovement; + + beforeEach(() => { + engine = new NullEngine({ + renderHeight: 256, + renderWidth: 256, + textureSize: 256, + deterministicLockstep: false, + lockstepMaxSteps: 1, + }); + scene = new Scene(engine); + const limits = new GeospatialLimits(); + const cameraPosition = new Vector3(0, 0, 100); + const cameraCenter = new Vector3(0, 0, 0); + const cameraLookAt = new Vector3(0, 0, -1); + movement = new GeospatialCameraMovement(scene, limits, cameraPosition, cameraCenter, cameraLookAt); + }); + + afterEach(() => { + scene?.dispose(); + engine?.dispose(); + }); + + // ============================================ + // Input map resolution + // ============================================ + describe("default inputMap", () => { + it("should have 8 entries", () => { + expect(movement.inputMap).toHaveLength(8); + }); + + it("should map left-click to pan", () => { + expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("pan"); + }); + + it("should map middle-click to rotate", () => { + expect(movement.resolveInteraction("pointer", { button: 1 })).toBe("rotate"); + }); + + it("should map right-click to rotate", () => { + expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("rotate"); + }); + + it("should map wheel to zoom", () => { + expect(movement.resolveInteraction("wheel")).toBe("zoom"); + }); + + it("should map +/- keys to zoom", () => { + expect(movement.resolveInteraction("keyboard", { key: 187 })).toBe("zoom"); // + key + expect(movement.resolveInteraction("keyboard", { key: 107 })).toBe("zoom"); // numpad + + expect(movement.resolveInteraction("keyboard", { key: 189 })).toBe("zoom"); // - key + expect(movement.resolveInteraction("keyboard", { key: 109 })).toBe("zoom"); // numpad - + }); + + it("should map ctrl+keyboard to rotate", () => { + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("rotate"); + }); + + it("should map alt+keyboard to rotate", () => { + expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })).toBe("rotate"); + }); + + it("should map plain keyboard to pan", () => { + expect(movement.resolveInteraction("keyboard", { modifiers: {} })).toBe("pan"); + }); + + it("should map arrow keys without modifiers to pan", () => { + expect(movement.resolveInteraction("keyboard", { key: 38, modifiers: {} })).toBe("pan"); // up arrow + expect(movement.resolveInteraction("keyboard", { key: 40, modifiers: {} })).toBe("pan"); // down arrow + expect(movement.resolveInteraction("keyboard", { key: 37, modifiers: {} })).toBe("pan"); // left arrow + expect(movement.resolveInteraction("keyboard", { key: 39, modifiers: {} })).toBe("pan"); // right arrow + }); + + it("should map arrow keys with ctrl to rotate", () => { + expect(movement.resolveInteraction("keyboard", { key: 38, modifiers: { ctrl: true } })).toBe("rotate"); + expect(movement.resolveInteraction("keyboard", { key: 37, modifiers: { ctrl: true } })).toBe("rotate"); + }); + + it("should map zoom keys with ctrl to zoom (key match wins over modifier match)", () => { + // Key-specific entry comes before modifier entry in the inputMap, so it wins + expect(movement.resolveInteraction("keyboard", { key: 187, modifiers: { ctrl: true } })).toBe("zoom"); + }); + + it("should map pointer with shift modifier when configured", () => { + movement.inputMap = [ + { source: "pointer", button: 0, modifiers: { shift: true }, interaction: "rotate" }, + { source: "pointer", button: 0, interaction: "pan" }, + ]; + expect(movement.resolveInteraction("pointer", { button: 0, modifiers: { shift: true } })).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 0, modifiers: {} })).toBe("pan"); + }); + }); + + // ============================================ + // Handler accumulation direction tests + // ============================================ + describe("rotate handler", () => { + it("should accumulate positive yaw to rotationAccumulatedPixels.y", () => { + movement.handlers.rotate(5, 0); + expect(movement.rotationAccumulatedPixels.y).toBe(5); + expect(movement.rotationAccumulatedPixels.x).toBe(0); + }); + + it("should accumulate negative yaw to rotationAccumulatedPixels.y", () => { + movement.handlers.rotate(-3, 0); + expect(movement.rotationAccumulatedPixels.y).toBe(-3); + }); + + it("should accumulate positive pitch to rotationAccumulatedPixels.x", () => { + movement.handlers.rotate(0, 7); + expect(movement.rotationAccumulatedPixels.x).toBe(7); + expect(movement.rotationAccumulatedPixels.y).toBe(0); + }); + + it("should accumulate negative pitch to rotationAccumulatedPixels.x", () => { + movement.handlers.rotate(0, -4); + expect(movement.rotationAccumulatedPixels.x).toBe(-4); + }); + + it("should accumulate yaw and pitch independently", () => { + movement.handlers.rotate(2, 3); + expect(movement.rotationAccumulatedPixels.y).toBe(2); + expect(movement.rotationAccumulatedPixels.x).toBe(3); + }); + + it("should accumulate multiple calls", () => { + movement.handlers.rotate(1, 2); + movement.handlers.rotate(3, 4); + expect(movement.rotationAccumulatedPixels.y).toBe(4); // 1 + 3 + expect(movement.rotationAccumulatedPixels.x).toBe(6); // 2 + 4 + }); + }); + + describe("zoom handler", () => { + it("should accumulate positive zoom delta", () => { + movement.handlers.zoom(10, false); + expect(movement.zoomAccumulatedPixels).toBe(10); + }); + + it("should accumulate negative zoom delta", () => { + movement.handlers.zoom(-5, false); + expect(movement.zoomAccumulatedPixels).toBe(-5); + }); + + it("should accumulate multiple zoom calls", () => { + movement.handlers.zoom(3, false); + movement.handlers.zoom(7, false); + expect(movement.zoomAccumulatedPixels).toBe(10); + }); + }); + + // ============================================ + // Direction sign convention tests + // These verify that the handler-to-accumulator mapping matches the + // convention used by geospatialCamera._checkInputs, which reads: + // rotationDeltaCurrentFrame.x → pitch (added to _pitch) + // rotationDeltaCurrentFrame.y → yaw (added to _yaw) + // ============================================ + describe("direction sign conventions", () => { + it("positive yaw (right) should produce positive rotationAccumulatedPixels.y", () => { + // Simulates: right arrow key or rightward pointer drag + movement.handlers.rotate(1, 0); + expect(movement.rotationAccumulatedPixels.y).toBeGreaterThan(0); + }); + + it("negative yaw (left) should produce negative rotationAccumulatedPixels.y", () => { + // Simulates: left arrow key or leftward pointer drag + movement.handlers.rotate(-1, 0); + expect(movement.rotationAccumulatedPixels.y).toBeLessThan(0); + }); + + it("pointer drag up (negative offsetY) should produce negative pitch accumulator for tilt-up", () => { + // Pointer: offsetY < 0 when dragging up, caller passes -offsetY as pitch + // This should result in positive pitch accumulator → _pitch increases → tilts toward horizon + const offsetY = -10; + movement.handlers.rotate(0, -offsetY); // caller convention: negate offsetY for pitch + expect(movement.rotationAccumulatedPixels.x).toBeGreaterThan(0); + }); + + it("keyboard up arrow should produce negative pitch accumulator for tilt-up (toward top-down)", () => { + // Keyboard convention: up arrow passes negative pitch + // _pitch decreases → tilts away from horizon (more top-down) + movement.handlers.rotate(0, -1); + expect(movement.rotationAccumulatedPixels.x).toBeLessThan(0); + }); + + it("keyboard down arrow should produce positive pitch accumulator for tilt-down (toward horizon)", () => { + // Keyboard convention: down arrow passes positive pitch + // _pitch increases → tilts toward horizon + movement.handlers.rotate(0, 1); + expect(movement.rotationAccumulatedPixels.x).toBeGreaterThan(0); + }); + + it("positive zoom should increase zoomAccumulatedPixels (zoom in)", () => { + movement.handlers.zoom(1, false); + expect(movement.zoomAccumulatedPixels).toBeGreaterThan(0); + }); + + it("negative zoom should decrease zoomAccumulatedPixels (zoom out)", () => { + movement.handlers.zoom(-1, false); + expect(movement.zoomAccumulatedPixels).toBeLessThan(0); + }); + }); + + // ============================================ + // resetInputMap + // ============================================ + describe("resetInputMap", () => { + it("should restore default inputMap after modification", () => { + movement.inputMap = []; + expect(movement.inputMap).toHaveLength(0); + + movement.resetInputMap(); + expect(movement.inputMap).toHaveLength(8); + + expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("pan"); + expect(movement.resolveInteraction("pointer", { button: 1 })).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("rotate"); + expect(movement.resolveInteraction("wheel")).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { key: 187 })).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("rotate"); + expect(movement.resolveInteraction("keyboard", { modifiers: {} })).toBe("pan"); + }); + }); +}); From b65423d0b6a5cebd633c2b71d39189efaf2804c5 Mon Sep 17 00:00:00 2001 From: Georgina Date: Mon, 13 Apr 2026 19:12:13 -0400 Subject: [PATCH 17/39] continue iterating and making improvements to api --- .../arcRotateCameraKeyboardMoveInput.ts | 81 +++++------- .../Inputs/arcRotateCameraPointersInput.ts | 53 +++----- .../Inputs/geospatialCameraKeyboardInput.ts | 124 ++++++++++++------ .../Inputs/geospatialCameraPointersInput.ts | 63 ++++++--- .../src/Cameras/arcRotateCameraMovement.ts | 12 +- .../core/src/Cameras/cameraInteractions.ts | 18 ++- .../dev/core/src/Cameras/cameraMovement.ts | 68 ++++++++-- .../src/Cameras/geospatialCameraMovement.ts | 8 +- .../Cameras/arcRotateCameraMovement.test.ts | 36 ++--- .../test/unit/Cameras/cameraMovement.test.ts | 64 +++++---- .../Cameras/geospatialCameraMovement.test.ts | 54 ++++---- 11 files changed, 346 insertions(+), 235 deletions(-) diff --git a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts index 6566aca1445..da2831257de 100644 --- a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts @@ -91,30 +91,6 @@ export class ArcRotateCameraKeyboardMoveInput implements ICameraInput(); private _ctrlPressed: boolean; private _altPressed: boolean; @@ -237,33 +213,36 @@ export class ArcRotateCameraKeyboardMoveInput implements ICameraInput, offsetX: number, offsetY: number): void { - if (this.camera.movement) { - if (this._activeType === "pan") { + if (this.camera.movement && this._activeEntry) { + const sens = this._activeEntry.sensitivity ?? 1; + if (this._activeEntry.interaction === "pan") { this.camera.movement.activeInput = true; - this.camera.movement.handlers.pan(-offsetX * this.panSensitivity, offsetY * this.panSensitivity); - } else if (this._activeType === "rotate") { + this.camera.movement.handlers.pan(-offsetX * sens, offsetY * sens); + } else if (this._activeEntry.interaction === "rotate") { this.camera.movement.activeInput = true; - this.camera.movement.handlers.rotate(-offsetX * this.rotationSensitivityX, -offsetY * this.rotationSensitivityY); + this.camera.movement.handlers.rotate(-offsetX * sens, -offsetY * sens); } } else { if (this.panningSensibility !== 0 && ((this._ctrlKey && this.camera._useCtrlForPanning) || this._isPanClick)) { @@ -229,7 +206,7 @@ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput { */ public override onButtonDown(evt: IPointerEvent): void { if (this.camera.movement) { - this._activeType = this.camera.movement.resolveInteraction("pointer", { + this._activeEntry = this.camera.movement.resolveInteraction("pointer", { button: evt.button, modifiers: { ctrl: evt.ctrlKey, alt: evt.altKey, shift: evt.shiftKey }, }); @@ -245,7 +222,7 @@ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput { * @param _evt Defines the event to track */ public override onButtonUp(_evt: IPointerEvent): void { - this._activeType = "none"; + this._activeEntry = null; this._isPanClick = false; super.onButtonUp(_evt); } @@ -254,7 +231,7 @@ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput { * Called when window becomes inactive. */ public override onLostFocus(): void { - this._activeType = "none"; + this._activeEntry = null; this._isPanClick = false; super.onLostFocus(); } diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index 5f34e89e49f..5cee623dde3 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -61,23 +61,62 @@ export class GeospatialCameraKeyboardInput implements ICameraInput e.source === "keyboard" && e.interaction === "rotate"); + return entry?.sensitivity ?? 1; + } + + public set rotationSensitivity(value: number) { + if (this.camera.movement) { + for (const entry of this.camera.movement.inputMap) { + if (entry.source === "keyboard" && entry.interaction === "rotate") { + entry.sensitivity = value; + } + } + } + } /** * Defines the panning sensitivity of the inputs. * (How many pixels of pointer input to apply per keypress, before pan speed factor is applied by movement class) + * @deprecated Use the `sensitivity` field on the keyboard pan entry in `camera.movement.inputMap` instead. */ - @serialize() - public panSensitivity: number = 1.0; + public get panSensitivity(): number { + const entry = this.camera.movement?.inputMap.find((e) => e.source === "keyboard" && e.interaction === "pan"); + return entry?.sensitivity ?? 1; + } + + public set panSensitivity(value: number) { + if (this.camera.movement) { + for (const entry of this.camera.movement.inputMap) { + if (entry.source === "keyboard" && entry.interaction === "pan") { + entry.sensitivity = value; + } + } + } + } /** * Defines the zooming sensitivity of the inputs. * (How many pixels of pointer input to apply per keypress, before zoom speed factor is applied by movement class) + * @deprecated Use the `sensitivity` field on the keyboard zoom entry in `camera.movement.inputMap` instead. */ - @serialize() - public zoomSensitivity: number = 1.0; + public get zoomSensitivity(): number { + const entry = this.camera.movement?.inputMap.find((e) => e.source === "keyboard" && e.interaction === "zoom"); + return entry?.sensitivity ?? 1; + } + + public set zoomSensitivity(value: number) { + if (this.camera.movement) { + for (const entry of this.camera.movement.inputMap) { + if (entry.source === "keyboard" && entry.interaction === "zoom") { + entry.sensitivity = value; + } + } + } + } private _keys = new Array(); private _ctrlPressed: boolean; @@ -205,42 +244,45 @@ export class GeospatialCameraKeyboardInput implements ICameraInput = null; - /** The resolved interaction type for the current pointer gesture */ - private _activeType: string = "none"; + /** Cached resolved inputMap entry for the current pointer gesture */ + private _activeEntry: InputMapEntry | null = null; /** - * Defines the rotation sensitivity of the pointer when rotating camera around the x axis (pitch) + * Defines the rotation sensitivity of the pointer when rotating camera around the x axis (pitch). * (Multiplied by the true pixel delta of pointer input, before rotation speed factor is applied by movement class) + * @deprecated Use the `sensitivity` field on the pointer rotate entry in `camera.movement.inputMap` instead. */ - public pitchSensitivity = 1.0; + public get pitchSensitivity(): number { + const entry = this.camera.movement?.getEntry("pointer", "rotate"); + return entry?.sensitivity ?? 1; + } + + public set pitchSensitivity(value: number) { + if (this.camera.movement) { + for (const entry of this.camera.movement.inputMap) { + if (entry.source === "pointer" && entry.interaction === "rotate") { + entry.sensitivity = value; + } + } + } + } /** - * Defines the rotation sensitivity of the pointer when rotating the camera around the Y axis (yaw) + * Defines the rotation sensitivity of the pointer when rotating the camera around the Y axis (yaw). * (Multiplied by the true pixel delta of pointer input, before rotation speed factor is applied by movement class) + * @deprecated Use the `sensitivity` field on the pointer rotate entry in `camera.movement.inputMap` instead. */ - public yawSensitivity: number = 1.0; + public get yawSensitivity(): number { + const entry = this.camera.movement?.getEntry("pointer", "rotate"); + return entry?.sensitivity ?? 1; + } + + public set yawSensitivity(value: number) { + if (this.camera.movement) { + for (const entry of this.camera.movement.inputMap) { + if (entry.source === "pointer" && entry.interaction === "rotate") { + entry.sensitivity = value; + } + } + } + } /** * Defines the distance used to consider the camera in pan mode vs pinch/zoom. @@ -49,23 +78,27 @@ export class GeospatialCameraPointersInput extends OrbitCameraPointersInput { this.camera.movement.activeInput = true; const scene = this.camera.getScene(); - this._activeType = this.camera.movement.resolveInteraction("pointer", { + this._activeEntry = this.camera.movement.resolveInteraction("pointer", { button: evt.button, modifiers: { ctrl: evt.ctrlKey, alt: evt.altKey, shift: evt.shiftKey }, }); - if (this._activeType === "pan") { + if (this._activeEntry?.interaction === "pan") { this.camera.movement.handlers.pan.start(scene.pointerX, scene.pointerY); } } public override onTouch(point: Nullable, offsetX: number, offsetY: number): void { + if (!this._activeEntry) { + return; + } + const sens = this._activeEntry.sensitivity ?? 1; const scene = this.camera.getScene(); - if (this._activeType === "pan") { + if (this._activeEntry.interaction === "pan") { this.camera.movement.handlers.pan.update(scene.pointerX, scene.pointerY); - } else if (this._activeType === "rotate") { - this.camera.movement.handlers.rotate(offsetX * this.yawSensitivity, -offsetY * this.pitchSensitivity); + } else if (this._activeEntry.interaction === "rotate") { + this.camera.movement.handlers.rotate(offsetX * sens, -offsetY * sens); } } @@ -123,7 +156,7 @@ export class GeospatialCameraPointersInput extends OrbitCameraPointersInput { if (previousMultiTouchPanPosition && multiTouchPanPosition) { const moveDeltaX = multiTouchPanPosition.x - previousMultiTouchPanPosition.x; const moveDeltaY = multiTouchPanPosition.y - previousMultiTouchPanPosition.y; - this.camera.movement.handlers.rotate(moveDeltaX * this.yawSensitivity, -moveDeltaY * this.pitchSensitivity); + this.camera.movement.handlers.rotate(moveDeltaX * (this._activeEntry?.sensitivity ?? 1), -moveDeltaY * (this._activeEntry?.sensitivity ?? 1)); } } @@ -166,10 +199,10 @@ export class GeospatialCameraPointersInput extends OrbitCameraPointersInput { } public override onButtonUp(_evt: IPointerEvent): void { - if (this._activeType === "pan") { + if (this._activeEntry?.interaction === "pan") { this.camera.movement.handlers.pan.stop(); } - this._activeType = "none"; + this._activeEntry = null; this.camera.movement.activeInput = false; this._initialPinchSquaredDistance = 0; this._pinchCentroid = null; @@ -177,7 +210,7 @@ export class GeospatialCameraPointersInput extends OrbitCameraPointersInput { } public override onLostFocus(): void { - this._activeType = "none"; + this._activeEntry = null; this._initialPinchSquaredDistance = 0; this._pinchCentroid = null; super.onLostFocus(); diff --git a/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts index d3fb6995078..bad244c7f67 100644 --- a/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts +++ b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts @@ -75,13 +75,13 @@ export class ArcRotateCameraMovement extends CameraMovement { private _createDefaultInputMap(): InputMapEntry[] { return [ - { source: "pointer", button: 0, interaction: "rotate" }, - { source: "pointer", button: 2, interaction: "pan" }, + { source: "pointer", button: 0, interaction: "rotate", sensitivity: 0.001 }, + { source: "pointer", button: 2, interaction: "pan", sensitivity: 0.001 }, { source: "wheel", interaction: "zoom" }, - { source: "keyboard", key: [187, 107, 189, 109], interaction: "zoom" }, // +/-/numpad+/numpad- - { source: "keyboard", modifiers: { ctrl: true }, interaction: "pan" }, - { source: "keyboard", modifiers: { alt: true }, interaction: "zoom" }, - { source: "keyboard", interaction: "rotate" }, + { source: "keyboard", key: [187, 107, 189, 109], interaction: "zoom", sensitivity: 0.04 }, // +/-/numpad+/numpad- + { source: "keyboard", modifiers: { ctrl: true }, interaction: "pan", sensitivity: 0.02 }, + { source: "keyboard", modifiers: { alt: true }, interaction: "zoom", sensitivity: 0.04 }, + { source: "keyboard", interaction: "rotate", sensitivity: 0.01 }, ]; } } diff --git a/packages/dev/core/src/Cameras/cameraInteractions.ts b/packages/dev/core/src/Cameras/cameraInteractions.ts index 01e27d097fe..bbc0a7861c1 100644 --- a/packages/dev/core/src/Cameras/cameraInteractions.ts +++ b/packages/dev/core/src/Cameras/cameraInteractions.ts @@ -20,7 +20,7 @@ export type InputModifiers = { export type PointerConditions = { /** Mouse button (0=left, 1=middle, 2=right). Omit to match any button. */ button?: number; - /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ + /** Modifier key state. Only specified keys are checked; omitted = don't-care. */ modifiers?: InputModifiers; }; @@ -28,7 +28,7 @@ export type PointerConditions = { * Conditions for mouse wheel inputs. */ export type WheelConditions = { - /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ + /** Modifier key state. Only specified keys are checked; omitted = don't-care. */ modifiers?: InputModifiers; }; @@ -46,7 +46,7 @@ export type TouchConditions = { export type KeyboardConditions = { /** Key code of the current key being resolved. Omit to match any key. */ key?: number; - /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ + /** Modifier key state. Only specified keys are checked; omitted = don't-care. */ modifiers?: InputModifiers; }; @@ -58,6 +58,8 @@ export type KeyboardConditions = { export type PointerInputMapEntry = { source: "pointer"; interaction: TInteraction; + /** Multiplier applied to input deltas before passing to the handler. Default is 1. */ + sensitivity?: number; } & PointerConditions; /** @@ -66,6 +68,8 @@ export type PointerInputMapEntry = { export type WheelInputMapEntry = { source: "wheel"; interaction: TInteraction; + /** Multiplier applied to input deltas before passing to the handler. Default is 1. */ + sensitivity?: number; } & WheelConditions; /** @@ -74,6 +78,8 @@ export type WheelInputMapEntry = { export type TouchInputMapEntry = { source: "touch"; interaction: TInteraction; + /** Multiplier applied to input deltas before passing to the handler. Default is 1. */ + sensitivity?: number; } & TouchConditions; /** @@ -84,9 +90,11 @@ export type TouchInputMapEntry = { export type KeyboardInputMapEntry = { source: "keyboard"; interaction: TInteraction; + /** Multiplier applied to input deltas before passing to the handler. Default is 1. */ + sensitivity?: number; /** Key code filter(s). Supports a single code or an array. Omit to match any key. */ key?: number | number[]; - /** Modifier key filters. Only specified keys are checked; omitted = don't-care. */ + /** Modifier keys that must be active for this entry to match. Omit to match regardless of modifiers. */ modifiers?: InputModifiers; }; @@ -112,7 +120,7 @@ export type InputMapEntry = export type InputConditions = { /** Mouse button (0=left, 1=middle, 2=right) */ button?: number; - /** Modifier key state */ + /** Current modifier key state */ modifiers?: InputModifiers; /** Number of active touch points */ touchCount?: number; diff --git a/packages/dev/core/src/Cameras/cameraMovement.ts b/packages/dev/core/src/Cameras/cameraMovement.ts index 7e018690b42..181ef0510ec 100644 --- a/packages/dev/core/src/Cameras/cameraMovement.ts +++ b/packages/dev/core/src/Cameras/cameraMovement.ts @@ -1,6 +1,6 @@ import { type Scene } from "../scene"; import { Vector3 } from "../Maths/math.vector"; -import type { InputMapEntry, InputModifiers, InputConditions, InputSource } from "./cameraInteractions"; +import type { InputMapEntry, InputConditions, InputSource, InputModifiers } from "./cameraInteractions"; import { type InterpolatingBehavior } from "../Behaviors/Cameras/interpolatingBehavior"; const FrameDurationAt60FPS = 1000 / 60; @@ -35,14 +35,15 @@ export class CameraMovement { public inputMap: InputMapEntry[] = []; /** - * Resolves a physical input event to a semantic interaction type by walking the inputMap. - * Returns the interaction string of the first matching entry, or "none" if no entry matches. - * The returned string corresponds to a handler property name on the camera's movement subclass. + * Resolves a physical input event to a matching inputMap entry. + * When multiple entries match, the most specific one wins (counted by number of conditions). + * Among equally specific entries, the first one in the array wins. + * Returns the matched entry, or null if no entry matches. * @param source - The physical input source (e.g. "pointer", "keyboard") * @param conditions - Conditions to match against, specific to the source type - * @returns The resolved interaction type string, or "none" + * @returns The matched InputMapEntry, or null if no entry matches */ - public resolveInteraction(source: InputSource, conditions?: InputConditions): string { + public resolveInteraction(source: InputSource, conditions?: InputConditions): InputMapEntry | null { for (const entry of this.inputMap) { if (entry.source !== source) { continue; @@ -77,9 +78,9 @@ export class CameraMovement { } break; } - return entry.interaction; + return entry; } - return "none"; + return null; } /** @@ -91,6 +92,53 @@ export class CameraMovement { this.inputMap = []; } + /** + * Finds the first inputMap entry matching the given source and interaction. + * Useful for modifying entry properties (e.g. sensitivity) without rebuilding the entire inputMap. + * @param source - The physical input source to match + * @param interaction - The interaction type to match + * @returns The matching entry, or undefined if not found + */ + public getEntry(source: InputSource, interaction: string): InputMapEntry | undefined { + return this.inputMap.find((e) => e.source === source && e.interaction === interaction); + } + + /** + * Adds an entry to the inputMap at the correct position based on specificity. + * More specific entries (with more conditions like button, key, modifiers) are placed + * before less specific ones, ensuring they match first. Among equally specific entries, + * the new entry is placed after existing ones. + * @param entry - The entry to add + */ + public addEntry(entry: InputMapEntry): void { + const score = this._entrySpecificity(entry); + let insertIndex = this.inputMap.length; + for (let i = 0; i < this.inputMap.length; i++) { + if (this._entrySpecificity(this.inputMap[i]) < score) { + insertIndex = i; + break; + } + } + this.inputMap.splice(insertIndex, 0, entry); + } + + private _entrySpecificity(entry: InputMapEntry): number { + let score = 0; + if ("button" in entry && entry.button !== undefined) { + score++; + } + if ("key" in entry && entry.key !== undefined) { + score++; + } + if ("touchCount" in entry && entry.touchCount !== undefined) { + score++; + } + if ("modifiers" in entry && entry.modifiers) { + score++; + } + return score; + } + private _matchModifiers(entryModifiers?: InputModifiers, conditionModifiers?: InputModifiers): boolean { if (!entryModifiers) { return true; @@ -297,6 +345,10 @@ export class CameraMovement { let inputVelocity = velocityRef; const deltaTimeMs = this._scene.getEngine().getDeltaTime(); + if (deltaTimeMs === 0) { + return inputVelocity; + } + // If we are actively receiving input or have accumulated some pixel delta since last frame, calculate inputVelocity (inertia doesn't kick in yet) if (pixelDelta !== 0 || this.activeInput) { inputVelocity = pixelDelta / deltaTimeMs; diff --git a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts index ef9cab40e61..b335e514293 100644 --- a/packages/dev/core/src/Cameras/geospatialCameraMovement.ts +++ b/packages/dev/core/src/Cameras/geospatialCameraMovement.ts @@ -144,10 +144,10 @@ export class GeospatialCameraMovement extends CameraMovement { { source: "pointer", button: 1, interaction: "rotate" }, { source: "pointer", button: 2, interaction: "rotate" }, { source: "wheel", interaction: "zoom" }, - { source: "keyboard", key: [187, 107, 189, 109], interaction: "zoom" }, // +/-/numpad+/numpad- - { source: "keyboard", modifiers: { ctrl: true }, interaction: "rotate" }, - { source: "keyboard", modifiers: { alt: true }, interaction: "rotate" }, - { source: "keyboard", interaction: "pan" }, + { source: "keyboard", key: [187, 107, 189, 109], interaction: "zoom", sensitivity: 1.0 }, // +/-/numpad+/numpad- + { source: "keyboard", modifiers: { ctrl: true }, interaction: "rotate", sensitivity: 1.0 }, + { source: "keyboard", modifiers: { alt: true }, interaction: "rotate", sensitivity: 1.0 }, + { source: "keyboard", interaction: "pan", sensitivity: 1.0 }, ]; } diff --git a/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts b/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts index be37f272e70..79eeb0a114d 100644 --- a/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts +++ b/packages/dev/core/test/unit/Cameras/arcRotateCameraMovement.test.ts @@ -33,38 +33,38 @@ describe("ArcRotateCameraMovement", () => { }); it("should map left-click to rotate", () => { - expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 0 })?.interaction).toBe("rotate"); }); it("should map right-click to pan", () => { - expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("pan"); + expect(movement.resolveInteraction("pointer", { button: 2 })?.interaction).toBe("pan"); }); it("should map wheel to zoom", () => { - expect(movement.resolveInteraction("wheel")).toBe("zoom"); + expect(movement.resolveInteraction("wheel")?.interaction).toBe("zoom"); }); it("should map +/- keys to zoom", () => { - expect(movement.resolveInteraction("keyboard", { key: 187 })).toBe("zoom"); // + key - expect(movement.resolveInteraction("keyboard", { key: 107 })).toBe("zoom"); // numpad + - expect(movement.resolveInteraction("keyboard", { key: 189 })).toBe("zoom"); // - key - expect(movement.resolveInteraction("keyboard", { key: 109 })).toBe("zoom"); // numpad - + expect(movement.resolveInteraction("keyboard", { key: 187 })?.interaction).toBe("zoom"); // + key + expect(movement.resolveInteraction("keyboard", { key: 107 })?.interaction).toBe("zoom"); // numpad + + expect(movement.resolveInteraction("keyboard", { key: 189 })?.interaction).toBe("zoom"); // - key + expect(movement.resolveInteraction("keyboard", { key: 109 })?.interaction).toBe("zoom"); // numpad - }); it("should map zoom keys with ctrl to zoom (key match wins over modifier match)", () => { - expect(movement.resolveInteraction("keyboard", { key: 187, modifiers: { ctrl: true } })).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { key: 187, modifiers: { ctrl: true } })?.interaction).toBe("zoom"); }); it("should map ctrl+keyboard to pan", () => { - expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("pan"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })?.interaction).toBe("pan"); }); it("should map alt+keyboard to zoom", () => { - expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })?.interaction).toBe("zoom"); }); it("should map plain keyboard to rotate", () => { - expect(movement.resolveInteraction("keyboard", { modifiers: {} })).toBe("rotate"); + expect(movement.resolveInteraction("keyboard", { modifiers: {} })?.interaction).toBe("rotate"); }); }); @@ -102,13 +102,13 @@ describe("ArcRotateCameraMovement", () => { movement.resetInputMap(); expect(movement.inputMap).toHaveLength(7); - expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("rotate"); - expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("pan"); - expect(movement.resolveInteraction("wheel")).toBe("zoom"); - expect(movement.resolveInteraction("keyboard", { key: 187 })).toBe("zoom"); - expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("pan"); - expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })).toBe("zoom"); - expect(movement.resolveInteraction("keyboard", { modifiers: {} })).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 0 })?.interaction).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 2 })?.interaction).toBe("pan"); + expect(movement.resolveInteraction("wheel")?.interaction).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { key: 187 })?.interaction).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })?.interaction).toBe("pan"); + expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })?.interaction).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { modifiers: {} })?.interaction).toBe("rotate"); }); }); }); diff --git a/packages/dev/core/test/unit/Cameras/cameraMovement.test.ts b/packages/dev/core/test/unit/Cameras/cameraMovement.test.ts index 1db9d913f2d..93f721f227e 100644 --- a/packages/dev/core/test/unit/Cameras/cameraMovement.test.ts +++ b/packages/dev/core/test/unit/Cameras/cameraMovement.test.ts @@ -1,5 +1,6 @@ -import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { CameraMovement } from "core/Cameras/cameraMovement"; +import { FreeCamera } from "core/Cameras/freeCamera"; import { Vector3 } from "core/Maths/math.vector"; import { NullEngine } from "core/Engines/nullEngine"; import { Scene } from "core/scene"; @@ -19,6 +20,8 @@ describe("CameraMovement", () => { lockstepMaxSteps: 1, }); scene = new Scene(engine); + // Mock getDeltaTime to return a stable 16.67ms (60fps) + vi.spyOn(engine, "getDeltaTime").mockReturnValue(1000 / 60); movement = new CameraMovement(scene, Vector3.Zero()); }); @@ -36,10 +39,10 @@ describe("CameraMovement", () => { { source: "touch", interaction: "pan" }, ]; - expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("rotate"); - expect(movement.resolveInteraction("keyboard")).toBe("translate"); - expect(movement.resolveInteraction("wheel")).toBe("zoom"); - expect(movement.resolveInteraction("touch")).toBe("pan"); + expect(movement.resolveInteraction("pointer", { button: 0 })?.interaction).toBe("rotate"); + expect(movement.resolveInteraction("keyboard")?.interaction).toBe("translate"); + expect(movement.resolveInteraction("wheel")?.interaction).toBe("zoom"); + expect(movement.resolveInteraction("touch")?.interaction).toBe("pan"); }); it("should return first match when multiple entries exist for same source", () => { @@ -48,52 +51,62 @@ describe("CameraMovement", () => { { source: "pointer", button: 0, interaction: "pan" }, ]; - expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 0 })?.interaction).toBe("rotate"); }); it("should match exact modifiers", () => { movement.inputMap = [{ source: "keyboard", modifiers: { ctrl: true }, interaction: "pan" }]; - expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("pan"); - expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: false } })).toBe("none"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })?.interaction).toBe("pan"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: false } })).toBeNull(); }); it("should match when entry has no modifiers (matches anything)", () => { movement.inputMap = [{ source: "keyboard", interaction: "rotate" }]; - expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("rotate"); - expect(movement.resolveInteraction("keyboard")).toBe("rotate"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })?.interaction).toBe("rotate"); + expect(movement.resolveInteraction("keyboard")?.interaction).toBe("rotate"); }); it("should match partial modifiers (only check specified keys)", () => { movement.inputMap = [{ source: "keyboard", modifiers: { ctrl: true }, interaction: "pan" }]; - expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true, shift: true } })).toBe("pan"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true, shift: true } })?.interaction).toBe("pan"); }); it("should match pointer button", () => { movement.inputMap = [{ source: "pointer", button: 2, interaction: "pan" }]; - expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("pan"); - expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("none"); + expect(movement.resolveInteraction("pointer", { button: 2 })?.interaction).toBe("pan"); + expect(movement.resolveInteraction("pointer", { button: 0 })).toBeNull(); }); it("should match touch count", () => { movement.inputMap = [{ source: "touch", touchCount: 2, interaction: "zoom" }]; - expect(movement.resolveInteraction("touch", { touchCount: 2 })).toBe("zoom"); - expect(movement.resolveInteraction("touch", { touchCount: 1 })).toBe("none"); + expect(movement.resolveInteraction("touch", { touchCount: 2 })?.interaction).toBe("zoom"); + expect(movement.resolveInteraction("touch", { touchCount: 1 })).toBeNull(); }); - it("should return 'none' when no entry matches", () => { + it("should return null when no entry matches", () => { movement.inputMap = [{ source: "pointer", button: 0, interaction: "rotate" }]; - expect(movement.resolveInteraction("keyboard")).toBe("none"); + expect(movement.resolveInteraction("keyboard")).toBeNull(); }); - it("should return 'none' with empty inputMap", () => { + it("should return null with empty inputMap", () => { movement.inputMap = []; - expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("none"); + expect(movement.resolveInteraction("pointer", { button: 0 })).toBeNull(); + }); + + it("should return sensitivity from matched entry", () => { + movement.inputMap = [{ source: "pointer", button: 0, interaction: "rotate", sensitivity: 0.5 }]; + expect(movement.resolveInteraction("pointer", { button: 0 })?.sensitivity).toBe(0.5); + }); + + it("should return undefined sensitivity when not specified", () => { + movement.inputMap = [{ source: "pointer", button: 0, interaction: "rotate" }]; + expect(movement.resolveInteraction("pointer", { button: 0 })?.sensitivity).toBeUndefined(); }); }); @@ -104,6 +117,7 @@ describe("CameraMovement", () => { movement.zoomAccumulatedPixels = 3; movement.activeInput = true; + movement.computeCurrentFrameDeltas(); expect(movement.panAccumulatedPixels.x).toBe(0); @@ -116,6 +130,7 @@ describe("CameraMovement", () => { movement.panAccumulatedPixels.x = 10; movement.activeInput = true; + movement.computeCurrentFrameDeltas(); const firstDelta = movement.panDeltaCurrentFrame.x; @@ -123,6 +138,7 @@ describe("CameraMovement", () => { movement.panAccumulatedPixels.x = 10; movement.activeInput = true; + movement.computeCurrentFrameDeltas(); const secondDelta = movement.panDeltaCurrentFrame.x; @@ -136,10 +152,11 @@ describe("CameraMovement", () => { movement.rotationAccumulatedPixels.y = 10; movement.activeInput = true; + movement.computeCurrentFrameDeltas(); const ratio = movement.rotationDeltaCurrentFrame.y / movement.rotationDeltaCurrentFrame.x; - expect(Math.abs(ratio - 4)).toBeLessThan(0.01); // 2.0 / 0.5 = 4 + expect(Math.abs(ratio - 4)).toBeLessThan(0.01); }); it("should compute zoom delta with zoomSpeed", () => { @@ -147,6 +164,7 @@ describe("CameraMovement", () => { movement.zoomAccumulatedPixels = 5; movement.activeInput = true; + movement.computeCurrentFrameDeltas(); expect(movement.zoomDeltaCurrentFrame).not.toBe(0); @@ -156,11 +174,12 @@ describe("CameraMovement", () => { movement.panInertia = 0.9; movement.panAccumulatedPixels.x = 100; movement.activeInput = true; + movement.computeCurrentFrameDeltas(); const firstDelta = Math.abs(movement.panDeltaCurrentFrame.x); + movement.panAccumulatedPixels.x = 0; - movement.activeInput = false; movement.computeCurrentFrameDeltas(); const secondDelta = Math.abs(movement.panDeltaCurrentFrame.x); @@ -172,10 +191,11 @@ describe("CameraMovement", () => { movement.panInertia = 0; movement.panAccumulatedPixels.x = 100; movement.activeInput = true; + movement.computeCurrentFrameDeltas(); + movement.panAccumulatedPixels.x = 0; - movement.activeInput = false; movement.computeCurrentFrameDeltas(); expect(movement.panDeltaCurrentFrame.x).toBe(0); diff --git a/packages/dev/core/test/unit/Cameras/geospatialCameraMovement.test.ts b/packages/dev/core/test/unit/Cameras/geospatialCameraMovement.test.ts index 10e92ed2b21..02b3b1a0b40 100644 --- a/packages/dev/core/test/unit/Cameras/geospatialCameraMovement.test.ts +++ b/packages/dev/core/test/unit/Cameras/geospatialCameraMovement.test.ts @@ -41,55 +41,55 @@ describe("GeospatialCameraMovement", () => { }); it("should map left-click to pan", () => { - expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("pan"); + expect(movement.resolveInteraction("pointer", { button: 0 })?.interaction).toBe("pan"); }); it("should map middle-click to rotate", () => { - expect(movement.resolveInteraction("pointer", { button: 1 })).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 1 })?.interaction).toBe("rotate"); }); it("should map right-click to rotate", () => { - expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 2 })?.interaction).toBe("rotate"); }); it("should map wheel to zoom", () => { - expect(movement.resolveInteraction("wheel")).toBe("zoom"); + expect(movement.resolveInteraction("wheel")?.interaction).toBe("zoom"); }); it("should map +/- keys to zoom", () => { - expect(movement.resolveInteraction("keyboard", { key: 187 })).toBe("zoom"); // + key - expect(movement.resolveInteraction("keyboard", { key: 107 })).toBe("zoom"); // numpad + - expect(movement.resolveInteraction("keyboard", { key: 189 })).toBe("zoom"); // - key - expect(movement.resolveInteraction("keyboard", { key: 109 })).toBe("zoom"); // numpad - + expect(movement.resolveInteraction("keyboard", { key: 187 })?.interaction).toBe("zoom"); // + key + expect(movement.resolveInteraction("keyboard", { key: 107 })?.interaction).toBe("zoom"); // numpad + + expect(movement.resolveInteraction("keyboard", { key: 189 })?.interaction).toBe("zoom"); // - key + expect(movement.resolveInteraction("keyboard", { key: 109 })?.interaction).toBe("zoom"); // numpad - }); it("should map ctrl+keyboard to rotate", () => { - expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("rotate"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })?.interaction).toBe("rotate"); }); it("should map alt+keyboard to rotate", () => { - expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })).toBe("rotate"); + expect(movement.resolveInteraction("keyboard", { modifiers: { alt: true } })?.interaction).toBe("rotate"); }); it("should map plain keyboard to pan", () => { - expect(movement.resolveInteraction("keyboard", { modifiers: {} })).toBe("pan"); + expect(movement.resolveInteraction("keyboard", { modifiers: {} })?.interaction).toBe("pan"); }); it("should map arrow keys without modifiers to pan", () => { - expect(movement.resolveInteraction("keyboard", { key: 38, modifiers: {} })).toBe("pan"); // up arrow - expect(movement.resolveInteraction("keyboard", { key: 40, modifiers: {} })).toBe("pan"); // down arrow - expect(movement.resolveInteraction("keyboard", { key: 37, modifiers: {} })).toBe("pan"); // left arrow - expect(movement.resolveInteraction("keyboard", { key: 39, modifiers: {} })).toBe("pan"); // right arrow + expect(movement.resolveInteraction("keyboard", { key: 38, modifiers: {} })?.interaction).toBe("pan"); // up arrow + expect(movement.resolveInteraction("keyboard", { key: 40, modifiers: {} })?.interaction).toBe("pan"); // down arrow + expect(movement.resolveInteraction("keyboard", { key: 37, modifiers: {} })?.interaction).toBe("pan"); // left arrow + expect(movement.resolveInteraction("keyboard", { key: 39, modifiers: {} })?.interaction).toBe("pan"); // right arrow }); it("should map arrow keys with ctrl to rotate", () => { - expect(movement.resolveInteraction("keyboard", { key: 38, modifiers: { ctrl: true } })).toBe("rotate"); - expect(movement.resolveInteraction("keyboard", { key: 37, modifiers: { ctrl: true } })).toBe("rotate"); + expect(movement.resolveInteraction("keyboard", { key: 38, modifiers: { ctrl: true } })?.interaction).toBe("rotate"); + expect(movement.resolveInteraction("keyboard", { key: 37, modifiers: { ctrl: true } })?.interaction).toBe("rotate"); }); it("should map zoom keys with ctrl to zoom (key match wins over modifier match)", () => { // Key-specific entry comes before modifier entry in the inputMap, so it wins - expect(movement.resolveInteraction("keyboard", { key: 187, modifiers: { ctrl: true } })).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { key: 187, modifiers: { ctrl: true } })?.interaction).toBe("zoom"); }); it("should map pointer with shift modifier when configured", () => { @@ -97,8 +97,8 @@ describe("GeospatialCameraMovement", () => { { source: "pointer", button: 0, modifiers: { shift: true }, interaction: "rotate" }, { source: "pointer", button: 0, interaction: "pan" }, ]; - expect(movement.resolveInteraction("pointer", { button: 0, modifiers: { shift: true } })).toBe("rotate"); - expect(movement.resolveInteraction("pointer", { button: 0, modifiers: {} })).toBe("pan"); + expect(movement.resolveInteraction("pointer", { button: 0, modifiers: { shift: true } })?.interaction).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 0, modifiers: {} })?.interaction).toBe("pan"); }); }); @@ -224,13 +224,13 @@ describe("GeospatialCameraMovement", () => { movement.resetInputMap(); expect(movement.inputMap).toHaveLength(8); - expect(movement.resolveInteraction("pointer", { button: 0 })).toBe("pan"); - expect(movement.resolveInteraction("pointer", { button: 1 })).toBe("rotate"); - expect(movement.resolveInteraction("pointer", { button: 2 })).toBe("rotate"); - expect(movement.resolveInteraction("wheel")).toBe("zoom"); - expect(movement.resolveInteraction("keyboard", { key: 187 })).toBe("zoom"); - expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })).toBe("rotate"); - expect(movement.resolveInteraction("keyboard", { modifiers: {} })).toBe("pan"); + expect(movement.resolveInteraction("pointer", { button: 0 })?.interaction).toBe("pan"); + expect(movement.resolveInteraction("pointer", { button: 1 })?.interaction).toBe("rotate"); + expect(movement.resolveInteraction("pointer", { button: 2 })?.interaction).toBe("rotate"); + expect(movement.resolveInteraction("wheel")?.interaction).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { key: 187 })?.interaction).toBe("zoom"); + expect(movement.resolveInteraction("keyboard", { modifiers: { ctrl: true } })?.interaction).toBe("rotate"); + expect(movement.resolveInteraction("keyboard", { modifiers: {} })?.interaction).toBe("pan"); }); }); }); From 2196e8cf67e56dd39e4465be2602cee73de5fe54 Mon Sep 17 00:00:00 2001 From: Georgina Date: Mon, 13 Apr 2026 19:27:15 -0400 Subject: [PATCH 18/39] applypandelta extracted --- .../dev/core/src/Cameras/arcRotateCamera.ts | 110 +++++++----------- 1 file changed, 42 insertions(+), 68 deletions(-) diff --git a/packages/dev/core/src/Cameras/arcRotateCamera.ts b/packages/dev/core/src/Cameras/arcRotateCamera.ts index 5d7e34bafb6..99a436f7f56 100644 --- a/packages/dev/core/src/Cameras/arcRotateCamera.ts +++ b/packages/dev/core/src/Cameras/arcRotateCamera.ts @@ -1104,6 +1104,46 @@ export class ArcRotateCamera extends TargetCamera { } } + /** + * Applies a pan delta to the camera target in screen space. + * Shared by both the movement system and legacy inertia paths. + * @param panX - Horizontal pan delta + * @param panY - Vertical pan delta + */ + private _applyPanDelta(panX: number, panY: number): void { + const localDirection = TmpVectors.Vector3[0].copyFromFloats(panX, panY, panY); + + this._viewMatrix.invertToRef(this._cameraTransformMatrix); + localDirection.multiplyInPlace(this.panningAxis); + Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection); + + if (this.mapPanning) { + const up = this.upVector; + const right = Vector3.CrossToRef(this._transformedDirection, up, this._transformedDirection); + Vector3.CrossToRef(up, right, this._transformedDirection); + } else if (!this.panningAxis.y) { + this._transformedDirection.y = 0; + } + + if (!this._targetHost) { + if (this.panningDistanceLimit) { + this._transformedDirection.addInPlace(this._target); + const distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget); + if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) { + this._target.copyFrom(this._transformedDirection); + } + } else { + if (this.parent) { + const m = TmpVectors.Matrix[0]; + this.parent.getWorldMatrix().getRotationMatrixToRef(m); + m.transposeToRef(m); + Vector3.TransformCoordinatesToRef(this._transformedDirection, m, this._transformedDirection); + } + this._target.addInPlace(this._transformedDirection); + } + } + } + /** @internal */ public override _checkInputs(): void { //if (async) collision inspection was triggered, don't update the camera's position - until the collision callback was called. @@ -1125,7 +1165,6 @@ export class ArcRotateCamera extends TargetCamera { if (rotDelta.x !== 0 || rotDelta.y !== 0 || zoomDelta !== 0 || panDelta.x !== 0 || panDelta.y !== 0) { hasUserInteractions = true; - // Apply rotation const directionModifier = this.invertRotation ? -1 : 1; const handednessMultiplier = this._calculateHandednessMultiplier(); let alphaOffset = rotDelta.x * handednessMultiplier; @@ -1136,43 +1175,10 @@ export class ArcRotateCamera extends TargetCamera { this.alpha += alphaOffset * directionModifier; this.beta += rotDelta.y * directionModifier; - - // Apply zoom this.radius -= zoomDelta; - // Apply panning if (panDelta.x !== 0 || panDelta.y !== 0) { - const localDirection = TmpVectors.Vector3[0].copyFromFloats(panDelta.x, panDelta.y, panDelta.y); - - this._viewMatrix.invertToRef(this._cameraTransformMatrix); - localDirection.multiplyInPlace(this.panningAxis); - Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection); - - if (this.mapPanning) { - const up = this.upVector; - const right = Vector3.CrossToRef(this._transformedDirection, up, this._transformedDirection); - Vector3.CrossToRef(up, right, this._transformedDirection); - } else if (!this.panningAxis.y) { - this._transformedDirection.y = 0; - } - - if (!this._targetHost) { - if (this.panningDistanceLimit) { - this._transformedDirection.addInPlace(this._target); - const distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget); - if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) { - this._target.copyFrom(this._transformedDirection); - } - } else { - if (this.parent) { - const m = TmpVectors.Matrix[0]; - this.parent.getWorldMatrix().getRotationMatrixToRef(m); - m.transposeToRef(m); - Vector3.TransformCoordinatesToRef(this._transformedDirection, m, this._transformedDirection); - } - this._target.addInPlace(this._transformedDirection); - } - } + this._applyPanDelta(panDelta.x, panDelta.y); } } } else { @@ -1210,39 +1216,7 @@ export class ArcRotateCamera extends TargetCamera { if (this.inertialPanningX !== 0 || this.inertialPanningY !== 0) { hasUserInteractions = true; - const localDirection = new Vector3(this.inertialPanningX, this.inertialPanningY, this.inertialPanningY); - - this._viewMatrix.invertToRef(this._cameraTransformMatrix); - localDirection.multiplyInPlace(this.panningAxis); - Vector3.TransformNormalToRef(localDirection, this._cameraTransformMatrix, this._transformedDirection); - - // If mapPanning is enabled, we need to take the upVector into account and - // make sure we're not panning in the y direction - if (this.mapPanning) { - const up = this.upVector; - const right = Vector3.CrossToRef(this._transformedDirection, up, this._transformedDirection); - Vector3.CrossToRef(up, right, this._transformedDirection); - } else if (!this.panningAxis.y) { - this._transformedDirection.y = 0; - } - - if (!this._targetHost) { - if (this.panningDistanceLimit) { - this._transformedDirection.addInPlace(this._target); - const distanceSquared = Vector3.DistanceSquared(this._transformedDirection, this.panningOriginTarget); - if (distanceSquared <= this.panningDistanceLimit * this.panningDistanceLimit) { - this._target.copyFrom(this._transformedDirection); - } - } else { - if (this.parent) { - const m = TmpVectors.Matrix[0]; - this.parent.getWorldMatrix().getRotationMatrixToRef(m); - m.transposeToRef(m); - Vector3.TransformCoordinatesToRef(this._transformedDirection, m, this._transformedDirection); - } - this._target.addInPlace(this._transformedDirection); - } - } + this._applyPanDelta(this.inertialPanningX, this.inertialPanningY); this.inertialPanningX *= this.panningInertia; this.inertialPanningY *= this.panningInertia; From e48a14d2c78273eef780429142b03a1ff35ef280 Mon Sep 17 00:00:00 2001 From: Georgina Date: Mon, 13 Apr 2026 19:35:46 -0400 Subject: [PATCH 19/39] remove more duplication --- .../dev/core/src/Cameras/arcRotateCamera.ts | 56 +++++++++---------- 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/packages/dev/core/src/Cameras/arcRotateCamera.ts b/packages/dev/core/src/Cameras/arcRotateCamera.ts index 99a436f7f56..ba372fca564 100644 --- a/packages/dev/core/src/Cameras/arcRotateCamera.ts +++ b/packages/dev/core/src/Cameras/arcRotateCamera.ts @@ -637,9 +637,7 @@ export class ArcRotateCamera extends TargetCamera { // Handle _useCtrlForPanning: remove ctrl+keyboard→pan entry when false if (!this._useCtrlForPanning) { - const idx = this.movement.inputMap.findIndex( - (e) => e.source === "keyboard" && "modifiers" in e && e.modifiers?.ctrl === true && e.interaction === "pan" - ); + const idx = this.movement.inputMap.findIndex((e) => e.source === "keyboard" && "modifiers" in e && e.modifiers?.ctrl === true && e.interaction === "pan"); if (idx !== -1) { this.movement.inputMap.splice(idx, 1); } @@ -656,9 +654,7 @@ export class ArcRotateCamera extends TargetCamera { // Handle useAltToZoom: remove alt+keyboard→zoom entry when false const keyboardInput = this.inputs.attached["keyboard"] as ArcRotateCameraKeyboardMoveInput | undefined; if (keyboardInput && !keyboardInput.useAltToZoom) { - const idx = this.movement.inputMap.findIndex( - (e) => e.source === "keyboard" && "modifiers" in e && e.modifiers?.alt === true && e.interaction === "zoom" - ); + const idx = this.movement.inputMap.findIndex((e) => e.source === "keyboard" && "modifiers" in e && e.modifiers?.alt === true && e.interaction === "zoom"); if (idx !== -1) { this.movement.inputMap.splice(idx, 1); } @@ -1104,6 +1100,27 @@ export class ArcRotateCamera extends TargetCamera { } } + /** + * Applies rotation and zoom deltas to the camera, handling invertRotation, handedness, and beta-flip. + * Shared by both the movement system and legacy inertia paths. + * @param alphaOffset - Alpha (horizontal orbit) delta + * @param betaOffset - Beta (vertical orbit) delta + * @param radiusOffset - Radius (zoom) delta + */ + private _applyRotationAndZoomDelta(alphaOffset: number, betaOffset: number, radiusOffset: number): void { + const directionModifier = this.invertRotation ? -1 : 1; + const handednessMultiplier = this._calculateHandednessMultiplier(); + let adjustedAlpha = alphaOffset * handednessMultiplier; + + if (this.beta < 0) { + adjustedAlpha *= -1; + } + + this.alpha += adjustedAlpha * directionModifier; + this.beta += betaOffset * directionModifier; + this.radius -= radiusOffset; + } + /** * Applies a pan delta to the camera target in screen space. * Shared by both the movement system and legacy inertia paths. @@ -1155,7 +1172,6 @@ export class ArcRotateCamera extends TargetCamera { let hasUserInteractions = false; if (this.movement) { - // Movement system path: framerate-independent deltas this.movement.computeCurrentFrameDeltas(); const rotDelta = this.movement.rotationDeltaCurrentFrame; @@ -1164,18 +1180,7 @@ export class ArcRotateCamera extends TargetCamera { if (rotDelta.x !== 0 || rotDelta.y !== 0 || zoomDelta !== 0 || panDelta.x !== 0 || panDelta.y !== 0) { hasUserInteractions = true; - - const directionModifier = this.invertRotation ? -1 : 1; - const handednessMultiplier = this._calculateHandednessMultiplier(); - let alphaOffset = rotDelta.x * handednessMultiplier; - - if (this.beta < 0) { - alphaOffset *= -1; - } - - this.alpha += alphaOffset * directionModifier; - this.beta += rotDelta.y * directionModifier; - this.radius -= zoomDelta; + this._applyRotationAndZoomDelta(rotDelta.x, rotDelta.y, zoomDelta); if (panDelta.x !== 0 || panDelta.y !== 0) { this._applyPanDelta(panDelta.x, panDelta.y); @@ -1185,19 +1190,8 @@ export class ArcRotateCamera extends TargetCamera { // Legacy inertia path if (this.inertialAlphaOffset !== 0 || this.inertialBetaOffset !== 0 || this.inertialRadiusOffset !== 0) { hasUserInteractions = true; + this._applyRotationAndZoomDelta(this.inertialAlphaOffset, this.inertialBetaOffset, this.inertialRadiusOffset); - const directionModifier = this.invertRotation ? -1 : 1; - const handednessMultiplier = this._calculateHandednessMultiplier(); - let inertialAlphaOffset = this.inertialAlphaOffset * handednessMultiplier; - - if (this.beta < 0) { - inertialAlphaOffset *= -1; - } - - this.alpha += inertialAlphaOffset * directionModifier; - this.beta += this.inertialBetaOffset * directionModifier; - - this.radius -= this.inertialRadiusOffset; this.inertialAlphaOffset *= this.inertia; this.inertialBetaOffset *= this.inertia; this.inertialRadiusOffset *= this.inertia; From 4090e2e0e04d0c8575d35df87950625bf3c0a245 Mon Sep 17 00:00:00 2001 From: Georgina Date: Tue, 14 Apr 2026 12:42:34 -0400 Subject: [PATCH 20/39] speed calibration --- .../arcRotateCameraKeyboardMoveInput.ts | 11 +- .../Inputs/arcRotateCameraPointersInput.ts | 10 +- .../Inputs/geospatialCameraKeyboardInput.ts | 24 ++-- .../Inputs/geospatialCameraPointersInput.ts | 3 +- .../dev/core/src/Cameras/arcRotateCamera.ts | 2 +- .../src/Cameras/arcRotateCameraMovement.ts | 5 + .../dev/core/src/Cameras/cameraMovement.ts | 133 ++++++++++++------ 7 files changed, 122 insertions(+), 66 deletions(-) diff --git a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts index da2831257de..b89ea3f154b 100644 --- a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts @@ -102,6 +102,13 @@ export class ArcRotateCameraKeyboardMoveInput implements ICameraInput, offsetX: number, offsetY: number): void { if (this.camera.movement && this._activeEntry) { - const sens = this._activeEntry.sensitivity ?? 1; if (this._activeEntry.interaction === "pan") { + const sens = this._activeEntry.sensitivity ?? this._defaultPanSensitivity; this.camera.movement.activeInput = true; this.camera.movement.handlers.pan(-offsetX * sens, offsetY * sens); } else if (this._activeEntry.interaction === "rotate") { + const sens = this._activeEntry.sensitivity ?? this._defaultRotateSensitivity; this.camera.movement.activeInput = true; this.camera.movement.handlers.rotate(-offsetX * sens, -offsetY * sens); } diff --git a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts index 5cee623dde3..133e9c126cd 100644 --- a/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/geospatialCameraKeyboardInput.ts @@ -69,11 +69,9 @@ export class GeospatialCameraKeyboardInput implements ICameraInput e.source === "pointer" && e.interaction === "pan"); if (entry && entry.source === "pointer") { diff --git a/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts index bad244c7f67..03842fc9422 100644 --- a/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts +++ b/packages/dev/core/src/Cameras/arcRotateCameraMovement.ts @@ -48,6 +48,11 @@ export class ArcRotateCameraMovement extends CameraMovement { constructor(scene: Scene, cameraPosition: Vector3, behavior?: InterpolatingBehavior) { super(scene, cameraPosition, behavior); + // Scale global speed to match legacy ArcRotateCamera feel. + // The movement system's velocity model produces ~3.5x less movement than legacy's + // inertia-accumulating model for the same sensitivity values. + this.speed = 3.5; + this.handlers = { pan: (deltaX, deltaY) => { this.panAccumulatedPixels.x += deltaX; diff --git a/packages/dev/core/src/Cameras/cameraMovement.ts b/packages/dev/core/src/Cameras/cameraMovement.ts index 181ef0510ec..35b1338d357 100644 --- a/packages/dev/core/src/Cameras/cameraMovement.ts +++ b/packages/dev/core/src/Cameras/cameraMovement.ts @@ -5,8 +5,51 @@ import { type InterpolatingBehavior } from "../Behaviors/Cameras/interpolatingBe const FrameDurationAt60FPS = 1000 / 60; /** - * Holds all logic related to converting input pixel deltas into current frame deltas, taking speed / framerate into account - * to ensure smooth frame-rate-independent movement + * Base class for camera movement systems that convert raw input into framerate-independent camera deltas. + * + * The movement system has three layers of configuration: + * + * **1. Input mapping (`inputMap`)** — Controls which physical inputs trigger which camera interactions. + * Each entry maps a source (pointer, keyboard, wheel, touch) + optional conditions (button, modifiers, key) + * to a semantic interaction type (pan, rotate, zoom). First matching entry wins; use `addEntry()` to + * auto-insert based on specificity, or `getEntry()` to modify an existing entry. + * + * ```typescript + * // Swap left-click rotate to pan + * camera.movement.getEntry("pointer", "rotate")!.interaction = "pan"; + * camera.movement.getEntry("pointer", "pan")!.interaction = "rotate"; + * + * // Add shift+drag to pan (auto-inserted before less-specific entries) + * camera.movement.addEntry({ source: "pointer", button: 0, modifiers: { shift: true }, interaction: "pan", sensitivity: 0.002 }); + * + * // Change sensitivity of pointer rotation + * camera.movement.getEntry("pointer", "rotate")!.sensitivity = 0.005; + * + * // Map +/- keys to zoom + * camera.movement.addEntry({ source: "keyboard", key: [187, 107, 189, 109], interaction: "zoom", sensitivity: 0.04 }); + * ``` + * + * **2. Sensitivity (`sensitivity` on each inputMap entry)** — Multiplier applied to input deltas before + * passing to the handler. Higher values = faster movement. Each entry can have its own sensitivity, + * allowing different sensitivity for e.g. keyboard rotate vs pointer rotate. When `sensitivity` is + * omitted from an entry, each input class uses its own built-in default for that interaction type. + * + * **3. Handlers** — Defined on camera-specific subclasses (e.g. `ArcRotateCameraMovement.handlers`). + * Handlers receive pre-scaled deltas and accumulate them into pixel accumulators. Override individual + * handlers to customize behavior without changing input mapping: + * + * ```typescript + * const defaultRotate = camera.movement.handlers.rotate; + * camera.movement.handlers.rotate = (dx, dy) => { + * console.log("rotate:", dx, dy); + * defaultRotate(dx, dy); + * }; + * ``` + * + * **4. Speed and inertia** — Properties on this base class that control how accumulated pixel deltas + * are converted to framerate-independent camera deltas via `computeCurrentFrameDeltas()`: + * - `panSpeed`, `rotationXSpeed`, `rotationYSpeed`, `zoomSpeed` — units of movement per pixel + * - `panInertia`, `rotationInertia`, `zoomInertia` — velocity decay factor when input stops (0 = instant stop, 0.9 = smooth glide) */ export class CameraMovement { protected _scene: Scene; @@ -40,49 +83,42 @@ export class CameraMovement { * Among equally specific entries, the first one in the array wins. * Returns the matched entry, or null if no entry matches. * @param source - The physical input source (e.g. "pointer", "keyboard") - * @param conditions - Conditions to match against, specific to the source type + * @param currentConditions - Conditions to match against, specific to the source type * @returns The matched InputMapEntry, or null if no entry matches */ - public resolveInteraction(source: InputSource, conditions?: InputConditions): InputMapEntry | null { + public resolveInteraction(source: InputSource, currentConditions?: InputConditions): InputMapEntry | null { for (const entry of this.inputMap) { - if (entry.source !== source) { - continue; + if (entry.source === source && this._entryMatches(entry, currentConditions)) { + return entry; } - switch (entry.source) { - case "pointer": - if (entry.button !== undefined && entry.button !== conditions?.button) { - continue; - } - if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) { - continue; - } - break; - case "wheel": - if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) { - continue; - } - break; - case "touch": - if (entry.touchCount !== undefined && entry.touchCount !== conditions?.touchCount) { - continue; - } - break; - case "keyboard": - if (entry.key !== undefined) { - if (Array.isArray(entry.key) ? entry.key.indexOf(conditions?.key ?? -1) === -1 : entry.key !== conditions?.key) { - continue; - } - } - if (!this._matchModifiers(entry.modifiers, conditions?.modifiers)) { - continue; - } - break; - } - return entry; } return null; } + private _entryMatches(entry: InputMapEntry, currentConditions?: InputConditions): boolean { + switch (entry.source) { + case "pointer": + if (entry.button !== undefined && entry.button !== currentConditions?.button) { + return false; + } + return this._matchModifiers(entry.modifiers, currentConditions?.modifiers); + case "wheel": + return this._matchModifiers(entry.modifiers, currentConditions?.modifiers); + case "touch": + if (entry.touchCount !== undefined && entry.touchCount !== currentConditions?.touchCount) { + return false; + } + return true; + case "keyboard": + if (entry.key !== undefined) { + if (Array.isArray(entry.key) ? entry.key.indexOf(currentConditions?.key ?? -1) === -1 : entry.key !== currentConditions?.key) { + return false; + } + } + return this._matchModifiers(entry.modifiers, currentConditions?.modifiers); + } + } + /** * Restores the inputMap to the default configuration for this camera type. * The base class resets to an empty array. Subclasses override this to restore @@ -139,17 +175,17 @@ export class CameraMovement { return score; } - private _matchModifiers(entryModifiers?: InputModifiers, conditionModifiers?: InputModifiers): boolean { + private _matchModifiers(entryModifiers?: InputModifiers, currentModifiers?: InputModifiers): boolean { if (!entryModifiers) { return true; } - if (entryModifiers.ctrl !== undefined && entryModifiers.ctrl !== (conditionModifiers?.ctrl ?? false)) { + if (entryModifiers.ctrl !== undefined && entryModifiers.ctrl !== (currentModifiers?.ctrl ?? false)) { return false; } - if (entryModifiers.shift !== undefined && entryModifiers.shift !== (conditionModifiers?.shift ?? false)) { + if (entryModifiers.shift !== undefined && entryModifiers.shift !== (currentModifiers?.shift ?? false)) { return false; } - if (entryModifiers.alt !== undefined && entryModifiers.alt !== (conditionModifiers?.alt ?? false)) { + if (entryModifiers.alt !== undefined && entryModifiers.alt !== (currentModifiers?.alt ?? false)) { return false; } return true; @@ -160,6 +196,11 @@ export class CameraMovement { * Speed defines the amount of camera movement expected per input pixel movement * ----------------------------------- */ + /** + * Global speed multiplier applied to all movement (pan, rotation, zoom). + * Acts as a master scale factor on top of the individual speed properties. + */ + public speed: number = 1; /** * Desired coordinate unit movement per input pixel when zooming */ @@ -314,7 +355,7 @@ export class CameraMovement { this._calculateCurrentVelocity(this._panVelocity.y, this.panAccumulatedPixels.y, this.panInertia), this._calculateCurrentVelocity(this._panVelocity.z, this.panAccumulatedPixels.z, this.panInertia) ); - this._panVelocity.scaleToRef(this.panSpeed * this._panSpeedMultiplier * deltaTimeMs, this.panDeltaCurrentFrame); + this._panVelocity.scaleToRef(this.speed * this.panSpeed * this._panSpeedMultiplier * deltaTimeMs, this.panDeltaCurrentFrame); this._rotationVelocity.copyFromFloats( this._calculateCurrentVelocity(this._rotationVelocity.x, this.rotationAccumulatedPixels.x, this.rotationInertia), @@ -322,13 +363,13 @@ export class CameraMovement { this._calculateCurrentVelocity(this._rotationVelocity.z, this.rotationAccumulatedPixels.z, this.rotationInertia) ); this.rotationDeltaCurrentFrame.copyFromFloats( - this._rotationVelocity.x * this.rotationXSpeed * deltaTimeMs, - this._rotationVelocity.y * this.rotationYSpeed * deltaTimeMs, - this._rotationVelocity.z * this.rotationYSpeed * deltaTimeMs + this._rotationVelocity.x * this.speed * this.rotationXSpeed * deltaTimeMs, + this._rotationVelocity.y * this.speed * this.rotationYSpeed * deltaTimeMs, + this._rotationVelocity.z * this.speed * this.rotationYSpeed * deltaTimeMs ); this._zoomVelocity = this._calculateCurrentVelocity(this._zoomVelocity, this.zoomAccumulatedPixels, this.zoomInertia); - this.zoomDeltaCurrentFrame = this._zoomVelocity * (this.zoomSpeed * this._zoomSpeedMultiplier) * deltaTimeMs; + this.zoomDeltaCurrentFrame = this._zoomVelocity * (this.speed * this.zoomSpeed * this._zoomSpeedMultiplier) * deltaTimeMs; this._prevFrameTimeMs = deltaTimeMs; this.zoomAccumulatedPixels = 0; From 85ad3177ff1fe6e77194352e4907c23449a9c0cc Mon Sep 17 00:00:00 2001 From: Georgina Date: Thu, 16 Apr 2026 12:53:44 -0400 Subject: [PATCH 21/39] inputmapper --- camera-test.ahk | 99 +++ devhost-after-reload.png | Bin 0 -> 75306 bytes devhost-initial.png | Bin 0 -> 13518 bytes legacy-before-drag.png | Bin 0 -> 101187 bytes legacy-drag.webm | Bin 0 -> 315292 bytes movement-drag.webm | Bin 0 -> 325461 bytes movement-system-presentation.html | 827 ++++++++++++++++++ .../arcRotateCameraKeyboardMoveInput.ts | 24 +- .../Inputs/arcRotateCameraMouseWheelInput.ts | 2 +- .../Inputs/arcRotateCameraPointersInput.ts | 12 +- .../Inputs/geospatialCameraKeyboardInput.ts | 46 +- .../Inputs/geospatialCameraMouseWheelInput.ts | 2 +- .../Inputs/geospatialCameraPointersInput.ts | 36 +- .../dev/core/src/Cameras/arcRotateCamera.ts | 18 +- .../src/Cameras/arcRotateCameraMovement.ts | 59 +- .../core/src/Cameras/cameraInteractions.ts | 160 ++++ .../dev/core/src/Cameras/cameraMovement.ts | 179 +--- .../dev/core/src/Cameras/geospatialCamera.ts | 3 +- .../src/Cameras/geospatialCameraMovement.ts | 95 +- packages/dev/core/src/Cameras/index.ts | 1 + .../Cameras/arcRotateCameraMovement.test.ts | 81 +- .../test/unit/Cameras/cameraMovement.test.ts | 164 ++-- .../Cameras/geospatialCameraMovement.test.ts | 158 ++-- specs/inputSystem/architecture.md | 805 +++++++++++++++++ specs/inputSystem/goals.md | 87 ++ specs/inputSystem/requirements.md | 268 ++++++ specs/inputSystem/task-board.md | 31 + temp_pg_legacy.js | 21 + 28 files changed, 2679 insertions(+), 499 deletions(-) create mode 100644 camera-test.ahk create mode 100644 devhost-after-reload.png create mode 100644 devhost-initial.png create mode 100644 legacy-before-drag.png create mode 100644 legacy-drag.webm create mode 100644 movement-drag.webm create mode 100644 movement-system-presentation.html create mode 100644 specs/inputSystem/architecture.md create mode 100644 specs/inputSystem/goals.md create mode 100644 specs/inputSystem/requirements.md create mode 100644 specs/inputSystem/task-board.md create mode 100644 temp_pg_legacy.js diff --git a/camera-test.ahk b/camera-test.ahk new file mode 100644 index 00000000000..1926e8c6a02 --- /dev/null +++ b/camera-test.ahk @@ -0,0 +1,99 @@ +; AutoHotkey v2 script for testing camera inertia at different framerates. +; +; USAGE: +; 1. Open the Babylon.js playground with the test scene loaded +; 2. Run this script: autohotkey camera-test.ahk +; 3. Click inside the playground canvas to focus it +; 4. Press F5 to start the test — it holds W for exactly 2 seconds, then releases +; 5. Observe the camera coast (inertia). Note final position from the GUI overlay. +; 6. Reset camera (switch camera type back and forth in the GUI) +; 7. Toggle FPS throttle in the playground GUI (e.g. 60 → 30) +; 8. Press F5 again — same 2-second W hold +; 9. Compare final positions between framerates +; +; HOTKEYS: +; F5 = Hold W for 2 seconds then release (translation test) +; F6 = Hold right-click + drag mouse 300px right over 1 second (rotation test) +; F7 = Hold right-click + drag mouse 200px down over 1 second (ArcRotate beta test) +; F8 = Scroll wheel down 5 clicks (zoom test for ArcRotateCamera) +; Esc = Exit this script +; + +#Requires AutoHotkey v2.0 +#SingleInstance Force + +; --- F5: Translation test (Right arrow held for 2 seconds) --- +F5:: { + ToolTip("Holding Right arrow for 0.5 seconds...") + Send("{Right down}") + Sleep(500) + Send("{Right up}") + ToolTip("Released Right — watch inertia coast") + Sleep(2000) + ToolTip() +} + +; --- F6: Rotation test (right-click drag 300px right over 1 second) --- +F6:: { + ToolTip("Right-click dragging right 300px over 1s...") + MouseGetPos(&startX, &startY) + + ; Right mouse down + Click("Right Down") + Sleep(50) + + ; Move 300px right in 30 steps over ~1 second + steps := 30 + pxPerStep := 10 ; 30 * 10 = 300px total + Loop steps { + MouseMove(pxPerStep, 0, 0, "R") ; relative move + Sleep(33) ; ~30fps step rate + } + + ; Right mouse up + Click("Right Up") + ToolTip("Released — watch rotation inertia") + Sleep(2000) + ToolTip() + + ; Move mouse back to start + MouseMove(startX, startY) +} + +; --- F7: Vertical drag test (right-click drag 200px down over 1 second) --- +F7:: { + ToolTip("Right-click dragging down 200px over 1s...") + MouseGetPos(&startX, &startY) + + Click("Right Down") + Sleep(50) + + steps := 30 + pxPerStep := 7 ; ~210px total + Loop steps { + MouseMove(0, pxPerStep, 0, "R") + Sleep(33) + } + + Click("Right Up") + ToolTip("Released — watch beta inertia") + Sleep(2000) + ToolTip() + + MouseMove(startX, startY) +} + +; --- F8: Zoom test (5 scroll wheel clicks down) --- +F8:: { + ToolTip("Scrolling down 5 clicks...") + Loop 5 { + Click("WheelDown") + Sleep(200) + } + ToolTip("Done — watch zoom inertia") + Sleep(2000) + ToolTip() +} + +; --- Esc: Exit script --- +Esc:: ExitApp() diff --git a/devhost-after-reload.png b/devhost-after-reload.png new file mode 100644 index 0000000000000000000000000000000000000000..a84dcfbec55073fde4679b56afbe60ac168d907b GIT binary patch literal 75306 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 {4Rd|Thnw( ziN}589EYv>26?&{D5~m%HA7m$=`Owet3*9W-}k>&>;?zOU$-33$w3od!w)q% z8y&Pi0idFK>bt*N8h|v}dPgs%!sN*Lc~ZBc5X|c)sE-48BBi0fq#f$28)tlCsb%rd zGnv@qG@NJ(^1`myIiT&IR6F^-gTT2W(VU=1-~_fB!E57D;RlftHd)&^mx zhwCx22NXELDO%iXZ#0=VC-KC>PmO5o0YQ4?Z-g&cSJL=kf~HXF2GBm2Ip+SxhI7Wt zOZZpaGFFcjiXa6+@a`*jO5~8B<)wmw*?={4pz-N^u*W*(9)HiNOepmkmmEvKzTTj^ z$4Ku*>m$dq1F}6VP&D?!OU`}A*~3ou04UI}1^~q=$i^v4HrU2&SV+CKt$j=G=Onp@ z{xhNjU3dnd?$#X}pZ4{6ZMut3q9u8_X3e732iF>Lm=|*50Y|O17rgiFMxBz7{L{m{ ztNgpM6$U<1AUEh^c268m;{&AGX}<{U zo2Z*l((VIwI%I^EmvAGU=5l+uWloK*mm&^1{RT!1o#J0KT9I`Qzx!XcfGl(LXoMo3 zp0Zi@bm&Pjaxh;Diw;6JyoOROfUf(8%_T@Sq{wd4XpR>;XtF|G>aC?!;DAbG59~Nl z7)XDes>%;V0Y5m*obwtA+;_+Q!#KG%7S3Ugs#&9raZiSX2!tzpg(8TXX6#|F3_&); z!FHGmQzhqf^I5-UPLIX@Wt>A&PMNoTXhAfV{EsQ*72Zvk3+a43s+NlvtF3hPV3>KG zEGpCEIAA{t$Yix4?TuqseXBDgMu)~AY&}KKfA|@ZoCLv61(S61M;)c-Z7H8SFz5}* z3iY(DZUn4cwE=T66-q^dy{#&S>O}NSE7UhtuXlREbt5{ev9itEwJj9u+ee^kz}8a< zKb2TApW&~J$HaoSWmh(ujDnXr$e z!L#IQjVRkt@6JBk2gbV!n;B{b!lN7 z24#p5Fnx*3Lap6LVRJf;t#@l)H{y3XV!CN54XqEE#)8D7wG6%aPFue9{n8h{?S)>K z6VhH24V2t0L&$VLf**CF`~*QsZ2(B8!77_De9|46bkSn_J;-;D# z8#IK5r<$ZYU7TfuOcKD$&x0?iOHGh6IE8|szJK7M1+ z2^zaMJ*0*!)ZSU2WL}MEq$($|2jW7Vv4dE8XQmfQ+-!u@V4x8ksB_T%_`k&u{#p%W zSA-k&GL5umV5azcIETR&A5ZiOr(xVixaL-epf9%_?XwNwt$^w1xDz(Jh|>>s>GR8Y zid!ffZ}+*Q1%tcoTBSzxAN8o$|B^rnn^x4+oUd+D49V1N_PxP!ptfev#NdF5{a&{7 z$TRe2u3dnCfH)NM60o=ggiY{tL-IvsqBthI-1N3vS-sg+@zLZ9rQ(~90RDb6Bw@ALhZO< zYr864U!Pxcx$$a5?%z)&&!avezK>%k8EpkNW$a-az>d4|X7cDkixv+S*&%o1nZM8E z+$~Wh;V>1{-K(fMcKqZNouC500lk0&7dySYvZ79Xb0LKUFQR65^lF5fTfTF@Sgg={ zBlXNI+p7ul%uUJ)D8ul30TB+iJeXp~1a)-m#Sn^1_VHqVSeW6G`)ps3O7cG@8oLGv z5bPzu*p8O9Lo4!Sez01Ck=f1*bGVTD(f^oM@%Z7fOlpG)oG~{FPLCbLC9#iB?HXtD z9<4EuwA*GvPU*viQBR7iT9!&i@GeXAdMhO{NGuhYscI>ok`3kc&q{8&9%%~HeMcW&DLt?9==xV9fCohbPR2*tgK$u zcrFb@O2Fh4k$YdNQ&QNdKdtk8kpjZjq#XTF>IM9G8sBuP+wOSm8mJhA?^g^=lI2lk zO5w1Y_1qBYRaZ)Dr z<;BH+%MPiUC}x-7;K@Y+caNLZ0~^vzWC#sGoB}9+5Fp`jeBYcpC4Q$Tky_Gfu>3

xacFgbJsCmlP0z^-$81!O$jOj4SnN6AhcgG`=* zB3SW?B35~JE}}JuRCjT9JFA9NU9YkGZ4igJ$J^$&&n_Fu&EMZ#;HlxRS=GCs$#`Nm zMp$EvVu=7Z_e(kgsTT?vxqMmg@|bOYaMSnXuOnG48!>>II*Ea&5=pvB?&F_tX^<^? z;0Y_s`a_>uj~TTr_rNAwgMjb%R_|XVH#0D0n3_o&*NLoxXI~^&81v-=WY0J@XebgG zL9+U0)t1pJaT%|a&&K<_)Z7mLg&dtVl@6ue0jlt;b^5p`EwAb^C;}^#Tw)}NGrM*) z05Q`7;suA`EW|OvK_+wWJY0GgEgPuecuakLz5D?MHGpTYz9H=1GxmJ2-x#B&W=Xs~ z%)UB${bW6G!i@dLv$H9gEzPQ*>JeUPeqHksN^=Xyxu*y*s6fLi`(XbmB`+M3X>W<9 zj(`6lC+V)?Ibc@5_t)&cou6z6^n}Z=D{@G#LON+;;tQ)vB{h%fzk;+P`JeqaxI54p zdV_X&yz-~a8ZSJ1F=534|AuKE4UZY`=EUMYe>H^1N?XKl}_^Nvmkt z7-enaas>JnD>ao;Qg5zSwA*@{)bpdM=}RiX)_)T|8Aw)3uLl%DP8x*WE;M@Wm3$wW zr&ee#Ta$Uyjk$~w4z{Nyw)R|rW;H=@mm@Z;zPS)GPPK~pb{F%oqhy6dvPSeE*~4%k z6YRg-Gmu5gT*z$A!#H0I=MYS(p!9R^Pk-#fepGj6e&bFL@EgIZ5q2GXY%+|LRl^R|p4M8< zK!&*8sc1l<@nh)CDAqO^a6QK#(Em6H8#4OLj#;b<{qeJCFChj&VLiZ&pkIB7H-2?v z{^~*f$!32N+g~lZzZ#Q&wPXLUb%l4%L6e~I-fsUJf&U-ifBgMqVOB;-?w3hbjdSI_ zbDKH!Ta?hhtj&)0>$ALKFu+7sbPTJ=J7MY}k5qO>zHwfXJ5Zs;KLf{?&CPc`$jZDaJ>IR)JhO)^n;U z@FKRq^`9)}5?@ayheg8cT1Mh(l#_fQHUkzjm!2gG8mZgdQ-riIOc9J)FAG_#yk)-8 zjmc>Ados<8t9P_p#4@)zaqZL#>dJl3>YM4C(mlVi<6@IrG)cQm^dg~?5QkjA(*})> z8EKt`png}}Y1#;y)*8OBs^kAneNVEF&$*AsD~QI6+lu{u5lyPCV%c6@adIYS&9h@# zKS_j)52-m{th)38RkIo$2bZNa;`jzyDR2Ldv~r|;Cn9Nu$;UI}LGVo-sdAX}TYnh3 z?K}#zt=YN~u$!6Ram$W#I~if^oyz&TJaj?4J22__!71;6BJu_`K_l?tgL}6G(%l>WSb5aL*D>qp@zU(tDEoDYClNMD$tqO!qu)zmA0cZK057GlZIAuW8m9zm)ys zzL#Cdfd4FNJ9NDZf2mj8XxsjsVW955D*v#$&9D47W-}uzu+ewjVSBs}uhi>o*zvV9 z$M9=Qb(fQlh>!fA4J+CTn3D>NuQ literal 0 HcmV?d00001 diff --git a/legacy-before-drag.png b/legacy-before-drag.png new file mode 100644 index 0000000000000000000000000000000000000000..018c08aecdff04f5c74587fafb7d70ad4df76752 GIT binary patch literal 101187 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%0A3CkT}I39b4Qmg(gM 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 BcTfNT literal 0 HcmV?d00001 diff --git a/legacy-drag.webm b/legacy-drag.webm new file mode 100644 index 0000000000000000000000000000000000000000..468fabefe20789b02d121ad071ff8a59b00eb3d5 GIT binary patch literal 315292 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\s80yd)N20<7iuoa0U=>%)LKwA)%Dl9Y&Y_)BN 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ýnXNBTy=kx*HMPs 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 Zfud_nt%>3S)F=Ht5=|#c*@&XM_#d9yR8If^ literal 0 HcmV?d00001 diff --git a/movement-drag.webm b/movement-drag.webm new file mode 100644 index 0000000000000000000000000000000000000000..9587e896a03b5c2f8f17dcdeae6bcdd915d54d82 GIT binary patch literal 325461 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