30ef1b1929
No behavioural change intended; this is the tidy-up pass after five rounds of track fixes.
Director.cs
* Six MaterialPropertyBlock fields (chara / bgColor1 / bgColor2 / spotlight / uvScroll /
blinkLight) become one shared `PropBlock`. Every use is the same self-contained
Get -> modify -> Set, and the block carries no state across frames or handlers, so the
separate fields were pure duplication. The reason the Get is mandatory (SetPropertyBlock
replaces rather than merges — this is what made GlobalLight dead for 59/59 songs) now
lives on the one shared field instead of being restated per handler.
* ResolveStageTargets wrote four instance fields as de facto out-parameters that
LogBgColor1Resolution read back. Replaced with a returned StageResolveReport, which also
lets the logger become static. `props` is now a required parameter — the `= null` default
silently meant "BgColor1's channel", which is the wrong default for a BgColor2 caller.
* Three duplicated blocks removed: shader-description building (BgColor1 and BlinkLight
logs -> DescribeRendererShaders), vocal entry resolution (InitializeMusic and
GetLiveAllVoiceEntry -> ResolveVocalEntry), and the FOV frame marking copied verbatim
into SaveCameraVMD and SaveMultiCameraVMD (-> MarkFovFrames, which additionally no longer
throws on an empty frame list).
* OnEffectUpdate's three identical "record the frame, bail out" branches collapse into
LoadEffectPrefab returning null.
* HdrBloom's handler and the Bloom volume override are gone. hdrBloomKeys is empty in all
59 songs, and the field-to-URP mapping was never confirmed — so this was code that could
only ever be wrong, plus an effect nobody wrote to. The data layer and the dispatch stay,
so re-adding it is one subscription.
* The BlinkLight TODO no longer lists palette slot mapping: that was reverse-engineered
(slot = the lightNNN_/alphaNNN_ prefix of the renderer or its nearest ancestor).
StageEnvMapDiag.cs deleted (with StageEnvRateToggle and its F9 hotkey). It existed to test one
hypothesis — that the floor blow-out came from DefaultEnvMapNoAmbient's env reflection — and
the verdict experiment ran: _EnvRate = 0 changed nothing. The real cause turned out to be
mirror_a and is fixed. Keeping it meant a full-hierarchy sweep on every stage load and a
hotkey, for a question already answered.
StageController no longer calls it; StageMissingScriptCensus's doc comment stops restating the
signature list that CLAUDE.md already carries.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UzXXkLzVC8pNA3JjyUGMbq