In this chapter
In this chapter
An arrow says which way
The round resize knobs were replaced with arrows pointing along the direction they control. Height points up; width and depth point across the building. Rotation gets a curved arrow. Free controls such as wall nodes and pipe ends keep their round shape because they are not tied to one direction.
The arrows have a dark rim so pale controls remain visible against a pale wall. Their clickable area reaches to the tip, which sounds obvious until the first version lets a visible arrowhead sit outside its old cube-shaped hit box.
Another correction stopped the tail of a wall’s height arrow from stealing a click meant for the wall itself. Where several grips overlap, the choice now follows the centre nearest the picking ray. The shape people see and the area they can click have to agree.
Keep the windows while it grows
The old drag preview reduced a building to plain massing while the detailed version waited for release. The new path rebuilds the changed cluster in full. Windows and roof pieces stay visible as the house grows, and new courses arrive with the construction animation.
To avoid rebuilding on every pointer event, a full build happens at most once every eighty milliseconds, or twice the previous build’s cost if that is longer. An edit made inside the gap is drawn when the wait ends. Neighbouring clusters whose own members did not change can wait until release.
Animation continuity needed its own bookkeeping. A nearest-piece match, limited to 1.2 metres within a material, carries settled pieces into the next build and lets unfinished pieces continue revealing. Only new pieces start growing. Release keeps that information even when its work is queued for a later frame, and carried pieces do not click again.


A better median, a worse hitch
The detailed drag is an honest trade-off. On Harbour’s main house, the measured median step fell from 38.3 to 25.7 milliseconds. The p95 went the other way, from 55.2 to 117.1, with a first full build reaching 391.1 milliseconds. The test ran on battery with Low Power Mode, so those numbers belong to that sitting.
The cheap steps between rebuilds brought the median down. The full builds were much heavier: about 43 milliseconds for the house against two for its plain preview. A large house could hitch every 120 to 170 milliseconds while being dragged. The denser scene and canal quarter were not measured in this experiment.
Widening a house also exposes the limits of matching by material and distance. Windows get re-spaced; a piece that jumps too far is treated as new and reveals again. A pane can briefly appear without its frame. Matching an entire opening would give those pieces a better shared identity.
The construction clock pauses during each full build, so other animations were running at roughly half speed during these drags. Keeping the building visible solved the visual interruption, while the expensive frames remained a separate problem.
A little lift when selected
Selection then moved from an outline box to a small lift in the part’s colour, with a touch of pale cyan. A faint glow helps at night. Self-lit windows and neon receive half the lift and no extra glow, so selecting a house does not wash out its bright details.
The shader tests the surface against the selected part’s bounds. A freehand wall uses a chain of up to sixteen boxes along its samples, which avoids lighting up a house simply because it sits inside the wall’s curve. An early bounds check keeps fragments outside the whole selection from paying for every box.
The highlight fades in over 0.12 seconds. It disappears while a grip is held and is hidden in clean photographs. In the recorded selection test, choosing a house or the sixteen-box wall had no measurable frame-cost increase.
Paying for the first frame
Foliage rendering was simplified too. Fullness and hue variants now share a merged mesh for each shape, with variation supplied per instance. Harbour’s standard day view dropped from 993 draw calls to 925, while the dense fixture saw no change. The frame-time ranges overlapped, so fewer calls did not establish a speed gain.
Shader warm-up moved some of the first-use work behind the startup screen and spread the remainder across idle rounds. After full warm-up, the first house release measured 86 to 93 milliseconds, down from about a second. Startup took roughly 1.44 seconds longer.
The remaining idle warm-up could produce frames of about 147 milliseconds during the first fifteen seconds of a session, and the first terrain raise still reached about 177 milliseconds in the warmed runs. These figures explain why a faster first house did not yet make the whole opening feel smooth.
From the project notebook
This chapter draws on the project’s records as they stood on 25 September 2026.
- docs/visual-handoff.md · 24 September arrow grips and full-detail resize
- docs/visual-handoff.md · 25 September selection highlight
- docs/visual-handoff.md · P1d foliage batching and shader warm-up
- docs/operation-treehouse.md · Editing results and open limits
- artifacts/owner-0924/drag/final3/performance.json
