The landscape tool grows alder, silver birch and hazel from a saved, seeded recipe. The original models use tapered branching trunks and folded leaf blades. Instances share species meshes; trees have separate trunk collision and shrubs are cosmetic.
#Try it
Pull codex/engine-foundations, restart npm run dev:editor, and open the full
private link printed by the command. New world → Winding river → Preview → Save
→ Publish now gives you a wooded riverbank. Existing drafts and invitations keep
their original content; use a new template or edit the existing landscape.
For an existing terrain patch, open Terrain → Trees & shrubs, enable growth, and choose species, seed, scale, tree density and shrub density. Preview ground, then Save. Apply shares the saved terrain revision with a development room; Publish creates a new invitation. Disable growth to remove the generated plants and trunk collision together. Saved Undo restores them.
The tool places plants on gentler, greener samples, avoiding generated river water and the current arrival areas captured when the patch is previewed. Ground paint, sculpting, seed and density affect suitable sites. Regenerate/preview after changing arrivals or environment layout, and check the paths in play. Individually placed water surfaces are independent of the terrain recipe and need a manual layout check.
#Contract and limits
heightfield-woodland.1binds placement andwoodland-models.1geometry. Preserve those versions' output when adding later generators or art. The authoring document retains the recipe; published worlds contain the ordinary validated models and objects. Models travel in the normal content bundle; no third-party asset service or additional runtime world format is required.- Density settings range from 0–100%, scale from 0.5–1.8 with seeded size variation, and seed is an unsigned 32-bit integer. A patch has at most 24 trees and 48 shrubs. Fewer plants appear when slopes, paint, shorelines or clearings exclude sites.
- Placement uses a bounded physical lattice over the actual chunks, ranked candidates, stable identities and a four-recipe cache. Gaps between distant chunks do not expand the sampling loop. Chunk order does not change the result.
- Species meshes use the existing instancing, frustum culling, shadow and resource sharing paths. Full-density plants plus sixteen ground chunks fit the existing 262,144-triangle place budget; other objects still share that budget. Trunk collision remains active independently of visibility. The capsule can slide around round trunks.
- Woodland objects/models remain owned by the terrain source. Use Terrain to change them. Species/scale changes, removal, undo and reload regenerate the exact projection. A later art revision must retain old source compatibility or explicitly migrate it.
- Leaves and branches are currently static. Wind animation for these models, a larger species library, independent painted planting masks and the final environment/art treatment remain open. The rejected character models still require their final pass.
#Acceptance
Verified on 2026-10-25:
- 917 headless tests passed, 68 skipped. New checks cover repeatable placement, dry arrivals, model/triangle bounds, source ownership, exact inverse restoration, native trunk collision and durable history across repeated world replacement and server restart. Two final focused model/projection checks also pass.
- Four hardware browser journeys passed on Intel Arc B390 / xe-3lpg: woodland editing and publication plus river editing and two-traveler swimming/reconnect/exit. Both woodland journeys also pass with software WebGPU, including saved reload, undo/redo, species and scale changes, removal/restoration, narrow controls and two published travelers using main-thread and Worker graphics. No page errors occurred.
- Production build and copied standalone CLI passed: river template, check, export, import, check and compile. The exported world contains 55 woodland objects, including 10 invisible solid trunks. Editable source stays in the document; runtime export intentionally contains the generated projection. The initial compile output hit a temporary-storage write error; the same detached CLI succeeded with its output written to workspace storage.
- Reviewed shared player view. The botanical forms and lighting are a usable environment layer; this does not approve or complete the required final character/environment/arrival art pass.
The first browser campaign exposed a durable-history byte failure after replacing wooded worlds repeatedly. Leaves now share vertices, and history measures candidate bytes before pruning to the existing 8 MiB limit. Neither the history nor checkpoint limit was increased. Repeated replacement and restart/undo now pass.
The initial software browser campaign missed the default five-second first-save deadline. The new woodland journey now uses the same explicit 15-second save allowance as its subsequent edits and records elapsed time: 6.359 and 7.359 seconds in the passing run. This establishes functional acceptance, not five-second performance. The separate existing software restoration timing failure remains open. Sustained performance, wider device coverage, tree wind and the rest of milestone 15 remain unverified or unfinished; no numbered roadmap milestone is closed.