v0.5.0 playtest fold-in: fog and near-plane clip, crash fixes, polish (D540-D564)

Deck/Windows playtest fixes: fog rework (D540) and RSP-style CPU near-plane
clip with per-vertex N64 fog (D543), with fog recomputed on near-plane-clipped vertices as the RSP does,
so the haze around the player stays steady (D553); colour-combiner clamp for banded walls
(D548); rocket and thrown-item stack overflows (D545, D549); menu
double-trigger mitigation (D541); Dam ending first-shot camera swivel
restored by removing an old port look-at workaround (D552); settings standardisation (D546), live
All unlocked (D547), F10 mouse (D544); static window title and the project
mark (the in-game crosshair shape, site gold) as window/taskbar icon and
favicon (D550). Reference frames re-based
on Windows, Linux and Steam Deck (A/B-confirmed); capture_p7.sh runs on
Windows. Opt-in update check, off by default (D551: one HTTPS request to
GitHub per launch when enabled; winhttp.dll loaded only then; the tag CI
job checks the tag against GE007_VERSION). Release notes, ROADMAP,
internals and security docs updated; tree-hygiene pass.

Refs: D540 D541 D543 D544 D545 D546 D547 D548 D549 D550 D551 D552 D553 D554 D555 D556 D557 D558 D559 D560 D561 D562 D563 D564
This commit is contained in:
James Dansereau committed 2026-10-06 18:35:44 -04:00
1 parent d7b9371afb
commit 4b710728bf
243 files changed
+2908 -614

No files matched your search

+45
View File
@@ -382,6 +382,51 @@ sync/flush) is shared.
rumble/mempak.
This is simpler than a full Memory Pak/PFS emulation.
* **F10 settings overlay: mouse and scrolling** (`port/src/optionsoverlay.c`,
`port/src/input.c`; D544, D314, D304):
* *Cursor.* `inputSuspendForOverlay()` (`input.c`) drops relative-mouse
grab and calls `mouseRequestCursor(1)`. With `Input.CrosshairCursor` on
(default, D555) `inputApplyMouseRequests()` (host thread) then hides the OS
cursor while the overlay is open and `drawCrosshairPointer()` in
`optionsoverlay.c` draws the game's own `crosshairimage` sprite at the mouse,
last in the overlay DL, at the game's on-screen size; the front end's own
crosshair keeps tracking the mouse (D519) and the pointer is drawn exactly
over it (`inputFrontEndCursorUiFrac()`), so only one shows; in a level it
follows the OS mouse. With the option off the OS arrow shows over the box. One owner of the cursor state (no show/hide race).
* *Hover vs selection.* `overlayHandleInputLocked()` maps the pointer to a
visible row with `overlayRowAtY()` (follows the eased scroll position, so
a click lands on the row it visually covers). Hover sets `s_hover` only
while `s_mouseActive` (mouse moved or clicked); it is a focus cue, never
the selection. The tip line (`helpVis` in the emit path) follows the
hovered row while the mouse is in use, else the selected row. The
wheel clears `s_mouseActive`.
* *Clicks.* Left-click on a row selects it; headers, links and Back act on
the whole row, otherwise only a click in the control span to the right of
the name changes the setting (toggle/cycle, open a dropdown, start a
binding capture, or set + drag a slider). With a dropdown open
(`s_ddRow >= 0`) it owns the pointer: hover picks, click confirms, click
outside or right-click cancels. Right-click elsewhere = Esc/back (closes a
dropdown first, then one page, then the overlay). `s_rmbBlock` holds that
off until release after a binding capture, so a right-click just bound
does not also back out.
* *Scrolling.* Long pages scroll as a window
over the visible-row list (`s_visIdx`/`s_visN`, first displayed entry
`s_scroll`, section header pinned). `overlayUpdateScroll()` moves the
window only when the selection leaves it (D304). The wheel arrives on the
host thread: `optionsOverlayScroll()` only queues notches in
`s_wheelPending` (SDL atomic, D314) and `overlayApplyWheel()` applies them
on the scheduler thread. The drawn position `s_scrollF` eases toward
`s_scroll` each emit (snaps on page change via `s_scrollSnap`).
* *Scrollbar (D556).* A page that overflows (same test as the "^ v" title
marker) draws a thin track + thumb in the card's right margin
(`overlayScrollbar()`: x = right-7..right-4, clear of the value text that
ends at right-10); thumb size = visible/total rows, position from
`s_scrollF`. Mouse: a press on the thumb drags it, a press on the track
pages up/down; both call `overlayScrollTo()`, which sets `s_scroll` and
moves `s_sel` into the window (like the wheel; otherwise
`overlayUpdateScroll()` would snap back). A scrollbar press never reaches
the row-click path.
---
## 8. Recommended plan