2.30.3 — shaders with includes, and constraints that drive another object
Shaders whose code lives in includes can now be patched
The SPI patcher previously refused any shader whose vertex function wasn't in the .shader file itself. That rules out most serious effect shaders — Cancerspace declares #pragma vertex vert and keeps vert, the structs, and nine includes' worth of everything else in Cancercore.cginc.
The refusal was reasonable on its own terms: editing somebody's shared .cginc would reach every other shader that includes it. But the objection was to editing the original, not to patching the shader. The includes are now cloned alongside the shader, and the copy's #include lines are repointed at the clones — so the originals are never written to and never read by the patched copy.
The patcher works on a unit now: the .shader plus every local include it reaches, depth-first. Each of the six stereo edits lands in whichever file actually contains its target. Unity's own includes (UnityCG.cginc, AutoLight.cginc) are recognised by failing to resolve next to their includer and left alone — they already handle stereo, and they aren't ours to copy.
Verified on Cancerspace: ten files cloned, every include repointed, compiles, and the CCK's non-SPI warning is gone.
The safety net is unchanged and now covers the whole unit — if the copy fails to compile, every file written for it is removed, not just the shader.
Constraints that drive another object
A VRC constraint can sit on one object and drive a different one via its Target Transform. Unity's constraints have no equivalent, and AvatarBridge had been dropping the redirection as unsupported.
That isn't a degradation — it's a silent total failure of anything built that way, and prefabs are built that way routinely. Avatar Limb Scaling puts its scale constraints on proxy objects inside its own prefab and points them at your real arm and leg bones; dropped, its sliders appeared, moved, synced, and scaled a hidden proxy.
Unity offers no way to redirect a constraint, but it doesn't need one: the constraint is now added to the target instead, carrying the same sources. Exact, not approximate. A target outside the avatar still can't be honoured, and the report now says plainly that whatever it was driving will not move.
Reports read the same in every locale
A report from a comma-decimal locale came back reading 'Height (M)' = 1,24 m and StepSize 0,05. Nothing generated was affected — there's no float.Parse anywhere in the tool and no number is written into any file it produces — but the report is the document bugs arrive with, read by someone other than whoever made it. Numbers are now formatted invariantly for the length of a conversion.
Documentation
The README picks up everything from 2.26.0 onward: a third-party prefab table (Avatar Limb Scaling, GoGo Loco, VRCFT rigs), a section on constraints that drive another object, one on VRCFury's systems and why the parameter compressor is removed, and a correction to face tracking — both set-up modes remove the existing rig's objects and parameters, not just its layers, and None leaves it entirely alone.