chore: abgen-lods flip for LOD bundles and ISS descriptors - #10114
Conversation
Mirror the abgen-pipeline flip for LODs: the `alfa-abgen-lods` feature
flag or the `--abgen-lods` launch arg moves LodAssetBundlesCDN and
LodGeneratorCDN together onto abgen-cdn, since the ISS descriptors and
the LOD bundles describe one generation. The flag's `lods-base-url` text
variant, or `--abgen-lods-base-url`, points both at an arbitrary base
instead (a bucket prefix holding one run), with the production layout
underneath: LOD/{level}/{sceneId}_{level}_{platform} and
lods-unity/manifests/{sceneId}_InitialSceneState.json.
LOD files are named by scene id only, so each LOD source needs its own
cache namespace. IDecentralandUrlsSource.AbgenLodsCacheKey (null on the
regular pipeline) replaces the "dummyDate" LOD manifest build date in
UpdateSceneLODInfoSystem and salts the ISS descriptor disk-cache key in
GetISSDescriptorIntention.DiskHashCompute. Both are read at use time so
a flag that loads after construction is still honoured. Asset bundles and
the registry do not follow the LOD flip.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
LOD bundles and ISS descriptors now resolve to the published abgen world LOD_1 run b191e06 (2026-09-15, decentraland/abgen PR #118) unless --abgen-lods-base-url points elsewhere. The override is always set, so the --abgen-lods arg and the alfa-abgen-lods flag branches are no longer reached. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
abgen now publishes the LOD generation to abgen-cdn, so the b191e06
prototype bucket default is gone and the "--abgen-lods" arg and the
alfa-abgen-lods flag reach their branches again.
The abgen layout keeps both routes under one "LOD/" prefix:
LOD/{level}/{sceneId}_{level}_{platform} for the bundles, whose segment
already comes from the LOD manifest version, and
LOD/lods-unity/manifests/{sceneId}_InitialSceneState.json for the
descriptors, whose path carries none. ResolveAbgenLodsUrl now appends a
sub-path to every abgen base - empty for the bundles, "/LOD" for the
descriptors - and nothing to the regular hosts, which lay their LOD
generation out as before.
Descriptor file names carry a lower-cased scene id and the bucket is
case-sensitive, so LoadISSDescriptorSystem lower-cases it the way the LOD
bundle path already does; mixed-case Qm ids were 404ing verbatim.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Juan Ignacio Molteni <juanignaciomolteni@gmail.com>
🚦 CI StatusWindows and Mac built successfully in Unity Cloud.
Warnings not reduced: 11881 => 11881 — remove at least 1 warning to merge. Warnings/errors in files changed by this PR (15)Lint run · took 20m 15s All Unity tests passed ✅
Tests time sums the test cases; Job time is the job's wall clock including checkout, licensing and asset import. Slowest tests
Full report: run summary · results + editor logs: editmode · playmode 🏁 Bare-metal benchmark finished — run #35605724255. Full reportPR #10114, run #35605724255 Overall: ✅ no significant changes Builds: Windows change, Windows baseline, macOS change, macOS baseline How to read this table
Apple M1
Intel Core i5
On demand — comment |
abgen publishes no LOD_0 - level 0 comes from the ISS path - and both the descriptor's assets and the v49+ manifest that gates it are resolved by the pipeline flip, so the LOD arg on its own leaves the client reading production manifests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The "lods-base-url" flag variant and the --abgen-lods-base-url arg existed to reach the LOD_1 prototype bucket. abgen publishes its LOD generation to abgen-cdn beside the asset bundles now, so the only two states left are the regular hosts and abgen - ResolveAbgenLodsUrl reduces to the shape ResolveAbgenPipelineUrl already has. Removes the arg, its AppArgsFlags entry and MainSceneLoader wiring, the abgenLodsBaseUrl ctor parameter on both url sources, and the variant constant. The flag-on test now pins AbgenLodsCacheKey outright, since the resolved base is no longer configurable. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DafGreco
left a comment
There was a problem hiding this comment.
✔️ PR reviewed and approved by QA on both platforms following instructions playing both happy and un-happy path
Regressions for this ticket had been performed in order to verify that the normal flow is working as expected:
- [ ✔️ ] Backpack and wearables in world
- [ ✔️ ] Emotes in world and in backpack
- [ ✔️ ] Teleport with map/coordinates/Jump In
- [ ✔️ ] Chat and multiplayer
- [ ✔️ ] Profile card
- [ ✔️ ] Camera
- [ ✔️ ] Skybox
Evidence:
20260918-1138-24.8852674.mp4
Pull Request Description
What does this PR change?
TL;DR — LOD bundles and ISS descriptors can now come from abgen instead of
ab-cdn/lod-generator-unity-cdn, flipped together by thealfa-abgen-lodsflag (or--abgen-lods). The flag is already on in org and zone, so merging puts clients on abgen LODs right away.DecentralandUrlsSource.ResolveAbgenLodsUrl— the descriptors and the bundles describe one generation, like the abgen registry and abgen-cdn do for asset bundles. Asset bundles and the registry do not follow the LOD flip.LOD/prefix, beside the asset bundles on the same CDN:/LOD/{level}/{sceneId}_{level}_{platform}for the bundles (that segment comes from the LOD manifest version) and/LOD/lods-unity/manifests/{sceneId}_InitialSceneState.jsonfor the descriptors, whose path carries none — so only the descriptor base takes the prefix. The regular hosts keep their layout.LoadISSDescriptorSystemlower-cases it as the LOD bundle path already does. Mixed-caseQm…ids were 404ing verbatim.IDecentralandUrlsSource.AbgenLodsCacheKey(null on the regular pipeline) replaces the literal"dummyDate"build date inUpdateSceneLODInfoSystemand salts the ISS descriptor disk-cache key. With the flip off both keys are byte-identical to today, so no existing cache is invalidated.abgen-pipelineflip. abgen's manifest is always v1002+, so its scenes always clear the v49 ISS gate; abgen publishes noLOD/0because level 0 is the ISS path. Hence the two flips belong on together.Routes verified live against
abgen-cdn.decentraland.orgon a sample of Genesis scenes (bafkrei…andQm…ids). Tests inDecentralandUrlsSourceShould: flag on (asserting the/LODdescriptor base and the cache key), the launch arg, and off.Test Instructions
Smoke test — run around Genesis City and check LODs look normal:
alfa-abgen-lodsis already enabled in org, so no launch arguments are needed — LODs should simply be visible, loading in at distance the way they do today. Nothing should look missing, untextured, or mispositioned versus adevbuild.Expected result: walking out from Genesis Plaza across the city, distant scenes fill in with their LOD meshes as usual, and close scenes resolve to the real thing. No holes where a LOD should be.
Then a world — worlds have their own LOD state, so check one too:
First set the scene load distance to 20 in Settings (
SceneLoadRadius), otherwise you never get far enough out for the LOD to kick in. Swissverse has one massive scene: walk away from it and it should swap to its LOD_1 — a visibly simplified but correctly placed and textured version of the same silhouette, not a hole and not a mispositioned block.Confirm with
Player.log~/Library/Logs/Decentraland/Explorer/Player.log%USERPROFILE%\AppData\LocalLow\Decentraland\Explorer\Player.logENABLED FEATURE FLAGSblock listsalfa-abgen-lodsandalfa-abgen-pipeline— that is what puts the session on abgen.LOD AB request for … failedwarnings while walking around. A handful means those scenes are missing from the abgen run; a flood means the source is wrong.Quality Checklist
Code Review Reference
Please review our Branch & PR Standards before submitting.
🤖 Generated with Claude Code