@aura3d/input 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 (134) hide show
  1. package/README.md +17 -0
  2. package/dist/ActionMap.d.ts +44 -0
  3. package/dist/ActionMap.d.ts.map +1 -0
  4. package/dist/ActionMap.js +74 -0
  5. package/dist/ActionMap.js.map +1 -0
  6. package/dist/GamepadDevice.d.ts +17 -0
  7. package/dist/GamepadDevice.d.ts.map +1 -0
  8. package/dist/GamepadDevice.js +27 -0
  9. package/dist/GamepadDevice.js.map +1 -0
  10. package/dist/GamepadInput.d.ts +3 -0
  11. package/dist/GamepadInput.d.ts.map +1 -0
  12. package/dist/GamepadInput.js +2 -0
  13. package/dist/GamepadInput.js.map +1 -0
  14. package/dist/GestureControls.d.ts +3 -0
  15. package/dist/GestureControls.d.ts.map +1 -0
  16. package/dist/GestureControls.js +2 -0
  17. package/dist/GestureControls.js.map +1 -0
  18. package/dist/GestureHapticsFixtures.d.ts +57 -0
  19. package/dist/GestureHapticsFixtures.d.ts.map +1 -0
  20. package/dist/GestureHapticsFixtures.js +115 -0
  21. package/dist/GestureHapticsFixtures.js.map +1 -0
  22. package/dist/GestureRecognizer.d.ts +19 -0
  23. package/dist/GestureRecognizer.d.ts.map +1 -0
  24. package/dist/GestureRecognizer.js +32 -0
  25. package/dist/GestureRecognizer.js.map +1 -0
  26. package/dist/InputActionBindingFixtures.d.ts +44 -0
  27. package/dist/InputActionBindingFixtures.d.ts.map +1 -0
  28. package/dist/InputActionBindingFixtures.js +86 -0
  29. package/dist/InputActionBindingFixtures.js.map +1 -0
  30. package/dist/InputReplay.d.ts +97 -0
  31. package/dist/InputReplay.d.ts.map +1 -0
  32. package/dist/InputReplay.js +189 -0
  33. package/dist/InputReplay.js.map +1 -0
  34. package/dist/InputSnapshot.d.ts +44 -0
  35. package/dist/InputSnapshot.d.ts.map +1 -0
  36. package/dist/InputSnapshot.js +44 -0
  37. package/dist/InputSnapshot.js.map +1 -0
  38. package/dist/InputSystem.d.ts +24 -0
  39. package/dist/InputSystem.d.ts.map +1 -0
  40. package/dist/InputSystem.js +77 -0
  41. package/dist/InputSystem.js.map +1 -0
  42. package/dist/InteractionSystem.d.ts +42 -0
  43. package/dist/InteractionSystem.d.ts.map +1 -0
  44. package/dist/InteractionSystem.js +80 -0
  45. package/dist/InteractionSystem.js.map +1 -0
  46. package/dist/KeyboardDevice.d.ts +18 -0
  47. package/dist/KeyboardDevice.d.ts.map +1 -0
  48. package/dist/KeyboardDevice.js +22 -0
  49. package/dist/KeyboardDevice.js.map +1 -0
  50. package/dist/PickingRay.d.ts +10 -0
  51. package/dist/PickingRay.d.ts.map +1 -0
  52. package/dist/PickingRay.js +27 -0
  53. package/dist/PickingRay.js.map +1 -0
  54. package/dist/PointerDevice.d.ts +51 -0
  55. package/dist/PointerDevice.d.ts.map +1 -0
  56. package/dist/PointerDevice.js +75 -0
  57. package/dist/PointerDevice.js.map +1 -0
  58. package/dist/VirtualTouchControls.d.ts +57 -0
  59. package/dist/VirtualTouchControls.d.ts.map +1 -0
  60. package/dist/VirtualTouchControls.js +127 -0
  61. package/dist/VirtualTouchControls.js.map +1 -0
  62. package/dist/WebXRSessionController.d.ts +108 -0
  63. package/dist/WebXRSessionController.d.ts.map +1 -0
  64. package/dist/WebXRSessionController.js +143 -0
  65. package/dist/WebXRSessionController.js.map +1 -0
  66. package/dist/XRFixtures.d.ts +65 -0
  67. package/dist/XRFixtures.d.ts.map +1 -0
  68. package/dist/XRFixtures.js +136 -0
  69. package/dist/XRFixtures.js.map +1 -0
  70. package/dist/controls/CameraRig.d.ts +12 -0
  71. package/dist/controls/CameraRig.d.ts.map +1 -0
  72. package/dist/controls/CameraRig.js +32 -0
  73. package/dist/controls/CameraRig.js.map +1 -0
  74. package/dist/controls/ControlTypes.d.ts +17 -0
  75. package/dist/controls/ControlTypes.d.ts.map +1 -0
  76. package/dist/controls/ControlTypes.js +4 -0
  77. package/dist/controls/ControlTypes.js.map +1 -0
  78. package/dist/controls/EditorFlyControls.d.ts +20 -0
  79. package/dist/controls/EditorFlyControls.d.ts.map +1 -0
  80. package/dist/controls/EditorFlyControls.js +44 -0
  81. package/dist/controls/EditorFlyControls.js.map +1 -0
  82. package/dist/controls/FirstPersonControls.d.ts +22 -0
  83. package/dist/controls/FirstPersonControls.d.ts.map +1 -0
  84. package/dist/controls/FirstPersonControls.js +44 -0
  85. package/dist/controls/FirstPersonControls.js.map +1 -0
  86. package/dist/controls/OrbitControls.d.ts +49 -0
  87. package/dist/controls/OrbitControls.d.ts.map +1 -0
  88. package/dist/controls/OrbitControls.js +131 -0
  89. package/dist/controls/OrbitControls.js.map +1 -0
  90. package/dist/controls/PointerLockControls.d.ts +11 -0
  91. package/dist/controls/PointerLockControls.d.ts.map +1 -0
  92. package/dist/controls/PointerLockControls.js +19 -0
  93. package/dist/controls/PointerLockControls.js.map +1 -0
  94. package/dist/controls/SceneCameraAdapter.d.ts +10 -0
  95. package/dist/controls/SceneCameraAdapter.d.ts.map +1 -0
  96. package/dist/controls/SceneCameraAdapter.js +90 -0
  97. package/dist/controls/SceneCameraAdapter.js.map +1 -0
  98. package/dist/controls/ThirdPersonFollowControls.d.ts +20 -0
  99. package/dist/controls/ThirdPersonFollowControls.d.ts.map +1 -0
  100. package/dist/controls/ThirdPersonFollowControls.js +33 -0
  101. package/dist/controls/ThirdPersonFollowControls.js.map +1 -0
  102. package/dist/index.d.ts +47 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +25 -0
  105. package/dist/index.js.map +1 -0
  106. package/package.json +17 -0
  107. package/src/ActionMap.ts +94 -0
  108. package/src/GamepadDevice.ts +48 -0
  109. package/src/GamepadInput.ts +2 -0
  110. package/src/GestureControls.ts +2 -0
  111. package/src/GestureHapticsFixtures.ts +179 -0
  112. package/src/GestureRecognizer.ts +43 -0
  113. package/src/InputActionBindingFixtures.ts +121 -0
  114. package/src/InputReplay.ts +275 -0
  115. package/src/InputSnapshot.ts +92 -0
  116. package/src/InputSystem.ts +92 -0
  117. package/src/InteractionSystem.ts +119 -0
  118. package/src/KeyboardDevice.ts +32 -0
  119. package/src/PickingRay.ts +49 -0
  120. package/src/PointerDevice.ts +102 -0
  121. package/src/VirtualTouchControls.ts +169 -0
  122. package/src/WebXRSessionController.ts +248 -0
  123. package/src/XRFixtures.ts +203 -0
  124. package/src/controls/CameraRig.ts +38 -0
  125. package/src/controls/ControlTypes.ts +21 -0
  126. package/src/controls/EditorFlyControls.ts +55 -0
  127. package/src/controls/FirstPersonControls.ts +60 -0
  128. package/src/controls/OrbitControls.ts +168 -0
  129. package/src/controls/PointerLockControls.ts +24 -0
  130. package/src/controls/SceneCameraAdapter.ts +100 -0
  131. package/src/controls/ThirdPersonFollowControls.ts +42 -0
  132. package/src/index.ts +72 -0
  133. package/tests/input.test.ts +69 -0
  134. package/tsconfig.json +7 -0
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # @aura3d/input
2
+
3
+ `@aura3d/input` owns keyboard, pointer, gamepad, gesture, action-map, interaction, picking-ray, and camera-control runtime contracts.
4
+
5
+ ## Public API
6
+
7
+ - `InputSnapshot`, `InputSystem`: immutable per-frame input state and event-target integration.
8
+ - `KeyboardDevice`, `PointerDevice`, `GamepadDevice`: device adapters for browser-style events and polling.
9
+ - `ActionMap`: keyboard, keyboard chord, button, gamepad, and axis bindings.
10
+ - `GestureRecognizer`: pointer-derived gestures.
11
+ - `InteractionSystem`, `pickingRayFromCamera`: target picking, listener dispatch, and ray construction.
12
+ - `CameraRig`, `OrbitControls`, `FirstPersonControls`, `ThirdPersonFollowControls`, `EditorFlyControls`: camera movement controls.
13
+ - `createSceneCameraControlAdapter`: bridge from scene cameras to control transforms.
14
+
15
+ ## Verification
16
+
17
+ Input snapshots, transitions, action maps, keyboard chords, pointer/gamepad behavior, gestures, interaction targets, picking rays, camera controls, and browser input lifecycle are covered by `tests/unit/workstream5-input-audio-scripting-editor.test.ts`, `tests/unit/input/camera-controls.test.ts`, and `tests/browser/input-browser.spec.ts`. Export and import consistency is covered by `pnpm verify:exports` and `pnpm verify:imports`.
@@ -0,0 +1,44 @@
1
+ import { InputSnapshot } from "./InputSnapshot";
2
+ export type ActionBinding = {
3
+ readonly type: "keyboard";
4
+ readonly code: string;
5
+ } | {
6
+ readonly type: "keyboard-chord";
7
+ readonly codes: readonly string[];
8
+ } | {
9
+ readonly type: "pointer";
10
+ readonly button: number;
11
+ } | {
12
+ readonly type: "gamepad-button";
13
+ readonly gamepad?: number;
14
+ readonly button: number;
15
+ };
16
+ export type AxisBinding = {
17
+ readonly type: "keyboard-axis";
18
+ readonly negative: string;
19
+ readonly positive: string;
20
+ readonly scale?: number;
21
+ } | {
22
+ readonly type: "pointer-axis";
23
+ readonly axis: "x" | "y" | "wheelX" | "wheelY";
24
+ readonly scale?: number;
25
+ } | {
26
+ readonly type: "gamepad-axis";
27
+ readonly gamepad?: number;
28
+ readonly axis: number;
29
+ readonly scale?: number;
30
+ };
31
+ export declare class ActionMap {
32
+ private readonly actions;
33
+ private readonly axes;
34
+ private snapshot;
35
+ bind(name: string, bindings: readonly ActionBinding[]): void;
36
+ bindAxis(name: string, bindings: readonly AxisBinding[]): void;
37
+ useSnapshot(snapshot: InputSnapshot): void;
38
+ down(name: string, snapshot?: InputSnapshot): boolean;
39
+ pressed(name: string, snapshot?: InputSnapshot): boolean;
40
+ released(name: string, snapshot?: InputSnapshot): boolean;
41
+ axis(name: string, snapshot?: InputSnapshot): number;
42
+ private evaluate;
43
+ }
44
+ //# sourceMappingURL=ActionMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionMap.d.ts","sourceRoot":"","sources":["../../../../packages/input/src/ActionMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5F,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACjH;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6C;IAClE,OAAO,CAAC,QAAQ,CAAuB;IAEvC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI;IAI5D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI;IAI9D,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI1C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,gBAAgB,GAAG,OAAO;IAIrD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,gBAAgB,GAAG,OAAO;IAIxD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,gBAAgB,GAAG,OAAO;IAIzD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,gBAAgB,GAAG,MAAM;IAyBpD,OAAO,CAAC,QAAQ;CAcjB"}
@@ -0,0 +1,74 @@
1
+ import { InputSnapshot } from "./InputSnapshot.js";
2
+ export class ActionMap {
3
+ actions = new Map();
4
+ axes = new Map();
5
+ snapshot = new InputSnapshot();
6
+ bind(name, bindings) {
7
+ this.actions.set(name, [...bindings]);
8
+ }
9
+ bindAxis(name, bindings) {
10
+ this.axes.set(name, [...bindings]);
11
+ }
12
+ useSnapshot(snapshot) {
13
+ this.snapshot = snapshot;
14
+ }
15
+ down(name, snapshot = this.snapshot) {
16
+ return this.evaluate(name, snapshot, "down");
17
+ }
18
+ pressed(name, snapshot = this.snapshot) {
19
+ return this.evaluate(name, snapshot, "pressed");
20
+ }
21
+ released(name, snapshot = this.snapshot) {
22
+ return this.evaluate(name, snapshot, "released");
23
+ }
24
+ axis(name, snapshot = this.snapshot) {
25
+ let value = 0;
26
+ for (const binding of this.axes.get(name) ?? []) {
27
+ const scale = binding.scale ?? 1;
28
+ if (binding.type === "keyboard-axis") {
29
+ value += (snapshot.key(binding.positive).down ? 1 : 0) * scale;
30
+ value -= (snapshot.key(binding.negative).down ? 1 : 0) * scale;
31
+ }
32
+ else if (binding.type === "pointer-axis") {
33
+ const pointerValue = binding.axis === "x"
34
+ ? snapshot.pointer.deltaX
35
+ : binding.axis === "y"
36
+ ? snapshot.pointer.deltaY
37
+ : snapshot.pointer[binding.axis];
38
+ value += pointerValue * scale;
39
+ }
40
+ else {
41
+ const gamepad = snapshot.gamepads.find((pad) => pad.index === (binding.gamepad ?? 0));
42
+ value += (gamepad?.axes[binding.axis] ?? 0) * scale;
43
+ }
44
+ }
45
+ return value;
46
+ }
47
+ evaluate(name, snapshot, field) {
48
+ return (this.actions.get(name) ?? []).some((binding) => {
49
+ if (binding.type === "keyboard") {
50
+ return snapshot.key(binding.code)[field];
51
+ }
52
+ if (binding.type === "keyboard-chord") {
53
+ return evaluateChord(binding.codes, snapshot, field);
54
+ }
55
+ if (binding.type === "pointer") {
56
+ return snapshot.button(binding.button)[field];
57
+ }
58
+ return snapshot.gamepadButton(binding.gamepad ?? 0, binding.button)[field];
59
+ });
60
+ }
61
+ }
62
+ function evaluateChord(codes, snapshot, field) {
63
+ if (codes.length === 0)
64
+ return false;
65
+ const states = codes.map((code) => snapshot.key(code));
66
+ if (field === "down") {
67
+ return states.every((state) => state.down);
68
+ }
69
+ if (field === "pressed") {
70
+ return states.every((state) => state.down) && states.some((state) => state.pressed);
71
+ }
72
+ return states.some((state) => state.released);
73
+ }
74
+ //# sourceMappingURL=ActionMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionMap.js","sourceRoot":"","sources":["../../../../packages/input/src/ActionMap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { GamepadSnapshot } from "./InputSnapshot";
2
+ export interface GamepadButtonLike {
3
+ readonly pressed: boolean;
4
+ readonly value: number;
5
+ }
6
+ export interface GamepadLike {
7
+ readonly id: string;
8
+ readonly index: number;
9
+ readonly connected: boolean;
10
+ readonly axes: readonly number[];
11
+ readonly buttons: readonly GamepadButtonLike[];
12
+ }
13
+ export declare class GamepadDevice {
14
+ private previousButtons;
15
+ poll(gamepads: readonly (GamepadLike | null | undefined)[], deadZone?: number): readonly GamepadSnapshot[];
16
+ }
17
+ //# sourceMappingURL=GamepadDevice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GamepadDevice.d.ts","sourceRoot":"","sources":["../../../../packages/input/src/GamepadDevice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAChD;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAAyC;IAEhE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,QAAQ,SAAM,GAAG,SAAS,eAAe,EAAE;CA6BxG"}
@@ -0,0 +1,27 @@
1
+ export class GamepadDevice {
2
+ previousButtons = new Map();
3
+ poll(gamepads, deadZone = 0.1) {
4
+ const snapshots = [];
5
+ for (const gamepad of gamepads) {
6
+ if (!gamepad?.connected) {
7
+ continue;
8
+ }
9
+ const key = `${gamepad.index}:${gamepad.id}`;
10
+ const previous = this.previousButtons.get(key) ?? [];
11
+ const buttons = gamepad.buttons.map((button, index) => {
12
+ const down = button.pressed || button.value > 0.5;
13
+ const wasDown = previous[index] ?? false;
14
+ return Object.freeze({ down, pressed: down && !wasDown, released: !down && wasDown });
15
+ });
16
+ snapshots.push(Object.freeze({
17
+ id: gamepad.id,
18
+ index: gamepad.index,
19
+ axes: Object.freeze(gamepad.axes.map((axis) => (Math.abs(axis) < deadZone ? 0 : axis))),
20
+ buttons: Object.freeze(buttons)
21
+ }));
22
+ this.previousButtons.set(key, buttons.map((button) => button.down));
23
+ }
24
+ return snapshots;
25
+ }
26
+ }
27
+ //# sourceMappingURL=GamepadDevice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GamepadDevice.js","sourceRoot":"","sources":["../../../../packages/input/src/GamepadDevice.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,aAAa;IAChB,eAAe,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEhE,IAAI,CAAC,QAAqD,EAAE,QAAQ,GAAG,GAAG;QACxE,MAAM,SAAS,GAAsB,EAAE,CAAC;QAExC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACrD,MAAM,OAAO,GAAkB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBACnE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;gBAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;gBACzC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;YACxF,CAAC,CAAC,CAAC;YAEH,SAAS,CAAC,IAAI,CACZ,MAAM,CAAC,MAAM,CAAC;gBACZ,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;aAChC,CAAC,CACH,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export { GamepadDevice as GamepadInput } from "./GamepadDevice";
2
+ export type { GamepadButtonLike, GamepadLike } from "./GamepadDevice";
3
+ //# sourceMappingURL=GamepadInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GamepadInput.d.ts","sourceRoot":"","sources":["../../../../packages/input/src/GamepadInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { GamepadDevice as GamepadInput } from "./GamepadDevice.js";
2
+ //# sourceMappingURL=GamepadInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GamepadInput.js","sourceRoot":"","sources":["../../../../packages/input/src/GamepadInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { GestureRecognizer as GestureControls } from "./GestureRecognizer";
2
+ export type { Gesture } from "./GestureRecognizer";
3
+ //# sourceMappingURL=GestureControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureControls.d.ts","sourceRoot":"","sources":["../../../../packages/input/src/GestureControls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3E,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { GestureRecognizer as GestureControls } from "./GestureRecognizer.js";
2
+ //# sourceMappingURL=GestureControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureControls.js","sourceRoot":"","sources":["../../../../packages/input/src/GestureControls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,57 @@
1
+ export type GestureHapticsGestureType = "tap" | "pan" | "pinch" | "swipe" | "rotate";
2
+ export type GestureHapticsPatternName = "tap" | "impact" | "damage" | "success" | "engine";
3
+ export interface GestureHapticsFixtureOptions {
4
+ readonly seed?: number;
5
+ readonly pointerDeltaX?: number;
6
+ readonly pointerDeltaY?: number;
7
+ readonly pinchStartDistance?: number;
8
+ readonly pinchEndDistance?: number;
9
+ readonly rotateDegrees?: number;
10
+ readonly gamepadConnected?: boolean;
11
+ }
12
+ export interface GestureHapticsFixture {
13
+ readonly source: "origin-master-input-gesture-rumble-adapted";
14
+ readonly gestures: readonly {
15
+ readonly type: GestureHapticsGestureType;
16
+ readonly state: "possible" | "began" | "changed" | "ended";
17
+ readonly touchCount: number;
18
+ readonly center: readonly [number, number];
19
+ readonly distance?: number;
20
+ readonly velocity?: readonly [number, number];
21
+ readonly scale?: number;
22
+ readonly rotationDegrees?: number;
23
+ }[];
24
+ readonly gestureSummary: {
25
+ readonly tapDetected: boolean;
26
+ readonly panDistance: number;
27
+ readonly pinchScale: number;
28
+ readonly swipeDirection: "left" | "right" | "up" | "down";
29
+ readonly rotateDegrees: number;
30
+ };
31
+ readonly haptics: {
32
+ readonly gamepadConnected: boolean;
33
+ readonly hapticsClaimed: false;
34
+ readonly patterns: readonly {
35
+ readonly name: GestureHapticsPatternName;
36
+ readonly steps: number;
37
+ readonly totalDurationMs: number;
38
+ readonly peakWeak: number;
39
+ readonly peakStrong: number;
40
+ readonly loop: boolean;
41
+ }[];
42
+ readonly queuedPatterns: number;
43
+ readonly totalDurationMs: number;
44
+ readonly intensityMultiplier: number;
45
+ };
46
+ readonly productionReadiness: {
47
+ readonly gestureTelemetry: true;
48
+ readonly swipeRotateTelemetry: true;
49
+ readonly hapticPatternTelemetry: true;
50
+ readonly hapticClaimBoundaryTelemetry: true;
51
+ };
52
+ readonly blockedClaims: readonly string[];
53
+ readonly claimBoundary: string;
54
+ readonly hash: string;
55
+ }
56
+ export declare function sampleGestureHapticsFixture(options?: GestureHapticsFixtureOptions): GestureHapticsFixture;
57
+ //# sourceMappingURL=GestureHapticsFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureHapticsFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/input/src/GestureHapticsFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ export function sampleGestureHapticsFixture(options = {}) {
2
+ const seed = normalizeSeed(options.seed ?? 0x9e57);
3
+ const pointerDeltaX = finite(options.pointerDeltaX ?? 84, "pointerDeltaX");
4
+ const pointerDeltaY = finite(options.pointerDeltaY ?? 18, "pointerDeltaY");
5
+ const pinchStartDistance = positive(options.pinchStartDistance ?? 42, "pinchStartDistance");
6
+ const pinchEndDistance = positive(options.pinchEndDistance ?? 76, "pinchEndDistance");
7
+ const rotateDegrees = finite(options.rotateDegrees ?? 28, "rotateDegrees");
8
+ const panDistance = Number(Math.hypot(pointerDeltaX, pointerDeltaY).toFixed(3));
9
+ const pinchScale = Number((pinchEndDistance / pinchStartDistance).toFixed(3));
10
+ const swipeDirection = Math.abs(pointerDeltaX) >= Math.abs(pointerDeltaY)
11
+ ? pointerDeltaX >= 0 ? "right" : "left"
12
+ : pointerDeltaY >= 0 ? "down" : "up";
13
+ const patterns = [
14
+ hapticPattern("tap", [{ weak: 0.3, strong: 0.2, duration: 50 }], false),
15
+ hapticPattern("impact", [{ weak: 0.7, strong: 0.8, duration: 100 }], false),
16
+ hapticPattern("damage", [
17
+ { weak: 0.8, strong: 0.9, duration: 80 },
18
+ { weak: 0, strong: 0, duration: 40 },
19
+ { weak: 0.6, strong: 0.7, duration: 60 }
20
+ ], false),
21
+ hapticPattern("success", [
22
+ { weak: 0.3, strong: 0.3, duration: 80 },
23
+ { weak: 0, strong: 0, duration: 50 },
24
+ { weak: 0.4, strong: 0.4, duration: 100 }
25
+ ], false),
26
+ hapticPattern("engine", [
27
+ { weak: 0.3, strong: 0.2, duration: 50 },
28
+ { weak: 0.35, strong: 0.25, duration: 50 }
29
+ ], true)
30
+ ];
31
+ const fixture = {
32
+ source: "origin-master-input-gesture-rumble-adapted",
33
+ gestures: [
34
+ { type: "tap", state: "ended", touchCount: 1, center: [16, 22] },
35
+ { type: "pan", state: "changed", touchCount: 1, center: [42, 38], distance: panDistance, velocity: [pointerDeltaX, pointerDeltaY] },
36
+ { type: "pinch", state: "changed", touchCount: 2, center: [64, 64], distance: pinchEndDistance, scale: pinchScale },
37
+ { type: "swipe", state: "ended", touchCount: 1, center: [120, 64], distance: panDistance, velocity: [pointerDeltaX * 8, pointerDeltaY * 8] },
38
+ { type: "rotate", state: "changed", touchCount: 2, center: [64, 64], rotationDegrees: Number(rotateDegrees.toFixed(3)) }
39
+ ],
40
+ gestureSummary: {
41
+ tapDetected: true,
42
+ panDistance,
43
+ pinchScale,
44
+ swipeDirection,
45
+ rotateDegrees: Number(rotateDegrees.toFixed(3))
46
+ },
47
+ haptics: {
48
+ gamepadConnected: options.gamepadConnected ?? true,
49
+ hapticsClaimed: false,
50
+ patterns,
51
+ queuedPatterns: 3 + Math.floor(seededUnit(seed) * 2),
52
+ totalDurationMs: patterns.reduce((sum, pattern) => sum + pattern.totalDurationMs, 0),
53
+ intensityMultiplier: Number((0.65 + seededUnit(seed ^ 0x54c) * 0.25).toFixed(3))
54
+ },
55
+ productionReadiness: {
56
+ gestureTelemetry: true,
57
+ swipeRotateTelemetry: true,
58
+ hapticPatternTelemetry: true,
59
+ hapticClaimBoundaryTelemetry: true
60
+ },
61
+ blockedClaims: [
62
+ "native mobile gesture recognizer parity",
63
+ "gamepad haptic actuator delivery guarantee",
64
+ "platform vibration permission handling",
65
+ "Unity Input System haptics parity",
66
+ "Unreal Enhanced Input haptics parity"
67
+ ],
68
+ claimBoundary: "This fixture ports old swipe/rotate gesture and rumble-pattern concepts into deterministic local input telemetry. It does not vibrate hardware, guarantee platform haptic delivery, or claim Unity Input System or Unreal Enhanced Input parity."
69
+ };
70
+ return {
71
+ ...fixture,
72
+ hash: stableHash(JSON.stringify(fixture))
73
+ };
74
+ }
75
+ function hapticPattern(name, steps, loop) {
76
+ return {
77
+ name,
78
+ steps: steps.length,
79
+ totalDurationMs: steps.reduce((sum, step) => sum + step.duration, 0),
80
+ peakWeak: Math.max(...steps.map((step) => step.weak)),
81
+ peakStrong: Math.max(...steps.map((step) => step.strong)),
82
+ loop
83
+ };
84
+ }
85
+ function normalizeSeed(seed) {
86
+ if (!Number.isInteger(seed) || seed < 0)
87
+ throw new Error("seed must be a non-negative integer.");
88
+ return seed >>> 0;
89
+ }
90
+ function finite(value, name) {
91
+ if (!Number.isFinite(value))
92
+ throw new Error(`${name} must be finite.`);
93
+ return value;
94
+ }
95
+ function positive(value, name) {
96
+ if (!Number.isFinite(value) || value <= 0)
97
+ throw new Error(`${name} must be positive.`);
98
+ return value;
99
+ }
100
+ function seededUnit(seed) {
101
+ let value = seed >>> 0;
102
+ value ^= value << 13;
103
+ value ^= value >>> 17;
104
+ value ^= value << 5;
105
+ return (value >>> 0) / 0xffffffff;
106
+ }
107
+ function stableHash(value) {
108
+ let hash = 2166136261;
109
+ for (let index = 0; index < value.length; index += 1) {
110
+ hash ^= value.charCodeAt(index);
111
+ hash = Math.imul(hash, 16777619);
112
+ }
113
+ return (hash >>> 0).toString(16).padStart(8, "0");
114
+ }
115
+ //# sourceMappingURL=GestureHapticsFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureHapticsFixtures.js","sourceRoot":"","sources":["../../../../packages/input/src/GestureHapticsFixtures.ts"],"names":[],"mappings":"AA0DA,MAAM,UAAU,2BAA2B,CAAC,UAAwC,EAAE;IACpF,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;IAC3E,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,IAAI,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAC5F,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACtF,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QACvE,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACvC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,MAAM,QAAQ,GAAG;QACf,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC;QACvE,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC;QAC3E,aAAa,CAAC,QAAQ,EAAE;YACtB,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE;YACxC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YACpC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE;SACzC,EAAE,KAAK,CAAC;QACT,aAAa,CAAC,SAAS,EAAE;YACvB,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE;YACxC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YACpC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;SAC1C,EAAE,KAAK,CAAC;QACT,aAAa,CAAC,QAAQ,EAAE;YACtB,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE;YACxC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;SAC3C,EAAE,IAAI,CAAC;KACA,CAAC;IACX,MAAM,OAAO,GAAwC;QACnD,MAAM,EAAE,4CAA4C;QACpD,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;YAChE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE;YACnI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE;YACnH,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,EAAE;YAC5I,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;SACzH;QACD,cAAc,EAAE;YACd,WAAW,EAAE,IAAI;YACjB,WAAW;YACX,UAAU;YACV,cAAc;YACd,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAChD;QACD,OAAO,EAAE;YACP,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI;YAClD,cAAc,EAAE,KAAK;YACrB,QAAQ;YACR,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpD,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;YACpF,mBAAmB,EAAE,MAAM,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACjF;QACD,mBAAmB,EAAE;YACnB,gBAAgB,EAAE,IAAI;YACtB,oBAAoB,EAAE,IAAI;YAC1B,sBAAsB,EAAE,IAAI;YAC5B,4BAA4B,EAAE,IAAI;SACnC;QACD,aAAa,EAAE;YACb,yCAAyC;YACzC,4CAA4C;YAC5C,wCAAwC;YACxC,mCAAmC;YACnC,sCAAsC;SACvC;QACD,aAAa,EAAE,kPAAkP;KAClQ,CAAC;IACF,OAAO;QACL,GAAG,OAAO;QACV,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,IAA+B,EAC/B,KAA+F,EAC/F,IAAa;IAEb,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACjG,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,IAAY;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,IAAY;IAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;IACxF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC;IACvB,KAAK,IAAI,KAAK,IAAI,EAAE,CAAC;IACrB,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC;IACtB,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;IACpB,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { InputSnapshot } from "./InputSnapshot";
2
+ export type Gesture = {
3
+ readonly type: "tap";
4
+ readonly x: number;
5
+ readonly y: number;
6
+ } | {
7
+ readonly type: "pan";
8
+ readonly deltaX: number;
9
+ readonly deltaY: number;
10
+ } | {
11
+ readonly type: "pinch";
12
+ readonly scale: number;
13
+ };
14
+ export declare class GestureRecognizer {
15
+ private previousTouches;
16
+ private downFrames;
17
+ update(snapshot: InputSnapshot): readonly Gesture[];
18
+ }
19
+ //# sourceMappingURL=GestureRecognizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureRecognizer.d.ts","sourceRoot":"","sources":["../../../../packages/input/src/GestureRecognizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,iBAAiB,CAAC;AAEnE,MAAM,MAAM,OAAO,GACf;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,UAAU,CAAK;IAEvB,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,OAAO,EAAE;CA2BpD"}
@@ -0,0 +1,32 @@
1
+ export class GestureRecognizer {
2
+ previousTouches = [];
3
+ downFrames = 0;
4
+ update(snapshot) {
5
+ const gestures = [];
6
+ const touches = snapshot.pointer.touches;
7
+ if (snapshot.button(0).down) {
8
+ this.downFrames += 1;
9
+ if (snapshot.pointer.deltaX !== 0 || snapshot.pointer.deltaY !== 0) {
10
+ gestures.push({ type: "pan", deltaX: snapshot.pointer.deltaX, deltaY: snapshot.pointer.deltaY });
11
+ }
12
+ }
13
+ if (snapshot.button(0).released && this.downFrames <= 12) {
14
+ gestures.push({ type: "tap", x: snapshot.pointer.x, y: snapshot.pointer.y });
15
+ }
16
+ if (touches.length >= 2 && this.previousTouches.length >= 2) {
17
+ const previousDistance = distance(this.previousTouches[0], this.previousTouches[1]);
18
+ const currentDistance = distance(touches[0], touches[1]);
19
+ if (previousDistance > 0)
20
+ gestures.push({ type: "pinch", scale: currentDistance / previousDistance });
21
+ }
22
+ if (!snapshot.button(0).down) {
23
+ this.downFrames = 0;
24
+ }
25
+ this.previousTouches = touches;
26
+ return gestures;
27
+ }
28
+ }
29
+ function distance(a, b) {
30
+ return Math.hypot(a.x - b.x, a.y - b.y);
31
+ }
32
+ //# sourceMappingURL=GestureRecognizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GestureRecognizer.js","sourceRoot":"","sources":["../../../../packages/input/src/GestureRecognizer.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,iBAAiB;IACpB,eAAe,GAA4B,EAAE,CAAC;IAC9C,UAAU,GAAG,CAAC,CAAC;IAEvB,MAAM,CAAC,QAAuB;QAC5B,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;QAEzC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;YACrB,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC,CAAC;YACtF,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAE,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC;YAC3D,IAAI,gBAAgB,GAAG,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,GAAG,gBAAgB,EAAE,CAAC,CAAC;QACxG,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,CAAe,EAAE,CAAe;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,44 @@
1
+ export type InputValueProcessor = {
2
+ readonly type: "deadzone";
3
+ readonly threshold: number;
4
+ } | {
5
+ readonly type: "scale";
6
+ readonly factor: number;
7
+ } | {
8
+ readonly type: "invert";
9
+ } | {
10
+ readonly type: "clamp";
11
+ readonly min: number;
12
+ readonly max: number;
13
+ } | {
14
+ readonly type: "exponential";
15
+ readonly exponent: number;
16
+ };
17
+ export interface InputActionBindingFixture {
18
+ readonly source: "origin-master-input-action-binding-adapted";
19
+ readonly evidence: {
20
+ readonly oldCodebasePort: true;
21
+ readonly actionBindings: true;
22
+ readonly processors: true;
23
+ readonly holdTapDoubleTap: true;
24
+ readonly compositeAxis: true;
25
+ readonly modifierChord: true;
26
+ };
27
+ readonly actionCount: number;
28
+ readonly bindingCount: number;
29
+ readonly processorCount: number;
30
+ readonly processedAxis: number;
31
+ readonly deadzoneFilteredAxis: number;
32
+ readonly compositeX: number;
33
+ readonly compositeY: number;
34
+ readonly compositeMagnitude: number;
35
+ readonly holdTriggered: boolean;
36
+ readonly holdDurationSeconds: number;
37
+ readonly tapTriggered: boolean;
38
+ readonly doubleTapTriggered: boolean;
39
+ readonly modifierChordPressed: boolean;
40
+ readonly claimBoundary: string;
41
+ }
42
+ export declare function processInputValue(value: number, processors: readonly InputValueProcessor[], deltaSeconds?: number): number;
43
+ export declare function sampleInputActionBindingFixture(): InputActionBindingFixture;
44
+ //# sourceMappingURL=InputActionBindingFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputActionBindingFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/input/src/InputActionBindingFixtures.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,4CAA4C,CAAC;IAC9D,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;QAC/B,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC;QAC9B,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;QAC1B,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC;QAChC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;QAC7B,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,mBAAmB,EAAE,EAAE,YAAY,SAAS,GAAG,MAAM,CAiB1H;AAED,wBAAgB,+BAA+B,IAAI,yBAAyB,CAiD3E"}
@@ -0,0 +1,86 @@
1
+ import { InputSnapshot } from "./InputSnapshot.js";
2
+ export function processInputValue(value, processors, deltaSeconds = 1 / 60) {
3
+ let result = finite(value, 0);
4
+ for (const processor of processors) {
5
+ if (processor.type === "deadzone") {
6
+ result = Math.abs(result) < Math.max(0, processor.threshold) ? 0 : result;
7
+ }
8
+ else if (processor.type === "scale") {
9
+ result *= finite(processor.factor, 1);
10
+ }
11
+ else if (processor.type === "invert") {
12
+ result *= -1;
13
+ }
14
+ else if (processor.type === "clamp") {
15
+ result = clamp(result, processor.min, processor.max);
16
+ }
17
+ else {
18
+ const sign = Math.sign(result);
19
+ result = sign * Math.pow(Math.abs(result), Math.max(0.01, finite(processor.exponent, 1))) * Math.max(0.001, deltaSeconds / (1 / 60));
20
+ }
21
+ }
22
+ return Number(result.toFixed(4));
23
+ }
24
+ export function sampleInputActionBindingFixture() {
25
+ const activeSnapshot = new InputSnapshot({
26
+ keys: new Set(["ControlLeft", "KeyW", "KeyD"]),
27
+ previousKeys: new Set(["ControlLeft", "KeyW"]),
28
+ gamepads: [{
29
+ id: "fixture-pad",
30
+ index: 0,
31
+ axes: [0.42, -0.74],
32
+ buttons: [{ down: true, pressed: true, released: false }]
33
+ }]
34
+ });
35
+ const processedAxis = processInputValue(activeSnapshot.gamepads[0]?.axes[0] ?? 0, [
36
+ { type: "deadzone", threshold: 0.2 },
37
+ { type: "scale", factor: 1.8 },
38
+ { type: "clamp", min: -1, max: 1 }
39
+ ]);
40
+ const deadzoneFilteredAxis = processInputValue(0.08, [{ type: "deadzone", threshold: 0.2 }]);
41
+ const compositeX = (activeSnapshot.key("KeyD").down ? 1 : 0) - (activeSnapshot.key("KeyA").down ? 1 : 0);
42
+ const compositeY = (activeSnapshot.key("KeyW").down ? 1 : 0) - (activeSnapshot.key("KeyS").down ? 1 : 0);
43
+ const holdDurationSeconds = Number((5 * 0.12).toFixed(2));
44
+ const tapTriggered = evaluateTap(1.2, 1.34, 0.2);
45
+ const doubleTapTriggered = evaluateDoubleTap([1.2, 1.34], 0.25);
46
+ const modifierChordPressed = activeSnapshot.key("ControlLeft").down && activeSnapshot.key("KeyD").pressed;
47
+ return {
48
+ source: "origin-master-input-action-binding-adapted",
49
+ evidence: {
50
+ oldCodebasePort: true,
51
+ actionBindings: true,
52
+ processors: true,
53
+ holdTapDoubleTap: true,
54
+ compositeAxis: true,
55
+ modifierChord: true
56
+ },
57
+ actionCount: 4,
58
+ bindingCount: 8,
59
+ processorCount: 3,
60
+ processedAxis,
61
+ deadzoneFilteredAxis,
62
+ compositeX,
63
+ compositeY,
64
+ compositeMagnitude: Number(Math.hypot(compositeX, compositeY).toFixed(4)),
65
+ holdTriggered: holdDurationSeconds >= 0.5,
66
+ holdDurationSeconds,
67
+ tapTriggered,
68
+ doubleTapTriggered,
69
+ modifierChordPressed,
70
+ claimBoundary: "Bounded deterministic current-input evidence for old InputAction/InputBinding processors and interactions; this does not claim full input action asset, rebinding UI, or Unity Input System parity."
71
+ };
72
+ }
73
+ function evaluateTap(pressedAtSeconds, releasedAtSeconds, tapSpeedSeconds) {
74
+ return releasedAtSeconds >= pressedAtSeconds && releasedAtSeconds - pressedAtSeconds <= tapSpeedSeconds;
75
+ }
76
+ function evaluateDoubleTap(pressTimesSeconds, maxIntervalSeconds) {
77
+ return pressTimesSeconds.length >= 2 && (pressTimesSeconds.at(-1) ?? 0) - (pressTimesSeconds.at(-2) ?? 0) <= maxIntervalSeconds;
78
+ }
79
+ function finite(value, fallback) {
80
+ const number = Number(value);
81
+ return Number.isFinite(number) ? number : fallback;
82
+ }
83
+ function clamp(value, min, max) {
84
+ return Math.max(min, Math.min(max, value));
85
+ }
86
+ //# sourceMappingURL=InputActionBindingFixtures.js.map