Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions gui/public/i18n/en/translation.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -524,8 +524,10 @@ settings-general-steamvr-trackers-right_hand = Right hand
settings-general-steamvr-trackers-tracker_toggling = Automatic tracker assignment
settings-general-steamvr-trackers-tracker_toggling-description = Automatically handles toggling SteamVR trackers on or off depending on your current tracker assignments.
settings-general-steamvr-trackers-tracker_toggling-label = Automatic tracker assignment
settings-general-steamvr-trackers-hands-warning = <b>Warning:</b> hand trackers will override your controllers.
Are you sure?
settings-general-steamvr-trackers-hands-warning = <b>Warning:</b> Enabling the SteamVR hand trackers will disable inputs from real controllers.
This should only be enabled if you are using SlimeVR for hand tracking.

Are you sure you want to do this?
settings-general-steamvr-trackers-hands-warning-cancel = Cancel
settings-general-steamvr-trackers-hands-warning-done = Yes

Expand Down Expand Up @@ -1645,6 +1647,9 @@ tracking_checklist-FULL_RESET-desc = Some trackers need a reset to be performed.
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR not running
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR is not running. Are you using it for VR?
tracking_checklist-STEAMVR_DISCONNECTED-open = Launch SteamVR
tracking_checklist-STEAMVR_HANDS_ENABLED = Hand trackers toggled on
tracking_checklist-STEAMVR_HANDS_ENABLED-desc = You have enabled the SteamVR virtual hand trackers. This will cause button inputs to not work in SteamVR and in games.
tracking_checklist-STEAMVR_HANDS_ENABLED-go = Disable them
tracking_checklist-TRACKERS_REST_CALIBRATION = Calibrate your trackers
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = You didn't perform tracker calibration. Please let your trackers (highlighted in yellow) rest on a stable surface for a few seconds.
tracking_checklist-TRACKER_ERROR = Trackers with Errors
Expand Down
58 changes: 58 additions & 0 deletions gui/src/components/tracking-checklist/TrackingChecklist.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@ import {
} from '@/hooks/tracking-checklist';
import classNames from 'classnames';
import {
ChangeSettingsRequestT,
ResetType,
RpcMessage,
SettingsRequestT,
SettingsResponseT,
SteamVRTrackersSettingT,
TrackingChecklistPublicNetworksT,
TrackingChecklistStepId,
} from 'solarxr-protocol';
Expand All @@ -29,6 +34,7 @@ import { TrackingChecklistModal } from './TrackingChecklistModal';
import { NavLink, useNavigate } from 'react-router-dom';
import { useBreakpoint } from '@/hooks/breakpoint';
import { openUrl } from '@/hooks/crossplatform';
import { useWebsocketAPI } from '@/hooks/websocket-api';

function Step({
step: { status, id, optional, firstRequired },
Expand Down Expand Up @@ -102,6 +108,55 @@ function Step({
);
}

function SteamVRHandsEnabled() {
const { sendRPCPacket, useRPCPacket } = useWebsocketAPI();
const [steamVrTrackers, setSteamVrTrackers] = useState<Omit<
SteamVRTrackersSettingT,
'pack'
> | null>(null);

useEffect(() => {
sendRPCPacket(RpcMessage.SettingsRequest, new SettingsRequestT());
}, []);

useRPCPacket(RpcMessage.SettingsResponse, (settings: SettingsResponseT) => {
if (settings.steamVrTrackers) {
setSteamVrTrackers(settings.steamVrTrackers);
}
});

const disableHandTrackers = () => {
const settings = new ChangeSettingsRequestT();
settings.steamVrTrackers = new SteamVRTrackersSettingT(
steamVrTrackers?.waist,
steamVrTrackers?.chest,
steamVrTrackers?.automaticTrackerToggle,
steamVrTrackers?.leftFoot,
steamVrTrackers?.rightFoot,
steamVrTrackers?.leftKnee,
steamVrTrackers?.rightKnee,
steamVrTrackers?.leftElbow,
steamVrTrackers?.rightElbow,
false,
false
);
sendRPCPacket(RpcMessage.ChangeSettingsRequest, settings);
};

return (
<div className="space-y-2.5">
<Typography id="tracking_checklist-STEAMVR_HANDS_ENABLED-desc" />
<div className="flex">
<Button
id="tracking_checklist-STEAMVR_HANDS_ENABLED-go"
variant="primary"
onClick={disableHandTrackers}
/>
</div>
</div>
);
}

const stepContentLookup: Record<
number,
(
Expand Down Expand Up @@ -352,6 +407,9 @@ const stepContentLookup: Record<
</>
);
},
[TrackingChecklistStepId.STEAMVR_HANDS_ENABLED]: () => {
return <SteamVRHandsEnabled />;
},
};

export function TrackingChecklistMobile() {
Expand Down
2 changes: 2 additions & 0 deletions gui/src/hooks/tracking-checklist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ export const trackingchecklistIdtoLabel: Record<TrackingChecklistStepId, string>
'tracking_checklist-FEET_MOUNTING_CALIBRATION',
[TrackingChecklistStepId.STAY_ALIGNED_CONFIGURED]:
'tracking_checklist-STAY_ALIGNED_CONFIGURED',
[TrackingChecklistStepId.STEAMVR_HANDS_ENABLED]:
'tracking_checklist-STEAMVR_HANDS_ENABLED',
};

export type TrackingChecklistStepStatus =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import dev.slimevr.games.vrchat.VRCConfigRecommendedValues
import dev.slimevr.games.vrchat.VRCConfigValidity
import dev.slimevr.games.vrchat.VRCConfigValues
import dev.slimevr.tracking.trackers.Tracker
import dev.slimevr.tracking.trackers.TrackerPosition
import dev.slimevr.tracking.trackers.TrackerRole
import dev.slimevr.tracking.trackers.TrackerStatus
import dev.slimevr.tracking.trackers.TrackerUtils
import dev.slimevr.tracking.trackers.udp.TrackerDataType
Expand Down Expand Up @@ -86,6 +88,16 @@ class TrackingChecklistManager(private val vrServer: VRServer) : VRCConfigListen
},
)

steps.add(
TrackingChecklistStepT().apply {
id = TrackingChecklistStepId.STEAMVR_HANDS_ENABLED
enabled = false
optional = false
ignorable = false
visibility = TrackingChecklistStepVisibility.WHEN_INVALID
},
)

steps.add(
TrackingChecklistStepT().apply {
id = TrackingChecklistStepId.TRACKER_ERROR
Expand Down Expand Up @@ -280,6 +292,17 @@ class TrackingChecklistManager(private val vrServer: VRServer) : VRCConfigListen
it.extraData = null
}
}

val handsEnabled = steamVRBridge.getShareSetting(TrackerRole.LEFT_HAND) || steamVRBridge.getShareSetting(TrackerRole.RIGHT_HAND)
val hasControllers = vrServer.allTrackers.any {
(it.trackerPosition == TrackerPosition.LEFT_HAND || it.trackerPosition == TrackerPosition.RIGHT_HAND) && it.isComputed && !it.isInternal
}
val hasHandTrackers = vrServer.allTrackers.any {
(it.trackerPosition == TrackerPosition.LEFT_HAND || it.trackerPosition == TrackerPosition.RIGHT_HAND) && !it.isComputed
}
updateValidity(TrackingChecklistStepId.STEAMVR_HANDS_ENABLED, !steamvrConnected || !handsEnabled || (!hasControllers && hasHandTrackers)) {
it.enabled = true
}
}

if (vrServer.networkProfileChecker.isSupported) {
Expand Down
Loading