Building a wall generator and six steampunk walls
A new art-kit module builds walls from numbers on a 3 m grid, and the first six steampunk walls pass every pipeline step. None is placed in the world yet.
The art kit can now build the walls of a building from numbers. There is a new module, building_kit.py, a new pipeline class for building pieces, and six steampunk walls that pass every step of the model pipeline: a plain wall, one with a window, one with two, one with a door, and two upper-storey walls. Nothing is placed in the world yet. I asked for a generator and proof that it builds buildings, not for buildings in the game. Gables, plinth steps, string courses, roofs and the judge round come in later chunks.

Why are there new limits for a building piece?
The game’s only building is a hut of boxes, 10 by 8 m, whose front wall is 132 triangles in 11 boxes.

The new pieces replace nothing, so the hut stays. A wall piece gets 600 triangles near, 300 in the middle and 60 far, with 8 collision shapes and one material. Those limits are the new building_piece class in the pipeline. The ground storey is 4 m, so the 2.5 by 3.75 m door passes the interior kit’s door rule. Upper storeys are 3 m with a 0.15 m floor slab, which leaves an upper room 2.85 m clear.
| Wall | Near | Middle | Far |
|---|---|---|---|
| ground plain | 401 | 113 | 12 |
| ground window | 465 | 177 | 30 |
| ground double window | 561 | 273 | 50 |
| ground door | 314 | 314 | 24 |
| upper plain | 234 | 90 | 12 |
| upper window | 298 | 154 | 30 |
The door wall’s middle level equals its near level, because it has no detail parts to drop. At 314 it is over the 300 target and under the 345 cap.
How does a wall get built from numbers?
A wall is fixed to the line between two squares of a 3 m grid, and it has two sides. The line runs down the middle of its 0.30 m thickness, with the outside on one side and the inside on the other. Every part is a closed solid lofted from numbers in surface space, where u runs along the wall, v up and w out of the face. Parts are placed by a turn, not a mirror.
Joins are mitred per face. A point that stands w meters proud of the line ends at u = half a square + w. So the outside runs meet on the diagonal at the building’s outside corner, and the inside runs meet at the room’s corner. The core’s ends are a V, so the corner square is filled from both sides.
The core is cut into blocks around the openings, piers first. The blocks under a sill and over a head sink 2 cm into the piers. The steampunk look’s form file adds the outside: an I-beam pilaster 0.24 m wide, standing 0.18 m proud every 1.5 m on the grid lines, with half a pilaster on each wall at its ends. Pipe runs go in front of them with a bracket at each flange. A ground wall has a 0.45 by 0.12 m plinth with a 0.04 m chamfer. The inside gets a 0.02 m plaster lining and a 0.15 m skirting. Each part takes its own palette row: brick core, plaster lining, timber skirting, stone plinth and sills, dark pilasters and brackets, iron lintels. The upper wall carries one pipe at 2.75 m, radius 0.06, which a second review sheet settled.
Collision is written in the game’s axes. A window wall is one box, because piers 1.2 m apart failed the pipeline’s wedge rule for gaps under 2.4 m. A door wall is piers and a head. Each wall also lists 3 to 5 cable fixing points and 24 growth points, the highest scores from the layer kit’s scatter at 10 points per square meter.
Why did vertex color disappear on the way to the game?
Before any wall was built, a spike sent a slab and a loose panel from Blender 5.2 through glTF to Godot 4.7 and compared every channel with what Blender wrote. A piece carries four per-vertex numbers: which break group it belongs to, its break rank, how convex its edge is and how shut-in it is. They were lost in three places.
- The kit’s exporter call used
export_vertex_color="MATERIAL". The exporter then writesCOLOR_0as white, and the kit’s color went toCOLOR_1, which Godot never reads. The fix is"ACTIVE"with the piece’s one color attribute active. - The kit’s glTF slimmer dropped every color set when a file had a material or a picture, which every named piece has. It now takes a keep list and rewrites a kept color as unsigned bytes, rounded. Godot truncates a finer color to a byte, so a 16-bit color came back up to 1/255 off.
- Godot’s importer has no array for a custom attribute named with a leading underscore, so a pivot stored that way vanished. The pivot goes in UV maps 5 and 6, which Godot imports as
CUSTOM1, with maps 3 and 4 written as zeros because glTF numbers its sets in order.
Instance color also multiplies vertex color in Godot. With 64 instances the largest error against the product was 0.0039, one 8-bit step. The break channels cannot be recovered from the product, so building MultiMeshes keep use_colors off and carry their per-instance state in INSTANCE_CUSTOM.
The result is a contract the pipeline now checks for this class: COLOR_0 is four unsigned bytes, normalized, red the break group id divided by 255, green the rank, blue the edge and alpha the shut-in score. TEXCOORD_1 must exist, and no underscore attribute and no second color set may be present.
What is not finished?
Some end faces of the sunk blocks were kept by the visibility pass although they are inside the wall. An eye reached them by a path I did not find. In a straight run, mitred parts such as pilaster halves and pipe ends overlap in the same plane, and that can only be judged on an assembled house, so it waits for the next chunk. The upper storey’s short door is not built.
Also done
- The model gate’s test in the game now knows the building class has no clips.
- The pipeline’s self-test passed 161 checks, and the data-path checks passed 30 of 30 on the final code.
- The study built 8 pieces, with 0 failures and 0 faults. All 8 pass the Godot check and build to the same bytes twice. Every wall has 0 open edges at slopes of 0, 15 and 30 degrees.