# Original galaxy frame fade state and production binding The offline source is the read-only client copy with SHA-256 `6891f70a021fa9f3a0e00458c284f48d1226e68ae7fc02ad48081aed47857e93`. These RVAs describe that copy only; they are not native addresses for the current `ed5` client. No game process was opened or invoked. Run `research/Trace-OriginalGalaxyFrameFadeState.py` and `research/Trace-OriginalGalaxyFrameClock.py` with the reverse toolkit Python. Their byte-guarded results are `artifacts/galaxy-query-research/power-outer-sources/frame-fade-state/original-frame-fade-state.json` and `original-frame-clock.json`. The numerical tests are in that directory's `clock-tests/test-results.json` (18 passed: 9 existing fade tests, 5 state tests and 4 clock tests). ## State initialization is zero at activation Input component `3AC8790` exposes its general interface at component8, vtable `552B3E0`. Virtual60 is activation `3B37630`. That function binds the real controls and enables the dependency at component68. Its this pointer is component8; the store at `3B3765C` writes zero to this1A0, which is component1A8. Thus the recovered initial current transition is `0` at activation. The constructor alone did not prove this value. The state advances in `3AF5D70` and remains separate from its distance-derived target. The clock trace now closes its source: ordinary main loop `7F8CC0` obtains `GetSystemTimeAsFileTime` through `54D7D0`, subtracts the previous timestamp through `53E6E0`, and `52C3F0` converts seconds64 plus nanoseconds32/1e9 to float seconds. `7F3430` clamps raw seconds to at least1e-5, with an upper limit of.5 unless raw is strictly greater than4 seconds, in which case the upper limit is1/30. Explicit fixed-step mode uses1/app9B0 before the same clamps. This value goes through actual app virtualD0 (`1EB9C0`, stores8494), then virtualC8 (`1EB050`) publishes8494 unchanged to global `5F007A0`. `5FDB7D0` is the subscription type/dependency key, not the publisher. Dispatch `1EC720 ->1E7040 ->5529D98[0]/3ABA020 ->3AF5D70` forwards the float without further arithmetic; its parallel wrapper uses the same worker. The event is emitted before the5F052C0 and input5F05BC0 phases within1EB050. No fixed wall-time cadence is inferred. ## Settings threshold and renderer radius are the same actual value The Settings dependency ID at `5FA0A10` is read by the input constructor into its dependency at componentE8/F0. Renderer provider `3A5E4E0` publishes renderer component60 for that ID. The renderer constructor `3A06740` places vtable `551F408` at component58. Input's threshold call first subtracts8 from its F0 pointer, then calls virtual30. Vtable `551F408+30` is `1A3C960`, whose entire getter is `lea rax,[rcx+228]; ret`. Its returned pointer is therefore renderer component280. This is the same component280 updated by radius publisher `3AB5A60` through interface228, and the same source consumed by frame builder `3A26260 ->3ACA010`. The tool can bind the current ordinary catalogue `Descriptor.InnerRadius` to both the target threshold and prepared fade radius. Constructor50, sparse `OuterRadius` and `QueryFar` are not substitutes. A verified zero radius is valid: the original strict-less-than comparisons take the mode endpoint branch without entering the linear division. ## Tool-owned state API `GalaxyOriginalFrameFadeState` owns one tool camera/input lifetime. `Activate()` resets its current transition to the proved initial0. Call `TryAdvanceForCamera(actualCamera, rendererInnerRadius, originalViewMode, inputFrameValue)` once per input event, using the actual smoothed camera and the explicit input-frame float. The same radius drives both threshold and prepared radii. Multiple consumers then call `TryCreateForCamera(actualCamera, rendererInnerRadius, out fade)` without advancing the state again. Null or invalid required event inputs invalidate transition history. Later valid distance/radius parameters cannot recover a missing current value from the target. A new tool activation starts a fresh known-zero lifetime. `GalaxyOriginalFrameFadeClock.TryFromElapsedSeconds` binds tool elapsed seconds through the now-proved normal clock policy; fixed step remains explicit. The API does not import another game camera's live transition or assume a timer cadence. The previously recovered frame mapping remains: native camera is embedded at frame20; frame40 is its Forward and frame50 its Eye; the ellipsoid uses the independent orbit Focus. `TryCreateForCamera` binds these from the tool's actual camera. Near depth fade is1.5..3ly and far fade600..700ly. The tests establish numerical/state behavior, not live or visual parity.