Found by PR #773's independent reviewer at round 2. The cap and its silent downgrade predate
#768, so this is not #773's debt — the reviewer said so explicitly and it was not a condition
of that merge. Filing it because the margin is now measured.
A model that has a skin falls to the static (unskinned) render arm when it exceeds the
128-joint cap, and nothing says so. The selection predicate is at
crates/eqoxide-renderer/src/renderer.rs:663-664:
let use_skinned = joint_count > 0 && joint_count <= 128;
so the static arm is taken for !(0 < joint_count <= 128) — which folds "no skin at all"
together with "skinned, but too many joints" into one silent branch.
Why it matters now — the margin is one asset bake wide
The reviewer enumerated the rigs on this head: 50 names, one static (boat, 0 joints),
nothing currently above the cap, and 11 rigs at ≥109 joints. The highest is
race_pcfroglok at 127 of 128, with the next highest at 110.
race_pcfroglok is a PC race, and that directory is baked outside this repo. A
two-joint change in a future bake would move a playable race onto the grounded static arm with
no error, no warning, and no log line — it would simply start rendering differently.
Shape of a fix
The cheap honest form is a warn! when a model with a skin falls to the static arm because
it exceeded the cap — i.e. distinguish joint_count == 0 from joint_count > 128 at the
selection site and log only the latter. Not a placement change: the reviewer was explicit
that the fix here is making the downgrade loud, not making it different.
Raising the cap is a separate question and should not be folded in.
Verification
Assert the two arms are distinguishable rather than asserting on log text: a test that a
synthetic model with joint_count = 129 takes the static arm and is reported as a
downgrade, while one with joint_count = 0 takes the static arm and is not. Mutation-check
that collapsing the two cases back into one predicate goes RED.
Refs #768, #773.
Found by PR #773's independent reviewer at round 2. The cap and its silent downgrade predate
#768, so this is not #773's debt — the reviewer said so explicitly and it was not a condition
of that merge. Filing it because the margin is now measured.
A model that has a skin falls to the static (unskinned) render arm when it exceeds the
128-joint cap, and nothing says so. The selection predicate is at
crates/eqoxide-renderer/src/renderer.rs:663-664:so the static arm is taken for
!(0 < joint_count <= 128)— which folds "no skin at all"together with "skinned, but too many joints" into one silent branch.
Why it matters now — the margin is one asset bake wide
The reviewer enumerated the rigs on this head: 50 names, one static (
boat, 0 joints),nothing currently above the cap, and 11 rigs at ≥109 joints. The highest is
race_pcfroglokat 127 of 128, with the next highest at 110.race_pcfroglokis a PC race, and that directory is baked outside this repo. Atwo-joint change in a future bake would move a playable race onto the grounded static arm with
no error, no warning, and no log line — it would simply start rendering differently.
Shape of a fix
The cheap honest form is a
warn!when a model with a skin falls to the static arm becauseit exceeded the cap — i.e. distinguish
joint_count == 0fromjoint_count > 128at theselection site and log only the latter. Not a placement change: the reviewer was explicit
that the fix here is making the downgrade loud, not making it different.
Raising the cap is a separate question and should not be folded in.
Verification
Assert the two arms are distinguishable rather than asserting on log text: a test that a
synthetic model with
joint_count = 129takes the static arm and is reported as adowngrade, while one with
joint_count = 0takes the static arm and is not. Mutation-checkthat collapsing the two cases back into one predicate goes RED.
Refs #768, #773.