2.32.3 — real joysticks, and material swaps that survive
Two-axis puppets are a real joystick now
A VRChat two-axis puppet drives two parameters over −1..1. They were being converted into two ChilloutVR sliders, and a slider offers 0..1 — so half of every axis was unreachable and each controller worked in one quadrant. On one test avatar that was six half-usable sliders where there should have been three working controls.
ChilloutVR has the matching control and it simply wasn't being used. Joystick2D takes a Vector2 range, defaulting to (0,0)..(1,1) but settable, so −1..1 on both axes is a supported configuration rather than something to work around. A puppet now becomes one joystick with that range, centred where VRChat leaves it.
The catch is that Joystick2D takes no parameter names — it derives them, driving <machineName>-x and -y. The avatar's own axis parameters are therefore renamed to match, everywhere they're referenced, and both stay synced: the pair is one control to the wearer, and half a joystick arriving at other players would be worse than none.
Four-axis puppets are untouched — those are four independent 0..1 parameters, not two signed axes, so the sliders they already produce are the honest reading.
Toggles that swap materials no longer break
A toggle that swapped a material turned the mesh magenta, on an avatar that had converted cleanly many times with nothing about it changed.
VRCFury generates into a temp folder it deletes on its next build, and AvatarBridge has always copied what it finds there. But a reference is not the thing it points at, and that turned out to be true three levels deep:
- a clip that assigns a material carries it as an object-reference curve — copying the clip copies the reference
- the material VRCFury hands over is often embedded inside one of its controllers, so copying "the asset's file" duplicated a whole animator controller and rescued nothing
- and that material points its texture slots at sub-assets of a repacked texture container, also in temp
Each layer failed differently, which is what made it hard to see. A missing material renders magenta; missing textures render as an untextured wash — a white face with no eyes, which reads as an unrelated bug.
Re-homing now follows the whole graph: the clip, what it assigns, and the shader and textures that asset depends on, with standalone files and embedded sub-assets each handled correctly.
Also
- A stripped system's puppet is left alone. GoGo Loco ships its own two-axis puppet, and converting it renamed both parameters out of the
Go/family that marks them for removal — so GoGo's puppet survived a conversion that had been asked to strip GoGo, under a generated name. Anything that renames parameters ahead of stripping now asks first whether they're about to be removed. - Joystick and vector controls are no longer deleted as dead entries. A joystick's
machineNameis never itself a parameter — ChilloutVR derives one per axis — so the dead-entry cleanup judged every joystick by a name that by design never appears in an animator, and removed the only control for those axes. It now expands each entry to the parameters its type actually uses. - No compile warning in a CCK-only project. A field used only by convert mode was declared outside the guard covering its use, so every project without the VRChat SDK got a warning naming AvatarBridge on each recompile — which is the first thing anyone checks when they think a tool is misbehaving.