In this chapter
In this chapter
Measuring the hand
“This feels slow” is a useful observation and a terrible benchmark. So the hand-feel work started with a drag harness, a script that moves the pointer, presses buttons, scrubs sliders and triggers undo through the editor’s own input handlers.
It records the time spent in the handler, the wall-clock cost of the frame after it, and the rebuild on release. The second number is there because moving expensive work out of the handler doesn’t make it free. The next frame may just pay for it instead.
Test logs and fixed-camera captures made it possible to compare each change with the version before it. Backups kept a way back when an experiment went wrong, and notes on known faults helped distinguish a new regression from an old problem.
Replays also hash the document state they end with, since a faster run that quietly does less editing isn’t an improvement. Filmstrip captures at fixed times show the transition as well as the finished building.
Stop rebuilding things the hand did not change
A height drag used to rebuild the inspector controls and handle meshes, and it validated more of the scene than it needed to. Now it validates only the affected neighbourhood, previews slider changes continuously and commits once, on release.
Camera moves came out of the undo history too. Panning round to look at a roof shouldn’t count as an edit, and undoing the roof shouldn’t fling the camera back across town.
Direct manipulation got more consistent. A newly placed part stays selected, click-drag moves it, Alt-drag duplicates it, and guides show when something snaps to an edge, a ridge or an alignment. Roofs got curve and ridge-end handles, so more of their shape can be pulled around directly.
A building should get a moment to arrive
Placing a house used to produce a finished house on the very next frame. Efficient, perhaps, but oddly abrupt for a toy about building things. Now the massing, openings, roof and small details arrive one after another, in a set order.
Timing and reveal data reach the shader through per-vertex CUSTOM0. Walls rise with their top edge following the rhythm of the masonry, roofs pop in with a little squash, and bricks and tiles each come in on a seeded stagger. The seed belongs to the piece, so the same wall always builds the same way.
The generator also compares old pieces with new ones, so raising a house builds only the new storey and the rest of the house stays put. Settled geometry has no reveal gate left on it. Removing something plays a short sink-and-shrink, and undo and redo replay faster.

Where the time went
The animation work also spread the release rebuild out over the reveal. In the construction-animation comparison, the Harbour release dropped from about 200 ms to 34 ms, and the dense fixture from 2,153 ms to 291 ms. Those are release costs from that experiment, and they shouldn’t be read as average frame times.
Some budgets were still missed. Dense terrain dabs added about 2.5 ms against a 1 ms animation budget, and compiling a shader for the first time could affect the first reveal. Both remained open problems.
This is where the project’s idea of polish got more specific. What counts is the whole stretch of time between the hand moving and the world answering believably, and a fast final mesh or a nice animation curve only covers part of it.
From the project notebook
This chapter draws on the project’s records as they stood on 23 September 2026.
- docs/visual-handoff.md · Feel A0, A1 and A2
- docs/forum-post-technical.md · Tooling and feel
- scripts/edit_history.gd
- scripts/build_anim.gd
- artifacts/feel-journey/03-A2/pkg/after-c-place/





