In this chapter
In this chapter
A row along the canal
A new Amsterdam canal starter rebuilt a row of photographed houses from the game’s existing parts. The houses were placed from columns in the reference image, at about five centimetres per pixel. Narrow roof sections stacked against flat-roofed bodies supplied the neck and stepped gables.
The starter opens from the menu and can be undone like the other examples. Golden-hour light gives some windows a glow. Its materials come from the existing style palettes, so the orange and black houses in the reference could only be approximated. Houseboats had to become lines of the available 2.6-metre boat.
The trees exposed another limit. Their old visible crowns reached only about 3.7 metres, while those in the reference were roughly ten metres tall. The scene made the scale mismatch easy to see. The following tree work gave the building tools a much wider range.
A taller tree needs more branches
Height and Spread controls now work on green trees and blossoms. Height runs from 2.5 to 23.6 metres, and the widest crown can reach eighteen metres. The permitted spread narrows relative to height, so dragging wider cannot turn every tall tree into a pancake.
Trunk girth follows height only. A wide crown gets its reach from a lower fork and spreading limbs, rather than an inflated trunk. At a fork, the combined cross-sectional area of the children follows that of the parent, giving thin outer branches a structural reason to be thin.
The skeleton comes from a seeded recursive grammar. Each branch has a birth age and grows from the same underlying structure as the tree gets larger. That keeps resizing from replacing one random tree with another. Height and spread handles clamp to the allowed proportions, and changing a size stage gives the tree a small scale overshoot.
Individual limbs do not yet animate their own growth. The shape changes in stages, with that brief overshoot softening the transition. Picking also still ignores the tree’s lean.
Remember the size, share the mesh
Old saves needed careful treatment. Tree placement had previously copied some building parameters into the tree, including a height field. Reusing that field would have resized old trees when they loaded. The new dimensions use separate optional keys, grow_h and grow_w; absent keys retain the old 4.2-by-2.8-metre bounds.
Continuous sizes would be expensive if every tree needed a unique mesh. The cache uses fifty-three height stages and five crown habits, with at most three per cent residual scaling between them. Small height stages are close together; above about 8.3 metres they are half a metre apart.
The dense test scene’s hundred trees and blossoms used six merged tree meshes. Randomising every size would have needed ninety-nine stage groups. The cache has an eviction limit, so a scene with many different sizes can still spend time rebuilding shapes.
Give the house something to stand on
When a building meets a tree’s trunk or crown, the relationship is derived from their geometry. It is not stored as a permanent parent-child link. Moving either object recalculates which tree, if any, can carry the house.
Support boughs curve up from the trunk toward the underside of the building. Forked ends cradle timber sills, and a joist deck ties the support together under the floor. The placement system can suggest a perch, with tree-supported lifting allowed up to thirteen metres. A lifted house with nothing to carry it still gets the unsupported warning.
The crown grows around the house. Leaf clumps that would cut into walls are removed, and the host tree gets its own mesh while keeping its seeded orientation and lean. A roof up to forty-five degrees can receive a collar where the trunk passes through.
Steeper roofs need a different route. The trunk stops below the roof face and carrier limbs leave from under the floor, curve around the eaves and reach back into the crown. A house usually gets at most two of these limbs, or three when wider than six metres. A leaf clump without a drawn supporting limb is dropped, which prevents a crown from hanging in space.
The little trees still matter
The first growth model changed the familiar small trees too much. Green crowns became upright eggs on bare poles, and the blossom lost its flat parasol. Dark lower lobes made them feel heavier. The new system could grow a giant, but it had made the town’s ordinary trees less convincing.
A follow-up restored the young form with a low whorl of limbs fanning outward and a slightly lower crown top. The old tint range returned for young trees. As a tree grows older, that low fan drops out of the drawing, leaving the tall form’s clear trunk.
The geometry checks put the default green crown’s average top at 3.61 metres, close to the old 3.63. The blossom came back to 3.43 against 3.46. Their stored bounds stayed unchanged. The correction recovered the small silhouettes without removing the larger growth model.
How it held up
The final run covered forty test suites and 18,201 checks with no failures, plus a clean integration check. On the dense scene, three interleaved runs on AC power averaged 14.13 milliseconds per frame before the tree work and 14.20 after it, with the same 1,966 draw calls. The p95 change was small enough to sit within the observed run-to-run variation.
A separate test planted six trees at the maximum height and spread, with two carrying houses. Both had tree supports and no unsupported warning. The rebuilt Mac app rendered this scene in a standalone run. A Windows executable was exported, but it was not run on Windows.
There are still rough silhouettes at the largest sizes: bare stubs, notched tops and dark lower lobes. One house leaves a bare side after the crown is clipped; another has a length of exposed leader above its roof. A steep-roofed house lifted less than roughly a metre can lose the whole crown. The trees can now carry buildings, but those awkward combinations still need work.
From the project notebook
This chapter draws on the project’s records as they stood on 25 September 2026.
- HANDOFF.md · Amsterdam canal starter, 25 September
- docs/tree-growth-plan.md · Implemented design and deviations
- docs/visual-handoff.md · Tree growth, default-look correction and final verification
- artifacts/trees/final/ · Final test, benchmark and standalone evidence
- artifacts/trees/lookfix/ · Young crowns and treehouse captures

