diff --git a/gui/src/components/MainLayout.tsx b/gui/src/components/MainLayout.tsx
index 543cc03d3..47dadaac1 100644
--- a/gui/src/components/MainLayout.tsx
+++ b/gui/src/components/MainLayout.tsx
@@ -1,6 +1,8 @@
import classNames from 'classnames';
import { ReactNode, useEffect, useState } from 'react';
import {
+ LegTweaksTmpChangeT,
+ LegTweaksTmpClearT,
ResetType,
RpcMessage,
SettingsRequestT,
@@ -32,6 +34,7 @@ export function MainLayoutRoute({
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
const [driftCompensationEnabled, setDriftCompensationEnabled] =
useState(false);
+ const [ProportionsLastPageOpen, setProportionsLastPageOpen] = useState(true);
useEffect(() => {
sendRPCPacket(RpcMessage.SettingsRequest, new SettingsRequestT());
@@ -42,6 +45,33 @@ export function MainLayoutRoute({
setDriftCompensationEnabled(settings.driftCompensation.enabled);
});
+ function usePageChanged(callback: () => void) {
+ useEffect(() => {
+ callback();
+ }, [location.pathname]);
+ }
+
+ usePageChanged(() => {
+ if (location.pathname.includes('body-proportions')) {
+ const tempSettings = new LegTweaksTmpChangeT();
+ tempSettings.skatingCorrection = false;
+ tempSettings.floorClip = false;
+ tempSettings.toeSnap = false;
+ tempSettings.footPlant = false;
+
+ sendRPCPacket(RpcMessage.LegTweaksTmpChange, tempSettings);
+ } else if (ProportionsLastPageOpen) {
+ const resetSettings = new LegTweaksTmpClearT();
+ resetSettings.skatingCorrection = true;
+ resetSettings.floorClip = true;
+ resetSettings.toeSnap = true;
+ resetSettings.footPlant = true;
+
+ sendRPCPacket(RpcMessage.LegTweaksTmpClear, resetSettings);
+ }
+ setProportionsLastPageOpen(location.pathname.includes('body-proportions'));
+ });
+
return (
<>
diff --git a/gui/src/components/settings/pages/GeneralSettings.tsx b/gui/src/components/settings/pages/GeneralSettings.tsx
index 5c8ebdfed..69f779880 100644
--- a/gui/src/components/settings/pages/GeneralSettings.tsx
+++ b/gui/src/components/settings/pages/GeneralSettings.tsx
@@ -159,7 +159,6 @@ export function GeneralSettings() {
const modelSettings = new ModelSettingsT();
const toggles = new ModelTogglesT();
- const legTweaks = new LegTweaksSettingsT();
toggles.floorClip = values.toggles.floorClip;
toggles.skatingCorrection = values.toggles.skatingCorrection;
toggles.extendedKnee = values.toggles.extendedKnee;
@@ -169,6 +168,8 @@ export function GeneralSettings() {
toggles.viveEmulation = values.toggles.viveEmulation;
toggles.toeSnap = values.toggles.toeSnap;
toggles.footPlant = values.toggles.footPlant;
+
+ const legTweaks = new LegTweaksSettingsT();
legTweaks.correctionStrength = values.legTweaks.correctionStrength;
modelSettings.toggles = toggles;
diff --git a/package-lock.json b/package-lock.json
index 0bd711c9b..fb4eeb417 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9325,9 +9325,9 @@
}
},
"node_modules/webpack": {
- "version": "5.75.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz",
- "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==",
+ "version": "5.76.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
+ "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@@ -15881,9 +15881,9 @@
}
},
"webpack": {
- "version": "5.75.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz",
- "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==",
+ "version": "5.76.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
+ "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"peer": true,
"requires": {
"@types/eslint-scope": "^3.7.3",
diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java b/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java
index 65596cf36..aa29b0af1 100644
--- a/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java
+++ b/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java
@@ -78,6 +78,10 @@ public class RPCHandler extends ProtocolHandler
registerPacketListener(RpcMessage.ServerInfosRequest, this::onServerInfosRequest);
+ registerPacketListener(RpcMessage.LegTweaksTmpChange, this::onLegTweaksTmpChange);
+
+ registerPacketListener(RpcMessage.LegTweaksTmpClear, this::onLegTweaksTmpClear);
+
this.api.server.getAutoBoneHandler().addListener(this);
}
@@ -259,6 +263,43 @@ public class RPCHandler extends ProtocolHandler
this.api.server.clearTrackersDriftCompensation();
}
+ public void onLegTweaksTmpChange(
+ GenericConnection conn,
+ RpcMessageHeader messageHeader
+ ) {
+ LegTweaksTmpChange req = (LegTweaksTmpChange) messageHeader
+ .message(new LegTweaksTmpChange());
+ if (req == null)
+ return;
+
+ this.api.server.humanPoseManager
+ .setLegTweaksStateTemp(
+ req.skatingCorrection(),
+ req.floorClip(),
+ req.toeSnap(),
+ req.footPlant()
+ );
+ }
+
+ public void onLegTweaksTmpClear(
+ GenericConnection conn,
+ RpcMessageHeader messageHeader
+ ) {
+ LegTweaksTmpClear req = (LegTweaksTmpClear) messageHeader
+ .message(new LegTweaksTmpClear());
+ if (req == null)
+ return;
+
+ this.api.server.humanPoseManager
+ .clearLegTweaksStateTemp(
+ req.skatingCorrection(),
+ req.floorClip(),
+ req.toeSnap(),
+ req.footPlant()
+ );
+
+ }
+
@Override
public void onMessage(GenericConnection conn, RpcMessageHeader message) {
BiConsumer consumer = this.handlers[message
diff --git a/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java b/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java
index 042781e05..ab0bd2a2a 100644
--- a/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java
+++ b/server/src/main/java/dev/slimevr/tracking/processor/HumanPoseManager.java
@@ -601,6 +601,26 @@ public class HumanPoseManager {
}
}
+ public void setLegTweaksStateTemp(
+ boolean skatingCorrection,
+ boolean floorClip,
+ boolean toeSnap,
+ boolean footPlant
+ ) {
+ if (isSkeletonPresent())
+ skeleton.setLegTweaksStateTemp(skatingCorrection, floorClip, toeSnap, footPlant);
+ }
+
+ public void clearLegTweaksStateTemp(
+ boolean skatingCorrection,
+ boolean floorClip,
+ boolean toeSnap,
+ boolean footPlant
+ ) {
+ if (isSkeletonPresent())
+ skeleton.clearLegTweaksStateTemp(skatingCorrection, floorClip, toeSnap, footPlant);
+ }
+
public void updateTapDetectionConfig() {
if (isSkeletonPresent())
skeleton.updateTapDetectionConfig();
diff --git a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java
index 71ccf7727..1b4139322 100644
--- a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java
+++ b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java
@@ -1240,8 +1240,8 @@ public class HumanSkeleton {
case SKATING_CORRECTION -> legTweaks.setSkatingReductionEnabled(newValue);
case FLOOR_CLIP -> legTweaks.setFloorclipEnabled(newValue);
case VIVE_EMULATION -> viveEmulation.setEnabled(newValue);
- case TOE_SNAP -> legTweaks.setToeSnap(newValue);
- case FOOT_PLANT -> legTweaks.setFootPlant(newValue);
+ case TOE_SNAP -> legTweaks.setToeSnapEnabled(newValue);
+ case FOOT_PLANT -> legTweaks.setFootPlantEnabled(newValue);
}
}
@@ -1710,10 +1710,50 @@ public class HumanSkeleton {
legTweaks.updateConfig();
}
+ // does not save to config
+ public void setLegTweaksStateTemp(
+ boolean skatingCorrection,
+ boolean floorClip,
+ boolean toeSnap,
+ boolean footPlant
+ ) {
+ this.legTweaks.setSkatingReductionEnabled(skatingCorrection);
+ this.legTweaks.setFloorclipEnabled(floorClip);
+ this.legTweaks.setToeSnapEnabled(toeSnap);
+ this.legTweaks.setFootPlantEnabled(footPlant);
+ }
+
+ // resets to config values
+ public void clearLegTweaksStateTemp(
+ boolean skatingCorrection,
+ boolean floorClip,
+ boolean toeSnap,
+ boolean footPlant
+ ) {
+ // only reset the true values as they are a mask for what to reset
+ if (skatingCorrection)
+ this.legTweaks
+ .setSkatingReductionEnabled(
+ humanPoseManager.getToggle(SkeletonConfigToggles.SKATING_CORRECTION)
+ );
+ if (floorClip)
+ this.legTweaks
+ .setFloorclipEnabled(humanPoseManager.getToggle(SkeletonConfigToggles.FLOOR_CLIP));
+ if (toeSnap)
+ this.legTweaks
+ .setToeSnapEnabled(humanPoseManager.getToggle(SkeletonConfigToggles.TOE_SNAP));
+ if (footPlant)
+ this.legTweaks
+ .setFootPlantEnabled(humanPoseManager.getToggle(SkeletonConfigToggles.FOOT_PLANT));
+ }
+
public boolean[] getLegTweaksState() {
- boolean[] state = new boolean[2];
+ boolean[] state = new boolean[4];
state[0] = this.legTweaks.getFloorclipEnabled();
state[1] = this.legTweaks.getSkatingReductionEnabled();
+ state[2] = this.legTweaks.getToeSnapEnabled();
+ state[3] = this.legTweaks.getFootPlantEnabled();
+
return state;
}
diff --git a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/LegTweaks.java b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/LegTweaks.java
index 591776fe9..c2459e3ad 100644
--- a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/LegTweaks.java
+++ b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/LegTweaks.java
@@ -77,8 +77,8 @@ public class LegTweaks {
private boolean enabled = true; // master switch
private boolean floorclipEnabled = false;
private boolean skatingCorrectionEnabled = false;
- private boolean toeSnap = false;
- private boolean footPlant = false;
+ private boolean toeSnapEnabled = false;
+ private boolean footPlantEnabled = false;
private boolean active = false;
private boolean rightLegActive = false;
private boolean leftLegActive = false;
@@ -213,12 +213,12 @@ public class LegTweaks {
this.bufferInvalid = true;
}
- public void setToeSnap(boolean val) {
- this.toeSnap = val;
+ public void setToeSnapEnabled(boolean val) {
+ this.toeSnapEnabled = val;
}
- public void setFootPlant(boolean val) {
- this.footPlant = val;
+ public void setFootPlantEnabled(boolean val) {
+ this.footPlantEnabled = val;
}
public boolean getEnabled() {
@@ -233,12 +233,12 @@ public class LegTweaks {
return this.skatingCorrectionEnabled;
}
- public boolean getToeSnap() {
- return this.toeSnap;
+ public boolean getToeSnapEnabled() {
+ return this.toeSnapEnabled;
}
- public boolean getFootPlant() {
- return this.footPlant;
+ public boolean getFootPlantEnabled() {
+ return this.footPlantEnabled;
}
public void resetBuffer() {
@@ -256,8 +256,8 @@ public class LegTweaks {
floorclipEnabled = skeleton.humanPoseManager.getToggle(SkeletonConfigToggles.FLOOR_CLIP);
skatingCorrectionEnabled = skeleton.humanPoseManager
.getToggle(SkeletonConfigToggles.SKATING_CORRECTION);
- toeSnap = skeleton.humanPoseManager.getToggle(SkeletonConfigToggles.TOE_SNAP);
- footPlant = skeleton.humanPoseManager.getToggle(SkeletonConfigToggles.FOOT_PLANT);
+ toeSnapEnabled = skeleton.humanPoseManager.getToggle(SkeletonConfigToggles.TOE_SNAP);
+ footPlantEnabled = skeleton.humanPoseManager.getToggle(SkeletonConfigToggles.FOOT_PLANT);
}
// update the hyperparameters with the config
@@ -344,8 +344,10 @@ public class LegTweaks {
footLength = skeleton.leftFootNode.localTransform.getTranslation().length();
// if not enabled, do nothing and return false
- if (!enabled)
+ if (!enabled) {
+ bufferInvalid = true;
return false;
+ }
// if the user is standing start checking for a good time to enable leg
// tweaks
@@ -778,7 +780,7 @@ public class LegTweaks {
float masterWeightR = getMasterWeight(kneeAngleR);
// corrects rotations when planted firmly on the ground
- if (footPlant) {
+ if (footPlantEnabled) {
// prepare the weight vars for this correction step
float weightL = 0.0f;
float weightR = 0.0f;
@@ -812,7 +814,7 @@ public class LegTweaks {
// corrects rotations when the foot is in the air by rotating the foot
// down so that the toes are touching
- if (toeSnap) {
+ if (toeSnapEnabled) {
// this correction step has its own weight vars
float weightL = 0.0f;
float weightR = 0.0f;
diff --git a/solarxr-protocol b/solarxr-protocol
index 2019d5b43..7fed7a87c 160000
--- a/solarxr-protocol
+++ b/solarxr-protocol
@@ -1 +1 @@
-Subproject commit 2019d5b43bd8afb086ce11dcfebaf96bfaa96666
+Subproject commit 7fed7a87c585d7f00899d29069bc6fec83892582