Latent flaw in the c9e25e5 dirty-skip (now in master): the token hashes plane
PIXELS + lamp state only, but the ColorMapper gauge family (armor rosette
tints, the adpal/adpal2 damage flash) animates by writing CLUT entries with
ZERO pixel churn -- so a glass window whose plane is pixel-static held stale
colors while the D3D surround (which re-expands every frame) tracked live.
New SVGA16::paletteGeneration, bumped by the palette writers:
- BuildSecondaryColor: only on a REAL entry change (the flash alternates
palettes every Execute writing identical RGB at zero damage -- an
unconditional bump would repaint every palette-expanding window every
pump for nothing);
- BuildSecondaryPalette / BuildAuxiliaryPalette / BlankPalette (full
rebuilds): unconditionally.
GlassWindowToken folds it in for palette-expanding windows (monoTint < 0, or
all windows under BT_GLASS_MFD_PAL); mono-tint windows don't read the palette
and keep their pixel-only token.
KB: glass-cockpit.md gains the repaint-pump section (records f3d27f5 +
c9e25e5 + this). Companion branch sec-phantom-fix carries the idx-254
translation-table fix -- disjoint hunks, merges in either order.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>