Adds the first on-screen HUD for the dev client plus today's mouse-control refinements. Also lands yesterday's scenery-alignment changes that were left uncommitted in the working tree. Overlay: - BitmapFont rasterizes a system TTF via StbTrueTypeSharp into a 512x512 R8 atlas at startup (Consolas on Windows, DejaVu/Menlo fallbacks) - TextRenderer batches 2D quads in screen-space with ortho projection; one shader + two draw calls (rect then text) for panel backgrounds under glyphs - DebugOverlay composes info / stats / compass / help panels on top of the 3D scene; toggles via F1/F4/F5/F6; transient toasts for key events - DebugLineRenderer and its shaders (carried over from the scenery work) are properly committed in this commit Controls: - Per-mode mouse sensitivity (Chase 0.15, Fly 1.0, Orbit 1.0); F8/F9 to adjust the active mode multiplicatively (x1.2) - Hold RMB to free-orbit the chase camera around the player; release stays at the new angle (no snap-back) - Mouse-wheel zooms chase distance between 2m and 40m - Chase pitch widened to [-0.7, 1.4] so mouse-Y tilts both ways from the default neutral angle Scenery alignment (carried from yesterday's session): - ShadowObjectRegistry AllEntriesForDebug + Scale field - SceneryGenerator uses ACViewer's OnRoad polygon test + baseLoc + set_heading rotation - BSPQuery dispatchers accept localToWorld so normals/offsets transform correctly per part - TransitionTypes.CylinderCollision rewritten with wall-slide + push-out - PhysicsDataCache caches visual-mesh AABB for scenery that lacks physics Setup bounds
4.9 KiB
4.9 KiB
Session 2026-04-17 — Debug Overlay + Control Tuning
Headline result
On-screen HUD overlay and refined input controls for the dev client.
- TTF-based font atlas rendered via stb_truetype
- Screen-space text + rect batcher (
TextRenderer) - Composite overlay with panels for position / heading / collision / FPS / compass / keybind help
- Per-mode mouse sensitivity (Chase, Fly, Orbit)
- RMB-held free-orbit around the player (no snap-back on release)
- Mouse-wheel zoom in chase mode
- Extended chase pitch range so mouse-Y moves both ways
Files added
src/AcDream.App/Rendering/BitmapFont.cs— TTF atlas (stb_truetype)src/AcDream.App/Rendering/TextRenderer.cs— 2D quad batcher for text + rectssrc/AcDream.App/Rendering/DebugOverlay.cs— composed HUD panelssrc/AcDream.App/Rendering/Shaders/ui_text.{vert,frag}— ortho-proj text shadersrc/AcDream.App/Rendering/Shaders/debug_line.{vert,frag}— wireframe shader (carried from yesterday's scenery-alignment session but not committed then)
Files modified
src/AcDream.App/AcDream.App.csproj— addedStbTrueTypeSharp1.26.12src/AcDream.App/Rendering/Shader.cs— addedSetVec2/SetVec4src/AcDream.App/Rendering/ChaseCamera.cs- Added
YawOffsetfor RMB free-orbit - Added
AdjustDistancefor mouse-wheel zoom - Widened pitch clamp from
[0.05, 1.4]to[-0.7, 1.4](mouse-Y now moves camera in both directions from neutral) DistanceMin=2f,DistanceMax=40fzoom envelope
- Added
src/AcDream.App/Rendering/GameWindow.cs- Field block:
_textRenderer,_debugFont,_debugOverlay,_sensChase/_sensFly/_sensOrbit,_rmbHeld,_lastFps,_lastFrameMs - OnLoad: load Consolas → BitmapFont → TextRenderer → DebugOverlay (silently skips if no system font)
- Keyboard: F1/F2/F4/F5/F6 panel toggles; F8/F9 sensitivity (multiplicative ×1.2 steps, per-mode)
- Mouse: MouseDown / MouseUp track RMB; MouseMove routes to the active mode's sensitivity; RMB release does NOT snap YawOffset
- OnRender: snapshot builder (player pos, heading, nearest-obj dist,
colliding flag) passed to
DebugOverlay.Draw
- Field block:
Yesterday's scenery work (finally committed in this session's commit)
The untracked files show that yesterday's scenery-alignment fixes lived on disk but hadn't been committed. This session's commit includes:
src/AcDream.Core/Physics/BSPQuery.cs—localToWorldrotation paramssrc/AcDream.Core/Physics/PhysicsDataCache.cs—GfxObjVisualBoundssrc/AcDream.Core/Physics/ShadowObjectRegistry.cs—Scale+ debug itersrc/AcDream.Core/Physics/TransitionTypes.cs— rewritten cylinder / BSPsrc/AcDream.Core/World/SceneryGenerator.cs— 64-cell, ACViewer OnRoad, baseLoc + set_heading rotationsrc/AcDream.Core/World/WorldEntity.cs—Scalefield
Sensitivity defaults (current)
| Mode | Default | F8 step | F9 step |
|---|---|---|---|
| Chase | 0.15x | ÷ 1.2 | × 1.2 |
| Fly | 1.0x | ÷ 1.2 | × 1.2 |
| Orbit | 1.0x | ÷ 1.2 | × 1.2 |
Effective rate at chase 0.15x: 0.15 × 0.003 rad/px = 0.00045 rad/px
≈ 0.026°/pixel. 1000 pixels → 26° rotation.
Fly at 1.0x is 0.003 rad/px ≈ 0.172°/px.
Keybinds (full, current)
| Key | Action |
|---|---|
| F1 | Toggle keybind help panel |
| F2 | Toggle collision wireframes |
| F3 | Console dump (pos + nearby objects) |
| F4 | Toggle HUD info panel |
| F5 | Toggle HUD stats panel |
| F6 | Toggle compass |
| F8 / F9 | Active-mode mouse sensitivity slower / faster |
| F | Toggle fly camera |
| Tab | Toggle player mode (live session only) |
| WASD | Move (player mode) / fly |
| Space | Jump (hold to charge, release to fire) |
| Shift | Run |
| Mouse | Turn character / look |
| Hold RMB | Free-orbit camera around player (stays on release) |
| Wheel | Zoom chase distance |
| Escape | Exit fly / player / close window |
Open issue (parked for follow-up)
User reports mouse "feels like you can only move one way" at low
sensitivity. Diagnosed + fixed: chase PitchMin was clamping at
0.05f, preventing any upward tilt. Widened to -0.7f. Needs
visual verification next session.
Pickup for next session
MAJOR TASK PARKED HERE: user has asked for a deep investigation
- port of the retail AC client's GUI subsystem. User explicitly
directed Opus 4.7 with extra-high effort for this work. The
agents are dispatched in this session and their output lives in
docs/research/2026-04-17-retail-ui-*.md. See that set of files for the in-depth UI research + C# scaffold.
After the retail-UI port is in place:
- Hook the retail chat window to the existing WorldSession message stream
- Port the health/stamina/mana globes to real player stats (need
CharacterCreate/InqStatswire parsing first) - Port the inventory panel (needs CreateObject item parsing)