diff --git a/gui/public/i18n/en/translation.ftl b/gui/public/i18n/en/translation.ftl index e91247bac8..dffb2a281c 100644 --- a/gui/public/i18n/en/translation.ftl +++ b/gui/public/i18n/en/translation.ftl @@ -671,7 +671,7 @@ settings-general-fk_settings-self_localization-description = Mocap Mode allows t ## Gesture control settings (tracker tapping) settings-general-gesture_control = Gesture control settings-general-gesture_control-subtitle = Tap based resets -settings-general-gesture_control-description = Allows for resets to be triggered by tapping a tracker. The tracker highest up on your torso is used for Yaw Reset, the tracker highest up on your left leg is used for Full Reset, and the tracker highest up on your right leg is used for Mounting Calibration. Taps must occur within the time limit of 0.3 seconds times the number of taps to be recognized. +settings-general-gesture_control-description = Allows for resets to be triggered by tapping a tracker. Taps must occur within the time limit of 0.3 seconds times the number of taps to be recognized. # This is a unit: 3 taps, 2 taps, 1 tap # $amount (Number) - Amount of taps (touches to the tracker's case) settings-general-gesture_control-taps = { $amount -> @@ -687,12 +687,17 @@ settings-general-gesture_control-trackers = { $amount -> settings-general-gesture_control-yawResetEnabled = Enable tap to yaw reset settings-general-gesture_control-yawResetDelay = Yaw reset delay settings-general-gesture_control-yawResetTaps = Taps for yaw reset +settings-general-gesture_control-yawResetTracker = Yaw Reset Tracker settings-general-gesture_control-fullResetEnabled = Enable tap to full reset settings-general-gesture_control-fullResetDelay = Full reset delay settings-general-gesture_control-fullResetTaps = Taps for full reset +settings-general-gesture_control-fullResetTracker = Full Reset Tracker settings-general-gesture_control-mountingResetEnabled = Enable tap to perform mounting calibration settings-general-gesture_control-mountingResetDelay = Mounting calibration delay settings-general-gesture_control-mountingResetTaps = Taps for mounting calibration +settings-general-gesture_control-mountingResetTracker = Mounting Reset Tracker +settings-general-gesture_control-yawResetTracker-title = Yaw Reset Tracker +settings-general-gesture_control-fullResetTracker-title = Full Reset Tracker # The number of trackers that can have higher acceleration before a tap is rejected settings-general-gesture_control-numberTrackersOverThreshold = Trackers over threshold settings-general-gesture_control-numberTrackersOverThreshold-description = Increase this value if tap detection is not working. Do not increase it above what is needed to make tap detection work as it would cause more false positives. diff --git a/gui/src/components/commons/Dropdown.tsx b/gui/src/components/commons/Dropdown.tsx index bdfea555f2..b35b3d6979 100644 --- a/gui/src/components/commons/Dropdown.tsx +++ b/gui/src/components/commons/Dropdown.tsx @@ -19,7 +19,7 @@ import { ArrowDownIcon, ArrowUpIcon } from './icon/ArrowIcons'; import { a11yClick } from '@/utils/a11y'; import { createPortal } from 'react-dom'; -type DropdownItem = { +export type DropdownItem = { value: string; label: ReactNode; }; diff --git a/gui/src/components/onboarding/pages/trackers-assign/TrackerAssignment.tsx b/gui/src/components/onboarding/pages/trackers-assign/TrackerAssignment.tsx index 352217a01c..5655585d37 100644 --- a/gui/src/components/onboarding/pages/trackers-assign/TrackerAssignment.tsx +++ b/gui/src/components/onboarding/pages/trackers-assign/TrackerAssignment.tsx @@ -100,7 +100,11 @@ export function TrackersAssignPage() { tapDetectionSettings.mountingResetDelay, tapDetectionSettings.mountingResetEnabled, tapDetectionSettings.mountingResetTaps, - true + true, + null, + tapDetectionSettings.yawResetTracker, + tapDetectionSettings.fullResetTracker, + tapDetectionSettings.mountingResetTracker ); sendRPCPacket( diff --git a/gui/src/components/settings/pages/GeneralSettings.tsx b/gui/src/components/settings/pages/GeneralSettings.tsx index 56b8adcbb0..11197c65b4 100644 --- a/gui/src/components/settings/pages/GeneralSettings.tsx +++ b/gui/src/components/settings/pages/GeneralSettings.tsx @@ -15,6 +15,7 @@ import { SteamVRTrackersSettingT, TapDetectionSettingsT, HIDSettingsT, + BodyPart, } from 'solarxr-protocol'; import { useConfig } from '@/hooks/config'; import { useWebsocketAPI } from '@/hooks/websocket-api'; @@ -46,6 +47,8 @@ import { import { atom, useAtomValue, useSetAtom } from 'jotai'; import { isEqual } from '@react-hookz/deep-equal'; import { selectAtom } from 'jotai/utils'; +import { Dropdown } from '@/components/commons/Dropdown'; +import { ASSIGNMENT_MODES } from '@/components/onboarding/BodyAssignment'; export type SettingsForm = { trackers: { @@ -99,6 +102,9 @@ export type SettingsForm = { fullResetTaps: number; mountingResetTaps: number; numberTrackersOverThreshold: number; + yawResetTracker: string; + mountingResetTracker: string; + fullResetTracker: string; }; legTweaks: { correctionStrength: number; @@ -159,6 +165,9 @@ const defaultValues: SettingsForm = { fullResetTaps: 3, mountingResetTaps: 3, numberTrackersOverThreshold: 1, + yawResetTracker: String(BodyPart.CHEST), + mountingResetTracker: String(BodyPart.RIGHT_UPPER_LEG), + fullResetTracker: String(BodyPart.LEFT_UPPER_LEG), }, legTweaks: { correctionStrength: 0.3 }, resetsSettings: defaultResetSettings, @@ -180,6 +189,13 @@ export function GeneralSettings() { const { config } = useConfig(); const { currentLocales } = useLocaleConfig(); + const bodyParts: { value: string; label: string }[] = Object.values(BodyPart) + .filter((v): v is BodyPart => typeof v === 'number') + .filter((v) => ASSIGNMENT_MODES['full-body'].includes(v as BodyPart)) + .map((value) => ({ + value: String(value), + label: l10n.getString(`body_part-${BodyPart[value]}`), + })); const blockHandsWarning = useRef(false); // If not null, warning will be shown, and showHandsWarning will // hold which hands should be toggled ([leftHand, rightHand]) @@ -305,6 +321,15 @@ export function GeneralSettings() { tapDetection.yawResetDelay = values.tapDetection.yawResetDelay; tapDetection.yawResetEnabled = values.tapDetection.yawResetEnabled; tapDetection.yawResetTaps = values.tapDetection.yawResetTaps; + tapDetection.yawResetTracker = Number(values.tapDetection.yawResetTracker); + console.log(tapDetection.yawResetTracker); + tapDetection.mountingResetTracker = Number( + values.tapDetection.mountingResetTracker + ); + console.log(tapDetection.mountingResetTracker); + tapDetection.fullResetTracker = Number( + values.tapDetection.fullResetTracker + ); tapDetection.mountingResetEnabled = values.tapDetection.mountingResetEnabled; tapDetection.mountingResetDelay = values.tapDetection.mountingResetDelay; @@ -416,6 +441,18 @@ export function GeneralSettings() { mountingResetTaps: settings.tapDetectionSettings.mountingResetTaps || defaultValues.tapDetection.mountingResetTaps, + yawResetTracker: String( + settings.tapDetectionSettings.yawResetTracker || + defaultValues.tapDetection.yawResetTracker + ), + fullResetTracker: String( + settings.tapDetectionSettings.fullResetTracker || + defaultValues.tapDetection.fullResetTracker + ), + mountingResetTracker: String( + settings.tapDetectionSettings.mountingResetTracker || + defaultValues.tapDetection.mountingResetTracker + ), numberTrackersOverThreshold: settings.tapDetectionSettings.numberTrackersOverThreshold || defaultValues.tapDetection.numberTrackersOverThreshold, @@ -1208,34 +1245,80 @@ export function GeneralSettings() { {l10n.getString('settings-general-gesture_control-description')} -