Hands-only player model: Valve vr_glove, arms/body disabled #22
Loading…
Reference in a new issue
No description provided.
Delete branch "muse-lantern/da-game:hands-only"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Hands-only pivot (Zach's call 2026-10-25): arms rendering is dropped for now — too much time sunk, hands just need to work. The rig renders HandViews under the grip nodes instead of ArmsView.
What changed
assets/player/hands/LICENSE_valve.txt) converted FBX → GLB with albedo/normal/roughness wired (tools/convert_glove.py). Mono model, origin right; the left hand mirrors it at runtime.tests/hands_check.gd: GLB + remap + mirror + fist + trigger isolation + placeholder fallback. CI runs it.tools/recolor_gloves/) + tint masks + conversion sources committed for baked albedo variants.Verification
Headset checks owed
Later additions (on this branch)
debug_beam): red aim-direction beam under each aim node for screenshot parsing (the xr-tools laser does not rasterize in flat mode).levels/sandbox/gizmo/. The bridgedebug_gizmotool was removed with this move. Leaving the sandbox hides the gizmos; the rig's panel pointers stay forced on in sandbox so the button is laser-clickable. Suitetests/sandbox_gizmo_check.gd+ CI entry; game-scene probe verified 4 real instances on the live rig (correct parents, unshaded + double-sided).@muse-lantern Review of #22 at
651c19b: requesting changes. In short: the hands render and every suite passes, but in the real rig the curl calibration never measures anything, so a full grip does not close the hand.hands_checkcan't see it because its hands don't sit under a controller node.Curl calibration is overwritten in the rig
HandView._calibrate_curl()(src/player/hand_view.gd) poses the index finger, waits a frame, then measures. The newHandView._process()callsset_curl()every frame whenever the parent is anXRController3D, which it always is inplayer_rig.tscn(LeftGrip/RightGrip). So in the frame the probe waits,_processrewrites the index chain with the default axis. Every candidate then measures the same pose, the scores tie, and the first candidate (RIGHT, +1) wins on both hands.Measured headless on 4.6.3 at
651c19b, sameHandView, only the parent node differs:Node3D(whathands_checkuses)XRController3D(what the rig uses)So the "0.159 to 0.065 m" in the description is true for the test setup only. In the game the grip moves the fingertips slightly away from the wrist instead of into a fist, and the headset "fist feel" check will fail for this reason, not because of the curl magnitudes. It also means the "twist culprit" fix and the new UP candidate have only ever run in the test setup.
Fix: don't drive curl while calibration is running. Either skip
_processuntil calibration has finished (a_calibratedflag set at the end of_ready), or measure each probe in the same call that poses it, with no frame wait (on 4.6.3get_bone_global_posereflects a pose write immediately). Then puthands_check's hands under anXRController3D(or a stand-in that callsset_curlevery frame) and assert the chosen axis and sign per hand, so the test exercises the rig's real conditions.Smaller
assets/player/hands/src/has no.gdignore, so both FBX files are imported as scenes and the textures as game textures;tools/recolor_gloves/example_variants.pngis imported too.assets/player/arms/source/already uses a.gdignorefor this; the same here keeps them out of exports.vr_glove_color.jpg(710 KB) andvr_glove_normal.png(2.3 MB) are committed twice, undersrc/and as the extractedvr_glove_vr_glove_*copies, on top of the 3.2 MB GLB. The PR adds about 12 MB of binaries in total.twist_checknever runs in CI. The description counts it among the 11 suites, but it isn't in the suite list in.forgejo/workflows/tests.yml. Add it while you're editing that line.player_arms.glband runs its own calibration while hidden and undriven. Fine for now, but worth gating if boot time matters.Asks
_processfrom overwriting the calibration probe (either fix above), and report the chosen axis and sign per hand under a controller parent.hands_checkrun the hands under a controller-like parent, and assert axis, sign and the fist distance there..gdignoretoassets/player/hands/src/andtools/recolor_gloves/, and drop the duplicate textures.twist_checkto the CI suite list.The new glove export re-rigged the bone map but the wrist bone ("Right wrist") matched no profile's lookup: _wrist_name() fell through to the POLYONE name J_Right_Hand, so _apply_model_correction() and _calibrate_curl() early-returned silently -- grip alignment and curl calibration were dead, making the glove look half-unrigged. - hand_view.gd: single chain table (finger prefixes x _0_R/_1_R/_2_R/ _2_R_end); RigProfile enum + rig export removed. _wrist_index() resolves the skeleton's single root bone first, with a named fallback, so a future blend rename can't silently kill the correction again. RigChainTypes (14bed8b) is the da_rig successor for mod rigs; this table becomes a thin adapter over it then. - hands_check.gd: no hardcoded rig bone names; tips/wrist resolved dynamically via _finger_chains/_wrist_index (same pattern as hand_debug_curl_check.gd); adds wrist-resolves-as-root check. - convert_glove.py: accepts legacy and new image datablock names, asserts the blend's 21-bone rig map matches the runtime table. - README: documents the new rig map, the profile removal, and the converter's rig assertion. Suites green: hands_check, hand_debug_curl_check, rig_chains (64), smoke_menu (pre-existing body/pointers nil in cold-cache --script mode unchanged; unrelated).View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.