@aura3d/controls 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/ControlState.d.ts +14 -0
  2. package/dist/ControlState.d.ts.map +1 -0
  3. package/dist/ControlState.js +11 -0
  4. package/dist/ControlState.js.map +1 -0
  5. package/dist/DragControls.d.ts +8 -0
  6. package/dist/DragControls.d.ts.map +1 -0
  7. package/dist/DragControls.js +14 -0
  8. package/dist/DragControls.js.map +1 -0
  9. package/dist/FirstPersonControls.d.ts +5 -0
  10. package/dist/FirstPersonControls.d.ts.map +1 -0
  11. package/dist/FirstPersonControls.js +8 -0
  12. package/dist/FirstPersonControls.js.map +1 -0
  13. package/dist/FlyControls.d.ts +8 -0
  14. package/dist/FlyControls.d.ts.map +1 -0
  15. package/dist/FlyControls.js +12 -0
  16. package/dist/FlyControls.js.map +1 -0
  17. package/dist/InteractionControls.d.ts +83 -0
  18. package/dist/InteractionControls.d.ts.map +1 -0
  19. package/dist/InteractionControls.js +163 -0
  20. package/dist/InteractionControls.js.map +1 -0
  21. package/dist/MapControls.d.ts +6 -0
  22. package/dist/MapControls.d.ts.map +1 -0
  23. package/dist/MapControls.js +9 -0
  24. package/dist/MapControls.js.map +1 -0
  25. package/dist/NativeControlTypes.d.ts +49 -0
  26. package/dist/NativeControlTypes.d.ts.map +1 -0
  27. package/dist/NativeControlTypes.js +58 -0
  28. package/dist/NativeControlTypes.js.map +1 -0
  29. package/dist/OrbitControls.d.ts +11 -0
  30. package/dist/OrbitControls.d.ts.map +1 -0
  31. package/dist/OrbitControls.js +25 -0
  32. package/dist/OrbitControls.js.map +1 -0
  33. package/dist/Picking.d.ts +41 -0
  34. package/dist/Picking.d.ts.map +1 -0
  35. package/dist/Picking.js +149 -0
  36. package/dist/Picking.js.map +1 -0
  37. package/dist/PickingAnnotations.d.ts +134 -0
  38. package/dist/PickingAnnotations.d.ts.map +1 -0
  39. package/dist/PickingAnnotations.js +221 -0
  40. package/dist/PickingAnnotations.js.map +1 -0
  41. package/dist/PointerLockControls.d.ts +9 -0
  42. package/dist/PointerLockControls.d.ts.map +1 -0
  43. package/dist/PointerLockControls.js +14 -0
  44. package/dist/PointerLockControls.js.map +1 -0
  45. package/dist/SelectionManager.d.ts +8 -0
  46. package/dist/SelectionManager.d.ts.map +1 -0
  47. package/dist/SelectionManager.js +15 -0
  48. package/dist/SelectionManager.js.map +1 -0
  49. package/dist/TrackballControls.d.ts +18 -0
  50. package/dist/TrackballControls.d.ts.map +1 -0
  51. package/dist/TrackballControls.js +99 -0
  52. package/dist/TrackballControls.js.map +1 -0
  53. package/dist/TransformControls.d.ts +11 -0
  54. package/dist/TransformControls.d.ts.map +1 -0
  55. package/dist/TransformControls.js +19 -0
  56. package/dist/TransformControls.js.map +1 -0
  57. package/dist/index.d.ts +21 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +15 -0
  60. package/dist/index.js.map +1 -0
  61. package/package.json +16 -0
  62. package/src/ControlState.ts +24 -0
  63. package/src/DragControls.ts +17 -0
  64. package/src/FirstPersonControls.ts +8 -0
  65. package/src/FlyControls.ts +14 -0
  66. package/src/InteractionControls.ts +224 -0
  67. package/src/MapControls.ts +10 -0
  68. package/src/NativeControlTypes.ts +93 -0
  69. package/src/OrbitControls.ts +25 -0
  70. package/src/Picking.ts +234 -0
  71. package/src/PickingAnnotations.ts +391 -0
  72. package/src/PointerLockControls.ts +15 -0
  73. package/src/SelectionManager.ts +18 -0
  74. package/src/TrackballControls.ts +116 -0
  75. package/src/TransformControls.ts +19 -0
  76. package/src/index.ts +58 -0
@@ -0,0 +1,99 @@
1
+ import { OrbitControls } from "./OrbitControls.js";
2
+ export class TrackballControls extends OrbitControls {
3
+ enableDamping = false;
4
+ dampingFactor = 0.08;
5
+ keyPanSpeed = 0.12;
6
+ keyRollSpeed = 0.06;
7
+ rotationVelocity = { x: 0, y: 0, z: 0 };
8
+ panVelocity = { x: 0, y: 0 };
9
+ dollyVelocity = 0;
10
+ roll(delta) {
11
+ if (!this.state.enabled || !this.enableRotate)
12
+ return;
13
+ this.state.rotation.z += delta;
14
+ this.rotationVelocity.z += delta;
15
+ }
16
+ rotate(deltaX, deltaY) {
17
+ if (!this.state.enabled || !this.enableRotate)
18
+ return;
19
+ super.rotate(deltaX, deltaY);
20
+ this.rotationVelocity.x += deltaY;
21
+ this.rotationVelocity.y += deltaX;
22
+ }
23
+ pan(deltaX, deltaY) {
24
+ if (!this.state.enabled || !this.enablePan)
25
+ return;
26
+ super.pan(deltaX, deltaY);
27
+ this.panVelocity.x += deltaX;
28
+ this.panVelocity.y += deltaY;
29
+ }
30
+ dolly(scale) {
31
+ if (!this.state.enabled || !this.enableZoom)
32
+ return;
33
+ super.dolly(scale);
34
+ this.dollyVelocity += scale - 1;
35
+ }
36
+ handleKey(code) {
37
+ switch (code) {
38
+ case "ArrowUp":
39
+ this.pan(0, this.keyPanSpeed);
40
+ break;
41
+ case "ArrowDown":
42
+ this.pan(0, -this.keyPanSpeed);
43
+ break;
44
+ case "ArrowLeft":
45
+ this.pan(-this.keyPanSpeed, 0);
46
+ break;
47
+ case "ArrowRight":
48
+ this.pan(this.keyPanSpeed, 0);
49
+ break;
50
+ case "KeyQ":
51
+ this.roll(-this.keyRollSpeed);
52
+ break;
53
+ case "KeyE":
54
+ this.roll(this.keyRollSpeed);
55
+ break;
56
+ case "NumpadAdd":
57
+ case "+":
58
+ case "=":
59
+ this.dolly(0.95);
60
+ break;
61
+ case "NumpadSubtract":
62
+ case "-":
63
+ case "_":
64
+ this.dolly(1.05);
65
+ break;
66
+ }
67
+ }
68
+ update(deltaSeconds = 1 / 60) {
69
+ if (!this.enableDamping) {
70
+ return false;
71
+ }
72
+ const damping = Math.max(0, Math.min(1, this.dampingFactor * deltaSeconds * 60));
73
+ const rotationStep = {
74
+ x: this.rotationVelocity.x * damping,
75
+ y: this.rotationVelocity.y * damping,
76
+ z: this.rotationVelocity.z * damping
77
+ };
78
+ const panStep = {
79
+ x: this.panVelocity.x * damping,
80
+ y: this.panVelocity.y * damping
81
+ };
82
+ const dollyStep = this.dollyVelocity * damping;
83
+ this.state.rotation.x += rotationStep.x;
84
+ this.state.rotation.y += rotationStep.y;
85
+ this.state.rotation.z += rotationStep.z;
86
+ this.state.target.x += panStep.x;
87
+ this.state.target.y += panStep.y;
88
+ this.state.position.z *= 1 + dollyStep;
89
+ this.rotationVelocity.x -= rotationStep.x;
90
+ this.rotationVelocity.y -= rotationStep.y;
91
+ this.rotationVelocity.z -= rotationStep.z;
92
+ this.panVelocity.x -= panStep.x;
93
+ this.panVelocity.y -= panStep.y;
94
+ this.dollyVelocity -= dollyStep;
95
+ return Math.abs(this.rotationVelocity.x) + Math.abs(this.rotationVelocity.y) + Math.abs(this.rotationVelocity.z) +
96
+ Math.abs(this.panVelocity.x) + Math.abs(this.panVelocity.y) + Math.abs(this.dollyVelocity) > 1e-6;
97
+ }
98
+ }
99
+ //# sourceMappingURL=TrackballControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackballControls.js","sourceRoot":"","sources":["../../../../packages/controls/src/TrackballControls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type ControlObject3DLike, type Vector3Like } from "./NativeControlTypes";
2
+ export type TransformControlMode = "translate" | "rotate" | "scale";
3
+ export declare class TransformControls {
4
+ object: ControlObject3DLike | null;
5
+ mode: TransformControlMode;
6
+ attach(object: ControlObject3DLike): void;
7
+ detach(): void;
8
+ setMode(mode: TransformControlMode): void;
9
+ apply(delta: Vector3Like): void;
10
+ }
11
+ //# sourceMappingURL=TransformControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformControls.d.ts","sourceRoot":"","sources":["../../../../packages/controls/src/TransformControls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE9F,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpE,qBAAa,iBAAiB;IAC5B,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAQ;IAC1C,IAAI,EAAE,oBAAoB,CAAe;IAEzC,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IACzC,MAAM,IAAI,IAAI;IACd,OAAO,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAEzC,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;CAMhC"}
@@ -0,0 +1,19 @@
1
+ import { addVector3 } from "./NativeControlTypes.js";
2
+ export class TransformControls {
3
+ object = null;
4
+ mode = "translate";
5
+ attach(object) { this.object = object; }
6
+ detach() { this.object = null; }
7
+ setMode(mode) { this.mode = mode; }
8
+ apply(delta) {
9
+ if (!this.object)
10
+ return;
11
+ if (this.mode === "translate")
12
+ addVector3(this.object.position, delta);
13
+ if (this.mode === "rotate")
14
+ addVector3(this.object.rotation, delta);
15
+ if (this.mode === "scale")
16
+ addVector3(this.object.scale, delta);
17
+ }
18
+ }
19
+ //# sourceMappingURL=TransformControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformControls.js","sourceRoot":"","sources":["../../../../packages/controls/src/TransformControls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA8C,MAAM,sBAAsB,CAAC;AAI9F,MAAM,OAAO,iBAAiB;IAC5B,MAAM,GAA+B,IAAI,CAAC;IAC1C,IAAI,GAAyB,WAAW,CAAC;IAEzC,MAAM,CAAC,MAA2B,IAAU,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACnE,MAAM,KAAW,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,IAA0B,IAAU,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IAE/D,KAAK,CAAC,KAAkB;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACvE,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ export { OrbitControls } from "./OrbitControls";
2
+ export { TrackballControls } from "./TrackballControls";
3
+ export { FlyControls } from "./FlyControls";
4
+ export { FirstPersonControls } from "./FirstPersonControls";
5
+ export { MapControls } from "./MapControls";
6
+ export { PointerLockControls } from "./PointerLockControls";
7
+ export { DragControls } from "./DragControls";
8
+ export { TransformControls } from "./TransformControls";
9
+ export type { TransformControlMode } from "./TransformControls";
10
+ export { SelectionManager } from "./SelectionManager";
11
+ export { InteractionControls } from "./InteractionControls";
12
+ export type { HotspotHandler, InteractionControlMode, InteractionControlsEvent, InteractionControlsEventType, InteractionControlsListener, InteractionControlsOptions, InteractionControlsUpdate, InteractionRay, InteractionRayProvider, InteractionRootProvider } from "./InteractionControls";
13
+ export { Picking } from "./Picking";
14
+ export type { PickingDiagnostics, PickingOptions, PickingReport, ThreeCompatPickResult } from "./Picking";
15
+ export { annotationFromPickHit, createDistrictPickingAnnotations, createEntityPickingAnnotations, createImportedGlbHotspotAnnotations, createPickingAnnotationObject, createPickingAnnotationRoot, createRobotPickingAnnotations, pickAnnotation, pickScreenSpaceAnnotation } from "./PickingAnnotations";
16
+ export type { BuildingPickingDescriptor, DistrictPickingDescriptor, EntityPickingDescriptor, ImportedGlbHotspotDescriptor, PickingAnnotation, PickingAnnotationHitPolicy, PickingAnnotationKind, PickingAnnotationObject, PickingAnnotationOptions, PickingAnnotationReport, PickingAnnotationRoot, PickingAnnotationSource, ScreenPickingAnnotation, ScreenPickingHit, ScreenPickingOptions, ScreenPickingReport } from "./PickingAnnotations";
17
+ export { ControlVector3 } from "./NativeControlTypes";
18
+ export type { ControlObject3DLike, ControlPickMetadata, Vector3Like } from "./NativeControlTypes";
19
+ export { createDefaultControlState } from "./ControlState";
20
+ export type { ThreeCompatControlEvent, ThreeCompatControlState } from "./ControlState";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/controls/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACV,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,yBAAyB,EACzB,cAAc,EACd,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC1G,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,8BAA8B,EAC9B,mCAAmC,EACnC,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAC7B,cAAc,EACd,yBAAyB,EAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,iBAAiB,EACjB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export { OrbitControls } from "./OrbitControls.js";
2
+ export { TrackballControls } from "./TrackballControls.js";
3
+ export { FlyControls } from "./FlyControls.js";
4
+ export { FirstPersonControls } from "./FirstPersonControls.js";
5
+ export { MapControls } from "./MapControls.js";
6
+ export { PointerLockControls } from "./PointerLockControls.js";
7
+ export { DragControls } from "./DragControls.js";
8
+ export { TransformControls } from "./TransformControls.js";
9
+ export { SelectionManager } from "./SelectionManager.js";
10
+ export { InteractionControls } from "./InteractionControls.js";
11
+ export { Picking } from "./Picking.js";
12
+ export { annotationFromPickHit, createDistrictPickingAnnotations, createEntityPickingAnnotations, createImportedGlbHotspotAnnotations, createPickingAnnotationObject, createPickingAnnotationRoot, createRobotPickingAnnotations, pickAnnotation, pickScreenSpaceAnnotation } from "./PickingAnnotations.js";
13
+ export { ControlVector3 } from "./NativeControlTypes.js";
14
+ export { createDefaultControlState } from "./ControlState.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/controls/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAa5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,8BAA8B,EAC9B,mCAAmC,EACnC,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAC7B,cAAc,EACd,yBAAyB,EAC1B,MAAM,sBAAsB,CAAC;AAmB9B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "@aura3d/controls",
3
+ "version": "1.0.6",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
12
+ },
13
+ "dependencies": {
14
+ "@aura3d/input": "1.0.6"
15
+ }
16
+ }
@@ -0,0 +1,24 @@
1
+ import { ControlVector3 } from "./NativeControlTypes";
2
+
3
+ export interface ThreeCompatControlEvent {
4
+ readonly type: string;
5
+ readonly delta?: ControlVector3;
6
+ }
7
+
8
+ export interface ThreeCompatControlState {
9
+ readonly target: ControlVector3;
10
+ readonly position: ControlVector3;
11
+ readonly rotation: ControlVector3;
12
+ readonly zoom: number;
13
+ readonly enabled: boolean;
14
+ }
15
+
16
+ export function createDefaultControlState(): ThreeCompatControlState {
17
+ return {
18
+ target: new ControlVector3(),
19
+ position: new ControlVector3(0, 0, 5),
20
+ rotation: new ControlVector3(),
21
+ zoom: 1,
22
+ enabled: true
23
+ };
24
+ }
@@ -0,0 +1,17 @@
1
+ import { addVector3, type ControlObject3DLike, type Vector3Like } from "./NativeControlTypes";
2
+
3
+ export class DragControls {
4
+ dragging: ControlObject3DLike | null = null;
5
+
6
+ start(object: ControlObject3DLike): void {
7
+ this.dragging = object;
8
+ }
9
+
10
+ drag(delta: Vector3Like): void {
11
+ addVector3(this.dragging?.position, delta);
12
+ }
13
+
14
+ end(): void {
15
+ this.dragging = null;
16
+ }
17
+ }
@@ -0,0 +1,8 @@
1
+ import { FlyControls } from "./FlyControls";
2
+
3
+ export class FirstPersonControls extends FlyControls {
4
+ look(deltaX: number, deltaY: number): void {
5
+ this.state.rotation.y += deltaX;
6
+ this.state.rotation.x += deltaY;
7
+ }
8
+ }
@@ -0,0 +1,14 @@
1
+ import { createDefaultControlState, type ThreeCompatControlState } from "./ControlState";
2
+
3
+ export class FlyControls {
4
+ readonly state: ThreeCompatControlState = createDefaultControlState();
5
+ movementSpeed = 1;
6
+
7
+ moveForward(distance: number): void {
8
+ this.state.position.z -= distance * this.movementSpeed;
9
+ }
10
+
11
+ strafe(distance: number): void {
12
+ this.state.position.x += distance * this.movementSpeed;
13
+ }
14
+ }
@@ -0,0 +1,224 @@
1
+ import { InputSnapshot } from "@aura3d/input";
2
+ import { FlyControls } from "./FlyControls";
3
+ import { OrbitControls } from "./OrbitControls";
4
+ import { Picking, type PickingOptions, type PickingReport, type ThreeCompatPickResult } from "./Picking";
5
+ import { ControlVector3, type ControlObject3DLike, type Vector3Like } from "./NativeControlTypes";
6
+
7
+ export type InteractionControlMode = "orbit" | "fly";
8
+ export type InteractionControlsEventType =
9
+ | "mode-change"
10
+ | "hover-enter"
11
+ | "hover-exit"
12
+ | "pick"
13
+ | "hotspot-click";
14
+
15
+ export interface InteractionRay {
16
+ readonly origin: Vector3Like;
17
+ readonly direction: Vector3Like;
18
+ }
19
+
20
+ export type InteractionRayProvider = (snapshot: InputSnapshot) => InteractionRay;
21
+ export type InteractionRootProvider = () => ControlObject3DLike | undefined;
22
+ export type InteractionControlsListener = (event: InteractionControlsEvent) => void;
23
+ export type HotspotHandler = (event: InteractionControlsEvent & { readonly hit: ThreeCompatPickResult }) => void;
24
+
25
+ export interface InteractionControlsOptions {
26
+ readonly mode?: InteractionControlMode;
27
+ readonly orbit?: OrbitControls;
28
+ readonly fly?: FlyControls;
29
+ readonly picking?: Picking;
30
+ readonly root?: ControlObject3DLike | InteractionRootProvider;
31
+ readonly rayProvider?: InteractionRayProvider;
32
+ readonly pickOptions?: PickingOptions;
33
+ readonly rotateButton?: number;
34
+ readonly panButton?: number;
35
+ readonly rotateSpeed?: number;
36
+ readonly panSpeed?: number;
37
+ readonly dollySpeed?: number;
38
+ readonly flyMoveSpeed?: number;
39
+ }
40
+
41
+ export interface InteractionControlsEvent {
42
+ readonly type: InteractionControlsEventType;
43
+ readonly mode: InteractionControlMode;
44
+ readonly snapshot: InputSnapshot;
45
+ readonly hit?: ThreeCompatPickResult;
46
+ readonly previousHit?: ThreeCompatPickResult;
47
+ }
48
+
49
+ export interface InteractionControlsUpdate {
50
+ readonly mode: InteractionControlMode;
51
+ readonly pickReport?: PickingReport;
52
+ readonly hit: ThreeCompatPickResult | null;
53
+ }
54
+
55
+ export class InteractionControls {
56
+ readonly orbit: OrbitControls;
57
+ readonly fly: FlyControls;
58
+ readonly picking: Picking;
59
+
60
+ enabled = true;
61
+
62
+ private controlMode: InteractionControlMode;
63
+ private rootRef?: ControlObject3DLike | InteractionRootProvider;
64
+ private rayProvider?: InteractionRayProvider;
65
+ private pickOptions: PickingOptions;
66
+ private readonly listeners = new Set<InteractionControlsListener>();
67
+ private readonly hotspotHandlers = new Map<string, Set<HotspotHandler>>();
68
+ private hoverHit: ThreeCompatPickResult | null = null;
69
+ private disposed = false;
70
+
71
+ private readonly rotateButton: number;
72
+ private readonly panButton: number;
73
+ private readonly rotateSpeed: number;
74
+ private readonly panSpeed: number;
75
+ private readonly dollySpeed: number;
76
+ private readonly flyMoveSpeed: number;
77
+
78
+ constructor(options: InteractionControlsOptions = {}) {
79
+ this.orbit = options.orbit ?? new OrbitControls();
80
+ this.fly = options.fly ?? new FlyControls();
81
+ this.picking = options.picking ?? new Picking();
82
+ this.controlMode = options.mode ?? "orbit";
83
+ this.rootRef = options.root;
84
+ this.rayProvider = options.rayProvider;
85
+ this.pickOptions = options.pickOptions ?? {};
86
+ this.rotateButton = options.rotateButton ?? 0;
87
+ this.panButton = options.panButton ?? 1;
88
+ this.rotateSpeed = options.rotateSpeed ?? 0.005;
89
+ this.panSpeed = options.panSpeed ?? 0.01;
90
+ this.dollySpeed = options.dollySpeed ?? 0.001;
91
+ this.flyMoveSpeed = options.flyMoveSpeed ?? 1;
92
+ }
93
+
94
+ get mode(): InteractionControlMode {
95
+ return this.controlMode;
96
+ }
97
+
98
+ setMode(mode: InteractionControlMode, snapshot = new InputSnapshot()): void {
99
+ if (this.controlMode === mode) return;
100
+ this.controlMode = mode;
101
+ this.emit({ type: "mode-change", mode, snapshot });
102
+ }
103
+
104
+ setRoot(root: ControlObject3DLike | InteractionRootProvider | undefined): void {
105
+ this.rootRef = root;
106
+ this.hoverHit = null;
107
+ }
108
+
109
+ setRayProvider(provider: InteractionRayProvider | undefined): void {
110
+ this.rayProvider = provider;
111
+ }
112
+
113
+ setPickOptions(options: PickingOptions): void {
114
+ this.pickOptions = options;
115
+ }
116
+
117
+ subscribe(listener: InteractionControlsListener): () => void {
118
+ this.listeners.add(listener);
119
+ return () => this.listeners.delete(listener);
120
+ }
121
+
122
+ onHotspot(id: string, handler: HotspotHandler): () => void {
123
+ const handlers = this.hotspotHandlers.get(id) ?? new Set<HotspotHandler>();
124
+ handlers.add(handler);
125
+ this.hotspotHandlers.set(id, handlers);
126
+ return () => {
127
+ handlers.delete(handler);
128
+ if (handlers.size === 0) this.hotspotHandlers.delete(id);
129
+ };
130
+ }
131
+
132
+ update(snapshot: InputSnapshot): InteractionControlsUpdate {
133
+ if (this.disposed || !this.enabled) {
134
+ return { mode: this.controlMode, hit: this.hoverHit };
135
+ }
136
+
137
+ if (this.controlMode === "orbit") {
138
+ this.updateOrbit(snapshot);
139
+ } else {
140
+ this.updateFly(snapshot);
141
+ }
142
+
143
+ const pickReport = this.updatePicking(snapshot);
144
+ return { mode: this.controlMode, pickReport, hit: pickReport?.hit ?? null };
145
+ }
146
+
147
+ pick(snapshot: InputSnapshot): PickingReport | undefined {
148
+ const root = this.resolveRoot();
149
+ if (!root) return undefined;
150
+ const ray = this.resolveRay(snapshot);
151
+ return this.picking.report(root, ray.origin, ray.direction, this.pickOptions);
152
+ }
153
+
154
+ dispose(): void {
155
+ this.disposed = true;
156
+ this.listeners.clear();
157
+ this.hotspotHandlers.clear();
158
+ this.hoverHit = null;
159
+ }
160
+
161
+ private updateOrbit(snapshot: InputSnapshot): void {
162
+ if (snapshot.button(this.rotateButton).down) {
163
+ this.orbit.rotate(snapshot.pointer.deltaX * this.rotateSpeed, snapshot.pointer.deltaY * this.rotateSpeed);
164
+ }
165
+ if (snapshot.button(this.panButton).down) {
166
+ this.orbit.pan(snapshot.pointer.deltaX * this.panSpeed, -snapshot.pointer.deltaY * this.panSpeed);
167
+ }
168
+ if (snapshot.pointer.wheelY !== 0) {
169
+ this.orbit.dolly(Math.max(0.01, 1 + snapshot.pointer.wheelY * this.dollySpeed));
170
+ }
171
+ }
172
+
173
+ private updateFly(snapshot: InputSnapshot): void {
174
+ const distance = this.flyMoveSpeed;
175
+ if (snapshot.key("KeyW").down || snapshot.key("ArrowUp").down) this.fly.moveForward(distance);
176
+ if (snapshot.key("KeyS").down || snapshot.key("ArrowDown").down) this.fly.moveForward(-distance);
177
+ if (snapshot.key("KeyA").down || snapshot.key("ArrowLeft").down) this.fly.strafe(-distance);
178
+ if (snapshot.key("KeyD").down || snapshot.key("ArrowRight").down) this.fly.strafe(distance);
179
+ }
180
+
181
+ private updatePicking(snapshot: InputSnapshot): PickingReport | undefined {
182
+ const pickReport = this.pick(snapshot);
183
+ const hit = pickReport?.hit ?? null;
184
+ const previousHit = this.hoverHit;
185
+ if (previousHit?.object !== hit?.object) {
186
+ if (previousHit) this.emit({ type: "hover-exit", mode: this.controlMode, snapshot, previousHit });
187
+ if (hit) this.emit({ type: "hover-enter", mode: this.controlMode, snapshot, hit, previousHit: previousHit ?? undefined });
188
+ this.hoverHit = hit;
189
+ }
190
+
191
+ if (hit && snapshot.button(0).released) {
192
+ const event = { type: "pick" as const, mode: this.controlMode, snapshot, hit, previousHit: previousHit ?? undefined };
193
+ this.emit(event);
194
+ this.emitHotspot(event);
195
+ }
196
+
197
+ return pickReport;
198
+ }
199
+
200
+ private emitHotspot(event: InteractionControlsEvent & { readonly hit: ThreeCompatPickResult }): void {
201
+ const id = event.hit.metadata?.id ?? event.hit.object.name;
202
+ if (!id) return;
203
+ const hotspotEvent = { ...event, type: "hotspot-click" as const };
204
+ this.emit(hotspotEvent);
205
+ for (const handler of [...(this.hotspotHandlers.get(id) ?? [])]) {
206
+ handler(hotspotEvent);
207
+ }
208
+ }
209
+
210
+ private emit(event: InteractionControlsEvent): void {
211
+ for (const listener of [...this.listeners]) listener(event);
212
+ }
213
+
214
+ private resolveRoot(): ControlObject3DLike | undefined {
215
+ return typeof this.rootRef === "function" ? this.rootRef() : this.rootRef;
216
+ }
217
+
218
+ private resolveRay(snapshot: InputSnapshot): InteractionRay {
219
+ return this.rayProvider?.(snapshot) ?? {
220
+ origin: new ControlVector3(),
221
+ direction: new ControlVector3(0, 0, -1)
222
+ };
223
+ }
224
+ }
@@ -0,0 +1,10 @@
1
+ import { OrbitControls } from "./OrbitControls";
2
+
3
+ export class MapControls extends OrbitControls {
4
+ readonly screenSpacePanning = false;
5
+
6
+ truck(deltaX: number, deltaZ: number): void {
7
+ this.state.target.x += deltaX;
8
+ this.state.target.z += deltaZ;
9
+ }
10
+ }
@@ -0,0 +1,93 @@
1
+ export interface Vector3Like {
2
+ x: number;
3
+ y: number;
4
+ z: number;
5
+ }
6
+
7
+ export interface ControlPickMetadata {
8
+ readonly id?: string;
9
+ readonly label?: string;
10
+ readonly kind?: string;
11
+ readonly group?: string;
12
+ readonly routeId?: string;
13
+ readonly source?: string;
14
+ readonly targetId?: string;
15
+ readonly selectable?: boolean;
16
+ readonly highlightable?: boolean;
17
+ readonly pickRadius?: number;
18
+ readonly priority?: number;
19
+ readonly payload?: unknown;
20
+ }
21
+
22
+ export class ControlVector3 implements Vector3Like {
23
+ constructor(public x = 0, public y = 0, public z = 0) {}
24
+
25
+ set(x: number, y: number, z: number): this {
26
+ this.x = x;
27
+ this.y = y;
28
+ this.z = z;
29
+ return this;
30
+ }
31
+
32
+ copy(value: Vector3Like): this {
33
+ return this.set(value.x, value.y, value.z);
34
+ }
35
+
36
+ clone(): ControlVector3 {
37
+ return new ControlVector3(this.x, this.y, this.z);
38
+ }
39
+
40
+ add(value: Vector3Like): this {
41
+ this.x += value.x;
42
+ this.y += value.y;
43
+ this.z += value.z;
44
+ return this;
45
+ }
46
+
47
+ sub(value: Vector3Like): this {
48
+ this.x -= value.x;
49
+ this.y -= value.y;
50
+ this.z -= value.z;
51
+ return this;
52
+ }
53
+
54
+ length(): number {
55
+ return Math.hypot(this.x, this.y, this.z);
56
+ }
57
+
58
+ normalize(): this {
59
+ const length = this.length();
60
+ return length > 0 ? this.set(this.x / length, this.y / length, this.z / length) : this;
61
+ }
62
+ }
63
+
64
+ export interface ControlObject3DLike {
65
+ readonly name?: string;
66
+ readonly type?: string;
67
+ readonly children?: readonly ControlObject3DLike[];
68
+ readonly position: Vector3Like;
69
+ readonly rotation?: Vector3Like;
70
+ readonly scale?: Vector3Like;
71
+ readonly visible?: boolean;
72
+ readonly pickRadius?: number;
73
+ readonly pickPriority?: number;
74
+ readonly picking?: ControlPickMetadata;
75
+ readonly userData?: Record<string, unknown>;
76
+ traverse?(callback: (object: ControlObject3DLike) => void): void;
77
+ }
78
+
79
+ export function addVector3(target: Vector3Like | undefined, delta: Vector3Like): void {
80
+ if (!target) return;
81
+ target.x += delta.x;
82
+ target.y += delta.y;
83
+ target.z += delta.z;
84
+ }
85
+
86
+ export function traverseControlObject(root: ControlObject3DLike, callback: (object: ControlObject3DLike) => void): void {
87
+ if (typeof root.traverse === "function") {
88
+ root.traverse(callback);
89
+ return;
90
+ }
91
+ callback(root);
92
+ for (const child of root.children ?? []) traverseControlObject(child, callback);
93
+ }
@@ -0,0 +1,25 @@
1
+ import { createDefaultControlState, type ThreeCompatControlState } from "./ControlState";
2
+
3
+ export class OrbitControls {
4
+ readonly state: ThreeCompatControlState = createDefaultControlState();
5
+ enablePan = true;
6
+ enableZoom = true;
7
+ enableRotate = true;
8
+
9
+ rotate(deltaX: number, deltaY: number): void {
10
+ if (!this.enableRotate) return;
11
+ this.state.rotation.x += deltaY;
12
+ this.state.rotation.y += deltaX;
13
+ }
14
+
15
+ pan(deltaX: number, deltaY: number): void {
16
+ if (!this.enablePan) return;
17
+ this.state.target.x += deltaX;
18
+ this.state.target.y += deltaY;
19
+ }
20
+
21
+ dolly(scale: number): void {
22
+ if (!this.enableZoom) return;
23
+ this.state.position.z *= scale;
24
+ }
25
+ }