Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
2dad83e
Added toe entries.
Sebane1 Oct 8, 2025
e03b6d1
Add toe handling to GUI
Sebane1 Oct 9, 2025
98016d7
Properly reference toe trackers.
Sebane1 Oct 9, 2025
119c8dc
Add toesOSCHandler, and add it to VRServer
Sebane1 Oct 11, 2025
aea859c
Ensure correct config is passed in. Using config from VrcOscHandler
Sebane1 Oct 11, 2025
4e419dd
Actually requests updates to happen. Fix an issue with axis and inver…
Sebane1 Oct 11, 2025
75b80dc
Switch from computed trackers to bones for rotation.
Sebane1 Oct 11, 2025
cf61715
Fix manual mounting menu for toe entries.
Sebane1 Oct 12, 2025
271eafd
Both feet behave the same now, but math not quite mathing.
Sebane1 Oct 12, 2025
4c02fcf
Add offset for pitch angle.
Sebane1 Oct 13, 2025
3475576
Name Refactor, and correct math that doesnt make sense.
Sebane1 Oct 21, 2025
98e5644
Add toe UI entry
Sebane1 Oct 21, 2025
636cac9
Add toe parameter to UI, update flatbuffers.
Sebane1 Oct 21, 2025
3689ed2
Refactor datatypes and variables for toes to match toe muscle naming.
Sebane1 Oct 21, 2025
fa2c1e9
Add missing tracker roles
Sebane1 Oct 21, 2025
6b64617
Fix naming assignments for assigning body parts to trackers.
Sebane1 Oct 22, 2025
4f15c88
Update translations to include toes.
Sebane1 Oct 22, 2025
8836df4
Add translation for general toes.
Sebane1 Oct 22, 2025
8462f41
Get tracker assignment working. Basic skeleton rendering for toes.
Sebane1 Oct 22, 2025
7c47aff
Find decent enough offsets for displaying toes.
Sebane1 Oct 22, 2025
3690a0a
I dont think we actually need to null check these. Next function reli…
Sebane1 Oct 22, 2025
e2796ce
Remove X axis offset from toes, it interfered with other calculations.
Sebane1 Oct 22, 2025
a4b7158
Remove 90 degree offset for OSC calculation. It is no longer needed a…
Sebane1 Oct 22, 2025
ba597b5
Adjust syntax used in RelaxedPose.kt
Sebane1 Oct 24, 2025
fda513b
Fix an issue where pinky toe was not getting full reset.
Sebane1 Nov 6, 2025
81f82c3
Added toe splay.
Sebane1 Nov 8, 2025
53f4e85
Fix broken script after rebase.
Sebane1 Nov 24, 2025
25b8ab8
Fix broken script after rebase.
Sebane1 Nov 24, 2025
a89d332
Revert "Fix broken script after rebase."
Sebane1 Nov 24, 2025
85da7a3
Add missing toe translations for onboarding warnings
Sebane1 Nov 24, 2025
60ea39c
Adjust toe translations.
Sebane1 Nov 25, 2025
2f99e6f
Add toe mounting reset tap.
Sebane1 Dec 3, 2025
2b00b56
Adjust accuracy of toe bending. Adjusted Leg Tweaks to take toes into…
Sebane1 Dec 8, 2025
e0f7152
Update server/core/src/main/java/dev/slimevr/tracking/processor/skele…
Sebane1 Dec 3, 2025
9fa659f
Re-add toe mounting reset tracker to replaced java replacing kt file.
Sebane1 Dec 11, 2025
333f500
Fix GUI code broken by rebase.
Sebane1 Dec 11, 2025
905e3d4
Make sure toes are getting the same offset as feet.
Sebane1 Dec 13, 2025
6a86ad7
Remove offset change for toes. Does not resolve issue.
Sebane1 Dec 13, 2025
d88ace3
Fix an issue where rebase regression caused toe tracker mounting to n…
Sebane1 Dec 14, 2025
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
35 changes: 33 additions & 2 deletions gui/public/i18n/en/translation.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,15 @@ body_part-RIGHT_RING_INTERMEDIATE = Right ring intermediate
body_part-RIGHT_RING_DISTAL = Right ring distal
body_part-RIGHT_LITTLE_PROXIMAL = Right little proximal
body_part-RIGHT_LITTLE_INTERMEDIATE = Right little intermediate
body_part-RIGHT_LITTLE_DISTAL = Right little distal
body_part-RIGHT_LITTLE_DISTAL = Right little
body_part-LEFT_TOES = Left Toes
body_part-LEFT_TOES_ABDUCTOR_HALLUCIS = Left Big Toe
body_part-LEFT_TOES_DIGITORUM_BREVIS = Left Middle Toes
body_part-LEFT_TOES_ABDUCTOR_DIGITI_MINIMI = Left Pinky
body_part-RIGHT_TOES = Right Toes
body_part-RIGHT_TOES_ABDUCTOR_HALLUCIS = Right Big Toe
body_part-RIGHT_TOES_DIGITORUM_BREVIS = Right Middle Toes
body_part-RIGHT_TOES_ABDUCTOR_DIGITI_MINIMI = Right Pinky

## BoardType
board_type-UNKNOWN = Unknown
Expand Down Expand Up @@ -833,6 +841,7 @@ settings-osc-vrchat-network-trackers-hip = Hip
settings-osc-vrchat-network-trackers-knees = Knees
settings-osc-vrchat-network-trackers-feet = Feet
settings-osc-vrchat-network-trackers-elbows = Elbows
settings-osc-vrchat-network-trackers-toes = Toes

## VMC OSC settings
settings-osc-vmc = Virtual Motion Capture
Expand Down Expand Up @@ -1126,7 +1135,29 @@ onboarding-assign_trackers-warning-WAIST = Waist is assigned but you need { $una
[0] the chest
*[unknown] Unknown unassigned body part
} to also be assigned!

onboarding-assign_trackers-warning-LEFT_TOES_ABDUCTOR_HALLUCIS = Left Big Toe is assigned but you need { $unassigned ->
[0] the left foot
*[unknown] Unknown unassigned body part
} to also be assigned!
onboarding-assign_trackers-warning-LEFT_TOES_DIGITORUM_BREVIS = Left Middle Toes are assigned but you need { $unassigned ->
[0] the left foot
*[unknown] Unknown unassigned body part
} to also be assigned!
onboarding-assign_trackers-warning-LEFT_TOES_ABDUCTOR_DIGITI_MINIMI = Left Pinky Toe is assigned but you need { $unassigned ->
[0] the left foot
*[unknown] Unknown unassigned body part} to also be assigned!
onboarding-assign_trackers-warning-RIGHT_TOES_ABDUCTOR_HALLUCIS = Right Big Toe is assigned but you need { $unassigned ->
[0] the right foot
*[unknown] Unknown unassigned body part
} to also be assigned!
onboarding-assign_trackers-warning-RIGHT_TOES_DIGITORUM_BREVIS = Right Middle Toes are assigned but you need { $unassigned ->
[0] the right foot
*[unknown] Unknown unassigned body part
} to also be assigned!
onboarding-assign_trackers-warning-RIGHT_TOES_ABDUCTOR_DIGITI_MINIMI = Right Pinky Toe is assigned but you need { $unassigned ->
[0] the right foot
*[unknown] Unknown unassigned body part
} to also be assigned!
## Tracker mounting method choose
onboarding-choose_mounting = What mounting calibration method to use?
# Multiline text
Expand Down
104 changes: 40 additions & 64 deletions gui/src/components/commons/BodyPartIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,7 @@ export const mapPart: Record<
[BodyPart.HIP]: ({ width }) => <HipIcon width={width} />,
[BodyPart.LEFT_HIP]: ({ width }) => <HipIcon width={width} />, // Unused
[BodyPart.RIGHT_HIP]: ({ width }) => <HipIcon width={width} />, // Unused
[BodyPart.LEFT_FOOT]: ({ width, currentLocales }) =>
currentLocales.includes('en-x-owo') ? (
<PawIcon />
) : (
<FootIcon width={width} />
),
[BodyPart.LEFT_FOOT]: renderFootLeft,
[BodyPart.LEFT_HAND]: ({ width }) => <ControllerIcon width={width} />,
[BodyPart.LEFT_LOWER_ARM]: ({ width }) => <LowerArmIcon width={width} />,
[BodyPart.LEFT_LOWER_LEG]: ({ width }) => <AnkleIcon width={width} />,
Expand All @@ -48,85 +43,66 @@ export const mapPart: Record<
[BodyPart.LEFT_UPPER_LEG]: ({ width }) => <UpperLegIcon width={width} />,
[BodyPart.NECK]: ({ width }) => <NeckIcon width={width} />,
[BodyPart.NONE]: ({ width }) => <SlimeVRIcon width={width} />,
[BodyPart.RIGHT_FOOT]: ({ width, currentLocales }) =>
currentLocales.includes('en-x-owo') ? (
<PawIcon />
) : (
<FootIcon width={width} flipped />
),
[BodyPart.RIGHT_HAND]: ({ width }) => (
<ControllerIcon width={width} flipped />
),
[BodyPart.RIGHT_LOWER_ARM]: ({ width }) => (
<LowerArmIcon width={width} flipped />
),
[BodyPart.RIGHT_LOWER_LEG]: ({ width }) => (
<AnkleIcon width={width} flipped />
),
[BodyPart.RIGHT_FOOT]: renderFootRight,
[BodyPart.RIGHT_HAND]: ({ width }) => <ControllerIcon width={width} flipped />,
[BodyPart.RIGHT_LOWER_ARM]: ({ width }) => <LowerArmIcon width={width} flipped />,
[BodyPart.RIGHT_LOWER_LEG]: ({ width }) => <AnkleIcon width={width} flipped />,
[BodyPart.RIGHT_SHOULDER]: ({ width }) => <ShoulderIcon width={width} />,
[BodyPart.RIGHT_UPPER_ARM]: ({ width }) => (
<UpperArmIcon width={width} flipped />
),
[BodyPart.RIGHT_UPPER_LEG]: ({ width }) => (
<UpperLegIcon width={width} flipped />
),
[BodyPart.RIGHT_UPPER_ARM]: ({ width }) => <UpperArmIcon width={width} flipped />,
[BodyPart.RIGHT_UPPER_LEG]: ({ width }) => <UpperLegIcon width={width} flipped />,
[BodyPart.WAIST]: ({ width }) => <WaistIcon width={width} />,
[BodyPart.LEFT_THUMB_METACARPAL]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.LEFT_THUMB_METACARPAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_THUMB_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_THUMB_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_INDEX_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_INDEX_INTERMEDIATE]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.LEFT_INDEX_INTERMEDIATE]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_INDEX_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_MIDDLE_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_MIDDLE_INTERMEDIATE]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.LEFT_MIDDLE_INTERMEDIATE]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_MIDDLE_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_RING_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_RING_INTERMEDIATE]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.LEFT_RING_INTERMEDIATE]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_RING_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_LITTLE_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_LITTLE_INTERMEDIATE]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.LEFT_LITTLE_INTERMEDIATE]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.LEFT_LITTLE_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_THUMB_METACARPAL]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.RIGHT_THUMB_METACARPAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_THUMB_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_THUMB_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_INDEX_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_INDEX_INTERMEDIATE]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.RIGHT_INDEX_INTERMEDIATE]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_INDEX_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_MIDDLE_PROXIMAL]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.RIGHT_MIDDLE_INTERMEDIATE]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.RIGHT_MIDDLE_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_MIDDLE_INTERMEDIATE]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_MIDDLE_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_RING_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_RING_INTERMEDIATE]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.RIGHT_RING_INTERMEDIATE]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_RING_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_LITTLE_PROXIMAL]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.RIGHT_LITTLE_INTERMEDIATE]: ({ width }) => (
<FingersIcon width={width} />
),
[BodyPart.RIGHT_LITTLE_DISTAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_LITTLE_PROXIMAL]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_LITTLE_INTERMEDIATE]: ({ width }) => <FingersIcon width={width} />,
[BodyPart.RIGHT_LITTLE_DISTAL]: ({ width }) => <FingersIcon width={width}></FingersIcon>,
[BodyPart.LEFT_TOES_ABDUCTOR_HALLUCIS]: renderFootLeft,
[BodyPart.LEFT_TOES_DIGITORUM_BREVIS]: renderFootLeft,
[BodyPart.LEFT_TOES_ABDUCTOR_DIGITI_MINIMI]: renderFootLeft,
[BodyPart.RIGHT_TOES_ABDUCTOR_HALLUCIS]: renderFootRight,
[BodyPart.RIGHT_TOES_DIGITORUM_BREVIS]: renderFootRight,
[BodyPart.RIGHT_TOES_ABDUCTOR_DIGITI_MINIMI]: renderFootRight,
};

function renderFootLeft({ width, currentLocales }) {
if (currentLocales.includes('en-x-owo')) {
return <PawIcon />;
}
return <FootIcon width={width} />;
}

function renderFootRight({ width, currentLocales }) {
if (currentLocales.includes('en-x-owo')) {
return <PawIcon />;
}
return <FootIcon width={width} flipped />;
}

export function BodyPartIcon({
bodyPart = BodyPart.NONE,
width = 24,
Expand Down
56 changes: 56 additions & 0 deletions gui/src/components/commons/PersonFrontIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ export const SIDES = [
upperLeg: BodyPart.LEFT_UPPER_LEG,
lowerLeg: BodyPart.LEFT_LOWER_LEG,
foot: BodyPart.LEFT_FOOT,
toesAbductorHallucis: BodyPart.LEFT_TOES_ABDUCTOR_HALLUCIS,
toesDigitorumBrevis: BodyPart.LEFT_TOES_DIGITORUM_BREVIS,
toesAbductorDigitiMinimi: BodyPart.LEFT_TOES_ABDUCTOR_DIGITI_MINIMI,
},
{
shoulder: BodyPart.RIGHT_SHOULDER,
Expand All @@ -18,6 +21,9 @@ export const SIDES = [
upperLeg: BodyPart.RIGHT_UPPER_LEG,
lowerLeg: BodyPart.RIGHT_LOWER_LEG,
foot: BodyPart.RIGHT_FOOT,
toesAbductorHallucis: BodyPart.RIGHT_TOES_ABDUCTOR_HALLUCIS,
toesDigitorumBrevis: BodyPart.RIGHT_TOES_DIGITORUM_BREVIS,
toesAbductorDigitiMinimi: BodyPart.RIGHT_TOES_ABDUCTOR_DIGITI_MINIMI,
},
];

Expand Down Expand Up @@ -121,6 +127,28 @@ export function PersonFrontIcon({ mirror = true }: { mirror?: boolean }) {
id={BodyPart[SIDES[right].foot]}
/>

<circle
className="body-part-circle"
cx="90"
cy="395"
r={CIRCLE_RADIUS}
id={BodyPart[SIDES[right].toesAbductorHallucis]}
/>
<circle
className="body-part-circle"
cx="102"
cy="395"
r={CIRCLE_RADIUS}
id={BodyPart[SIDES[right].toesDigitorumBrevis]}
/>
<circle
className="body-part-circle"
cx="114"
cy="395"
r={CIRCLE_RADIUS}
id={BodyPart[SIDES[right].toesAbductorDigitiMinimi]}
/>

<circle
className="body-part-circle"
cx="15"
Expand Down Expand Up @@ -172,6 +200,34 @@ export function PersonFrontIcon({ mirror = true }: { mirror?: boolean }) {
r={CIRCLE_RADIUS}
id={BodyPart[SIDES[left].foot]}
/>
<circle
className="body-part-circle"
cx="75"
cy="410"
r={CIRCLE_RADIUS}
id="left-toes"
/>
<circle
className="body-part-circle"
cx="75"
cy="395"
r={CIRCLE_RADIUS}
id={BodyPart[SIDES[left].toesAbductorHallucis]}
/>
<circle
className="body-part-circle"
cx="62"
cy="395"
r={CIRCLE_RADIUS}
id={BodyPart[SIDES[left].toesDigitorumBrevis]}
/>
<circle
className="body-part-circle"
cx="50"
cy="395"
r={CIRCLE_RADIUS}
id={BodyPart[SIDES[left].toesAbductorDigitiMinimi]}
/>
</svg>
);
}
Loading