see _shared/line-capsule.ts for the model + the three
deliberate exactness relaxations
capsule is calibrated so the side-on appearance matches
screen-space by construction (the Gaussian-equivalent truncation T in
_shared/line-capsule.ts relates drawn width to σ), which is what makes
a session-wide A/B meaningful.
A third primitive, volumetric (segment ⊛ isotropic 3D Gaussian, solved
per-fragment against the true camera-space segment), shipped behind this
toggle during #1352 and was deleted after the capsule flip: the capsule
matched or beat it visually — including near-axial, its signature case —
at quad-class cost. Its closed-form ray-integral math survives in git
history (branch point 1481995d9).
Unlike lineJoin this is NOT an authorable node attribute: the primitive is
a renderer implementation choice, not scene content, and the flip to a new
default (#1352) must not leave authored attributes behind. It is selected
per session — ?linePrimitive= override, then the Advanced → Line primitive policy setting — with the auto policy additionally sizing
the scene once before material build (sceneEffectiveLineLoad) and
each node once at material build (resolveLinePrimitiveForNode).
It lives here, in the layer-neutral types/, rather than in rendering/
because config/url-params.ts must both parse it and install it, and
config/ may not import from rendering/ (see .dependency-cruiser.cjs).
The override and policy are installed once at startup; the aggregate load
is replaced for each scene before any line material is constructed.
Line rendering primitive — which fragment model draws a line segment (issue #1352).
screen-spacecapsule_shared/line-capsule.tsfor the model + the threecapsuleis calibrated so the side-on appearance matchesscreen-spaceby construction (the Gaussian-equivalent truncation T in_shared/line-capsule.tsrelates drawn width to σ), which is what makes a session-wide A/B meaningful.A third primitive,
volumetric(segment ⊛ isotropic 3D Gaussian, solved per-fragment against the true camera-space segment), shipped behind this toggle during #1352 and was deleted after the capsule flip: the capsule matched or beat it visually — including near-axial, its signature case — at quad-class cost. Its closed-form ray-integral math survives in git history (branch point1481995d9).Unlike
lineJointhis is NOT an authorable node attribute: the primitive is a renderer implementation choice, not scene content, and the flip to a new default (#1352) must not leave authored attributes behind. It is selected per session —?linePrimitive=override, then theAdvanced → Line primitivepolicy setting — with theautopolicy additionally sizing the scene once before material build (sceneEffectiveLineLoad) and each node once at material build (resolveLinePrimitiveForNode).It lives here, in the layer-neutral
types/, rather than inrendering/becauseconfig/url-params.tsmust both parse it and install it, andconfig/may not import fromrendering/(see.dependency-cruiser.cjs). The override and policy are installed once at startup; the aggregate load is replaced for each scene before any line material is constructed.