Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
58e9bbe
fix(look): the sun is Unreal's 6 lux and the fixed exposure is Unreal…
jonit-dev Nov 3, 2026
601ce17
test(scaffold): re-pin the six kits the 6 lux sun moved (PRD-632)
jonit-dev Nov 3, 2026
3417676
fix(look): rough surfaces shade as a fresh Unreal project's Substrate…
jonit-dev Nov 3, 2026
d43e2aa
style(starter): biome format of shadeLikeSubstrate, starter hash re-p…
jonit-dev Nov 3, 2026
639a9db
docs(prd): PRD-632 decisions: Substrate energy conservation, the sun0…
jonit-dev Nov 3, 2026
7316f2d
fix(unreal-look): the L9 post chain follows ?tier=; PRD-632 AC-2 and …
jonit-dev Nov 3, 2026
366f847
fix(unreal-look): L9 switches reach the template arm; ?legacyLook=1 i…
jonit-dev Nov 3, 2026
ab3d3cf
fix(runtime-native): the native three/tsl shim declines F_Schlick, sp…
jonit-dev Nov 3, 2026
57f8925
feat(look): Unreal's 43.7 LUT channel clip is on by default (PRD-632 …
jonit-dev Nov 3, 2026
ace57f1
docs(prd): PRD-632 AC-3 judge result (REGRESSION on interiors, GI bou…
jonit-dev Nov 3, 2026
fb26f33
fix(runtime-native): F_Schlick keeps three/tsl's export name under th…
jonit-dev Nov 3, 2026
7e42dc1
chore(unreal-look): PRD-632 re-cuts the reference board: 520 regions …
jonit-dev Nov 3, 2026
109e8ec
Merge origin/develop into prd/632-filmic-exposure (status files regen…
jonit-dev Nov 3, 2026
a66f55e
fix(vsm): the depth pad no longer widens the soft shadow search or th…
jonit-dev Nov 3, 2026
f673386
docs(prd): PRD-632 defers AC-1 and AC-3 with revisit conditions, tick…
jonit-dev Nov 3, 2026
fa269c0
fix(ci): starter render source may call useRoughDiffuse (PRD-632)
jonit-dev Nov 3, 2026
4a2c5bd
Merge remote-tracking branch 'origin/develop' into prd/632-filmic-exp…
jonit-dev Nov 3, 2026
e47916b
fix(quality): the F_Schlick cast in rough-diffuse carries its waiver …
jonit-dev Nov 3, 2026
7b1d44c
test(native): the rough diffuse reference keeps the Substrate slab's …
jonit-dev Nov 3, 2026
5217b15
docs(prd): PRD-632 is done: box 111 ticked on a green full board, mov…
jonit-dev Nov 3, 2026
cfe773f
Merge origin/develop into PRD-632 (PR #607): develop's exposure deriv…
jonit-dev Nov 4, 2026
d68bd2b
docs(native): refresh the native coverage record for the merged tree …
jonit-dev Nov 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,14 +184,14 @@ ported from what its source does, never from its code, under a PRD in
Every Unreal 5.8.3 system that sets the look or the frame cost, split into 380 subsystems and
measured in lines of the Unreal source. Each one maps to the ThreeNative PRD that ports it.

**21% done · 24% in progress · 34% not started · 18% deferred · 1% with no PRD** (share of 676K Unreal lines; the tool-heavy Niagara, Landscape, World Partition, RHI and RenderCore modules are left out)
· 87 open PRDs on this branch · 51 subsystems with no PRD
**23% done · 22% in progress · 34% not started · 18% deferred · 1% with no PRD** (share of 676K Unreal lines; the tool-heavy Niagara, Landscape, World Partition, RHI and RenderCore modules are left out)
· 86 open PRDs on this branch · 51 subsystems with no PRD

[![Unreal port progress map](docs/PRDs/Unreal/research/unreal-port-status.svg)](docs/PRDs/Unreal/research/unreal-visuals-and-performance-feature-map.html)

**Pace:** 109 PRD boxes ticked a week over the last 2 weeks. The port order runs waves 1-4 first,
so at that pace the default look is done about **Nov 25, 2026**, and everything filed today about
**Dec 20, 2026**. Scope grows as PRDs are filed, so read the dates as the earliest finish.
**Pace:** 105 PRD boxes ticked a week over the last 2 weeks. The port order runs waves 1-4 first,
so at that pace the default look is done about **Nov 26, 2026**, and everything filed today about
**Dec 22, 2026**. Scope grows as PRDs are filed, so read the dates as the earliest finish.

[![Unreal port burn-up](docs/PRDs/Unreal/research/unreal-port-progress.svg)](docs/PRDs/Unreal/research/unreal-visuals-and-performance-feature-map.html)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ that a sun disc of 1% of the frame does not move the exposure.
pass sums the tiles. It stays fragment-only and runs on every backend that runs the mean meter.
The meter's luminance clamp moved from 8 to 65 504 (half-float overflow guard only), as the
Solution says.
- 2026-10-19 (PRD-631 reference plan): Turning this histogram on by default, with Unreal's speeds (3 stops/s brightening, 1 stop/s darkening), range (−10 to +20 EV100) and +1 EV bias, is owned by [PRD-632](../../Unreal/look/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md). This PRD's scope and boxes are unchanged.
- 2026-10-19 (PRD-631 reference plan): Turning this histogram on by default, with Unreal's speeds (3 stops/s brightening, 1 stop/s darkening), range (−10 to +20 EV100) and +1 EV bias, is owned by [PRD-632](../../done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md). This PRD's scope and boxes are unchanged.

## Blocked on

Expand Down
4 changes: 2 additions & 2 deletions docs/PRDs/Unreal/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,15 +126,15 @@ A layer turns on by default only when five conditions hold:
| Layer | Adds | Owner |
| --- | --- | --- |
| L0 | Geometry and camera alignment | [PRD-631](../done/PRD-631-an-unreal-reference-scene-measures-the-default-look.md) |
| L1 | Tone curve, exposure, light units | [PRD-632](look/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) |
| L1 | Tone curve, exposure, light units | [PRD-632](../done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) |
| L2 | Sky atmosphere and sky light capture | [PRD-633](look/PRD-633-the-sky-is-an-atmosphere-and-it-lights-the-scene.md) |
| L3 | Height fog and aerial perspective | [PRD-562](rendering/PRD-562-aerial-perspective-from-a-froxel-volume.md) (amended) |
| L4 | Volumetric clouds | [PRD-VQ-08](rendering/PRD-VQ-08-clouds-and-overhead-transmittance.md) (amended) |
| L5 | Sun shadows: coverage and source-angle penumbra | [PRD-634](look/PRD-634-sun-shadows-reach-the-horizon-and-soften-with-distance-from-the-caster.md); page cost in [PRD-457](rendering/PRD-457-virtual-shadows-scale-by-measurement.md) |
| L6 | Ambient occlusion on indirect light only | [PRD-635](look/PRD-635-ambient-occlusion-darkens-only-the-light-that-comes-from-around.md) |
| L7 | Global illumination | The [GI set](#global-illumination-the-lumen-set-filed-2026-10-20) below: PRD-603 to PRD-605, PRD-638 to PRD-645, PRD-VQ-09; templates last through [PRD-267](../useful-defaults/PRD-267-screen-space-gi-ships-in-the-templates.md) (amended) |
| L8 | Reflections | [PRD-642](gi/PRD-642-glossy-surfaces-reflect-what-the-camera-cannot-see.md) on `high`; [PRD-VQ-03](../rendering/PRD-VQ-03-local-reflection-probes.md) (amended) on `low` and `medium` |
| L9 | Bloom, vignette, local exposure, motion blur, neutral grade | [PRD-636](look/PRD-636-the-finishing-post-chain-matches-unreal-defaults.md); anti-aliasing in [PRD-539](../done/PRD-539-low-resolution-temporal-reconstruction-quality-and-cost.md) (amended); exposure default in [PRD-632](look/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) |
| L9 | Bloom, vignette, local exposure, motion blur, neutral grade | [PRD-636](look/PRD-636-the-finishing-post-chain-matches-unreal-defaults.md); anti-aliasing in [PRD-539](../done/PRD-539-low-resolution-temporal-reconstruction-quality-and-cost.md) (amended); exposure default in [PRD-632](../done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) |

Order: PRD-631 first, then PRD-632, because every later row is compared at matched exposure. After
that, PRD-633 and PRD-635 can run in parallel, then the rest. Not filed: a surface BRDF PRD. three.js
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ prd_contract: v1
**Priority:** P1 — no box is ticked: until ThreeNative loads the Unreal calibration scenes with the same geometry, materials, lights and units, a GI difference cannot be told apart from a scene difference.
**Complexity:** 6 (MEDIUM) — 1–5 files: a scene loader in the harness, the unit conversions, one visualize node, specs (+1), new module: the calibration scene loader (+2), crosses the engine boundary: the owned engine must render every light class the scenes use (+2), native proof (+1); risk override: none
**Owner:** João
**Depends on:** [PRD-638](../../done/PRD-638-calibration-scenes-are-built-in-unreal-and-captured-as-the-gi-target.md) Phase 1 (`cornell`, its `scene.json` and `scene.glb`). [PRD-632](../look/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (light units and EV100). The loop that uses the recreated scenes is [PRD-647](../../done/PRD-647-a-visual-judge-calibrates-gi-against-the-unreal-scenes-until-parity.md).
**Depends on:** [PRD-638](../../done/PRD-638-calibration-scenes-are-built-in-unreal-and-captured-as-the-gi-target.md) Phase 1 (`cornell`, its `scene.json` and `scene.glb`). [PRD-632](../../done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (light units and EV100). The loop that uses the recreated scenes is [PRD-647](../../done/PRD-647-a-visual-judge-calibrates-gi-against-the-unreal-scenes-until-parity.md).

## Context

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ prd_contract: v1
**Priority:** P2 — shipped templates remain unchanged: every template's sky and ambient light come from a fixed photograph, so the sun cannot move and the sky never tints the scene the way Unreal's default level does.
**Complexity:** 6 (MEDIUM) — template sky source in 13 templates (+2), a core sky-capture mechanism with an amortized refresh (+2), native proof of the LUT sky and the capture (+2); risk override: none
**Owner:** João
**Depends on:** [PRD-631](../../done/PRD-631-an-unreal-reference-scene-measures-the-default-look.md) Phase 3 (the L2 row) and [PRD-632](PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (lux and EV100: an atmosphere sky in nits cannot be compared at a hand-set exposure). Uses the LUTs that [PRD-248](../../done/PRD-248-the-atmosphere-is-luts-the-sky-is-the-games.md) shipped. [PRD-562](../rendering/PRD-562-aerial-perspective-from-a-froxel-volume.md) adds the aerial perspective on top.
**Depends on:** [PRD-631](../../done/PRD-631-an-unreal-reference-scene-measures-the-default-look.md) Phase 3 (the L2 row) and [PRD-632](../../done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (lux and EV100: an atmosphere sky in nits cannot be compared at a hand-set exposure). Uses the LUTs that [PRD-248](../../done/PRD-248-the-atmosphere-is-luts-the-sky-is-the-games.md) shipped. [PRD-562](../rendering/PRD-562-aerial-perspective-from-a-froxel-volume.md) adds the aerial perspective on top.

## Context

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ prd_contract: v1
**Priority:** P2 — AC-1 and AC-3 are open: the starter L9 cells still differ from Unreal in lighting, sky, shadows and ambient occlusion, which other PRDs own, and the whole `high` chain does not hold 16.7 ms while ambient occlusion costs 15 ms.
**Complexity:** 5 (MEDIUM) — template post source in 13 templates (+2), a local-exposure stage that is new to the chain (+2), native proof (+1); risk override: none
**Owner:** João
**Depends on:** [PRD-631](../../done/PRD-631-an-unreal-reference-scene-measures-the-default-look.md) Phase 3 (the L9 row) and [PRD-632](PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md): bloom and local exposure act on the exposed scene-linear frame, so they cannot be compared before exposure matches. Low-resolution temporal reconstruction belongs to [PRD-539](../../done/PRD-539-low-resolution-temporal-reconstruction-quality-and-cost.md). Phase 4 makes temporal anti-aliasing the default, by owner decision on 2026-10-21.
**Depends on:** [PRD-631](../../done/PRD-631-an-unreal-reference-scene-measures-the-default-look.md) Phase 3 (the L9 row) and [PRD-632](../../done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md): bloom and local exposure act on the exposed scene-linear frame, so they cannot be compared before exposure matches. Low-resolution temporal reconstruction belongs to [PRD-539](../../done/PRD-539-low-resolution-temporal-reconstruction-quality-and-cost.md). Phase 4 makes temporal anti-aliasing the default, by owner decision on 2026-10-21.

## Context

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ prd_contract: v1
**Priority:** P1 — the default look cannot ship until the exposure line lands: PRD-632's L1 and L9 checks need it, and it is held today because sunlit-room locks and ratchets break (Phase 3).
**Complexity:** 4 (MEDIUM) — about 8 harness and core files (+2), the shared cloud and sky-light capture state that every scene reads (+2); risk override: the line moves every locked scene and layer, so every lock and ratchet is checked
**Owner:** João
**Depends on:** [PRD-632](PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (the exposure line is its Phase 2 work) and [PRD-633](PRD-633-the-sky-is-an-atmosphere-and-it-lights-the-scene.md) (the cloud deck and the sky capture)
**Depends on:** [PRD-632](../../done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (the exposure line is its Phase 2 work) and [PRD-633](PRD-633-the-sky-is-an-atmosphere-and-it-lights-the-scene.md) (the cloud deck and the sky capture)

## Context

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ prd_contract: v1
**Priority:** P1 — no create-threenative kit gets the Unreal defaults that #541 put in `packages/core`: all 13 kits still pin ACES and a fixed exposure, so the owner's goal ("this PR is useless if we dont change the starter kit templates to use our defaults") stays open until every kit box below is ticked.
**Complexity:** 5 (MEDIUM) — 11+ implementation files across 13 kits (+3), `packages/core` and `create-threenative` release separately (+2); risk override: every kit that `create-threenative` scaffolds changes on screen and each kit carries a frame budget.
**Owner:** João
**Depends on:** [PRD-632](PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (the core defaults, on develop through #541). [PRD-722](https://github.com/ThreeNativeHQ/threenative-engine/blob/lane/sunwarm/docs/PRDs/Unreal/look/PRD-722-every-kit-and-every-default-scene-renders-the-unreal-look.md) Phase 2 (sky, GI cache and traced reflections in core) is not gating: once the kits import the look from core, that work reaches them with no kit edit.
**Depends on:** [PRD-632](../../done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (the core defaults, on develop through #541). [PRD-722](https://github.com/ThreeNativeHQ/threenative-engine/blob/lane/sunwarm/docs/PRDs/Unreal/look/PRD-722-every-kit-and-every-default-scene-renders-the-unreal-look.md) Phase 2 (sky, GI cache and traced reflections in core) is not gating: once the kits import the look from core, that work reaches them with no kit edit.

## Context

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ prd_contract: v1
**Priority:** P1 — the default look reaches the templates only when the starter and minimal port (PRD-722) lands, and five receipted lines wait for the same merge.
**Complexity:** 3 (MEDIUM) — about 6 lane branches to merge and re-prove on one combined tree (+2), the template budgets need an owner decision (+1).
**Owner:** João
**Depends on:** [PRD-632](PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (park notes for PRD-722 and PRD-723), [PRD-636](PRD-636-the-finishing-post-chain-matches-unreal-defaults.md), [PRD-641](../gi/PRD-641-bounce-light-holds-still-while-the-camera-moves-and-follows-a-light-that-changes.md), [PRD-649](../shadows/PRD-649-shadow-calibration-scenes-are-built-in-unreal-and-judged-until-parity.md) and [PRD-697](../rendering/PRD-697-probe-volume-and-atmosphere-run-on-the-owned-engine.md).
**Depends on:** [PRD-632](../../done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md) (park notes for PRD-722 and PRD-723), [PRD-636](PRD-636-the-finishing-post-chain-matches-unreal-defaults.md), [PRD-641](../gi/PRD-641-bounce-light-holds-still-while-the-camera-moves-and-follows-a-light-that-changes.md), [PRD-649](../shadows/PRD-649-shadow-calibration-scenes-are-built-in-unreal-and-judged-until-parity.md) and [PRD-697](../rendering/PRD-697-probe-volume-and-atmosphere-run-on-the-owned-engine.md).

## Context

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ prd_contract: v1
**Priority:** P3 — Phase 1 is open: the default temporal resolve clips history in the frame's own color space with one variance gamma, and no measurement says whether dark regions ghost or bright regions flicker because of it.
**Complexity:** 6 (MEDIUM) — 2–4 files (+1), a color-space change in a shared resolve (+2), the same rule on the owned engine (+2), a visual judge (+1); risk override: none
**Owner:** João
**Depends on:** [PRD-539](../../done/PRD-539-low-resolution-temporal-reconstruction-quality-and-cost.md) for the corpus, which also names the moire error of lever 4. `docs/PRDs/Unreal/look/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md` (on `feat/unreal-look-epic`) for the exposure the rejection reads.
**Depends on:** [PRD-539](../../done/PRD-539-low-resolution-temporal-reconstruction-quality-and-cost.md) for the corpus, which also names the moire error of lever 4. `docs/PRDs/done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md` (on `feat/unreal-look-epic`) for the exposure the rejection reads.

## Context

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ prd_contract: v1
**Priority:** P2 — Phase 1 is an unbuilt gate: a fresh Unreal 5.8.3 project turns Substrate on, and no measurement says whether its rough diffuse and forced energy conservation move the L1 sphere rows past the PRD-631 thresholds.
**Complexity:** 5 (MEDIUM) — 1–5 implementation files (+1), a second Unreal capture project with one setting changed (+1), a lighting-model hook that the owned host must compile too (+2), a visual judge (+1); risk override: none
**Owner:** João
**Depends on:** `docs/PRDs/Unreal/look/PRD-631-an-unreal-reference-scene-measures-the-default-look.md` (on `origin/feat/unreal-look-epic`, all boxes ticked: the capture harness and the L1 thresholds). `docs/PRDs/Unreal/look/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md` must close the L1 tone gap before Phase 2 judges a shading change, because a tone gap hides a BSDF gap.
**Depends on:** `docs/PRDs/Unreal/look/PRD-631-an-unreal-reference-scene-measures-the-default-look.md` (on `origin/feat/unreal-look-epic`, all boxes ticked: the capture harness and the L1 thresholds). `docs/PRDs/done/PRD-632-the-frame-is-exposed-and-tone-mapped-the-way-a-fresh-unreal-project-is.md` must close the L1 tone gap before Phase 2 judges a shading change, because a tone gap hides a BSDF gap.

## Context

Expand Down
8 changes: 8 additions & 0 deletions docs/PRDs/Unreal/research/port-history.json
Original file line number Diff line number Diff line change
Expand Up @@ -158,5 +158,13 @@
"lookDone": 150,
"lookTotal": 493,
"open": 87
},
{
"date": "2026-11-04",
"done": 410,
"total": 1142,
"lookDone": 156,
"lookTotal": 491,
"open": 86
}
]
Loading
Loading