Axial stencil reach beyond a CUT joint end, px — TWO of the vertex stage's
four ext arms (ny = the cut normal's PERPENDICULAR component in the
leg's own local frame).
Without a packet the fragment renders only the kept half-disc, whose axial
extent is |ny|·rMax — a genuinely cheaper stencil than a cap, which is the
whole reason joints cost less fill than free ends. With one, the deficit
term reaches wherever MY OWN profile does (it renders max(mine − partner,
0) ≤ mine), so the end must reserve the FULL disc or the rasterizer chops
the light the deficit rule draws (#1488). Both carry the AA apron.
rMax is the vertex stage's OWN rMax — max(rA, rB) + apron, the same
value the width gate compares and the quad's half-width uses — so both arms
add the apron a second time, exactly as the four ext writes do
(extA = rMax + APRON / abs(nLoc.y) * rMax + APRON). Passing the bare
drawn radius instead would make this model reserve 0.5 px LESS than the
shader: faithful-looking, and quietly able to chop what the shader draws.
The two arms it does NOT model: the bare-apron BUTT an interior end keeps
when there is no partner-far texel, the joint vertex is behind the near
plane, the projected partner length degenerates (the shaders' ql > 1e-4
guard, shader-glsl-capsule.ts — this model divides by that length
instead: a tiny-but-finite one is modelled as an extreme taper rather than
a butt, and a ZERO one goes non-finite WHERE THE PACKET IS LIVE, which the
sweep throws on rather than scoring as a vacuous 0 — gated off, the gradient
is never read and the row scores finitely), or nLoc.x fails its sign test;
and the free-end/hairpin rMax, which the model hardcodes at its own call
sites and so cannot be reached through an injected rule. The first two of
those are unproducible here (the model has no texels and no near plane), but
the nLoc.x one merely goes unexercised: with θ the angle between q̂ and m̂,
nl = 2|sin(θ/2)| and nLoc.x = −|sin(θ/2)|, so the window
nl > 1e-3 ∧ nLoc.x > −1e-3 holds for θ in (0.057°, 0.115°) — a sliver just
above the hairpin fallback, which leg(180, …) vs leg(180.08, …) would
enter. No row in the sweep does.
Axial stencil reach beyond a CUT joint end, px — TWO of the vertex stage's four
extarms (ny= the cut normal's PERPENDICULAR component in the leg's own local frame).Without a packet the fragment renders only the kept half-disc, whose axial extent is |ny|·rMax — a genuinely cheaper stencil than a cap, which is the whole reason joints cost less fill than free ends. With one, the deficit term reaches wherever MY OWN profile does (it renders max(mine − partner, 0) ≤ mine), so the end must reserve the FULL disc or the rasterizer chops the light the deficit rule draws (#1488). Both carry the AA apron.
rMaxis the vertex stage's OWNrMax—max(rA, rB) + apron, the same value the width gate compares and the quad's half-width uses — so both arms add the apron a second time, exactly as the fourextwrites do (extA = rMax + APRON/abs(nLoc.y) * rMax + APRON). Passing the bare drawn radius instead would make this model reserve 0.5 px LESS than the shader: faithful-looking, and quietly able to chop what the shader draws.The two arms it does NOT model: the bare-apron BUTT an interior end keeps when there is no partner-far texel, the joint vertex is behind the near plane, the projected partner length degenerates (the shaders'
ql > 1e-4guard,shader-glsl-capsule.ts— this model divides by that length instead: a tiny-but-finite one is modelled as an extreme taper rather than a butt, and a ZERO one goes non-finite WHERE THE PACKET IS LIVE, which the sweep throws on rather than scoring as a vacuous 0 — gated off, the gradient is never read and the row scores finitely), ornLoc.xfails its sign test; and the free-end/hairpinrMax, which the model hardcodes at its own call sites and so cannot be reached through an injected rule. The first two of those are unproducible here (the model has no texels and no near plane), but thenLoc.xone merely goes unexercised: with θ the angle between q̂ and m̂,nl = 2|sin(θ/2)|andnLoc.x = −|sin(θ/2)|, so the windownl > 1e-3 ∧ nLoc.x > −1e-3holds for θ in (0.057°, 0.115°) — a sliver just above the hairpin fallback, whichleg(180, …)vsleg(180.08, …)would enter. No row in the sweep does.