Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
442 commits
Select commit Hold shift + click to select a range
11dd0cb
feat(strata): forest pines keep their photographed colour, share one …
jonit-dev Oct 2, 2026
09897a9
fix(core): sample atmosphere LUTs through their linear filter
jonit-dev Oct 2, 2026
f1d3608
docs(strata): record Round 17 erosion delivery and qualified performance
jonit-dev Oct 2, 2026
f3e3971
feat(veg): a layered wood — noise stands, eight species per understor…
jonit-dev Oct 2, 2026
dc8fd50
fix(strata): drop the broad Kite pine; it reads as a gnarled broadlea…
jonit-dev Oct 2, 2026
2705256
Merge branch 'feat/prd-466-468-erosion' into feat/prd-466-468-strata
jonit-dev Oct 2, 2026
1b79536
feat(strata): band landscape detail and blend stone at measured groun…
jonit-dev Oct 2, 2026
25ce84e
feat(strata): share LUT sky and height-aware aerial perspective
jonit-dev Oct 2, 2026
923a120
fix(veg): the pine's bare lower branches are opaque, so the dead-need…
jonit-dev Oct 2, 2026
ba994eb
fix(strata): share landscape stone shading at triangle-accurate prop …
jonit-dev Oct 2, 2026
d886a09
docs(strata): record round 18 veg-lane ecology note
jonit-dev Oct 2, 2026
6643f52
fix(strata): use metre-scale sand ripple phase and shared distance fade
jonit-dev Oct 2, 2026
c1fa4d6
perf(veg): the prop band rebuilt every third walking frame, and the p…
jonit-dev Oct 2, 2026
d612454
fix(strata): fade the finite horizon and project cloud layers
jonit-dev Oct 2, 2026
d43287e
fix(strata): keep sand ripple phase coherent across changing beach no…
jonit-dev Oct 2, 2026
10f4fe0
docs(strata): record Round 18 material proof and visual limits
jonit-dev Oct 2, 2026
d544366
docs(prd-466): record atmosphere scratch proof and final lock delays
jonit-dev Oct 2, 2026
ebd4885
docs(strata): record round 18 veg-lane p50 root cause and the one-pin…
jonit-dev Oct 2, 2026
34191a1
Merge branch 'feat/prd-466-468-material' into feat/prd-466-468-strata
jonit-dev Oct 2, 2026
6388964
docs(prd-466): record licensed atmosphere proof and fallback startup gap
jonit-dev Oct 2, 2026
2cbf69b
fix(core): warm probe repack shaders and filter atmosphere LUT reads
jonit-dev Oct 2, 2026
5e5e2cf
fix(veg): needle litter had no procedural stand-in, so the fallback d…
jonit-dev Oct 2, 2026
25eb6b2
docs(strata): record round 18 veg-lane final proofs and the fallback …
jonit-dev Oct 2, 2026
f3d8a20
perf(veg): one draw per species, so trim understorey species to the d…
jonit-dev Oct 2, 2026
14e3b0a
fix(strata): keep foreground clear and tune LUT sky by biome
jonit-dev Oct 2, 2026
af60ea8
perf(veg): variant counts match the trimmed species lists
jonit-dev Oct 2, 2026
da93961
Merge branch 'feat/prd-466-468-ecosystem' into feat/prd-466-468-strata
jonit-dev Oct 3, 2026
3c2ee0d
fix(strata): retain local aerosol tint in mesa shadows
jonit-dev Oct 3, 2026
9d6d3cc
docs(prd-466): record final atmosphere measurements and CPU gate gaps
jonit-dev Oct 3, 2026
219f446
Merge branch 'feat/prd-466-468-atmos' into feat/prd-466-468-strata
jonit-dev Oct 3, 2026
2d75df9
style(core): block body for the velocity spec's output capture (biome…
jonit-dev Oct 3, 2026
dcb6214
test(strata): prop draw ceiling 64 for the layered understorey
jonit-dev Oct 3, 2026
384ede4
docs(strata): V11 captures of all five worlds and judge score 3.71/10
jonit-dev Oct 3, 2026
4ec6e48
docs(prd-466): record measured GI sampler budget and baseline allocat…
jonit-dev Oct 3, 2026
9a978ad
fix(strata): sample sky fill without terrain bindings and fade far sh…
jonit-dev Oct 3, 2026
8f77316
Merge origin/develop (114e268ef, ci(prd-481)) into feat/prd-466-468-s…
jonit-dev Oct 3, 2026
ca25b54
fix(strata): withdraw irradiance candidate after failed atmosphere ch…
jonit-dev Oct 3, 2026
a71d4a3
Merge branch 'feat/prd-466-468-gi2' into feat/prd-466-468-strata
jonit-dev Oct 3, 2026
2cbf316
Merge origin/feat/prd-466-468-strata (2c's develop merge) into local …
jonit-dev Oct 3, 2026
41cff09
feat(strata): bake surveyed USGS geology for alpine and desert
jonit-dev Oct 3, 2026
19a0e88
fix(strata): frame the surveyed headwall and retain snow in hollows
jonit-dev Oct 3, 2026
a816785
feat(strata): 60 fps stable replaces the 4 ms CPU caps
jonit-dev Oct 3, 2026
b6b365f
fix(strata): keep the surveyed alpine skyline visible
jonit-dev Oct 3, 2026
79de3ca
Merge origin/develop into feat/prd-466-468-strata
jonit-dev Oct 3, 2026
e734e0e
docs(strata): keep the strata evidence within the 72 MB tree budget
jonit-dev Oct 3, 2026
21bfad5
docs(strata): record final DEM runtime and export results
jonit-dev Oct 3, 2026
7c0f2c8
Merge branch 'feat/prd-466-468-dem' into feat/prd-466-468-strata
jonit-dev Oct 3, 2026
a2fc3af
test(strata): report, don't cap, the presented interval under the pri…
jonit-dev Oct 3, 2026
728501f
feat(strata): survey forest coastal tundra and all five horizon rings
jonit-dev Oct 3, 2026
01a9fc6
fix(strata): far pines reach their LOD, and the river mirror redraws …
jonit-dev Oct 3, 2026
7c07576
docs(strata): record DEM2 visual water and seam proof
jonit-dev Oct 3, 2026
72e0edb
fix(strata): opt into the engine's automatic resolution scaler
jonit-dev Oct 3, 2026
a604daa
Merge branch 'develop' into feat/prd-466-468-strata
jonit-dev Oct 3, 2026
a215963
Merge remote-tracking branch 'origin/feat/prd-466-468-strata' into fe…
jonit-dev Oct 3, 2026
c58b447
docs(strata): record honest DEM2 licensed capture timeout
jonit-dev Oct 3, 2026
33edbf2
docs(strata): finish DEM2 local proof with failed gates explicit
jonit-dev Oct 3, 2026
5b17a4b
perf(core): avoid redundant floor bounds work and observe actual main…
jonit-dev Oct 3, 2026
b3c532c
Merge branch 'feat/prd-466-468-dem2' into feat/prd-466-468-strata
jonit-dev Oct 3, 2026
7e2269a
perf(strata): slice prop work and measure complete camera windows
jonit-dev Oct 3, 2026
c3dbaab
Merge branch 'develop' into feat/prd-466-468-strata
jonit-dev Oct 3, 2026
9da6655
Merge remote-tracking branch 'origin/feat/prd-466-468-strata' into st…
jonit-dev Oct 3, 2026
faf9126
Merge branch 'feat/prd-466-468-perf' into feat/prd-466-468-strata
jonit-dev Oct 3, 2026
4f9167d
fix(strata): imported foliage draws with its own material
jonit-dev Oct 3, 2026
e0799dc
fix(strata): light the scene with an image-based sky environment
jonit-dev Oct 3, 2026
c57dcea
fix(strata): ground opts out of the sky environment until retuned
jonit-dev Oct 3, 2026
e6c837c
perf(strata): prop LOD scan reads pose translation, allocates nothing
jonit-dev Oct 3, 2026
3a9667a
fix(strata): sky light reaches vegetation per material, not the ground
jonit-dev Oct 3, 2026
319710c
perf(core): addInSlices time-budgets its slices by default
jonit-dev Oct 3, 2026
c7c6c1b
docs(core): addInSlices time budget reaches docs, templates and its p…
jonit-dev Oct 3, 2026
1db7d58
feat(core): TN_UNLIT_FOLIAGE names cutout PBR drawn with no sky light
jonit-dev Oct 3, 2026
3727a84
docs(templates): imported foliage draws as imported under the sky light
jonit-dev Oct 3, 2026
a9acd77
docs(prd-466): paperboard root cause, real-display FPS and guardrails
jonit-dev Oct 3, 2026
1e71f37
test(strata): characterize imported prop materials before refactoring
jonit-dev Oct 3, 2026
afae569
test(strata): make characterization assertions explicit
jonit-dev Oct 3, 2026
836ab9d
feat(world): accept decoded packages with caller-owned terrain
jonit-dev Oct 4, 2026
44f7f64
feat(strata): stream authored props through WorldCells
jonit-dev Oct 4, 2026
537de09
fix(strata): preserve streamed prop reach and LOD hysteresis
jonit-dev Oct 4, 2026
1c6d60b
perf(strata): bound prop cell admission jobs
jonit-dev Oct 4, 2026
9db7fd3
fix(strata): preserve regional shadows and authored prop fidelity
jonit-dev Oct 4, 2026
2f00a5b
fix(world): preserve authored wide shadow geometry
jonit-dev Oct 4, 2026
2314e83
fix(world): converge deferred admission to the latest camera
jonit-dev Oct 4, 2026
ce9f7de
refactor(strata): extract imported prop geometry behind a characteriz…
jonit-dev Oct 4, 2026
25dba20
fix(strata): imported foliage keeps its normal map and sky light
jonit-dev Oct 4, 2026
9458de6
docs(strata): record the scene.environment IBL A/B and its revert
jonit-dev Oct 4, 2026
3331d6c
refactor(strata): split pack.ts surface() into named helpers
jonit-dev Oct 4, 2026
d041dee
Merge develop into PR #381 preserving Strata and render fixes
jonit-dev Oct 4, 2026
53f302a
fix(strata): preserve published behavior under current lint contracts
jonit-dev Oct 4, 2026
f635921
Merge current develop CI improvements into PR #381
jonit-dev Oct 4, 2026
8644992
test: reconcile strata fixture types without changing runtime
jonit-dev Oct 4, 2026
f7e6cc5
fix(strata): forest draws its licensed spruce under ACES, not a chalk…
jonit-dev Oct 5, 2026
feb08f3
fix(strata): spruce hue, sun-dominated crowns, field grass and per-wo…
jonit-dev Oct 5, 2026
24c1542
feat(strata): every starter world exports a full-world GLB with place…
jonit-dev Oct 5, 2026
8a91a62
docs(prd-466): tick AC-8 with the five-world export proof; count AC-5…
jonit-dev Oct 5, 2026
62a2234
docs(prd-466): Phase 4 — starter world kits are the agent handoff
jonit-dev Oct 5, 2026
2659a56
feat(terrain): forest starter kit — recipe, bake, game entry and a sp…
jonit-dev Oct 5, 2026
0f4054b
feat(terrain): bake a Strata world into the engine WorldCells package
jonit-dev Oct 5, 2026
65345cc
feat(terrain): forest kit draws Poly Haven's authored fir LOD2, impos…
jonit-dev Oct 5, 2026
6503b54
docs(terrain): credit the authored fir LOD2; starter/ is copy-out gam…
jonit-dev Oct 5, 2026
533f572
fix(terrain): forest kit's splat textures resolve and its props are s…
jonit-dev Oct 5, 2026
d3ae46e
fix(terrain): forest kit's ground collides before addForest resolves
jonit-dev Oct 5, 2026
4547686
fix(terrain): forest kit draws its near firs (CPU-culled WorldCells)
jonit-dev Oct 5, 2026
7bd7c84
fix(core): WorldCells bundle check never copies texture pixels
jonit-dev Oct 5, 2026
90ffb5b
feat(terrain): forest kit's boulder is Poly Haven's textured boulder_…
jonit-dev Oct 5, 2026
4ac0d53
test(strata): test:kit proves the forest kit in a freshly scaffolded …
jonit-dev Oct 5, 2026
bc2d77f
docs(prd-466): Phase 4 forest kit round 1 evidence and engine findings
jonit-dev Oct 5, 2026
916f812
feat(terrain): forest kit casts shadows, clusters its stands and gree…
jonit-dev Oct 5, 2026
37b5958
test(terrain): kit spec follows the clustered boulder count
jonit-dev Oct 5, 2026
0778342
feat(core): terrain splat layers can blend a far tile of their own ma…
jonit-dev Oct 5, 2026
aeeeef7
feat(terrain): forest kit's grass and dirt blend a far tile against v…
jonit-dev Oct 5, 2026
5d80a4a
docs(terrain): forest kit README says how to add, bake and change it
jonit-dev Oct 5, 2026
92f8cf0
docs(create-threenative): terrain authoring sends a ready-world ask t…
jonit-dev Oct 5, 2026
b962f8d
fix(core): world impostors sample their atlas right side up
jonit-dev Oct 5, 2026
0fed4b8
fix(core): world impostors follow instance writes on static batches
jonit-dev Oct 5, 2026
39908e7
test(strata): the kit proof streams around its camera
jonit-dev Oct 5, 2026
e9608da
perf(terrain): forest kit streams its prop colliders with the player
jonit-dev Oct 5, 2026
7bc624c
feat(terrain): forest kit shades crowns as volumes; the proof frames …
jonit-dev Oct 5, 2026
58c0ba6
feat(terrain): forest kit's haze no longer bleaches the high view
jonit-dev Oct 5, 2026
7d3e431
test(strata): the kit proof's edge view stands on the sun's side of t…
jonit-dev Oct 5, 2026
7174271
feat(terrain): forest kit mixes a second fir shape (Poly Haven fir c …
jonit-dev Oct 5, 2026
d783832
docs(prd-466): Phase 4 rounds 2-4 evidence; K2 real-display block
jonit-dev Oct 6, 2026
72b12bd
fix(playtest): verify explicitly requested host displays
jonit-dev Oct 6, 2026
18edddb
fix(core): bound streamed terrain construction across updates
jonit-dev Oct 6, 2026
af6dfc8
fix(strata): hold play for streamed spawn coverage
jonit-dev Oct 6, 2026
710b68c
feat(world): cook bounded static scatter cell proxies
jonit-dev Oct 6, 2026
3fa0a3a
Merge commit 'af6dfc8ec04f748b1759c758aa552f312c4a7a38' into feat/str…
jonit-dev Oct 6, 2026
5c1d59f
Merge develop into PR381 loading and terrain budget fixes
jonit-dev Oct 6, 2026
786e236
style(strata): format the kit loading source copy
jonit-dev Oct 6, 2026
2ef3fc2
merge: absorb published PR381 readiness and TS7 head
jonit-dev Oct 6, 2026
b73d27c
feat(world): consume bounded HLOD proxies and cache CPU bundle eligib…
jonit-dev Oct 6, 2026
9b33b68
fix(world): upload far instance matrices only after writes
jonit-dev Oct 6, 2026
b954abe
perf(core): skip inherited TSL methods in bundle validation
jonit-dev Oct 6, 2026
ea0a062
fix(core): observe renderer-visible node children in bundle safety
jonit-dev Oct 6, 2026
afd3cce
fix(strata): upload loading status only when text changes
jonit-dev Oct 6, 2026
f3a8e3f
docs(strata): record post-fix OOM and actual loading captures
jonit-dev Oct 6, 2026
9d2c6df
fix(core): reuse live default color attachments at unchanged size
jonit-dev Oct 6, 2026
022da23
fix(core): keep late prewarm draws in their accounting epoch
jonit-dev Oct 6, 2026
71940f3
test(scaffold): record attachment patch tree fingerprints
jonit-dev Oct 6, 2026
e437bdf
docs(strata): record remaining depth OOM after attachment fix
jonit-dev Oct 6, 2026
14aa2c1
fix(core): retain bounded canvas depth attachments across output passes
jonit-dev Oct 6, 2026
2d3a244
fix(core): close async pipeline validation scopes before yielding
jonit-dev Oct 6, 2026
3a1b02d
fix(world): budget reach preparation and capture spawn failure
jonit-dev Oct 6, 2026
9fa9e56
test(strata): add controlled canopy material comparison
jonit-dev Oct 6, 2026
66a3811
fix(strata): bound compressed texture uploads before cell admission
jonit-dev Oct 6, 2026
a4f345c
test(scaffold): refresh hashes for bounded texture upload patch
jonit-dev Oct 6, 2026
6810f72
fix(strata): isolate texture uploads from hidden world draws
jonit-dev Oct 7, 2026
ed41541
Merge branch 'develop' into feat/prd-466-468-strata
jonit-dev Oct 7, 2026
cb2febe
perf(strata): reuse medians between frame budget windows
jonit-dev Oct 7, 2026
eb3a3cf
test(core): cover delayed upload scope and host yield completion
jonit-dev Oct 7, 2026
eb2d73f
Merge PR381 remote progress into loading and CPU fixes
jonit-dev Oct 7, 2026
6cff71c
perf(strata): defer hidden world draws until streams attach
jonit-dev Oct 7, 2026
88af7c5
fix(startup): observe completed work during held loading
jonit-dev Oct 7, 2026
c22e5ba
perf(textures): bound validation batches during cold preparation
jonit-dev Oct 7, 2026
2eb3188
chore(textures): refresh derived package patch pins
jonit-dev Oct 7, 2026
12970d4
docs(strata): record passing bounded-upload load and walk
jonit-dev Oct 7, 2026
2d093a4
fix(strata): preserve authored crown normals by default
jonit-dev Oct 7, 2026
9977b16
docs(strata): publish matched authored canopy evidence
jonit-dev Oct 7, 2026
de1b57a
Merge branch 'develop' into feat/prd-466-468-strata
jonit-dev Oct 8, 2026
43f97d8
fix(core): keep virtual shadow receiver inputs in the render group
jonit-dev Oct 8, 2026
b75ce28
fix(lock): point strata-terrain-preview three at the current patch hash
jonit-dev Oct 8, 2026
e3d6352
fix(strata): keep the prop wind clock and canopy sun in the render group
jonit-dev Oct 8, 2026
71414a6
docs(prd-466): re-evaluate visual verdicts after the frozen shadow in…
jonit-dev Oct 8, 2026
fe6964f
fix(strata): lift the field grass root albedo out of near-black
jonit-dev Oct 8, 2026
de021ee
docs(prd-466): record the meadow light budget and the field grass change
jonit-dev Oct 8, 2026
85499a1
docs(prd-466): record the rejected forest sun/env rebalance round
jonit-dev Oct 8, 2026
56cadfe
fix(strata): resolve forest blades and needles with TRAA instead of M…
jonit-dev Oct 8, 2026
97458bb
docs(prd-466): record the forest TRAA round and its red readiness sce…
jonit-dev Oct 8, 2026
bac22a0
docs(prd-466): record three rejected forest lighting rounds after TRAA
jonit-dev Oct 8, 2026
d62aa97
fix(strata): drop the MSAA depth dilation from the TRAA air composite
jonit-dev Oct 8, 2026
44c7410
docs(prd-466): record the rejected wider contact AO round
jonit-dev Oct 8, 2026
c809f08
docs(prd-466): record the god rays and bloom rounds with the VSM recipe
jonit-dev Oct 8, 2026
fac0b27
docs(prd-466): record readiness variance behind the red terrain scenario
jonit-dev Oct 8, 2026
65a4e4a
fix(strata): double the forest distance haze for aerial perspective
jonit-dev Oct 8, 2026
94cb937
docs(prd-466): record quiet-host readiness and the TRAA load-time con…
jonit-dev Oct 8, 2026
5817a92
docs(prd-466): record native desktop result and its pre-session control
jonit-dev Oct 8, 2026
bf9143f
docs(prd-466): record that native desktop draws no ground textures
jonit-dev Oct 8, 2026
99b2125
fix(strata): stage the CC0 ground maps where the native host looks fo…
jonit-dev Oct 8, 2026
6ff79df
docs(prd-466): locate the native KTX2 failure (transcoder path, then …
jonit-dev Oct 8, 2026
1d2b3a2
docs(prd-466): narrow the native upload loss and record the writeText…
jonit-dev Oct 8, 2026
c1a7fc2
fix(runtime-native): keep device.lost pending while the device lives
jonit-dev Oct 8, 2026
4ad7d97
fix(core): do not lift the resolution floor for velocity consumers
jonit-dev Oct 8, 2026
e60883b
fix(strata): keep the imported normal-map green convention
jonit-dev Oct 8, 2026
c1c7f0b
fix(strata): write an opaque frame at the end of the outdoor chain
jonit-dev Oct 8, 2026
e42da81
docs(prd-466): record the independent look diagnosis and its three fixes
jonit-dev Oct 8, 2026
d5bef2f
fix(strata): take the baked sun out of the vegetation sky image
jonit-dev Oct 8, 2026
46d96d1
docs(prd-466): record the sky sun clamp result
jonit-dev Oct 8, 2026
2cca8e2
docs(prd-466): record the rejected AgX and Neutral tone-curve rounds
jonit-dev Oct 8, 2026
4bfb69f
fix(strata): let forest ground foliage transmit the sun
jonit-dev Oct 8, 2026
95fd51f
fix(strata): gate foliage transmission by blade height
jonit-dev Oct 8, 2026
f4252d1
fix(strata): keep more forest ground detail into the mid distance
jonit-dev Oct 8, 2026
369f595
docs(prd-466): record the rejected grass reach round
jonit-dev Oct 8, 2026
eb4b09a
fix(strata): type the TRAA velocity argument
jonit-dev Oct 8, 2026
384bfd0
docs(prd-466): record the rejected trunk contact decal round
jonit-dev Oct 8, 2026
44c3ea7
docs(prd-466): record the reverted startup upload budget round
jonit-dev Oct 8, 2026
a887535
fix(core): yield loading slices through scheduler.yield where the hos…
jonit-dev Oct 8, 2026
033456a
docs(prd-466): record the load breakdown, the yield fix and native li…
jonit-dev Oct 8, 2026
7180c76
test(core): delete the scheduler stub with Reflect.deleteProperty
jonit-dev Oct 8, 2026
18043a8
docs(prd-466): record the web playtest rerun after the yield fix
jonit-dev Oct 8, 2026
ce65961
docs(prd-466): trace the native spawn red to per-frame slice pacing
jonit-dev Oct 8, 2026
0dca477
docs(prd-466): rule out play-time-unsafe slice sizing for the native …
jonit-dev Oct 8, 2026
0571f5d
feat(core): admit more streamed content per update behind the startup…
jonit-dev Oct 9, 2026
0d08f9f
fix(strata): settle the spawn gate per world draw, not only per physi…
jonit-dev Oct 9, 2026
f38c36c
docs(prd-466): record the spawn-gate deadlock fix and covered admission
jonit-dev Oct 9, 2026
8b24bf0
perf(strata): bucket river segments for the tundra wet test
jonit-dev Oct 9, 2026
55e1539
docs(prd-466): record the world-switch profile and the GPU timing check
jonit-dev Oct 9, 2026
6fe2dff
docs(prd-466): record the native rerun with the gate and cover fixes
jonit-dev Oct 9, 2026
5d86079
feat(strata): paint the forest floor under the placed trees
jonit-dev Oct 9, 2026
968b829
docs(prd-466): record the rejected cooler-turf round
jonit-dev Oct 9, 2026
ed2b6f0
docs(prd-466): record the two rejected understory rounds
jonit-dev Oct 9, 2026
e8e8ff4
fix(core): read GPU samples against the engine's own frame id
jonit-dev Oct 9, 2026
d30d772
docs(prd-466): record the GPU view-window fix and the 58/62 web run
jonit-dev Oct 9, 2026
f149d08
fix(strata): place rock outcrops on the terrain's own steepest ground
jonit-dev Oct 9, 2026
3806ec2
docs(prd-466): record the crags fix and the 59/62 web run
jonit-dev Oct 9, 2026
a4522f7
docs(prd-466): record the GPU cost attribution
jonit-dev Oct 9, 2026
3580236
docs(prd-466): record the triangle census and the spruce variant 2 fa…
jonit-dev Oct 9, 2026
e16b54a
docs(prd-466): record the two rejected far-crown thinning rounds
jonit-dev Oct 9, 2026
219a04c
perf(strata): bucket river stations in the ground curvature bake
jonit-dev Oct 9, 2026
04e765d
docs(prds): file PRD-541, lift water queries, slope thresholds and sp…
jonit-dev Oct 9, 2026
62ad3f2
PRD-541: terrain generator owns water queries; core owns spawn readin…
jonit-dev Oct 9, 2026
56ae690
feat(strata): the ground receives diffuse sky light without a sampler
jonit-dev Oct 9, 2026
995b2e5
fix(strata): the forest kit gate typechecks again and its terrain sui…
jonit-dev Oct 9, 2026
8e34647
feat(strata): the forest kit draws its lake and river; K1 adoption pr…
jonit-dev Oct 9, 2026
bfdac1d
docs(prd-466): tick K5, a cold agent reaches a playing forest world
jonit-dev Oct 9, 2026
38d7118
fix(strata): the lake mirror redraws every fourth frame; K2 frame p95…
jonit-dev Oct 9, 2026
9745269
docs(prd-466): record the K3 absolute judge measurement; K3 stays open
jonit-dev Oct 9, 2026
9d50b5d
feat(strata): the alpine starter kit bakes from its own recipe (K4, p…
jonit-dev Oct 9, 2026
71cfa35
feat(strata): the tundra starter kit bakes its rivers and kettle lake…
jonit-dev Oct 9, 2026
21d67f4
feat(strata): the coastal starter kit bakes its ocean, with the CC0 f…
jonit-dev Oct 9, 2026
cc86b29
feat(strata): the desert starter kit bakes with a boulder placeholder…
jonit-dev Oct 9, 2026
09a14dd
feat(strata): the alpine starter kit streams with boulder colliders a…
jonit-dev Oct 9, 2026
99ce0fd
feat(strata): the alpine kit proof passes, with the player spawned be…
jonit-dev Oct 9, 2026
a4e9d77
feat(strata): the desert kit proof passes, with its runtime, scene an…
jonit-dev Oct 9, 2026
e630907
feat(strata): the tundra kit proof passes, with its lakes and rivers …
jonit-dev Oct 9, 2026
6fb7e03
feat(strata): the coastal kit proof passes, with its sea drawn as wat…
jonit-dev Oct 9, 2026
d905aa0
docs(prd-466): record the first absolute judge pass for the four star…
jonit-dev Oct 9, 2026
c7d1c4b
feat(strata): the coastal sea uses the spectral simulation; the tundr…
jonit-dev Oct 9, 2026
b32da0b
docs(prd-466): tick K2; a quiet pair of forest proofs meets the frame…
jonit-dev Oct 9, 2026
36f9385
feat(strata): the tundra kettle lakes sit in closed basins off the ri…
jonit-dev Oct 9, 2026
a668138
fix(strata): the desert and coastal sand base tiles without a seam (K…
jonit-dev Oct 9, 2026
0dd37f2
docs(prd-466): AC-5 budget met and the frost-band trial recorded (K4,…
jonit-dev Oct 9, 2026
e2c3276
docs(prd-466): record the licensed terrain web run as red (boxes 56 a…
jonit-dev Oct 9, 2026
09615ae
Merge origin/develop into feat/prd-466-468-strata
jonit-dev Oct 10, 2026
acb1a8d
docs(prds): PRD-466 K3 round after the develop merge, judge 2 to 3, l…
jonit-dev Oct 10, 2026
90ec181
feat(terrain): forest kit uses authored fir LOD1 crowns, tinted bould…
jonit-dev Oct 10, 2026
342158c
feat(terrain): forest kit fill 1.5, sun 2.6 (PRD-466 K3 round 7, judg…
jonit-dev Oct 10, 2026
ece594a
docs(prds): close PRD-466/467/468 and move the Strata art bar to PRD-580
jonit-dev Oct 10, 2026
beb6a8c
Merge remote-tracking branch 'origin/develop' into fix/pr381-ci-repair
jonit-dev Oct 10, 2026
441481c
fix: repair PR #381 CI and starter asset caps
jonit-dev Oct 10, 2026
f32d791
style: sort native smoke imports
jonit-dev Oct 10, 2026
68f1525
Merge develop into PR 381 repair
jonit-dev Oct 10, 2026
ba28419
fix(playtest): classify SwiftShader compilation device loss
jonit-dev Oct 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@ jobs:
shared-artifact: workspace-packages
save-bundles: "false"
pack-archives: "false"
- name: Generate the terrain example's ignored world source
run: pnpm --filter strata-terrain-preview bake
- run: pnpm typecheck

lint:
Expand Down Expand Up @@ -270,6 +272,9 @@ jobs:
shared-artifact: workspace-packages
save-bundles: "false"
pack-archives: "false"
- name: Generate the terrain example's ignored world source
if: needs.scope.outputs.selection == 'full'
run: pnpm --filter strata-terrain-preview bake
- uses: ./.github/actions/playwright-chromium
if: needs.scope.outputs.selection == 'full'
- name: Run impacted unit contracts
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/npm-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ jobs:
# @threenative/procedural-animals
# @threenative/raw-unreal
# @threenative/runtime-native
# @threenative/terrain
# @threenative/ueformat
# @threenative/ui
# create-threenative
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,9 @@ examples/auto-lod/public/

# Generated by prepack from packages/core/patches (the only tracked copy).
packages/create-threenative/template-assets/patches/

# Licensed (non-redistributable) local art for review; never committed
examples/strata-terrain-preview/local-assets/
examples/native-css-hud/corpus/out/
examples/native-css-hud/corpus/out-interaction/
examples/native-css-hud/corpus/out-desktop/
Expand Down
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

### Added

- The optional `@threenative/terrain` authoring addon validates and retains
stable-key placement overrides through `validatePlacementOverrides` and
`applyPlacementOverrides`. The example editor offers individual prop selection,
ordinary Three.js gizmos, numeric transforms and measured grounding overrides.

- `create-threenative` ships an `optimizeModels()` Vite plugin, and every template
wires it into `vite.config.ts`. At build time it regenerates each `public/assets/*.glb`
from its source in `assets/models/` via gltf-transform whenever the source is newer
Expand All @@ -25,6 +30,11 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

### Breaking

- The unreleased terrain editor's `mountTerrainEditor` view factory receives
`(host, controller)`. Its `IEditorView` implements `setDocument(document, revision)`
so metadata edits can update the scene without dispatching terrain evaluation;
`update(state)` can return resolved placements. Host-only callbacks remain valid.

- `@threenative/core`'s `renderer.projection` now also accepts
`{ materialChecks: "spread" | "everyFrame" }` and not only a boolean (PRD-462). This widens the
accepted values rather than removing one, so a game that passed `true` or `false` needs no
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ Details in [`create-threenative`](packages/create-threenative/README.md).
| `@threenative/procedural-animals` | Baked animal payloads, runtime poses, accepted-state following, and conservative bounds |
| `@threenative/runtime-native` | Owned C++ host for desktop and Android |
| `@threenative/raw-unreal` | Raw Unreal editor `.uasset` static-mesh loader — UE5 FMeshDescription and UE4.18 FRawMesh, no interchange conversion |
| `@threenative/terrain` | Optional headless Strata authoring: validated recipes, baked heightfields and indexed Three.js geometry |
| `@threenative/ui` | React bindings for HUD and game state |
| `@threenative/ueformat` | UEFormat v10 `.uemodel` parser and Three.js loader for meshes exported from Unreal packages |
| `threenative-engine-mcp` | Offline MCP capability discovery for authoring agents |
Expand Down
3 changes: 3 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
"**/mcp/blender-server.mjs",
"packages/metahuman/wasm/**",
"artifacts/**",
"examples/strata-terrain-preview/src/world/*.json",
"examples/strata-terrain-preview/local-assets/**",
"build/**",
"release-native/**",
".linchpin/**",
Expand All @@ -35,6 +37,7 @@
"examples/native-css-hud/corpus/out-interaction/**",
"packages/assets/vendor/basis-encoder/basis_encoder.js",
"packages/runtime-native/**/*.json",
"packages/terrain/starter/*/recipe.json",
"test-results/**",
"examples/abyss-vanilla/index.html",
"examples/abyss-vanilla/src/main.js",
Expand Down
4,193 changes: 4,193 additions & 0 deletions docs/PRDs/done/PRD-466-strata-terrain-threejs-integration.md

Large diffs are not rendered by default.

515 changes: 515 additions & 0 deletions docs/PRDs/done/PRD-467-strata-live-terrain-editor.md

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# PRD-541 — The terrain generator owns water queries and slope thresholds; core owns spawn readiness

**Status:** DONE
**Priority:** P1 — every game built on the terrain generator repeats the slow water loops and the playtest spawn deadlock that PRD-466 fixed only in its preview example
**Depends on:** PRD-466 (the preview fixes this lifts into packages)

## Problem

PRD-466 found three defects in the Strata preview's own `src/render/` code, which any game built on
`@threenative/terrain` would write again:

- **Water proximity is an O(points × river segments) scan.** The scatter's `wet` test and the
ground curvature bake both walked every river segment or station per candidate or vertex. That
cost 3.4 s and 2.3 s inside a synchronous world-switch scene entry (tundra, 612 stations).
The preview fixes (`8b24bf0c2`, `219a04cb5`) bucket the segments locally, in example code.
- **Placement slope thresholds are fixed degrees.** Outcrops required over 30 degrees. The rebaked
forest's 98th percentile is 22 degrees, so it placed none (`f149d0853`).
- **A startup hold observed only in `afterPhysics` deadlocks under the playtest clock.** The
deterministic clock advances no fixed step while startup is held. Spawn read 6/6 ready from
36.6 s but resolved only at the 120 s deadline (`0d08f9f71`, example-only fix).

The generator should expose the mechanism once; the density rules and looks stay game source.

### Phase 1 — Water distance query in `@threenative/terrain`

- [x] A baked world exposes one indexed water query (distance to the nearest river segment or lake
shore, with that water's level), built once per world. proof: `packages/terrain/__tests__/`
spec against a brute-force scan over every shipped world fixture (identical answers) — PASS as
`createSegmentIndex` (candidates; callers keep their exact test): `water.spec.ts` 3/3, completeness
against a brute-force scan over 400 seeded segments × 3,000 points × 4 cell sizes; red when the
reach growth is removed. Terrain suite 153/153 (`forest-runtime.spec.ts` fails to load here and on
the PRD-466 branch alike).
- [x] The preview's scatter `wet` test and curvature wet margin call it, deleting their local
buckets. proof: placement and curvature-pixel hashes identical to PRD-466's (`59002b165fe4d94d`
tundra placements; curvature `130803d9b4c9` forest, `2a15707623b8` tundra) — PASS, HEAD vs edited
identical: placements forest `c28dcd7b709f7de2`, coastal `172e610299240db8`, tundra
`64de36d111a3bba3` (the PRD-466 tundra hash predates `f149d0853`'s outcrops); curvature forest
`130803d9b4c959eb`, coastal `dd8cc32a7b3eb69f`, tundra `2a15707623b82a71`.

### Phase 2 — Terrain-relative slope thresholds

- [x] `@threenative/terrain` reports a world's slope quantiles from its own heightfield, and the
preview's outcrop rule reads its 98th percentile instead of computing it locally. proof: terrain
spec on fixtures; forest still places 7 outcrops, coastal 75 — PASS: `slopeQuantile` (built on
`slopeAtIndex`), `slope-quantile.spec.ts` 2/2; preview placements identical to HEAD (forest
`c28dcd7b709f7de2` 7 outcrops, coastal `172e610299240db8` 75, tundra `64de36d111a3bba3` 0).

### Phase 3 — Spawn readiness without simulation ticks, in core

- [x] `ctx.startup.hold` accepts a readiness predicate that core evaluates every rendered frame, so
a hold cannot depend on fixed steps the playtest clock withholds. proof: core spec with a
fixed-step stub that never ticks while the hold is pending (red before, green after) — PASS:
`startup-readiness.spec.ts` "releases a predicate hold on the first frame it reads true" red
(released at once) → green; startup and game specs 99/99; core tsc clean.
- [x] The preview's spawn gate uses it and drops its `beforeRender` duplicate. proof:
`pnpm --filter strata-terrain-preview test:terrain:web` reaches its assertions — PASS
(2026-10-09, host load 29, after the stall fixes below): 62 assertions, 59 pass; the three left
are the PRD-466 performance bounds (`afterFirstFrameTaskMs` 1,387, `timeToReadyMs` 37,915,
`maxViewGpuMs` 35.6).

**Main-thread stalls found on the way** (the previous run died on a bridge timeout amid 14 stalls
up to 11.6 s). A CPU profile of a view-cycling session attributed them to (1) core
`VelocityTracker.commit` allocating a fresh `Float32Array` per instanced mesh per frame, about
14 MB/frame for 218,809 instances, plus a 10.3 s collector stall, fixed by double buffering
(`58a112f16`) and by skipping unchanged meshes by `instanceMatrix.version` (`26a830ab0`), both red →
green in `render-velocity.spec.ts`; and (2) the preview walking every streamed world three times per
fixed step for prop counts (`bf3485fc7`, now every 30 steps). Busy stretches over 1.5 s: 50 → 8;
playtest stalls: 14 (max 11.6 s) → 4 (max 2.6 s).

### Acceptance criteria

- [x] Templates' `AGENTS.md` name the water query and the readiness predicate as conventions.
proof: `pnpm sync:agents --check` and the instruction-budget spec — PASS: all 13 templates name
`createSegmentIndex`/`slopeQuantile` on their terrain line and `ctx.startup.hold(label, () => ready)`
in their loading conventions; `pnpm sync:agents` regenerated, instruction-budget and sync specs
17/17, scaffold byte-stability hashes refreshed for the AGENTS change, `pnpm check:docs` clean.

## Blocked on

Nothing. `packages/terrain` and `examples/strata-terrain-preview` exist only on the PRD-466 branch
(PR #381), so this PR is stacked on that branch (base `feat/prd-466-468-strata`) and retargets to
`develop` when #381 merges.

## Decisions

- 2026-10-08, owner direction in the PRD-466 session: optimisations belong in the generator and
core so every game gets them, not scene by scene in the preview.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Three of the four admission paths have no time ceiling at all. Verified in this
| Cost | Where | Bounded by |
| --- | --- | --- |
| Model loads | `ModelLoadLimiter` — `packages/core/src/world-cells.ts:360`, default 6 (`:490`, `packages/core/src/streaming.ts:132`) | loads in flight |
| Chunk attach | `addInSlices` — `packages/core/src/world-cells.ts:997`, 256 objects/frame (`packages/core/src/streaming.ts:131`) | object count, not ms |
| Chunk attach | `addInSlices` — `packages/core/src/world-cells.ts:997`, 8 ms/slice unless the game gives `sliceSize` (`packages/core/src/streaming.ts:131`) | elapsed time, not objects |
| Cell-asset batch build | `#buildBatch` — `packages/core/src/world-cells.ts:825`: one `InstancedBatch` per level (`:835`), a synchronous pass over **every** placement in the run (`:837`), `build()` in the same call (`:859`) | nothing |
| `InstancedBatch.build` | `packages/core/src/instanced-batch.ts:173`: `new InstancedMesh` (`:178`), one `setMatrixAt` per instance (`:180`), `needsUpdate` (`:183`), `computeBoundingSphere` (`:188`) | nothing |
| Refilter | `#updateMaxDistance` — `packages/core/src/world-cells.ts:936` | `rebuildsPerUpdate`, a count (16 by default, `:485`) |
Expand Down
Loading
Loading