@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
@@ -0,0 +1,143 @@
1
+ export class WebXRSessionController {
2
+ mode;
3
+ requiredFeatures;
4
+ optionalFeatures;
5
+ referenceSpaceType;
6
+ xr;
7
+ session = null;
8
+ referenceSpace = null;
9
+ constructor(options = {}) {
10
+ this.xr = options.xr ?? readNavigatorXR();
11
+ this.mode = options.mode ?? "immersive-vr";
12
+ this.requiredFeatures = options.requiredFeatures ?? [];
13
+ this.optionalFeatures = options.optionalFeatures ?? [];
14
+ this.referenceSpaceType = options.referenceSpace ?? (this.mode === "immersive-ar" ? "viewer" : "local-floor");
15
+ }
16
+ get active() {
17
+ return this.session !== null;
18
+ }
19
+ async isSupported() {
20
+ if (!this.xr)
21
+ return false;
22
+ if (!this.xr.isSessionSupported)
23
+ return true;
24
+ return this.xr.isSessionSupported(this.mode);
25
+ }
26
+ async start() {
27
+ if (!this.xr) {
28
+ return {
29
+ mode: this.mode,
30
+ referenceSpace: this.referenceSpaceType,
31
+ supported: false,
32
+ started: false
33
+ };
34
+ }
35
+ const supported = await this.isSupported();
36
+ if (!supported) {
37
+ return {
38
+ mode: this.mode,
39
+ referenceSpace: this.referenceSpaceType,
40
+ supported: false,
41
+ started: false
42
+ };
43
+ }
44
+ this.session = await this.xr.requestSession(this.mode, {
45
+ requiredFeatures: this.requiredFeatures,
46
+ optionalFeatures: this.optionalFeatures
47
+ });
48
+ this.referenceSpace = await this.session.requestReferenceSpace?.(this.referenceSpaceType) ?? { type: this.referenceSpaceType };
49
+ return {
50
+ mode: this.mode,
51
+ referenceSpace: this.referenceSpace?.type ?? this.referenceSpaceType,
52
+ supported: true,
53
+ started: true
54
+ };
55
+ }
56
+ sampleFrame(frame, hitTestSource) {
57
+ const referenceSpace = this.referenceSpace ?? { type: this.referenceSpaceType };
58
+ const controllers = Array.from(this.session?.inputSources ?? []).map((source) => sampleInputSource(source, frame, referenceSpace));
59
+ const hitTests = frame?.getHitTestResults && hitTestSource
60
+ ? frame.getHitTestResults(hitTestSource).map(sampleHitTest)
61
+ : [];
62
+ return {
63
+ mode: this.mode,
64
+ referenceSpace: this.referenceSpace?.type ?? this.referenceSpaceType,
65
+ active: this.active,
66
+ controllerCount: controllers.length,
67
+ controllers,
68
+ hitTestCount: hitTests.length,
69
+ hitTests
70
+ };
71
+ }
72
+ async end() {
73
+ const session = this.session;
74
+ this.session = null;
75
+ this.referenceSpace = null;
76
+ await session?.end?.();
77
+ }
78
+ async pulseHaptics(intensity = 0.5, duration = 35) {
79
+ if (!Number.isFinite(intensity) || intensity < 0 || intensity > 1)
80
+ throw new RangeError("WebXR haptic intensity must be in [0, 1].");
81
+ if (!Number.isFinite(duration) || duration < 0)
82
+ throw new RangeError("WebXR haptic duration must be finite and non-negative.");
83
+ let pulses = 0;
84
+ for (const source of this.session?.inputSources ?? []) {
85
+ for (const actuator of source.gamepad?.hapticActuators ?? []) {
86
+ const accepted = await actuator.pulse?.(intensity, duration);
87
+ if (accepted !== false)
88
+ pulses += 1;
89
+ }
90
+ }
91
+ return pulses;
92
+ }
93
+ }
94
+ function sampleInputSource(source, frame, referenceSpace) {
95
+ const buttons = source.gamepad?.buttons ?? [];
96
+ const axes = source.gamepad?.axes ?? [];
97
+ const trigger = buttons[0];
98
+ const squeeze = buttons[1];
99
+ return {
100
+ handedness: source.handedness ?? "none",
101
+ targetRayMode: source.targetRayMode ?? "tracked-pointer",
102
+ profiles: source.profiles ?? [],
103
+ triggerPressed: Boolean(trigger?.pressed),
104
+ squeezePressed: Boolean(squeeze?.pressed),
105
+ primaryValue: finiteOrZero(trigger?.value),
106
+ axes: axes.map(finiteOrZero),
107
+ targetRayMatrix: samplePoseMatrix(frame, source.targetRaySpace, referenceSpace),
108
+ gripMatrix: samplePoseMatrix(frame, source.gripSpace, referenceSpace),
109
+ hapticActuatorCount: source.gamepad?.hapticActuators?.length ?? 0
110
+ };
111
+ }
112
+ function samplePoseMatrix(frame, space, referenceSpace) {
113
+ if (!frame?.getPose || !space)
114
+ return null;
115
+ return sanitizeMatrix4(frame.getPose(space, referenceSpace)?.transform?.matrix);
116
+ }
117
+ function sampleHitTest(result) {
118
+ return {
119
+ position: sanitizeVec3(result.position, [0, 0, 0]),
120
+ normal: sanitizeVec3(result.normal, [0, 1, 0])
121
+ };
122
+ }
123
+ function sanitizeVec3(value, fallback) {
124
+ if (!value || value.length < 3)
125
+ return fallback;
126
+ const x = finiteOrZero(value[0]);
127
+ const y = finiteOrZero(value[1]);
128
+ const z = finiteOrZero(value[2]);
129
+ return [x, y, z];
130
+ }
131
+ function finiteOrZero(value) {
132
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
133
+ }
134
+ function sanitizeMatrix4(value) {
135
+ if (!value || value.length < 16)
136
+ return null;
137
+ const matrix = Array.from(value.slice(0, 16), finiteOrZero);
138
+ return matrix;
139
+ }
140
+ function readNavigatorXR() {
141
+ return globalThis.navigator?.xr;
142
+ }
143
+ //# sourceMappingURL=WebXRSessionController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebXRSessionController.js","sourceRoot":"","sources":["../../../../packages/input/src/WebXRSessionController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ export type XRFixtureSessionMode = "inline" | "immersive-vr" | "immersive-ar";
2
+ export type XRFixtureLodLevel = "high" | "medium" | "low" | "culled";
3
+ export interface XRFixtureOptions {
4
+ readonly requestedMode?: XRFixtureSessionMode;
5
+ readonly gaze?: readonly [number, number];
6
+ readonly objectCount?: number;
7
+ }
8
+ export interface XRRuntimeFixture {
9
+ readonly source: "origin-master-xr-session-input-foveated-adapted";
10
+ readonly requestedMode: XRFixtureSessionMode;
11
+ readonly fallbackMode: "inline";
12
+ readonly sessionSupported: boolean;
13
+ readonly fallbackUsed: boolean;
14
+ readonly webXRSessionClaimed: false;
15
+ readonly deviceRuntimeClaimed: false;
16
+ readonly evidence: {
17
+ readonly oldCodebasePort: true;
18
+ readonly sessionCapabilityNegotiation: true;
19
+ readonly gracefulInlineFallback: true;
20
+ readonly controllerInputTelemetry: true;
21
+ readonly handGestureTelemetry: true;
22
+ readonly gazeBasedLodTelemetry: true;
23
+ };
24
+ readonly capabilities: {
25
+ readonly supportedModes: readonly XRFixtureSessionMode[];
26
+ readonly requestedFeatures: readonly string[];
27
+ readonly optionalFeatures: readonly string[];
28
+ readonly unsupportedFeatures: readonly string[];
29
+ readonly referenceSpaces: readonly string[];
30
+ readonly depthSensing: false;
31
+ readonly handTracking: false;
32
+ readonly eyeTracking: false;
33
+ readonly domOverlay: false;
34
+ };
35
+ readonly input: {
36
+ readonly controllerCount: number;
37
+ readonly handedness: readonly ["left", "right"];
38
+ readonly triggerPressed: boolean;
39
+ readonly squeezePressed: boolean;
40
+ readonly thumbstickMagnitude: number;
41
+ readonly hapticsClaimed: false;
42
+ readonly pinchDetected: boolean;
43
+ readonly pinchStrength: number;
44
+ readonly pinchDistanceMeters: number;
45
+ readonly pointDetected: boolean;
46
+ readonly pointConfidence: number;
47
+ };
48
+ readonly gazeLod: {
49
+ readonly gaze: readonly [number, number];
50
+ readonly objectCount: number;
51
+ readonly performanceBudget: number;
52
+ readonly updatedObjects: number;
53
+ readonly highDetailCount: number;
54
+ readonly mediumDetailCount: number;
55
+ readonly lowDetailCount: number;
56
+ readonly culledCount: number;
57
+ readonly transitionsPerFrame: number;
58
+ readonly selectedLevels: readonly XRFixtureLodLevel[];
59
+ };
60
+ readonly blockedClaims: readonly string[];
61
+ readonly hash: string;
62
+ readonly claimBoundary: string;
63
+ }
64
+ export declare function sampleXRRuntimeFixture(options?: XRFixtureOptions): XRRuntimeFixture;
65
+ //# sourceMappingURL=XRFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XRFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/input/src/XRFixtures.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC;AAC9E,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,iDAAiD,CAAC;IACnE,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,KAAK,CAAC;IACpC,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;QAC/B,QAAQ,CAAC,4BAA4B,EAAE,IAAI,CAAC;QAC5C,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC;QACtC,QAAQ,CAAC,wBAAwB,EAAE,IAAI,CAAC;QACxC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC;QACpC,QAAQ,CAAC,qBAAqB,EAAE,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE;QACrB,QAAQ,CAAC,cAAc,EAAE,SAAS,oBAAoB,EAAE,CAAC;QACzD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;QAC9C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;QAC7C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;QAChD,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5C,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;QAC7B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;QAC7B,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;QAC5B,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;QACjC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;QACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC;QAC/B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;QAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;QAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;KAClC,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,cAAc,EAAE,SAAS,iBAAiB,EAAE,CAAC;KACvD,CAAC;IACF,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,gBAAqB,GAAG,gBAAgB,CA6GvF"}
@@ -0,0 +1,136 @@
1
+ export function sampleXRRuntimeFixture(options = {}) {
2
+ const requestedMode = options.requestedMode ?? "immersive-vr";
3
+ const gaze = options.gaze ?? [0.48, 0.44];
4
+ const objectCount = Math.max(6, Math.min(48, Math.trunc(options.objectCount ?? 14)));
5
+ const supportedModes = ["inline"];
6
+ const sessionSupported = supportedModes.includes(requestedMode);
7
+ const objects = Array.from({ length: objectCount }, (_, index) => {
8
+ const column = index % 7;
9
+ const row = Math.floor(index / 7);
10
+ const x = 0.12 + column * 0.13;
11
+ const y = 0.18 + row * 0.21;
12
+ const distance = Math.hypot(x - gaze[0], y - gaze[1]);
13
+ return { index, distance, lod: lodForDistance(distance) };
14
+ });
15
+ const performanceBudget = Math.min(10, objectCount);
16
+ const updatedObjects = objects
17
+ .slice()
18
+ .sort((left, right) => left.distance - right.distance)
19
+ .slice(0, performanceBudget);
20
+ const selectedLevels = uniqueLevels(objects.map((object) => object.lod));
21
+ const pinchDistanceMeters = 0.024;
22
+ const pointConfidence = 0.82;
23
+ const unsupportedFeatures = [
24
+ "local-floor",
25
+ "bounded-floor",
26
+ "hand-tracking",
27
+ "eye-tracking",
28
+ "depth-sensing",
29
+ "dom-overlay",
30
+ "hit-test",
31
+ "anchors",
32
+ "plane-detection",
33
+ "mesh-detection",
34
+ "light-estimation"
35
+ ];
36
+ const blockedClaims = [
37
+ "real WebXR headset session evidence",
38
+ "AR hit-test anchor platform parity",
39
+ "device hand-tracking runtime parity",
40
+ "eye-tracked foveated rendering",
41
+ "Unity XR Interaction Toolkit parity",
42
+ "Unreal XR framework parity"
43
+ ];
44
+ const hash = hashStrings([
45
+ requestedMode,
46
+ String(sessionSupported),
47
+ ...selectedLevels,
48
+ String(updatedObjects.length),
49
+ String(pinchDistanceMeters),
50
+ String(pointConfidence),
51
+ ...blockedClaims
52
+ ]);
53
+ return {
54
+ source: "origin-master-xr-session-input-foveated-adapted",
55
+ requestedMode,
56
+ fallbackMode: "inline",
57
+ sessionSupported,
58
+ fallbackUsed: !sessionSupported,
59
+ webXRSessionClaimed: false,
60
+ deviceRuntimeClaimed: false,
61
+ evidence: {
62
+ oldCodebasePort: true,
63
+ sessionCapabilityNegotiation: true,
64
+ gracefulInlineFallback: true,
65
+ controllerInputTelemetry: true,
66
+ handGestureTelemetry: true,
67
+ gazeBasedLodTelemetry: true
68
+ },
69
+ capabilities: {
70
+ supportedModes,
71
+ requestedFeatures: ["local-floor"],
72
+ optionalFeatures: unsupportedFeatures.slice(2),
73
+ unsupportedFeatures,
74
+ referenceSpaces: ["viewer"],
75
+ depthSensing: false,
76
+ handTracking: false,
77
+ eyeTracking: false,
78
+ domOverlay: false
79
+ },
80
+ input: {
81
+ controllerCount: 2,
82
+ handedness: ["left", "right"],
83
+ triggerPressed: true,
84
+ squeezePressed: false,
85
+ thumbstickMagnitude: round(Math.hypot(0.42, -0.36)),
86
+ hapticsClaimed: false,
87
+ pinchDetected: pinchDistanceMeters <= 0.03,
88
+ pinchStrength: round((0.05 - pinchDistanceMeters) / 0.05),
89
+ pinchDistanceMeters,
90
+ pointDetected: true,
91
+ pointConfidence
92
+ },
93
+ gazeLod: {
94
+ gaze: [round(gaze[0]), round(gaze[1])],
95
+ objectCount,
96
+ performanceBudget,
97
+ updatedObjects: updatedObjects.length,
98
+ highDetailCount: objects.filter((object) => object.lod === "high").length,
99
+ mediumDetailCount: objects.filter((object) => object.lod === "medium").length,
100
+ lowDetailCount: objects.filter((object) => object.lod === "low").length,
101
+ culledCount: objects.filter((object) => object.lod === "culled").length,
102
+ transitionsPerFrame: updatedObjects.filter((object) => object.lod !== "medium").length,
103
+ selectedLevels
104
+ },
105
+ blockedClaims,
106
+ hash,
107
+ claimBoundary: "Bounded deterministic fixture adapted from old XR session/input/foveated concepts. It does not claim a real WebXR headset session, AR platform support, eye-tracked foveated rendering, Unity XR parity, or Unreal XR parity."
108
+ };
109
+ }
110
+ function lodForDistance(distance) {
111
+ if (distance <= 0.18)
112
+ return "high";
113
+ if (distance <= 0.36)
114
+ return "medium";
115
+ if (distance <= 0.58)
116
+ return "low";
117
+ return "culled";
118
+ }
119
+ function uniqueLevels(levels) {
120
+ const order = ["high", "medium", "low", "culled"];
121
+ return order.filter((level) => levels.includes(level));
122
+ }
123
+ function hashStrings(values) {
124
+ let hash = 0x811c9dc5;
125
+ for (const value of values) {
126
+ for (let index = 0; index < value.length; index += 1) {
127
+ hash ^= value.charCodeAt(index);
128
+ hash = Math.imul(hash, 0x01000193);
129
+ }
130
+ }
131
+ return (hash >>> 0).toString(16).padStart(8, "0");
132
+ }
133
+ function round(value) {
134
+ return Number(value.toFixed(4));
135
+ }
136
+ //# sourceMappingURL=XRFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XRFixtures.js","sourceRoot":"","sources":["../../../../packages/input/src/XRFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CameraTransformLike, Vec3Like } from "./ControlTypes";
2
+ export interface CameraRigState {
3
+ readonly position: Vec3Like;
4
+ readonly target?: Vec3Like;
5
+ }
6
+ export declare class CameraRig {
7
+ private readonly camera;
8
+ constructor(camera: CameraTransformLike);
9
+ apply(state: CameraRigState): void;
10
+ blend(from: CameraRigState, to: CameraRigState, alpha: number): CameraRigState;
11
+ }
12
+ //# sourceMappingURL=CameraRig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraRig.d.ts","sourceRoot":"","sources":["../../../../../packages/input/src/controls/CameraRig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;CAC5B;AAED,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,mBAAmB;IAExD,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IASlC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc;CAkB/E"}
@@ -0,0 +1,32 @@
1
+ export class CameraRig {
2
+ camera;
3
+ constructor(camera) {
4
+ this.camera = camera;
5
+ }
6
+ apply(state) {
7
+ this.camera.position.x = state.position.x;
8
+ this.camera.position.y = state.position.y;
9
+ this.camera.position.z = state.position.z;
10
+ if (state.target) {
11
+ this.camera.lookAt?.(state.target);
12
+ }
13
+ }
14
+ blend(from, to, alpha) {
15
+ const t = Math.min(1, Math.max(0, alpha));
16
+ return {
17
+ position: {
18
+ x: from.position.x + (to.position.x - from.position.x) * t,
19
+ y: from.position.y + (to.position.y - from.position.y) * t,
20
+ z: from.position.z + (to.position.z - from.position.z) * t
21
+ },
22
+ target: from.target && to.target
23
+ ? {
24
+ x: from.target.x + (to.target.x - from.target.x) * t,
25
+ y: from.target.y + (to.target.y - from.target.y) * t,
26
+ z: from.target.z + (to.target.z - from.target.z) * t
27
+ }
28
+ : (to.target ?? from.target)
29
+ };
30
+ }
31
+ }
32
+ //# sourceMappingURL=CameraRig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraRig.js","sourceRoot":"","sources":["../../../../../packages/input/src/controls/CameraRig.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAG,CAAC;IAE5D,KAAK,CAAC,KAAqB;QACzB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAoB,EAAE,EAAkB,EAAE,KAAa;QAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1C,OAAO;YACL,QAAQ,EAAE;gBACR,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC1D,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC1D,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;aAC3D;YACD,MAAM,EACJ,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM;gBACtB,CAAC,CAAC;oBACE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;oBACpD,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;oBACpD,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;iBACrD;gBACH,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;SACjC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ export interface Vec3Like {
2
+ x: number;
3
+ y: number;
4
+ z: number;
5
+ }
6
+ export interface EulerLike {
7
+ x: number;
8
+ y: number;
9
+ z: number;
10
+ }
11
+ export interface CameraTransformLike {
12
+ readonly position: Vec3Like;
13
+ readonly rotation?: EulerLike;
14
+ lookAt?(target: Vec3Like): void;
15
+ }
16
+ export declare function clamp(value: number, min: number, max: number): number;
17
+ //# sourceMappingURL=ControlTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlTypes.d.ts","sourceRoot":"","sources":["../../../../../packages/input/src/controls/ControlTypes.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE"}
@@ -0,0 +1,4 @@
1
+ export function clamp(value, min, max) {
2
+ return Math.min(max, Math.max(min, value));
3
+ }
4
+ //# sourceMappingURL=ControlTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlTypes.js","sourceRoot":"","sources":["../../../../../packages/input/src/controls/ControlTypes.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { InputSnapshot } from "../InputSnapshot";
2
+ import { type CameraTransformLike } from "./ControlTypes";
3
+ export interface EditorFlyControlsOptions {
4
+ readonly baseSpeed?: number;
5
+ readonly fastMultiplier?: number;
6
+ readonly lookSpeed?: number;
7
+ }
8
+ export declare class EditorFlyControls {
9
+ private readonly camera;
10
+ enabled: boolean;
11
+ private yaw;
12
+ private pitch;
13
+ private readonly baseSpeed;
14
+ private readonly fastMultiplier;
15
+ private readonly lookSpeed;
16
+ constructor(camera: CameraTransformLike, options?: EditorFlyControlsOptions);
17
+ update(snapshot: InputSnapshot, deltaSeconds: number): void;
18
+ dispose(): void;
19
+ }
20
+ //# sourceMappingURL=EditorFlyControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorFlyControls.d.ts","sourceRoot":"","sources":["../../../../../packages/input/src/controls/EditorFlyControls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,KAAK,mBAAmB,EAAS,MAAM,gBAAgB,CAAC;AAEjE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,iBAAiB;IAS1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,UAAQ;IACf,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGhB,MAAM,EAAE,mBAAmB,EAC5C,OAAO,GAAE,wBAA6B;IASxC,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAuB3D,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,44 @@
1
+ import { clamp } from "./ControlTypes.js";
2
+ export class EditorFlyControls {
3
+ camera;
4
+ enabled = true;
5
+ yaw = 0;
6
+ pitch = 0;
7
+ baseSpeed;
8
+ fastMultiplier;
9
+ lookSpeed;
10
+ constructor(camera, options = {}) {
11
+ this.camera = camera;
12
+ this.baseSpeed = options.baseSpeed ?? 3;
13
+ this.fastMultiplier = options.fastMultiplier ?? 4;
14
+ this.lookSpeed = options.lookSpeed ?? 0.0025;
15
+ this.pitch = clamp(camera.rotation?.x ?? 0, -Math.PI / 2 + 0.001, Math.PI / 2 - 0.001);
16
+ this.yaw = camera.rotation?.y ?? 0;
17
+ }
18
+ update(snapshot, deltaSeconds) {
19
+ if (!this.enabled)
20
+ return;
21
+ if (snapshot.button(1).down || snapshot.button(2).down) {
22
+ this.yaw -= snapshot.pointer.deltaX * this.lookSpeed;
23
+ this.pitch = clamp(this.pitch - snapshot.pointer.deltaY * this.lookSpeed, -Math.PI / 2 + 0.001, Math.PI / 2 - 0.001);
24
+ if (this.camera.rotation) {
25
+ this.camera.rotation.x = this.pitch;
26
+ this.camera.rotation.y = this.yaw;
27
+ }
28
+ }
29
+ const speed = this.baseSpeed * (snapshot.key("ShiftLeft").down || snapshot.key("ShiftRight").down ? this.fastMultiplier : 1);
30
+ const forward = (snapshot.key("KeyW").down ? 1 : 0) - (snapshot.key("KeyS").down ? 1 : 0);
31
+ const strafe = (snapshot.key("KeyD").down ? 1 : 0) - (snapshot.key("KeyA").down ? 1 : 0);
32
+ const lift = (snapshot.key("KeyE").down ? 1 : 0) - (snapshot.key("KeyQ").down ? 1 : 0);
33
+ const step = speed * deltaSeconds;
34
+ const sin = Math.sin(this.yaw);
35
+ const cos = Math.cos(this.yaw);
36
+ this.camera.position.x += (strafe * cos + forward * sin) * step;
37
+ this.camera.position.z += (forward * cos - strafe * sin) * step;
38
+ this.camera.position.y += lift * step;
39
+ }
40
+ dispose() {
41
+ this.enabled = false;
42
+ }
43
+ }
44
+ //# sourceMappingURL=EditorFlyControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorFlyControls.js","sourceRoot":"","sources":["../../../../../packages/input/src/controls/EditorFlyControls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { InputSnapshot } from "../InputSnapshot";
2
+ import { type CameraTransformLike } from "./ControlTypes";
3
+ export interface FirstPersonControlsOptions {
4
+ readonly moveSpeed?: number;
5
+ readonly lookSpeed?: number;
6
+ readonly minPitch?: number;
7
+ readonly maxPitch?: number;
8
+ }
9
+ export declare class FirstPersonControls {
10
+ private readonly camera;
11
+ enabled: boolean;
12
+ private yaw;
13
+ private pitch;
14
+ private readonly moveSpeed;
15
+ private readonly lookSpeed;
16
+ private readonly minPitch;
17
+ private readonly maxPitch;
18
+ constructor(camera: CameraTransformLike, options?: FirstPersonControlsOptions);
19
+ update(snapshot: InputSnapshot, deltaSeconds: number): void;
20
+ dispose(): void;
21
+ }
22
+ //# sourceMappingURL=FirstPersonControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FirstPersonControls.d.ts","sourceRoot":"","sources":["../../../../../packages/input/src/controls/FirstPersonControls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAS,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAEjE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,mBAAmB;IAW5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,UAAQ;IAEf,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAGf,MAAM,EAAE,mBAAmB,EAC5C,OAAO,GAAE,0BAA+B;IAU1C,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAwB3D,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,44 @@
1
+ import { clamp } from "./ControlTypes.js";
2
+ export class FirstPersonControls {
3
+ camera;
4
+ enabled = true;
5
+ yaw = 0;
6
+ pitch = 0;
7
+ moveSpeed;
8
+ lookSpeed;
9
+ minPitch;
10
+ maxPitch;
11
+ constructor(camera, options = {}) {
12
+ this.camera = camera;
13
+ this.moveSpeed = options.moveSpeed ?? 1;
14
+ this.lookSpeed = options.lookSpeed ?? 0.002;
15
+ this.minPitch = options.minPitch ?? -Math.PI / 2 + 0.001;
16
+ this.maxPitch = options.maxPitch ?? Math.PI / 2 - 0.001;
17
+ this.pitch = clamp(camera.rotation?.x ?? 0, this.minPitch, this.maxPitch);
18
+ this.yaw = camera.rotation?.y ?? 0;
19
+ }
20
+ update(snapshot, deltaSeconds) {
21
+ if (!this.enabled) {
22
+ return;
23
+ }
24
+ if (snapshot.button(0).down) {
25
+ this.yaw -= snapshot.pointer.deltaX * this.lookSpeed;
26
+ this.pitch = clamp(this.pitch - snapshot.pointer.deltaY * this.lookSpeed, this.minPitch, this.maxPitch);
27
+ if (this.camera.rotation) {
28
+ this.camera.rotation.x = this.pitch;
29
+ this.camera.rotation.y = this.yaw;
30
+ }
31
+ }
32
+ const forward = (snapshot.key("KeyW").down ? 1 : 0) - (snapshot.key("KeyS").down ? 1 : 0);
33
+ const strafe = (snapshot.key("KeyD").down ? 1 : 0) - (snapshot.key("KeyA").down ? 1 : 0);
34
+ const step = this.moveSpeed * deltaSeconds;
35
+ const sin = Math.sin(this.yaw);
36
+ const cos = Math.cos(this.yaw);
37
+ this.camera.position.x += (strafe * cos + forward * sin) * step;
38
+ this.camera.position.z += (forward * cos - strafe * sin) * step;
39
+ }
40
+ dispose() {
41
+ this.enabled = false;
42
+ }
43
+ }
44
+ //# sourceMappingURL=FirstPersonControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FirstPersonControls.js","sourceRoot":"","sources":["../../../../../packages/input/src/controls/FirstPersonControls.ts"],"names":[],"mappings":"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"}