Add setting for step mounting

This commit is contained in:
Sapphire
2025-11-09 12:50:08 -06:00
committed by Butterscotch!
parent e5cf22c5b5
commit 9d325ffdf1
9 changed files with 72 additions and 51 deletions

View File

@@ -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.

View File

@@ -850,46 +850,64 @@ export function GeneralSettings() {
/>
</div>
<div className="flex flex-col pt-2">
<div className="flex flex-col pt-2 pb-2">
<Typography variant="section-title">
{l10n.getString('settings-general-fk_settings-reset_settings')}
</Typography>
</div>
<div className="flex flex-col pt-2 pb-3">
<div className="grid grid-cols-2 gap-2">
<div className="flex flex-col gap-2">
<Typography>
{l10n.getString(
'settings-general-fk_settings-reset_settings-reset_hmd_pitch-description'
)}
</Typography>
<CheckBox
variant="toggle"
outlined
control={control}
name="resetsSettings.resetHmdPitch"
label={l10n.getString(
'settings-general-fk_settings-reset_settings-reset_hmd_pitch'
)}
/>
</div>
<div className="flex flex-col gap-2 justify-end">
<Typography>
{l10n.getString(
'settings-general-fk_settings-leg_fk-reset_mounting_feet-description-v1'
)}
</Typography>
<CheckBox
variant="toggle"
outlined
control={control}
name="resetsSettings.resetMountingFeet"
label={l10n.getString(
'settings-general-fk_settings-leg_fk-reset_mounting_feet-v1'
)}
/>
</div>
</div>
<div className="grid sm:grid-cols-1 gap-3 pb-3">
<Typography>
{l10n.getString(
'settings-general-fk_settings-reset_settings-step_mounting-description'
)}
</Typography>
</div>
<div className="grid sm:grid-cols-1 gap-2 pb-3">
<CheckBox
variant="toggle"
outlined
control={control}
name="resetsSettings.stepMounting"
label={l10n.getString(
'settings-general-fk_settings-reset_settings-step_mounting'
)}
/>
</div>
<div className="grid sm:grid-cols-1 gap-3 pb-3">
<Typography>
{l10n.getString(
'settings-general-fk_settings-reset_settings-reset_hmd_pitch-description'
)}
</Typography>
</div>
<div className="grid sm:grid-cols-1 gap-3 pb-3">
<CheckBox
variant="toggle"
outlined
control={control}
name="resetsSettings.resetHmdPitch"
label={l10n.getString(
'settings-general-fk_settings-reset_settings-reset_hmd_pitch'
)}
/>
</div>
<div className="grid sm:grid-cols-1 gap-3 pb-3">
<Typography>
{l10n.getString(
'settings-general-fk_settings-leg_fk-reset_mounting_feet-description-v1'
)}
</Typography>
</div>
<div className="grid sm:grid-cols-1 gap-3 pb-3">
<CheckBox
variant="toggle"
outlined
control={control}
name="resetsSettings.resetMountingFeet"
label={l10n.getString(
'settings-general-fk_settings-leg_fk-reset_mounting_feet-v1'
)}
/>
</div>
<div>

View File

@@ -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;
}

View File

@@ -48,6 +48,7 @@ enum class MountingMethods(val id: Int) {
}
class ResetsConfig {
var stepMounting = false
// Always reset mounting for feet
var resetMountingFeet = false

View File

@@ -369,6 +369,7 @@ fun createArmsResetModeSettings(
resetsConfig.yawResetSmoothTime,
resetsConfig.saveMountingReset,
resetsConfig.resetHmdPitch,
resetsConfig.stepMounting,
)
fun createSettingsResponse(fbb: FlatBufferBuilder, server: VRServer): Int {

View File

@@ -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()
}

View File

@@ -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()

View File

@@ -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