Its far samples took their depth off the coarse pyramid levels but their
colour off the full screen, so a supersampled frame's colour fetches missed
the cache. A half-size colour pyramid beside the depth one now gives each
far sample its colour at its depth's level.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Three channels: near (the speaker's own faction within /say's 25 yards,
heard from where the speaker stands), group/raid and guild (any
distance). Voice never rides the world socket: clients send 20 ms Opus
frames over UDP to moonwell-voice-relay, which forwards each one only
to whoever may hear it, from the state the core feeds it (faction,
map, instance, position, group, guild), so no client can claim a place
or a group of its own. The core vouches for a client with a signed
ticket (`.mwvoice`).
- crates/moonwell-voice: the ticket and feed formats (byte-checked
against the core's own C++ output), the client-relay wire, routing,
the relay binary; with `client`, the microphone and voice output on
their own cpal streams, Opus through the vendored libopus (no cmake),
per-speaker playout queues and the UDP session.
- crates/moonwell/src/voice.rs: the game side: push-to-talk (Mouse4 by
default) or voice activation, near speakers placed by distance and
side, Lua MoonWell_Voice*, settings in moonwell-voice.toml, and the
MoonWellVoice addon (voice.lua): the ticket, /voice and its settings
window (devices by id with their Windows names, activation, key,
threshold and meter, talk channel, channels heard, volumes, echo test).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Light in the air through the sun's shadow cascades (rays through canopies, the air glowing
toward a low sun), secondary lighting off the screen, FXAA and a contrast-adaptive sharpen in
the post pass, bloom from the stock FFXGlow, dense far grass through ClutterConfig (the core
re-meshes on a fade change), wind waves on water without current (city canals included), and
a "WoW Forever look" button in the options window. Everything off still draws the stock image.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The FPS journal writes gpu-passes.log (every top-level GPU pass) and cpu-phases.csv (wall,
process and main-thread CPU per main schedule) beside fps-journal.csv, with a session marker
per recording. On Windows the phase clocks count thread cycles (QueryThreadCycleTime /
QueryProcessCycleTime at a TSC rate calibrated against Instant), since tick-sized process
times cannot split a frame. A crate on top labels recordings through FpsJournalTags; each tag
lands in all three files when recording starts and whenever it changes, and
scripts/journal-report.py summarises a recording per session and tag state side by side.
moonwell-gfx tags recordings with its settings (mwgfx) and gets cheaper at renderScale 2:
- the ambient occlusion reads a linear depth pyramid (ao_depth.wgsl, after McGuire's SAO),
far samples off coarse levels: 2.2-2.4 ms -> ~1.1 ms at 12 MP, image unchanged (max 9/255);
- the water's scene copy is skipped while no view sees a liquid;
- shadow casters take their own visibility class, so the world camera stops listing them.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Add the graphify knowledge graph of crates/ and the CLAUDE.md rules for using it. Only the graph, report, viz and manifest are tracked; caches and scratch files are ignored.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>