Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b59e2ac040 |
+16
-40
@@ -414,14 +414,6 @@ Verified live: bay fire → lamp 0xD (the LRM's select button) flashes 0x37 + en
|
|||||||
on detonation/purge. Diagnostics: `BT_LAMP_LOG` → `[techstat]`/`[galarm]`/`[lamp]`. Details +
|
on detonation/purge. Diagnostics: `BT_LAMP_LOG` → `[techstat]`/`[galarm]`/`[lamp]`. Details +
|
||||||
the four load-bearing fixes en route: [[open-questions]] + [[decomp-reference]] §GaugeAlarm.
|
the four load-bearing fixes en route: [[open-questions]] + [[decomp-reference]] §GaugeAlarm.
|
||||||
|
|
||||||
**These conditions are ROUTINE and SELF-CLEARING [T2, field-verified 2026-08-08].** A `SET` is an
|
|
||||||
operating state, not a fault: every laser volley trips Overheating (cond 3) and clears it on
|
|
||||||
cooldown (33× on one LLaser in a single match), and BadPower (cond 6) flickers whenever
|
|
||||||
simultaneous draw browns the bus. Across a full match every subsystem's SET/CLEARED counts are
|
|
||||||
balanced — nothing latches. So a lamp flashing after a respawn is the mech *operating*, not a
|
|
||||||
failed reset; diagnose from the SET/CLEARED balance, never from a lone SET. Full census + the
|
|
||||||
#137 post-mortem it settled: [[decomp-reference]] §TechStatus.
|
|
||||||
|
|
||||||
## ConfigMapGauge (the weapon panel's trigger-config joystick) — LIVE via LinkToEntity (2026-07-21)
|
## ConfigMapGauge (the weapon panel's trigger-config joystick) — LIVE via LinkToEntity (2026-07-21)
|
||||||
The per-weapon btjoy.pcc joystick image + 4 cm_* state lamps (off/other/only/both) showing,
|
The per-weapon btjoy.pcc joystick image + 4 cm_* state lamps (off/other/only/both) showing,
|
||||||
for each mappable fire button (Pinky/ThumbLow/Trigger/ThumbHigh), whether THIS panel's weapon
|
for each mappable fire button (Pinky/ThumbLow/Trigger/ThumbHigh), whether THIS panel's weapon
|
||||||
@@ -557,38 +549,6 @@ and every instrument is now live [T2]:**
|
|||||||
transcription color bug caught by a period reference screenshot, 2026-07-09; same for the
|
transcription color bug caught by a period reference screenshot, 2026-07-09; same for the
|
||||||
bottom bowtie carets @4569-4570); pegs at 1200 with no target; the DISPLAYED range slides at
|
bottom bowtie carets @4569-4570); pegs at 1200 with no target; the DISPLAYED range slides at
|
||||||
**500 m/s** toward the true pick range (HudSimulation :5652 [T1]).
|
**500 m/s** toward the true pick range (HudSimulation :5652 [T1]).
|
||||||
**The HudSimulation tuning constants, read off .rdata 2026-08-08 [T1]** (`section_dump.txt`
|
|
||||||
rows ` 4b7ec0 8be55dc3 0000403f 0000803f 0000c842` / ` 4b7ed0 00000000`) —
|
|
||||||
`_DAT_004b7ec4` = **0.75f**, `_DAT_004b7ec8` = **1.0f**, `_DAT_004b7ecc` = **100.0f**,
|
|
||||||
`_DAT_004b7ed0` = **0.0f**, `_DAT_004b7f90` = **0.0f**. ec4/ec8 are the fire-control **LOCK**
|
|
||||||
limits (own HUD host zone < 0.75 damage, targeted zone < 1.0 — so a shot-up cockpit drops to
|
|
||||||
"target held, no lock", and a dead zone can't be re-locked); ed0 is the shared **zero** in the
|
|
||||||
range-slide `Abs()` idiom (the 500 is an immediate `0x43fa0000`, NOT a global). `hud.cpp` had
|
|
||||||
carried all five as 0.0f/500.0f stand-ins under guessed names ("SegmentTempLimit … heat
|
|
||||||
threshold for HUD page visibility" was neither heat nor page visibility) — corrected in place,
|
|
||||||
with the live lock/slide implementation staying in mech4.cpp's targeting step, which had both
|
|
||||||
thresholds right all along.
|
|
||||||
**THE CARET CAN DIE FOR THE WHOLE SESSION — #147, fixed 2026-08-08 [T2 code, T3 field link]:**
|
|
||||||
`sShownRange` (mech4's targeting step) is a **function-level static** — one cell per process,
|
|
||||||
shared by every mech, carried across drops. **NaN is absorbing** in `step = trueRange −
|
|
||||||
sShownRange; sShownRange += step`, and neither the producer's clamps nor
|
|
||||||
`BTReticleRenderable::Draw`'s (`range < minRange` / `range > maxRange`) catch it — both
|
|
||||||
comparisons are **false for NaN**. A poisoned value therefore reaches `AddPoint`/`ConcatMatrix`,
|
|
||||||
and the caret + its bar become **degenerate geometry that stops rendering while the static tick
|
|
||||||
marks keep drawing** — the exact reported symptom ("no range finder on this drop", ticks there,
|
|
||||||
caret gone), sticky until relaunch. Fixed four ways: re-seed on mech change (not on respawn —
|
|
||||||
that reuses the entity, and the binary doesn't reset the readout either), a producer NaN trap, a
|
|
||||||
NaN-safe consumer clamp falling back to the 1200 peg, and — the reason no log could settle it —
|
|
||||||
**`BT_RANGE_LOG` now prints the caret's actual input** (`[range] caret input shown=`). It never
|
|
||||||
did before: `BT_RANGE_LOG` instrumented the PICK (#4) and `[target]`'s `range=` is a *separate*
|
|
||||||
locally-recomputed Sqrt in the weapon-range check, so grepping field logs for NaN found nothing
|
|
||||||
because the poisoned variable was never printed. Causal link to the field report is INFERENCE.
|
|
||||||
**GAP — the 100 m RANGE BIAS is NOT reconstructed [T1 read, unimplemented]:** HudSimulation
|
|
||||||
subtracts `_DAT_004b7ecc` (100.0f) from `RangeToTarget@0x1EC` **every frame while the timed
|
|
||||||
flag @0x22C is set**, accumulating @0x21C by `time_slice` until it reaches @0x1D8, then clearing
|
|
||||||
both. The port's targeting step (mech4.cpp) does the slide but never the bias, so whatever
|
|
||||||
in-game state sets @0x22C currently produces no range offset. Trigger for @0x22C not yet
|
|
||||||
identified — see [[open-questions]].
|
|
||||||
**VERDICT (Gitea #4, 2026-07-20): the "range slides in/out crazily while walking" report is
|
**VERDICT (Gitea #4, 2026-07-20): the "range slides in/out crazily while walking" report is
|
||||||
AUTHENTIC behavior, not a bug [T2 measured].** Per-frame `BT_RANGE_LOG` traces (mech4.cpp, with
|
AUTHENTIC behavior, not a bug [T2 measured].** Per-frame `BT_RANGE_LOG` traces (mech4.cpp, with
|
||||||
an independent Möller-Trumbore cross-check `BTGroundRayHitExact` in btvisgnd.cpp) on scripted
|
an independent Möller-Trumbore cross-check `BTGroundRayHitExact` in btvisgnd.cpp) on scripted
|
||||||
@@ -823,6 +783,22 @@ pattern across entries [2^bits..255] (high-index art degrades to its
|
|||||||
index-mod-2^bits colour IN-PLANE, can never leak). The 1995 binary ships the
|
index-mod-2^bits colour IN-PLANE, can never leak). The 1995 binary ships the
|
||||||
SAME 64-entry fill and relied on 6-bit art discipline -- garbage is not a
|
SAME 64-entry fill and relied on 6-bit art discipline -- garbage is not a
|
||||||
preservable behaviour, so the cycle-fill is a guarded PORT deviation.
|
preservable behaviour, so the cycle-fill is a guarded PORT deviation.
|
||||||
|
|
||||||
|
**REFINED 2026-08-10 [T1] -- the cycle-fill itself made phantoms.** The
|
||||||
|
in-plane wrap mapped art index 254 onto plane slot 62 = the LIVE
|
||||||
|
`colorMapperMultiArmor` right-armor damage slot, and idx-254 art EXISTS:
|
||||||
|
every SMODE.PCC frame fills the INACTIVE control-mode box interiors with 254
|
||||||
|
(active border/text idx 9 yellow, inactive borders idx 5 orange-red), and
|
||||||
|
BTSEC1.PCX carries a stray 52x13 idx-254 bar at port (199-250, 101-113) --
|
||||||
|
between the heading dial and the armor rosette, geometrically a scratch
|
||||||
|
duplicate of the rosette quadrant bars. Both lit up in the current
|
||||||
|
right-armor colour (adpal ramp green/orange/red) on EVERY render path --
|
||||||
|
playtester-reported as "red boxes around MID/ADV" + "a block between Armor
|
||||||
|
and Heading". On the shipped machine those regions rendered BLACK (the
|
||||||
|
garbage entry's low plane bits were 0 -> in-plane index 0), so the fill now
|
||||||
|
maps [2^bits..255] to `translationTable[0]` (plane BACKGROUND) -- authentic
|
||||||
|
on-screen result, same no-leak guarantee. NB the 2026-07-19 audit verified
|
||||||
|
smode BEFORE the 07-25 cycle-fill landed, which is why the row said CORRECT.
|
||||||
Post-fix: **0 leaks over 60s** on the same probe; sim3 3-pod regression clean.
|
Post-fix: **0 leaks over 60s** on the same probe; sim3 3-pod regression clean.
|
||||||
**The tripwires are DEFAULT-ON in every build** (BT_PLANE_AUDIT=0 opts out): the
|
**The tripwires are DEFAULT-ON in every build** (BT_PLANE_AUDIT=0 opts out): the
|
||||||
plane-leak trap, plus an out-of-bounds draw-start trap in `buildDestPointer`
|
plane-leak trap, plus an out-of-bounds draw-start trap in `buildDestPointer`
|
||||||
|
|||||||
@@ -203,32 +203,6 @@ appears in the cfg like any panel and honours `,noframe`. Verified: a drag wrote
|
|||||||
at 321,222. NB the plasma window blits directly every frame (`GetDC`+`StretchDIBits`), so unlike
|
at 321,222. NB the plasma window blits directly every frame (`GetDC`+`StretchDIBits`), so unlike
|
||||||
the panels it has no `WM_TIMER` focus-throttle to worry about.
|
the panels it has no `WM_TIMER` focus-throttle to worry about.
|
||||||
|
|
||||||
## Glass-panel repaint pump — perf + dirty-skip (2026-08-09/10) [T2 measured]
|
|
||||||
|
|
||||||
The exploded per-display windows are pure CPU/GDI (`ExpandPlaneToBGRA` +
|
|
||||||
`StretchDIBits`), repainted synchronously on the MAIN render thread by
|
|
||||||
`BTGlassPanels_Tick` (~16 Hz). Three layered changes after a playtester reported
|
|
||||||
~20 fps in panels mode vs ~130 fps in the surround:
|
|
||||||
|
|
||||||
1. **HALFTONE → COLORONCOLOR** (`f3d27f5`, in master): the `HALFTONE` stretch
|
|
||||||
(GDI's per-output-pixel resample) × 7 windows per pump was the primary sink;
|
|
||||||
nearest is crisper for the low-res MFD pixels anyway. `BT_GLASS_SMOOTH=1` restores.
|
|
||||||
2. **Per-window dirty-skip** (`c9e25e5`, in master): each window carries a change
|
|
||||||
token = FNV over `SVGA16::PlaneChecksum(mask)` (the shared pixelBuffer masked to
|
|
||||||
every port that can feed the window) + each button's RENDERED lamp brightness +
|
|
||||||
held/latch. The pump re-blits only windows whose token moved: ~31 pumps/2s →
|
|
||||||
4-15 window repaints vs 217-224 always-on. `BT_GLASS_DIRTY=1` logs the tally.
|
|
||||||
3. **Palette generation in the token** (branch `glass-palette-token`): the
|
|
||||||
ColorMapper family (armor rosette tints, adpal/adpal2 damage flash) animates by
|
|
||||||
CLUT writes with ZERO pixel churn — invisible to a pixel checksum.
|
|
||||||
`SVGA16::paletteGeneration` is bumped by the palette writers
|
|
||||||
(`BuildSecondaryColor` only on a REAL entry change, since the flash alternates
|
|
||||||
palettes every Execute writing identical RGB at zero damage; full rebuilds
|
|
||||||
unconditionally) and folded into the token for palette-expanding windows
|
|
||||||
(`monoTint < 0`, or all under `BT_GLASS_MFD_PAL`). Without it the glass radar
|
|
||||||
held stale armor tints between pixel repaints while the D3D surround (which
|
|
||||||
re-expands every frame) tracked live.
|
|
||||||
|
|
||||||
**Turning it OFF: `L4PLASMA=NONE` (also `OFF`/`0`, 2026-08-06) [T2].** `L4GREND` creates a
|
**Turning it OFF: `L4PLASMA=NONE` (also `OFF`/`0`, 2026-08-06) [T2].** `L4GREND` creates a
|
||||||
marquee whenever `L4PLASMA` is set at all (`SCREEN` → the desktop window, anything else → a real
|
marquee whenever `L4PLASMA` is set at all (`SCREEN` → the desktop window, anything else → a real
|
||||||
`PlasmaDisplay` on that serial port), and the GLASS profile force-defaults it to `SCREEN` — so on
|
`PlasmaDisplay` on that serial port), and the GLASS profile force-defaults it to `SCREEN` — so on
|
||||||
|
|||||||
@@ -696,7 +696,7 @@ reconfigure/externalConfigure); parse-skip list EMPTY ([gskip]=0), all 50 attr b
|
|||||||
| 30 | sec: schematic CRITICAL view (cmCrit) | subsystem simulationState/damage | LIVE this audit: N-cycle shows the full subsystem list (GEN A-D, LOOP 1-6, HUD, SENSORS, GYRO, TORSO, weapons) | T2 | CORRECT |
|
| 30 | sec: schematic CRITICAL view (cmCrit) | subsystem simulationState/damage | LIVE this audit: N-cycle shows the full subsystem list (GEN A-D, LOOP 1-6, HUD, SENSORS, GYRO, TORSO, weapons) | T2 | CORRECT |
|
||||||
| 31 | sec: schematic HEAT view (cmHeat) | subsystem currentTemperature tint | #6 pixel-verified; re-cycled this audit (mask 0x450421→0x490421→0x510421) | T2 | CORRECT |
|
| 31 | sec: schematic HEAT view (cmHeat) | subsystem currentTemperature tint | #6 pixel-verified; re-cycled this audit (mask 0x450421→0x490421→0x510421) | T2 | CORRECT |
|
||||||
| 32 | sec: view cycling (N / pod 0x15) | CycleDisplayMode → vtbl+0x4C @4d1ae4 | #6 resolution re-verified live ([mode] display notify 0/1/2) | T2 | CORRECT |
|
| 32 | sec: view cycling (N / pod 0x15) | CycleDisplayMode → vtbl+0x4C @4d1ae4 | #6 resolution re-verified live ([mode] display notify 0/1/2) | T2 | CORRECT |
|
||||||
| 33 | sec: CONTROL MODE lamp (BAS/MID/ADV) | ControlsMapper/DisplayMode oneOfSeveralPixInt | attr wave incr.5; M-cycle verified #6 | T2 | CORRECT |
|
| 33 | sec: CONTROL MODE lamp (BAS/MID/ADV) | ControlsMapper/**ControlMode** oneOfSeveralPixInt (row previously mislabeled DisplayMode — that is the sibling sdspmod) | attr wave incr.5; M-cycle verified #6. **2026-08-10:** this row's verification PREDATED the 07-25 #48 cycle-fill, which then lit the inactive box interiors (art idx 254 → live armor slot 62) — playtester-reported, re-fixed by mapping out-of-range indices to plane background (see context/gauges-hud.md §#48 REFINED); both render paths re-verified against the reference | T2 | CORRECT |
|
||||||
| 34 | sec: duck / searchlight button lamps | duckState (ctor-zeroed only) / Searchlight LightOn | duckState writer missing (P3 leftover) | T3 | DEFERRED-FEED (duck); CORRECT (light attr published) |
|
| 34 | sec: duck / searchlight button lamps | duckState (ctor-zeroed only) / Searchlight LightOn | duckState writer missing (P3 leftover) | T3 | DEFERRED-FEED (duck); CORRECT (light attr published) |
|
||||||
| 35 | sec: messageBoard ticker | StatusMessagePool (NULL stub) + kill ticker strip 0 | 7fc4acb; kill ticker live 2026-07-12, other strips unsurveyed | T2/T3 | DEFERRED-FEED (partial) |
|
| 35 | sec: messageBoard ticker | StatusMessagePool (NULL stub) + kill ticker strip 0 | 7fc4acb; kill ticker live 2026-07-12, other strips unsurveyed | T2/T3 | DEFERRED-FEED (partial) |
|
||||||
| 36 | MFD preset paging (J/K/L, pod RIO banks) | SetPresetMode table @0051dbf0 (little-endian re-decode) | #9; re-verified live this audit: cycles visit EXACTLY the populated set (MFD1: 1,2,4; MFD2: 1-4; MFD3: 1,2) | T2 | CORRECT |
|
| 36 | MFD preset paging (J/K/L, pod RIO banks) | SetPresetMode table @0051dbf0 (little-endian re-decode) | #9; re-verified live this audit: cycles visit EXACTLY the populated set (MFD1: 1,2,4; MFD2: 1-4; MFD3: 1,2) | T2 | CORRECT |
|
||||||
|
|||||||
@@ -2104,19 +2104,7 @@ static unsigned long
|
|||||||
if (svga == NULL) svga = static_cast<SVGA16*>(p->graphicsDisplay);
|
if (svga == NULL) svga = static_cast<SVGA16*>(p->graphicsDisplay);
|
||||||
}
|
}
|
||||||
if (svga != NULL && combined != 0)
|
if (svga != NULL && combined != 0)
|
||||||
{
|
|
||||||
token ^= svga->PlaneChecksum(combined);
|
token ^= svga->PlaneChecksum(combined);
|
||||||
// PALETTE-ANIMATED content (2026-08-10): a palette-expanding window
|
|
||||||
// (the radar; MFDs under BT_GLASS_MFD_PAL) changes colour with ZERO
|
|
||||||
// pixel writes -- the ColorMapper family (armor rosette tints, the
|
|
||||||
// adpal/adpal2 damage flash) writes CLUT entries. Fold the palette
|
|
||||||
// write generation in so those changes repaint; mono-tint windows
|
|
||||||
// don't read the palette and keep their pixel-only token.
|
|
||||||
static int sPalTok = -1;
|
|
||||||
if (sPalTok < 0) sPalTok = getenv("BT_GLASS_MFD_PAL") ? 1 : 0;
|
|
||||||
if (w->monoTint < 0 || sPalTok)
|
|
||||||
token = (token ^ svga->PaletteGeneration()) * 16777619UL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lamps: each button's RENDERED brightness + held/latched, so a flash toggle or a
|
// Lamps: each button's RENDERED brightness + held/latched, so a flash toggle or a
|
||||||
|
|||||||
+17
-29
@@ -5445,7 +5445,6 @@ SVGA16::SVGA16(
|
|||||||
BuildWindows(init_width,init_height,windowed, secondaryIndex, aux1Index, aux2Index);
|
BuildWindows(init_width,init_height,windowed, secondaryIndex, aux1Index, aux2Index);
|
||||||
for (int _i = 0; _i < 10; _i++) // DEV-COMPOSITE: lazily created on first surface draw
|
for (int _i = 0; _i < 10; _i++) // DEV-COMPOSITE: lazily created on first surface draw
|
||||||
mDevSurfaceTex[_i] = NULL;
|
mDevSurfaceTex[_i] = NULL;
|
||||||
paletteGeneration = 0; // GLASS dirty-skip palette tracking
|
|
||||||
//STUBBED: VIDEO RB 1/15/07
|
//STUBBED: VIDEO RB 1/15/07
|
||||||
# if defined(DEBUG)
|
# if defined(DEBUG)
|
||||||
Tell("SVGA16::SVGA16()\n");
|
Tell("SVGA16::SVGA16()\n");
|
||||||
@@ -7191,7 +7190,6 @@ void
|
|||||||
|
|
||||||
svga_palette->paletteData.Valid = True;
|
svga_palette->paletteData.Valid = True;
|
||||||
svga_palette->modified = True;
|
svga_palette->modified = True;
|
||||||
((SVGA16 *) graphicsDisplay)->paletteGeneration++; // glass dirty-skip (full rebuild)
|
|
||||||
|
|
||||||
Check_Fpu();
|
Check_Fpu();
|
||||||
}
|
}
|
||||||
@@ -7236,13 +7234,6 @@ void
|
|||||||
SVGA16Palette
|
SVGA16Palette
|
||||||
*svga_palette(&((SVGA16 *) graphicsDisplay)->palette[paletteID]);
|
*svga_palette(&((SVGA16 *) graphicsDisplay)->palette[paletteID]);
|
||||||
|
|
||||||
// GLASS dirty-skip: track whether this write CHANGES anything -- the
|
|
||||||
// ColorMapper family calls this every Execute (the adpal/adpal2 flash
|
|
||||||
// alternates palettes even at zero damage, usually writing identical RGB),
|
|
||||||
// so bump the generation only on a real change or every glass window that
|
|
||||||
// palette-expands would repaint every pump for nothing.
|
|
||||||
int palette_changed = 0;
|
|
||||||
|
|
||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
// If any of the ...TransparentZero modes are used,
|
// If any of the ...TransparentZero modes are used,
|
||||||
// leave color zero undefined for this bit group by
|
// leave color zero undefined for this bit group by
|
||||||
@@ -7284,31 +7275,21 @@ void
|
|||||||
{
|
{
|
||||||
case RedChannel:
|
case RedChannel:
|
||||||
case RedChannelTransparentZero:
|
case RedChannelTransparentZero:
|
||||||
if (destination_triplet->Red != source_triplet->Red)
|
|
||||||
palette_changed = 1;
|
|
||||||
destination_triplet->Red = source_triplet->Red;
|
destination_triplet->Red = source_triplet->Red;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GreenChannel:
|
case GreenChannel:
|
||||||
case GreenChannelTransparentZero:
|
case GreenChannelTransparentZero:
|
||||||
if (destination_triplet->Green != source_triplet->Green)
|
|
||||||
palette_changed = 1;
|
|
||||||
destination_triplet->Green = source_triplet->Green;
|
destination_triplet->Green = source_triplet->Green;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BlueChannel:
|
case BlueChannel:
|
||||||
case BlueChannelTransparentZero:
|
case BlueChannelTransparentZero:
|
||||||
if (destination_triplet->Blue != source_triplet->Blue)
|
|
||||||
palette_changed = 1;
|
|
||||||
destination_triplet->Blue = source_triplet->Blue;
|
destination_triplet->Blue = source_triplet->Blue;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AllChannels:
|
case AllChannels:
|
||||||
case AllChannelsTransparentZero:
|
case AllChannelsTransparentZero:
|
||||||
if (destination_triplet->Red != source_triplet->Red
|
|
||||||
|| destination_triplet->Green != source_triplet->Green
|
|
||||||
|| destination_triplet->Blue != source_triplet->Blue)
|
|
||||||
palette_changed = 1;
|
|
||||||
*destination_triplet = *source_triplet;
|
*destination_triplet = *source_triplet;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -7329,8 +7310,6 @@ void
|
|||||||
|
|
||||||
svga_palette->paletteData.Valid = True;
|
svga_palette->paletteData.Valid = True;
|
||||||
svga_palette->modified = True;
|
svga_palette->modified = True;
|
||||||
if (palette_changed)
|
|
||||||
((SVGA16 *) graphicsDisplay)->paletteGeneration++; // glass dirty-skip
|
|
||||||
|
|
||||||
Check_Fpu();
|
Check_Fpu();
|
||||||
}
|
}
|
||||||
@@ -7434,7 +7413,6 @@ void
|
|||||||
|
|
||||||
svga_palette->paletteData.Valid = True;
|
svga_palette->paletteData.Valid = True;
|
||||||
svga_palette->modified = True;
|
svga_palette->modified = True;
|
||||||
((SVGA16 *) graphicsDisplay)->paletteGeneration++; // glass dirty-skip (full rebuild)
|
|
||||||
|
|
||||||
# if defined(TESTPALETTE)
|
# if defined(TESTPALETTE)
|
||||||
std::cout << "L4GraphicsPort::BuildAuxiliaryPalette for port " <<
|
std::cout << "L4GraphicsPort::BuildAuxiliaryPalette for port " <<
|
||||||
@@ -7545,7 +7523,6 @@ void
|
|||||||
|
|
||||||
svga_palette->paletteData.Valid = True;
|
svga_palette->paletteData.Valid = True;
|
||||||
svga_palette->modified = True;
|
svga_palette->modified = True;
|
||||||
((SVGA16 *) graphicsDisplay)->paletteGeneration++; // glass dirty-skip (full rebuild)
|
|
||||||
|
|
||||||
Check_Fpu();
|
Check_Fpu();
|
||||||
}
|
}
|
||||||
@@ -7580,17 +7557,28 @@ void
|
|||||||
// LEFT AS HEAP GARBAGE and any pixmap pixel >= that count wrote the
|
// LEFT AS HEAP GARBAGE and any pixmap pixel >= that count wrote the
|
||||||
// garbage's high bits into other displays' planes (the #48 stray
|
// garbage's high bits into other displays' planes (the #48 stray
|
||||||
// blocks; convicted live by BT_PLANE_AUDIT -- the 480x640 radar
|
// blocks; convicted live by BT_PLANE_AUDIT -- the 480x640 radar
|
||||||
// background carries index 217). Cycle the in-plane pattern across
|
// background carries index 217). Map the remainder to the plane
|
||||||
// the remainder: high-index art degrades to its (index mod 2^bits)
|
// BACKGROUND (translationTable[0]): high-index art renders as the
|
||||||
// colour IN-PLANE, and can never leak. (The 1995 binary shipped the
|
// port's background colour in-plane, and can never leak.
|
||||||
// same 64-entry fill and relied on art discipline; garbage is not a
|
//
|
||||||
// preservable behaviour, so this is a guarded PORT deviation.)
|
// REFINED 2026-08-10 (the sec-surface phantoms): the first #48 fill
|
||||||
|
// cycled the remainder IN-PLANE (index mod 2^bits), which mapped art
|
||||||
|
// index 254 onto plane slot 62 -- a LIVE colorMapperMultiArmor damage
|
||||||
|
// slot. SMODE.PCC's inactive control-mode box interiors and a stray
|
||||||
|
// 52x13 idx-254 bar baked into BTSEC1.PCX (between the heading dial
|
||||||
|
// and the armor rosette) lit up in the current right-armor damage
|
||||||
|
// colour on every render path. On the shipped machine those regions
|
||||||
|
// rendered BLACK (the heap garbage's low plane bits were 0 ->
|
||||||
|
// in-plane index 0), so background IS the authentic on-screen result.
|
||||||
|
// (The 1995 binary shipped the same 64-entry fill and relied on art
|
||||||
|
// discipline; garbage is not a preservable behaviour, so this stays a
|
||||||
|
// guarded PORT deviation.)
|
||||||
{
|
{
|
||||||
int filled = 1;
|
int filled = 1;
|
||||||
for (int b = bitMask & 0xFF; b != 0; b &= (b - 1))
|
for (int b = bitMask & 0xFF; b != 0; b &= (b - 1))
|
||||||
filled <<= 1;
|
filled <<= 1;
|
||||||
for (int i = filled; i < 256; ++i)
|
for (int i = filled; i < 256; ++i)
|
||||||
translationTable[i] = translationTable[i & (filled - 1)];
|
translationTable[i] = translationTable[0];
|
||||||
}
|
}
|
||||||
Check_Fpu();
|
Check_Fpu();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -382,15 +382,6 @@ protected:
|
|||||||
SVGA16Palette
|
SVGA16Palette
|
||||||
palette[PaletteCount];
|
palette[PaletteCount];
|
||||||
|
|
||||||
// GLASS dirty-skip (2026-08-10): bumped by the palette writers
|
|
||||||
// (L4GraphicsPort::BuildSecondaryColor on a REAL entry change; the full
|
|
||||||
// palette rebuilds unconditionally) so the glass repaint token can see
|
|
||||||
// palette-only animation -- the ColorMapper family (armor rosette tints,
|
|
||||||
// damage flash) changes COLORS with zero pixel writes, which the pixel
|
|
||||||
// checksum alone can never catch.
|
|
||||||
unsigned long
|
|
||||||
paletteGeneration;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int NUMGAUGEWINDOWS;
|
int NUMGAUGEWINDOWS;
|
||||||
HWND *gaugeWindows;
|
HWND *gaugeWindows;
|
||||||
@@ -434,11 +425,6 @@ public:
|
|||||||
// glass repaint pump re-blit ONLY the windows whose plane actually changed
|
// glass repaint pump re-blit ONLY the windows whose plane actually changed
|
||||||
// (idle MFDs / static panels skip; the sweeping radar keeps updating).
|
// (idle MFDs / static panels skip; the sweeping radar keeps updating).
|
||||||
unsigned long PlaneChecksum(int mask) const;
|
unsigned long PlaneChecksum(int mask) const;
|
||||||
|
|
||||||
// GLASS dirty-skip: the palette write generation (see paletteGeneration).
|
|
||||||
// Folded into the repaint token of palette-expanding windows so ColorMapper
|
|
||||||
// palette animation (armor tints / damage flash) repaints without pixel churn.
|
|
||||||
unsigned long PaletteGeneration() const { return paletteGeneration; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//########################################################################
|
//########################################################################
|
||||||
|
|||||||
Reference in New Issue
Block a user