acdream/tools
Erik 646ccca85e feat(sky): load Setup-backed (0x020xxx) sky objects via SetupMesh.Flatten
Independent code review by an external agent (2026-04-27) flagged
that SkyRenderer.EnsureMeshUploaded only ever called
_dats.Get<GfxObj>(...) — every 0x020xxx Setup ID returned null and
got cached as an empty submesh list, silently dropping every
Setup-backed sky object across the Dereth Region. In Rainy DG3
alone that's 6 dropped SkyObjects (0x02000714, 0x02000BA6 ×2,
0x02000588 ×4, 0x02000589 ×3 across various time-of-day windows).

Verbatim from retail's CelestialPosition struct at acclient.h:35451:

    struct CelestialPosition {
        IDClass<...> gfx_id;
        IDClass<...> pes_id;          // particle scheduler
        float heading; float rotation;
        Vector3 tex_velocity;
        float transparent; float luminosity; float max_bright;
        unsigned int properties;
    };

Per the named retail decomp, CPhysicsObj::InitPartArrayObject (decomp
~280484) dispatches gfx_id by type prefix: type 6 → direct GfxObj,
type 7 → Setup via CPartArray::CreateSetup (decomp ~287490) which
walks Setup.Parts. Mirror that here: detect 0x020xxxxx in
EnsureMeshUploaded, route to a new EnsureSetupUploaded helper that
flattens via SetupMesh.Flatten (existing Phase-2 utility) and bakes
each part's transform into the vertex positions before upload.
Sky setups don't animate in any way that affects the static-mesh
visual we render here.

Probe extension: also added the Diffuse column to RainMeshProbe's
sky-surface audit so the (Type, Translucency, Luminosity, Diffuse)
quadruple is visible on every flag-bit row.

Visual impact at verification launch: not observable. The Setup
objects in Rainy DGs appear to be tiny placeholder meshes existing
mainly to anchor PES emitters. The dynamic "aurora-like" sheen the
user observes in retail comes from the PES particle layer, which
remains unimplemented (issue #28). Keeping this fix because the
geometry path is now decomp-correct and provides foundation for
the eventual PES wiring.

Issue #29 filed for the residual cloud-density gap. 1227 tests pass.
2026-04-27 23:24:09 +02:00
..
dump-keymap docs(research): canonical retail keymap + dump-keymap tool 2026-04-25 23:01:58 +02:00
ghidra_project feat(core): port decompiled AC client physics — CollisionPrimitives + PhysicsBody 2026-04-12 23:54:51 +02:00
pdb-extract docs(research): #9 sweep acclient_function_map.md against PDB symbols 2026-04-25 17:44:07 +02:00
PesChainAudit docs(research): sky/weather investigation handoff + diagnostic tools 2026-04-26 21:40:34 +02:00
RainMeshProbe feat(sky): load Setup-backed (0x020xxx) sky objects via SetupMesh.Flatten 2026-04-27 23:24:09 +02:00
RetailTimeProbe sky(phase-8): retail-faithful night sky + README refresh 2026-04-24 20:34:36 +02:00
SkyObjectInspect sky(phase-8): retail-faithful night sky + README refresh 2026-04-24 20:34:36 +02:00
StarsProbe tools(probe): add StarsProbe to dump every SkyObject's geometry + UVs 2026-04-26 22:19:28 +02:00
TextureDump docs(research): sky/weather investigation handoff + diagnostic tools 2026-04-26 21:40:34 +02:00
WeatherEnumerator docs(research): sky/weather investigation handoff + diagnostic tools 2026-04-26 21:40:34 +02:00
WeatherSetupProbe docs(research): sky/weather investigation handoff + diagnostic tools 2026-04-26 21:40:34 +02:00
decompile_acclient.py research: decompile acclient.exe terrain/physics via Ghidra headless 2026-04-12 23:18:27 +02:00
decompile_full.py research: full acclient.exe decompilation — 22,225 functions, 688K lines 2026-04-12 23:25:51 +02:00
DecompileTargets.java research: decompile acclient.exe terrain/physics via Ghidra headless 2026-04-12 23:18:27 +02:00
ghidra_decompile.py research: decompile acclient.exe terrain/physics via Ghidra headless 2026-04-12 23:18:27 +02:00