fix(scene): greek text rect renders filled at the text's own color

Greek rects rendered through fill_tris went through the face3d 0.45
dim path; the pre-boost (color × 1/0.45) compensated only until clamp
hit at 1.0, leaving bright user colors washed out. The earlier outline
workaround dodged the dim but lost the filled box visual that AutoCAD
uses for "text lives here".

  - face3d pipeline now skips the 0.45 dim when `wire.points` is
    empty. PolyfaceMesh / PolygonMesh keep their dim (both points and
    fill_tris populated); greek and MultiLeader background-fill emit
    `points: vec![]` so they render at the literal color.
  - All three greek paths (top-level, block-defn, MultiLeader) emit a
    2-triangle filled rect instead of an outline / boosted fill.
  - Greek rects are clamped to single-line height so 5-line MText
    doesn't blow the box up to the full text-block height. MultiLeader
    emits one rect per line — keeps the per-row visual hint.
  - BatchEntry/StyleKey gain an `is_fill_only` discriminator so greek
    batches never collide with regular wire batches; otherwise the
    finalized WireModel could carry both points and fill_tris and
    defeat the pipeline-side empty-points check.

Xref fade still applies to the resolved color via the existing
`fade_toward_bg` path, so xref greek stays faded as expected.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Hakan 2026-05-15 16:32:27 +03:00
commit ddd0a2de16
4 changed files with 173 additions and 107 deletions

View file

@ -85,13 +85,22 @@ impl Face3DGpu {
vertices.push(v(3));
}
// PolyfaceMesh / PolygonMesh pre-triangulated fills.
// PolyfaceMesh / PolygonMesh / unlit fills (text greek, MultiLeader
// background). Wires whose `points` are empty carry pure 2-D fills
// that should render at their literal color — applying the 0.45
// AO-style dim to them would wash out user-picked colors. Wires
// with both fill_tris and points (mesh edges + faces) keep the dim
// so PolyfaceMesh / PolygonMesh still look 3-D-shaded.
for wire in all_wires {
if wire.fill_tris.is_empty() {
continue;
}
let [r, g, b, a] = wire.color;
let fill_color = [r * 0.45, g * 0.45, b * 0.45, a];
let fill_color = if wire.points.is_empty() {
[r, g, b, a]
} else {
[r * 0.45, g * 0.45, b * 0.45, a]
};
for &position in &wire.fill_tris {
vertices.push(Face3DVertex {
position,