Skip to content

2.28.1 — four fixes that showed up as a broken avatar

Choose a tag to compare

@MrTactical MrTactical released this 26 Jul 14:55

Four fixes, all found on one avatar, all of which produced a converted result that looked wrong rather than one that reported an error.

Blend trees were being flattened

The important one, and it affects most VRCFury avatars.

Unity clamps a blend tree's child thresholds into [minThreshold, maxThreshold] when those are assigned — but min/max only mean anything when a tree uses automatic thresholds, so an author working in manual mode leaves them wherever they happen to be. VRCFury emits its manual trees with min = max = 0. Copying that faithfully crushed every child threshold to 0.

That is not a subtle failure. A 1D tree whose thresholds are all equal plays all of its clips at once. On the avatar this was found with, the tail-scale tree held both extremes at full weight and the tail swallowed the model.

Min and max are now copied only in automatic mode, which is the only mode in which they mean anything. In manual mode the children's own thresholds are the whole truth.

(Found by diffing VRCFury's own baked controller against the converted one — thresholds 0, 1 in the source against 0, 0 in the output. Reasoning about it had already produced one wrong answer.)

VRCFury's parameter compressor is removed

It exists to beat VRChat's 256-parameter ceiling: it sets your real parameters to networkSynced = false, mirrors each into VF<id>_<name>, and rotates the mirrors through a couple of sync slots about twice a second. A good answer to a VRChat problem, and a pure loss in ChilloutVR, which has 3200 bits and syncs straight from the animator declaration.

Carried across, it cost three ways:

  • the rotation ran every frame, as a Direct blend tree — most of what made the "Internal Parameter Math" layer expensive
  • the mirrors and slot counters sat in the parameter list doing nothing
  • the real parameters were left marked not-synced, so the conversion faithfully gave them the local-only # prefix and the compressed values reached nobody

An avatar whose author installed the compressor to make more things sync ended up with those things syncing not at all. Its layers and mirrors are now removed and every real parameter goes back to syncing natively, instantly, rather than on a half-second carousel.

Face-tracking rigs are actually removed now

The setting always claimed both face-tracking modes strip whatever rig the avatar shipped with. They stripped its animator layers and stopped there — so a Native conversion carried the original VRCFT prefab in the hierarchy alongside the native component that had just replaced it, plus its entire parameter set.

The objects are now removed too, and the parameters can finally be released: they were pinned in place by VRCFury's Defaults layer, a single Direct blend tree that writes every parameter on the avatar and is rightly kept. On the test avatar that came to one object, two layers and 202 parameters.

None mode is untouched and now means what it says: the rig is left completely alone, objects and all.

Missing parameters take their default from the parameter they mirror

VRCFury copies parameters it needs into its own namespace, and those copies are often the ones left undeclared — so they were being declared Float 0 along with every other unknown name.

Zero is not neutral for a slider. Avatar Limb Scaling rests at 0.5, where 0 means fully shrunk; the same avatar's Wider Legs, Wider Thighs and Chubby Belly sliders behave identically. The repair now finds the parameter each copy shadows and takes its default. Genuinely unknown names still get 0, which is right for them.

The distinction is worth stating: the old behaviour left a feature inert, which is obvious and recoverable. This left the avatar deformed, which reads as the converter having mangled the model.