From 9d325ffdf1df618407ae083c80f44af83a999178 Mon Sep 17 00:00:00 2001 From: Sapphire Date: Sun, 9 Nov 2025 12:50:08 -0600 Subject: [PATCH] Add setting for step mounting --- gui/public/i18n/en/translation.ftl | 2 + .../settings/pages/GeneralSettings.tsx | 90 +++++++++++-------- gui/src/hooks/reset-settings.ts | 3 + .../java/dev/slimevr/config/ResetsConfig.kt | 1 + .../rpc/settings/RPCSettingsBuilder.kt | 1 + .../rpc/settings/RPCSettingsHandler.kt | 1 + .../processor/skeleton/HumanSkeleton.kt | 4 +- .../tracking/trackers/TrackerResetsHandler.kt | 19 ++-- solarxr-protocol | 2 +- 9 files changed, 72 insertions(+), 51 deletions(-) diff --git a/gui/public/i18n/en/translation.ftl b/gui/public/i18n/en/translation.ftl index 7158573da..51725c55f 100644 --- a/gui/public/i18n/en/translation.ftl +++ b/gui/public/i18n/en/translation.ftl @@ -637,6 +637,8 @@ settings-general-fk_settings-arm_fk = Arm tracking settings-general-fk_settings-arm_fk-description = Force arms to be tracked from the headset (HMD) even if positional hand data is available. settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD settings-general-fk_settings-reset_settings = Reset settings +settings-general-fk_settings-reset_settings-step_mounting-description = Use step mounting method instead of ski pose. +settings-general-fk_settings-reset_settings-step_mounting = Step mounting settings-general-fk_settings-reset_settings-reset_hmd_pitch-description = Reset the HMD's pitch (vertical rotation) upon doing a full reset. Useful if wearing an HMD on the forehead for VTubing or mocap. Do not enable for VR. settings-general-fk_settings-reset_settings-reset_hmd_pitch = Reset HMD pitch settings-general-fk_settings-arm_fk-reset_mode-description = Change which arm pose is expected for mounting calibration. diff --git a/gui/src/components/settings/pages/GeneralSettings.tsx b/gui/src/components/settings/pages/GeneralSettings.tsx index 174601a93..ca25e98b3 100644 --- a/gui/src/components/settings/pages/GeneralSettings.tsx +++ b/gui/src/components/settings/pages/GeneralSettings.tsx @@ -850,46 +850,64 @@ export function GeneralSettings() { /> -
+
{l10n.getString('settings-general-fk_settings-reset_settings')}
-
-
-
- - {l10n.getString( - 'settings-general-fk_settings-reset_settings-reset_hmd_pitch-description' - )} - - -
-
- - {l10n.getString( - 'settings-general-fk_settings-leg_fk-reset_mounting_feet-description-v1' - )} - - -
-
+
+ + {l10n.getString( + 'settings-general-fk_settings-reset_settings-step_mounting-description' + )} + +
+
+ +
+
+ + {l10n.getString( + 'settings-general-fk_settings-reset_settings-reset_hmd_pitch-description' + )} + +
+
+ +
+
+ + {l10n.getString( + 'settings-general-fk_settings-leg_fk-reset_mounting_feet-description-v1' + )} + +
+
+
diff --git a/gui/src/hooks/reset-settings.ts b/gui/src/hooks/reset-settings.ts index 8b94e20fa..1a39d2dd8 100644 --- a/gui/src/hooks/reset-settings.ts +++ b/gui/src/hooks/reset-settings.ts @@ -14,6 +14,7 @@ export interface ResetSettingsForm { yawResetSmoothTime: number; saveMountingReset: boolean; resetHmdPitch: boolean; + stepMounting: boolean; } export const defaultResetSettings = { @@ -22,6 +23,7 @@ export const defaultResetSettings = { yawResetSmoothTime: 0.0, saveMountingReset: false, resetHmdPitch: false, + stepMounting: false, }; export function loadResetSettings(resetSettingsForm: ResetSettingsForm) { @@ -31,6 +33,7 @@ export function loadResetSettings(resetSettingsForm: ResetSettingsForm) { resetsSettings.yawResetSmoothTime = resetSettingsForm.yawResetSmoothTime; resetsSettings.saveMountingReset = resetSettingsForm.saveMountingReset; resetsSettings.resetHmdPitch = resetSettingsForm.resetHmdPitch; + resetsSettings.stepMounting = resetSettingsForm.stepMounting; return resetsSettings; } diff --git a/server/core/src/main/java/dev/slimevr/config/ResetsConfig.kt b/server/core/src/main/java/dev/slimevr/config/ResetsConfig.kt index 65cc761d8..84d89cf48 100644 --- a/server/core/src/main/java/dev/slimevr/config/ResetsConfig.kt +++ b/server/core/src/main/java/dev/slimevr/config/ResetsConfig.kt @@ -48,6 +48,7 @@ enum class MountingMethods(val id: Int) { } class ResetsConfig { + var stepMounting = false // Always reset mounting for feet var resetMountingFeet = false diff --git a/server/core/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.kt b/server/core/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.kt index a933bf193..2cb46baf6 100644 --- a/server/core/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.kt +++ b/server/core/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.kt @@ -369,6 +369,7 @@ fun createArmsResetModeSettings( resetsConfig.yawResetSmoothTime, resetsConfig.saveMountingReset, resetsConfig.resetHmdPitch, + resetsConfig.stepMounting, ) fun createSettingsResponse(fbb: FlatBufferBuilder, server: VRServer): Int { diff --git a/server/core/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.kt b/server/core/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.kt index 5f0453107..b01458888 100644 --- a/server/core/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.kt +++ b/server/core/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.kt @@ -332,6 +332,7 @@ class RPCSettingsHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI) { resetsConfig.saveMountingReset = req.resetsSettings().saveMountingReset() resetsConfig.yawResetSmoothTime = req.resetsSettings().yawResetSmoothTime() resetsConfig.resetHmdPitch = req.resetsSettings().resetHmdPitch() + resetsConfig.stepMounting = req.resetsSettings().stepMounting() resetsConfig.updateTrackersResetsSettings() } diff --git a/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.kt b/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.kt index 2680d0cec..2baef0bcd 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.kt +++ b/server/core/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.kt @@ -1627,7 +1627,7 @@ class HumanSkeleton( if (bodyParts.isEmpty() || bodyParts.contains(BodyPart.HEAD)) { // Only reset if head allowMounting or is computed but not HMD if (it.allowMounting || (it.isComputed && !it.isHmd)) { - it.resetsHandler.resetMountingAccel(referenceRotation) + it.resetsHandler.resetMounting(referenceRotation) } } referenceRotation = it.getRotation() @@ -1636,7 +1636,7 @@ class HumanSkeleton( for (tracker in trackersToReset) { // Only reset if tracker needsMounting if (tracker != null && tracker.allowMounting && (bodyParts.isEmpty() || bodyParts.contains(tracker.trackerPosition?.bodyPart))) { - tracker.resetsHandler.resetMountingAccel(referenceRotation) + tracker.resetsHandler.resetMounting(referenceRotation) } } legTweaks.resetBuffer() diff --git a/server/core/src/main/java/dev/slimevr/tracking/trackers/TrackerResetsHandler.kt b/server/core/src/main/java/dev/slimevr/tracking/trackers/TrackerResetsHandler.kt index fb9d2bc60..c75013ac5 100644 --- a/server/core/src/main/java/dev/slimevr/tracking/trackers/TrackerResetsHandler.kt +++ b/server/core/src/main/java/dev/slimevr/tracking/trackers/TrackerResetsHandler.kt @@ -39,6 +39,7 @@ class TrackerResetsHandler(val tracker: Tracker) { private var yawResetSmoothTime = 0.0f var saveMountingReset = false var resetHmdPitch = false + var stepMounting = false var allowDriftCompensation = false var lastResetQuaternion: Quaternion? = null @@ -164,6 +165,7 @@ class TrackerResetsHandler(val tracker: Tracker) { yawResetSmoothTime = config.yawResetSmoothTime saveMountingReset = config.saveMountingReset resetHmdPitch = config.resetHmdPitch + stepMounting = config.stepMounting } fun trySetMountingReset(quat: Quaternion) { @@ -392,18 +394,6 @@ class TrackerResetsHandler(val tracker: Tracker) { tracker.resetFilteringQuats(reference) } - fun resetMountingAccel(reference: Quaternion) { - if (tracker.trackerDataType == TrackerDataType.FLEX_RESISTANCE) { - tracker.trackerFlexHandler.resetMax() - tracker.resetFilteringQuats(reference) - return - } else if (tracker.trackerDataType == TrackerDataType.FLEX_ANGLE) { - return - } - - tracker.startMounting() - } - /** * Perform the math to align the tracker to go forward * and stores it in mountRotFix, and adjusts yawFix @@ -417,6 +407,11 @@ class TrackerResetsHandler(val tracker: Tracker) { return } + if (stepMounting) { + tracker.startMounting() + return + } + constraintFix = Quaternion.IDENTITY // Get the current calibrated rotation diff --git a/solarxr-protocol b/solarxr-protocol index fa2895b19..941f26205 160000 --- a/solarxr-protocol +++ b/solarxr-protocol @@ -1 +1 @@ -Subproject commit fa2895b19a53d9b1686de8c2a6efe2b3e9ca4fc6 +Subproject commit 941f262055876796bba76c88cb51b954fe3e40e8