LIVE_AUDIT_2026-08-05.md records the audit behind the previous commit: the
evidence for each fix, the tool invocations that produced it, and — deliberately
— the three conclusions I got wrong before the data corrected them, since each
was a plausible-sounding guess:
* "66 same-named wash lights stay lit" — that 66 is the mob_a000 crowd, not
lights. live10149 has 4 duplicated light names, 10 objects.
* "the light handlers need name -> List support first" — every one of song
1177's 28 BlinkLight group names maps to exactly one GameObject; the groups
address containers and GetComponentsInChildren already covered the children.
* "plane_000 should look lighter than the other two" — _EnvRate 0.75 vs 1.00
cannot be distinguished once the term saturates to white, so that comparison
could never have decided anything either way.
Also records which song exercises which fix, since only 1177 is downloaded
locally and it carries no bgColor2 / spotlight3d / transform data.
Stage floor blow-out (plane_000 / stage_object_001 / specular_002): four
mechanisms now ruled out rather than one cause found. Not lighting — live10149
has 10102 GameObjects and zero Light components, and the Live code never touches
Light at all. Not a missing reflection texture — StageEnvMapDiag reports 0 of 3
null. Not the unwritten _ColorPower — BgColor1's power field has a median of
1.000 on all three groups, which retroactively supports reverting that write.
Not the env reflection term — F9 zeroes _EnvRate on all three renderers, and the
log confirms it fired nine times with no visible change. Also corrects a sampling
error of mine: frame 0 is near-black, but across all 257 keys the floor's median
luminance is 0.548 and 81% of keys exceed 0.3, so it is meant to be bright for
most of the song. Next binary test is forcing _MulColor0 to black.
StageEnvMapDiag logs the env-map bindings once at stage init and attaches an
opt-in F9 toggle that flips _EnvRate between its authored value and 0 through a
property block. Diagnostic only; inert unless the key is pressed.
LIVE_DEV_MAP.md now separates "implemented" from "checked". Ten rows drop to
"OK?" because nobody has verified them — this session found four tracks that
were marked done and had never once produced output, so an unchecked mark is
not evidence of health. GlobalFog drops to partial: its data is height fog
(isDistance=0, isHeight=1) but the handler enables Unity distance fog, and
RenderSettings has no height fog. The claim that BlinkLight and Spotlight3d
drive child Light components was wrong and is corrected.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
All found by auditing the tracks LIVE_DEV_MAP marked as done. Every one of
them parses its keyframes correctly and then drops the result downstream with
no error, so the picture looks plausible and nothing ever surfaces the failure.
Verified against the bundles with tools/ before changing anything.
GlobalLight (48) — 9636 keys / 59 songs, never worked
* Renderer.SetPropertyBlock() replaces the whole block rather than merging.
AlterLateUpdate runs GlobalLight then BgColor1, and both allocated a fresh
block for the same container.Renderers, so BgColor1 wiped all 13 rim
properties every frame. Song 1177 carries GlobalLight x2 and CharaColor x2,
and bgColor1/globalLight both cover 59/59 songs — this was never once live.
* Both handlers now GetPropertyBlock -> modify -> SetPropertyBlock, sharing
one persistent block. The stage-side BgColor1 branch and BlinkLight already
did this; the two character-side handlers were the only exceptions.
* _UseOriginalDirectionalLight / _OriginalDirectionalLightDir moved into the
block too. They were written through renderer.materials, which instantiates
a material copy and allocates an array on every frame, per renderer.
BgColor2 (9) — 14346 keys / 15 songs, at most one group survived
* The dispatcher never filled the group name and the handler never read one,
so up to 15 groups (son1010 carries BgWashA..BgWashO) each repainted the
entire stage every frame and only the last one in list order survived.
* Name is now threaded through and resolved via ResolveStageTargets, writing
_AmbientColor through a MaterialPropertyBlock, resolved once and cached.
* The name -> renderer mapping is still unknown and is NOT guessed here.
BgWashA..O / LaserA..C are neither GameObject names nor _stageObjectUnits
unit names (the three downloaded stages use concrete names like neonsign),
and BlinkLight carries no index back into BgColor2. Unresolved names fall
back to the previous whole-stage write and log a warning, so behaviour is
never worse than before; delete the fallback once the mapping is known.
Spotlight3d (68) — 1089 keys / 31 songs
UVScrollLight (46)
* Both wrote _Color. Enumerating all 499 shaders shows no Gallop/3D/Live/Stage
shader declares it — the only two stage/Bg shaders that do are BgShadowOnly
and RedAlphaGreenColorShadowFogUVScroll, neither related. Spotlight beams are
StageBeamLight*, and UVScroll targets LightAdd1_UV and
StageLightAdd1_UVAlphaMask_TransmittedLightMask; all use _MulColor0 /
_MulColor1 / _ColorPower. The colour write was a no-op while _ColorPower kept
working, so the lights tracked the music in brightness but never in colour.
* This is the same defect as the BlinkLight _Color bug fixed in a3a7b83, twice
over. "The property exists" is not "the target shader has it" — all three
slipped through on that distinction.
* UVScrollLight also gains the previously unused mulColor1, and both now use
MaterialPropertyBlock with cached lookups instead of walking every renderer
on the stage and touching r.materials each frame.
Transform (31) — 681 keys / 12 songs, never worked
* UpdateTransform only consulted StageObjectUnitMap and had no else branch, so
a group named after a GameObject silently did nothing. son1028's first group
is light001_glow_001. This is the mirror image of the Object-track fix in
a3a7b83, which was missing the unit-name path instead.
* Also strips "(Clone)" on the child lookup, which UpdateObject already did.
* TypeTree confirms LiveTimelineKeyTransformData has only position/rotate/
scale and no OffsetType, so absolute writes are correct here.
StageController init — 4 permanently dark lights on live10149
* SetActive(false) sat inside the dedupe check, so among same-named objects
only the first was disabled. Track groups address containers, and the lights
are their children: light001_wash_ground_a (x4), swing_wash_ground_a (x2),
base_rotate_wash_ground_a (x2) and light000_wash_ground_a (x2) all sit under
pfb_env_live10149_blinklight_wash_ground_a. The handler re-enables only the
container, so that one disabled child was never turned back on.
* Now only the topmost timeline-controlled light in each branch is disabled;
descendants keep their prefab state and follow the parent. Dedupe and insert
also agree on the stripped name now.
Only GlobalLight could be verified in the editor — song 1177 carries no
bgColor2, spotlight3d or transform data. The rest is code review plus bundle
ground truth.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every fix here is the same shape: the keyframe data was already parsed
correctly and then dropped somewhere downstream, with no error logged.
Found by dumping the authoritative schema with tools/ and comparing against
what the handlers actually consume.
BgColor1 (8) — the largest track in the corpus, 43617 keys / 59 songs
* AlterUpdate_BgColor1 filtered on a `validBgColorNames` whitelist of four
character group names, discarding the other 16 stage groups outright.
On song 1177 that is ~92% of the track's keys. Filter removed; Director
now routes by group name (characters vs stage).
* Stage branch resolves renderers by walking the whole stage hierarchy.
StageObjectMap alone is not enough: it dedupes by name, and crowd groups
have 66-570 same-named objects, so only the first was ever coloured.
* Writes _MulColor0, confirmed by enumerating the shaders' property tables.
_AmbientColor belongs to BgColor2 — they are separate channels on the
same shader and must not be written by both.
* Populates fields the dispatcher had always left at default: colorPower,
scale, vertexColorToonPower, outlineWidthPower, LightBlendMode,
IsSilhouette, IsProjector, TimelineName.
Object (33) — the neon sign never descended from the ceiling
* The group name `neonsign` is a StageController._stageObjectUnits *unit*
name; no GameObject of that name exists, so the whole track never fired.
UpdateObject now falls back to StageObjectUnitMap and applies to each
child of the unit.
* ObjectUpdateInfo.OffsetType was populated by the dispatcher but never
read, so Add-relative positions were written as absolute and objects
snapped to their parent's origin. Now honoured against a lazily captured
base local TRS.
BlinkLight (45) — 19420 keys / 57 songs, the biggest lighting payload
* Wrote _Color, which does not exist on Gallop/3D/Live/Stage/LightBlinkBlend
(its colour channel is _BlinkLightColor), so the write was a no-op and the
lights rendered black. Now probes the shader for the real property.
* Brightness goes to _ColorPower instead of being folded into the colour,
falling back to colour*power only where that property is absent.
* Uses MaterialPropertyBlock; the old path hit Renderer.materials every
frame, allocating and breaking batching.
PostFilm (39) — ~20200 keys / 59 songs, previously recorded as empty
* Data class fields reordered to the bundle's TypeTree order and the five
missing BlinkLight* fields added; LiveTimelineKeyPostFilmDataList created;
postFilmKeys / postFilm2Keys / postFilm3Keys declared on the worksheet.
Runtime now deserializes 100 / 161 / 87 keys on song 1177.
* AlterUpdate_PostFilm dispatch with interpolation, PostFilmUpdateInfo,
a URP ScriptableRendererFeature and a full-screen blit shader.
* Rendering is disabled by default: filmOptionParam's geometry is undefined
anywhere we can read. All 100 keys on song 1177 are Vignette variants, so
that parameter decides the whole look, and the shader that defines it is
not in the `shader` bundle (all 499 searched by name and by property
signature) — it ships inside the app binary.
Diagnostics
* LiveTimelineWorksheetDiag dumps every track field with group names and key
counts, and Probe() tests whether a candidate field name matches the
bundle TypeTree. Confirmed worksheetList.Count == 1 (SheetType MainLive),
and that WashLightList really is spelled with a capital W — upstream
katboi01 uses washLightList, which never populates.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Replace broad Contains("light") with IsTimelineControlledLight() that matches
only objects actually controlled by timeline handlers (blinklight, spotlight3d,
_wash_, laser). Neonsigns, glow meshes, UV scroll objects and other static stage
props now keep their prefab default state instead of being silently disabled.
Also fix UVScrollLight handler to use GetComponentsInChildren<Renderer>(true)
so inactive renderers are included in material search.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces incorrect RenderSettings.ambient* with per-material
_AmbientColor writes on stage renderers, confirmed via live10106
material dump.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
scrollSpeedX/Y was incorrectly passed to SetTextureScale (tiling),
now accumulated as per-frame offset delta on top of keyframe scrollOffsetX/Y.
Added _uvScrollAccum dict cleared on InitializeTimeline.
Also updated LIVE_TRACKS.md with full-scan coverage numbers and
live-shader-todo.md with blocked-track categorization.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix LiveTimelineBgColor2Data.keys type (BgColor1DataList → BgColor2DataList)
- Add AlterUpdate_BgColor2 call and implementation in LiveTimelineControl
- Subscribe OnUpdateBgColor2 in Director with ambient color handler
- Extract all anonymous delegates in Director to named OnXxxUpdate methods
- Add LIVE_TRACKS.md: full track reference table (IDs 0–102)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Stage light objects have no Unity Light components — they are
self-illuminated meshes. All three handlers now write to MeshRenderer
material properties instead.
BlinkLight: GetComponentsInChildren<Renderer> → _Color + _ColorPower.
pattern==0 uses per-renderer color0Array/powerArray; blink cycle
multiplies col * intensity into _Color.
Spotlight3d: adds _Color + _ColorPower writes after transform update.
color/colorPower fields were previously unused.
WashLight: sets _ProjectorColorPower from CameraProjectionColorPower
on projector materials. _ProjectorMulColor0 left at material default
(no color field in keyData).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Volume, VolumeProfile, TextureCurve are in Unity.RenderPipelines.Core.Runtime,
not in the URP Runtime assembly. asmdef references are non-transitive so
both assemblies must be listed explicitly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Required for UnityEngine.Rendering.Universal namespace used
in Director.cs post-processing handlers.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Three new URP Volume Override tracks (Path A):
ChromaticAberration (73): power → intensity, isEnable toggles effect.
Per-channel redOffset/greenOffset/blueOffset not expressible in URP built-in CA.
HdrBloom (38): bloomIntensity → Bloom.intensity, threshold → Bloom.threshold.
Fields unconfirmed (no bundle data in 30-song scan).
ColorCorrection (61): saturation (game 1.0=neutral) → ColorAdjustments.saturation
(URP range -100..100). redCurve/greenCurve/blueCurve → ColorCurves via TextureCurve.
Depth curves and selective color have no URP equivalent.
Director.InitializeTimeline() acquires or creates a Volume on Camera.main and
adds the required overrides programmatically.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
BlinkLight (pattern != 0): was always on; now computes intensity each
frame from turnOnTime/keepTime/turnOffTime/intervalTime/waitTime/
loopCount/powerMin/powerMax — supports fade-in, hold, fade-out, interval
cycle. pattern == 0 retains the original static per-light path.
ParticleGroup: was driving emission from FlickerLightRate only;
now uses MinMaxCurve(FlickerDarkRate, FlickerLightRate) so Unity
randomly samples between the two rates each emission event.
Also adds TODO comments on WashLight, Laser, UVScrollLight incomplete
fields, updates CLAUDE.md track table and live-shader-todo.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- LiveTimelineEffectData.cs: new data class with full field set
(color, offset, owner, occurrenceSpot, IsLinkOwner*, etc.)
derived from actual cutt asset bundle TypeTree dump
- LiveTimelineWorkSheet: add effectList field
- LiveTimelineControl: add OnUpdateEffect event and AlterUpdate_EffectControl
- Director: add OnEffectUpdate handler and ApplyEffectTransform helper
loads prefab from 3d/effect/live/pfb_{name}, instantiates per key frame
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* update BillboardBuilder
* add a new enum value
* Add the EnableRootMotion option to support scenarios where the character is not within the camera view
* Add support for exporting prop
* update
* compatible with the new version 2
* update
---------
Co-authored-by: 左右看 <1918891542@qq.com>
* Bug fix, improved UI layout and live vocals
* Bug Fixes, New Live Compatibility
* Android build support
* Update build.yml
* Fix issues with the new version of the game
* bug fix
* add config button
* Improve performance
* Sync fork
* bug fix, new uma compatibility
* Add /UserSettings to gitignore
* bug fix, add live characher shader control
* fix compilation errors
* fix compilation errors 2
* fix the live lighting calculation logic
* bug fix, add editor layout settings to gitignore
* bug fix, add editor layout settings to gitignore
* Add time scale keys for live
* live camera bug fix
* add live stage control, optimize live performance
* fix build error
* add uma head custom
* Add tiptoes rotation for VMD export
* Add a save path prompt when exporting VMD files.
* Remove the debug code for body dragging.
* Remove unused physics components to improve performance.
* Fix incorrect VMD exports for loop animations
Fix VMD motion errors during repeated recordings
Fix ghost bone persistence after multiple recordings
* Revert "Remove unused physics components to improve performance."
This reverts commit 7a1ae7f7d13d05380f9215b653d1c6719303a458.
* Reapply "Remove unused physics components to improve performance."
This reverts commit fe4c05f6942198864ca06e25f17a11440961040d.
* fix https://github.com/katboi01/UmaViewer/issues/95
* live timescale bug fix
* bug fix for skin and tail textures in live
* bug fix for skin and tail textures in live (2)
* fix https://github.com/katboi01/UmaViewer/issues/108
* message ui bug fix
* Bug fix, improved UI layout and live vocals
* Bug Fixes, New Live Compatibility
* Android build support
* Update build.yml
* Update build.yml
* Update build.yml
* Update build.yml
* Update build.yml
* Update build.yml
* Fix issues with the new version of the game
* bug fix
* add config button
* Improve performance
* Sync fork
* bug fix, new uma compatibility
* Add /UserSettings to gitignore
* bug fix, add live characher shader control
* fix compilation errors
* fix compilation errors 2
* fix the live lighting calculation logic
* bug fix, add editor layout settings to gitignore
* bug fix, add editor layout settings to gitignore
* Add time scale keys for live
* live camera bug fix
* add live stage control, optimize live performance
* fix build error
* add uma head custom