// extra-inputs.js // Created by Ada on 2025-12-16 // SPDX-License-Identifier: Apache-2.0 "use strict"; if (!Controller.Hardware.OpenXR) { throw new Error("Not in OpenXR mode!"); } const CAMERA_RELATIVE_CONTROLLER_RIGHTHAND_INDEX = -5; const CAMERA_RELATIVE_CONTROLLER_LEFTHAND_INDEX = -6; const XR = Controller.Hardware.OpenXR; // TODO: Expose *all* inputs later? const inputHandles = { left: { triggerTouch: XR.LTTouch, triggerClick: XR.LTClick, thumbstickTouch: XR.LSTouch, primaryTouch: XR.LeftPrimaryTouch, secondaryTouch: XR.LeftSecondaryTouch, trackpadX: XR.LeftTrackpadX, trackpadY: XR.LeftTrackpadY, trackpadTouch: XR.LeftTrackpadTouch, trackpadClick: XR.LeftTrackpadClick, }, right: { triggerTouch: XR.RTTouch, triggerClick: XR.RTClick, thumbstickTouch: XR.RSTouch, primaryTouch: XR.RightPrimaryTouch, secondaryTouch: XR.RightSecondaryTouch, trackpadX: XR.RightTrackpadX, trackpadY: XR.RightTrackpadY, trackpadTouch: XR.RightTrackpadTouch, trackpadClick: XR.RightTrackpadClick, }, }; function fetchInputs() { let tmp = { left: {}, right: {}, }; for (const [key, path] of Object.entries(inputHandles.left)) { tmp.left[key] = Controller.getValue(path); } for (const [key, path] of Object.entries(inputHandles.right)) { tmp.right[key] = Controller.getValue(path); } return tmp; } const defaultProps = { parentID: MyAvatar.sessionUUID, type: "Text", lineHeight: 0.015, dimensions: [0.2, 0.2, 0.1], localPosition: [0.0, 0.3, 0.0], backgroundAlpha: 0.8, unlit: true, ignorePickIntersection: true, renderLayer: "front", }; const leftEntity = Entities.addEntity({ parentJointIndex: CAMERA_RELATIVE_CONTROLLER_LEFTHAND_INDEX, localRotation: Quat.fromPitchYawRollDegrees(45, -90, 0), text: "Left display", ...defaultProps }, "local"); const rightEntity= Entities.addEntity({ parentJointIndex: CAMERA_RELATIVE_CONTROLLER_RIGHTHAND_INDEX, localRotation: Quat.fromPitchYawRollDegrees(45, 90, 0), text: "Right display", ...defaultProps }, "local"); Script.update.connect(() => { const inputs = fetchInputs(); let leftText = [], rightText = []; for (const [key, value] of Object.entries(inputs.left)) { leftText.push(`${key}: ${value.toFixed(2)}`); } for (const [key, value] of Object.entries(inputs.right)) { rightText.push(`${key}: ${value.toFixed(2)}`); } Entities.editEntity(leftEntity, { text: leftText.join("\n") }); Entities.editEntity(rightEntity, { text: rightText.join("\n") }); }); Script.scriptEnding.connect(() => { Entities.deleteEntity(leftEntity); Entities.deleteEntity(rightEntity); });