Skip to content

MatrixRain 1.5.2161

Latest

Choose a tag to compare

@github-actions github-actions released this 07 Jun 15:37
a1fe489

[1.5.2161] - 2026-06-06

Added

  • Two-tab configuration property sheet. The single-page settings dialog
    is now split into Visuals and Performance tabs hosted by the Win32
    PropertySheetW host control. Visuals owns Density, Speed, Glow Intensity /
    Size, Color scheme, the Scanline Intensity / Style sliders, and
    Start-in-fullscreen. Performance owns Multi-monitor, Enable glow, Enable
    scanlines, GPU adapter, Quality preset + advanced sliders, and Show
    performance metrics. Each page shows the primary monitor's FPS
    and the process's GPU load in a bottom-right readout, updated once per
    second (NN fps, NN% GPU).
  • Cross-page "Reset to defaults" button. Lives in the property-sheet
    footer (left of OK/Cancel) and resets every control on both tabs in one
    click; the live preview snaps back instantly. The persisted 16-swatch
    custom-colour palette is preserved across Reset (FR-035 carve-out).
  • Enable glow checkbox on the Performance tab. Toggling it OFF
    bypasses the entire bloom pipeline (no extract / blur / composite passes)
    and greys every glow-dependent control on both tabs with an explanatory
    tooltip pointing at the toggle's location. Bloom GPU resources stay
    allocated so re-enabling is instant. Replaces the v1.4 "Glow Intensity =
    0" workaround; the slider minimum is back to 1.
  • CRT scanlines post-process (Enable toggle on Performance; Intensity /
    Style sliders on Visuals). Enabled by default
    on fresh installs and after upgrade (see migration note below). Intensity
    slider (1-100, default 30) controls darkening strength; Style slider
    (1-100, default 50) controls line density (Style 1 ≈ 981 lines / Style
    100 ≈ 150 lines, geometric falloff). Runs independently of glow — the
    no-glow render path routes through m_postBloomTarget so the scanline
    PS always has a populated SRV.
  • Custom color picker as a sixth Color combo entry (Custom…).
    Selecting it opens the standard Win32 ChooseColor dialog pre-populated
    with the prior custom RGB (default RGB(0, 255, 0)). The 16-swatch
    palette persists across launches (and across Reset). A clickable
    owner-draw colour swatch next to the combo previews the selected scheme;
    in Cycle mode the swatch animates at 30 Hz in sync with the rain.
    Clicking the swatch opens the chooser regardless of which scheme is
    currently active.
  • Per-page live FPS / GPU% readout in each page's bottom-right corner.
    Stable tab title text ("Performance") avoids the per-second tab-control
    flicker that an earlier prototype had.

Changed

  • Glow Intensity slider minimum reverted from 0 to 1 (the dedicated
    Enable glow toggle now owns "off").
  • Label renames in the Performance tab: "Render on all monitors" →
    "Use all monitors"; "Show debug statistics" → "Show performance
    metrics". Registry value names unchanged; existing installs round-trip
    without migration.
  • Modeless property-sheet teardown now uses the canonical
    PropSheet_GetCurrentPageHwnd polling pattern in the main message
    loop instead of DestroyWindow-from-PSN_APPLY (which re-entered the
    frame subclass and overflowed the stack).
  • Config dialog Z-order is re-asserted after
    Application::RebuildContextsForCurrentMode so toggling Start In
    Fullscreen no longer hides the dialog behind the freshly-created
    rain window.
  • Overlay text colour (Settings/Help/Exit hint, ? hotkey list,
    /? usage dialog) now resolves ColorScheme::Custom from
    snapshot.customColor instead of falling through GetColorRGB's
    green fallback.

Removed

  • The orphan fade-timer debug overlay (ShowFadeTimers registry value,
    m_showFadeTimers field, dialog checkbox, and the backtick () debug hotkey). Legacy ShowFadeTimers` registry values are silently
    ignored on Load.

Fixed

  • Reset-to-defaults wiped the saved custom-colour palette. The 16
    saved swatches now survive Reset and Reset→OK per FR-035.
  • Glow-off path could sample stale bloom. The no-glow composite
    branch now binds a null SRV at slot 1 so the composite PS doesn't
    resample whatever bloom texture was left bound by a prior frame.
  • Window-message ID collision. Two WM_APP messages (Reset-button
    reposition and custom-colour-chooser open) had been defined with the
    same numeric value; separated to distinct IDs.
  • Modeless PropertySheetW failure path. A -1 return is now
    recognised as failure instead of being cast to (HWND)-1 and treated
    as a valid sheet handle.

Upgrade migration note

Visible change on first launch after upgrading from v1.4: existing
installs will see scanlines render immediately on the first v1.5 launch,
because ScanlinesEnabled defaults to ON. If you'd prefer the v1.4
look, open Visuals → Scanlines and uncheck Scanlines Enabled.
The setting persists across runs. All other v1.4 settings (density,
color scheme, glow intensity, multi-monitor, GPU adapter, quality
preset, advanced sliders) round-trip unchanged on upgrade.

Known Issues

  • ARM64 builds require serial (/m:1) MSBuild invocation under the
    current Visual Studio 18 ARM64 cross-compile toolchain due to a
    per-process virtual-memory limit on PCH state when the test project
    is built in parallel with the EXE. This is a build-host concern, not
    a runtime issue; the resulting binaries are identical.

[1.4.2098] - 2026-06-06

Added

  • User Story 1 (P1) — Runtime topology and device-loss recovery. MatrixRain now responds to monitors being added or removed while running (WM_DISPLAYCHANGE, coalesced across windows) and to the active GPU becoming unavailable (driver reset, sleep/resume, eGPU unplugged - detected via Present HRESULT). The render context is rebuilt automatically; this fixes the previously-reported "GPU stuck at ~90% after undocking a Surface Book 3" defect where the ghost monitor's render thread continued processing forever.
  • User Story 2 (P1) — Optional multi-monitor spanning. New "Use all monitors" checkbox in the configuration dialog (default on). Toggling it live applies within 1 second; Cancel reverts.
  • User Story 3 (P2) — GPU adapter selection. New "GPU" dropdown in the configuration dialog listing each real adapter name (with "(default)" appended to the system default). Software/WARP adapters are excluded. Selection persists by description string; if the saved adapter is missing at startup, the application silently falls back to the system default. Live device-switch takes effect within 1 second.
  • User Story 4 (P2) — Frame cap on high-refresh monitors. Per-monitor FrameLimiter engages only when the monitor's native refresh exceeds 60 Hz, capping that monitor's rendering to 60 FPS. At ≤60 Hz the existing vsync path is preserved with no measurable per-frame overhead. Substantially reduces GPU work on 144Hz / 165Hz laptop displays.
  • User Story 5 (P3) — Graphics quality preset spectrum. New "Quality" slider (Low / Medium / High / Custom) in a "Graphics quality" group box. Three discrete tuning sliders are always visible — Glow passes (1-4), Glow resolution (Eighth / Quarter / Half / Full), Glow smoothness (Low / Medium / High). Each quality-related control has an "ⓘ" infotip; hovering or tabbing-then-pressing-Space/Enter reveals a tooltip with a description and standardized GPU-performance-impact phrase. First-run heuristic picks a starting preset based on detected GPU class and total monitor pixel count (discrete → High; integrated + modest load → Medium; integrated + heavy load → Low). Custom-drift behaviour: any direct edit of an advanced control auto-flips the preset to Custom and saves the resulting values for restoration when the user later re-selects Custom.

Changed

  • Bloom pipeline is now runtime-parametric: blur passes (1-4), bloom buffer resolution (full/half/quarter/eighth), and blur kernel taps (5 / 9 / 13) are all selectable per-frame from the quality preset / advanced sliders. Three blur shader variants are compiled at startup so the tap-count switch is free at draw time.
  • Default settings on a fresh install now pick a quality preset matched to detected hardware rather than always using the maximum.