Skip to content

renderer: a skinned model that exceeds the 128-joint cap falls to the static arm SILENTLY — race_pcfroglok sits at 127 of 128 #780

Description

@djhenry

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingseverity:mediumMedium severity

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions