A Blender level-blockout add-on. Place construction grids anywhere in space, draw on them with the mouse, and get ramps, walls, blocks and floors that stay editable forever.
Built for Blender 5.2 LTS as an Extension (blender_manifest.toml).
Three keys, in the 3D View in Object Mode. They are the add-on's whole loop, in order:
| key | what it does |
|---|---|
| Ctrl + Shift + P | place a construction plane — click two opposite corners |
| Ctrl + Shift + D | draw a stroke on the active plane |
| Ctrl + Shift + E | open the Efficiency Construction menu for the selected object |
None of the three overrides a stock Blender binding. Ctrl+Shift+G would have
been the obvious key for the grid and is not free — Blender uses it for Add
Selected to Active Collection — so the plane is on P.
The draw key is editable in Edit ▸ Preferences ▸ Add-ons ▸ Efficiency
Construction, which also prints all three keys so you never have to go
looking in the Keymap editor. Everything the keys do is also on buttons in the
sidebar: press N in the 3D View and open the Efficiency tab.
From a release ZIP — in Blender: Edit ▸ Preferences ▸ Add-ons ▸ ▾ ▸ Install from Disk…, pick the ZIP, then tick the checkbox beside Efficiency
Construction to switch it on. Blender remembers the tick between sessions.
From this repo — copy the inner efficiency_construction folder to:
%APPDATA%\Blender Foundation\Blender\5.2\extensions\user_default\efficiency_construction\
then toggle the add-on off and on in Preferences. That is also how you reinstall after editing the source.
Ships as an Extension (blender_manifest.toml), not a legacy bl_info
add-on. Blender 4.2 or newer; developed on 5.2 LTS.
Every object is a pure function of its inputs:
(stroke points, parameters, builder) --> rebuild() --> mesh
The mesh is disposable output; the stroke and parameters stored on the object are the source of truth. "Convert to stairs" swaps the builder and rebuilds. "Make it taller" changes a number and rebuilds. Nothing ever edits geometry, so edits work in any order, repeat indefinitely, and cannot corrupt the mesh.
1. Place a grid. In the Grids panel pick a plane (XY horizontal, XZ/YZ
vertical), type the offset coordinate — Z = 15 for a bridge deck fifteen
metres up — then click two opposite corners in the viewport.
Grids are ordinary scene objects: they save with the file, show in the
outliner, and move with G. Stack Above duplicates one a fixed distance
along its normal for aligned floor stacks; Add Adjacent butts a new one
against an edge.
Large grids draw every Nth cell rather than every cell, so they stay a light lattice instead of a black mat. Snapping still uses the true cell size.
2. Draw. Pick Ramp, Floor, or Wall, then hit Draw.
- Drag with the button held for a freehand curve — this is how you draw a crescent ramp.
- Click discrete points and press Enter — this is how you place the four corners of a block or the two ends of a straight wall.
The gesture decides, so there is no input mode to remember. C closes the
stroke, Backspace undoes a point, Esc cancels.
3. Right-click to edit. Everything is adjustable afterwards from the object context menu or the Selected panel.
| Mode | Stroke means | Result |
|---|---|---|
| Ramp | centreline | slab rising along the path |
| Floor | centreline | flat slab |
| Wall → Wall | centreline | vertical slab; a closed stroke gives a hollow enclosure |
| Wall → Block | footprint polygon | solid extruded mass |
Point count matters in Block mode, and only there:
| points | result |
|---|---|
| 1 | a beam — the seed for the pillar styles |
| 2 | rejected; two points enclose no area (use Wall mode) |
| 3 | triangular prism |
| 4 | cuboid |
| 5+ | extruded n-gon |
Filtered by what the object is, so the menu never offers something impossible.
- Ramp family — Ramp / Stairs / Floating Stairs / Hill, Fill Underneath, Step Count, Surface, Flare (closed strokes)
- Floor family — Floor / Bridge (adds camber), Surface (seven styles, each with a lever)
- Wall family — Wall / Arch (Cut Opening or Freestanding Ring)
- Blocks — Style (ten profiles) and Detail (three groups)
- All — Set Height, Set Slope, Thicken / Bevel, Edit Stroke, Rebuild
Height and slope never disagree. One is authoritative at a time; editing either recomputes the other. Redrawing a stroke changes its length, so whichever value is not in charge is recomputed to match.
- Draw two closed square Wall strokes; set their heights (say 20 m and 30 m).
- Add a horizontal grid at
Z = 15. - Draw a Floor across it between the towers.
- Right-click → Convert to Bridge, dial in camber.
Arches and single-point beams take their shape from a profile. Set it from Style in the right-click menu, or the Selected panel, and the object rebuilds.
Ten ship, ordered here flattest to tallest:
| profile | arch | pillar | rise ÷ span |
|---|---|---|---|
| Segmental | shallow circular slice | square post | 0.25 |
| Tudor | four-centred, shoulders into flat arcs | octagon | 0.35 |
| Plain | semicircular | square post | 0.50 |
| Roman | semicircular | Tuscan cylinder | 0.50 |
| Renaissance | semicircular | fluted column | 0.50 |
| Byzantine | stilted round | cylinder | 0.65 |
| Moorish | horseshoe | quatrefoil shaft | 0.72 |
| Gothic | two-centred equilateral | clustered pier | 0.866 |
| Ogee | S-curve to a point | slender octagon | 1.00 |
| Lancet | steep two-centred | slender octagon | 1.20 |
Several share an arch curve — the Roman round arch is the semicircle, and the Renaissance revived it deliberately — and differ in the shaft. That is historically the case, not an oversight.
The rise-to-span ratio in that table is what makes a style that style, so it is never compromised. Change a wall's height and the arch rescales with it, staying true to its profile.
When a wall is too low to carry the arch, the opening narrows rather than the arch flattening. Rise and opening shrink together, so a Gothic arch on a short wall stays properly Gothic and merely gets smaller. Only when the opening would drop below a quarter of the wall does the build refuse, and it then tells you the height it would need.
A horseshoe arch is wider above the impost than at its springing. The builder measures that overshoot from the curve itself and widens the jambs to suit, so the arch never breaks out through the side of its own wall.
An arch is dressed with the stones it would be built from: an archivolt of eleven voussoirs round the opening, a keystone at the crown, and an impost block on each jamb at springing height. They stand proud of both wall faces, so the same arch reads from either side.
The stones follow the intrados, so they take the style's curve for free — a horseshoe's voussoirs swing out with it, an ogee's follow it through the inflection. They sit on a continuous backing band, which is what makes the joints read as joints rather than as slots cut back to the wall.
All of it is sized from the headroom the arch left rather than from the wall, so an arch on a wall that is only just tall enough still tops out at exactly the height you set, and the opening the style solved for is never narrowed. If there is no room for stones — a very low wall, a very narrow jamb — the arch is simply built plain.
Slope is a ramp concept and does not apply to walls or arches — that is why
Set Slope only appears on the ramp family. To tilt an arch, rotate the object
normally with R; rebuilds preserve the object transform, so the rotation
survives every later edit.
A profile is data, not code: one register() call supplying an arch curve, a
footprint, and a rise factor. Shared curve maths lives in
builders/profiles/curves.py and shaft footprints in shafts.py, so most new
styles are a few lines.
Pillar footprints always fit inside the thickness you asked for, so a three-cell pier occupies three cells whatever style it wears.
A plain block is its footprint extruded straight up. Turn on a Detail group and the same footprint is lofted through a vertical profile instead, giving it a base, joints between drums, a shaft that swells, and a capital with ornament on it. Three ship:
| group | base | shaft | capital | ornament |
|---|---|---|---|---|
| Classical | attic — torus, scotia, torus on a square plinth | entasis, flutes, 5 drum joints | echinus under a square abacus | four corner volutes |
| Gothic | square plinth chamfered into a water-holding base | straight, 3 annulets | deep bell, octagonal abacus | eight crockets |
| Byzantine | stepped plinth and torus | plain, 2 wide joints | basket under an impost block | woven ribs |
These are grouped presets, not a kit of parts: pick Classical and you get its base, shaft, capital and volutes together. Detail is independent of Style, so any of the ten profiles can wear any of the three groups — a fluted Renaissance shaft with a Classical base and capital, or a Gothic clustered pier with a bell.
Set it from Detail in the right-click menu or the Selected panel. It applies to any block, not just single-point beams.
The capital defines the width. Profiles are normalised so the widest element lands exactly on the thickness you asked for and the shaft is slimmer in proportion, so a three-cell pier still occupies three cells once detailed — ornament included.
Detail groups used to be a handful of hand-typed rings. Three things replaced that, and a detailed column is now roughly ten to twenty times the geometry it was — a Roman column with a Classical capital went from 1 344 vertices to 22 336.
Mouldings are curves. A torus is a half-round in section and a scotia is a hollow; two points make both a chamfer. Profiles are written in a moulding vocabulary — torus, scotia, ovolo, cavetto, cyma, astragal, fillet, entasis — each sampling its own curve.
The footprint changes with height. The old limit was that a footprint could only be scaled, so a round column got a round abacus. Now each ring can also blend toward the shaft's smooth core and toward a square or octagonal target, so a cylinder carries a genuinely square abacus, and flutes stop at the base and under the necking instead of running through the mouldings.
Ornament is not a cross-section. A volute spirals: no ring of the column contains one. Volutes, crockets and basket ribs are separate closed solids swept along their own paths and placed from the profile that was actually built, so they follow when the mouldings change.
Limits: a faceted footprint stays faceted — a square or octagonal pier keeps its point count, so its abacus is square or octagonal in turn rather than being rounded off. And a footprint you drew gets the mouldings but not the morphing or the ornament: a square abacus over an arbitrary polygon has no defensible meaning, and guessing one would quietly reshape what you placed.
A wall sweeps along its stroke, whatever the stroke does. Circles, ellipses, spirals, S-curves and serpentines all work, open or closed — a closed round stroke gives a genuine cylindrical tower, not a faceted one.
What decides between a curve and a corner is how hard the stroke turns at a point, not how many points it has:
| closed stroke | turn per point | result |
|---|---|---|
| 20 points | 18° | true circle |
| 8 points | 45° | still rounded |
| 6 points | 60° | sharp hexagon |
| 4 points | 90° | sharp box |
Anything turning less than 50° is smoothed through; anything sharper is kept as a corner. So you get a cylinder and a box from the same gesture, and the only difference is how many points you place.
Measured on a 20-point circle of radius 13 with a 2 m wall: every vertex lands on the inner or outer face within 3 mm. A 4-point stroke of the same radius varies by over 4 m, because its corners are real corners.
The one limit is the turn-radius rule — a stroke cannot turn tighter than half the wall's thickness, or the inner face would fold through itself. Draw tighter than that and the stroke turns red before you commit.
A closed stroke means two different things, depending on what is reading it.
To the ramp family it is a helix. Draw a circle in Ramp mode and it climbs exactly one turn, finishing directly above where it began. Convert it to Stairs for a spiral staircase, or to Floating Stairs for cantilevered treads around an open well.
It is deliberately not swept as a loop — doing that would join the top of the climb back onto the bottom and twist the whole band through the rise.
Flare opens the turn out as it climbs, so the top is wider than the foot and the treads clear one another instead of stacking. At zero the spiral sits directly above itself.
Turns takes the spiral round more than once. What that means is left to the height driver, which already distinguishes the two things you might want:
| driven by | two turns gives |
|---|---|
| Slope | twice the climb — two loops, two storeys |
| Height | the same rise, spread over twice the distance: gentler |
Fill Underneath on a closed ramp gives one solid block — the heavy alternative to a floating spiral. Flare is not what makes that possible: every point of a turn is at its own angle, so a plain filled spiral is already a clean solid, with a vertical face where the turn closes. Flare changes the block's shape, widening it as it rises.
But a filled spiral needs flare to be usable. Fill runs from every point of the climb down to the ground, so at a given angle the upper turn's mass swallows the lower one. Unflared and filled, the whole thing is a single solid with only its topmost surface showing — there is no way onto it. Measured on a two-turn spiral, every radius from 5 m to 9 m reported the same top at 35.5 m.
Flared, each turn lands further out than the one below and becomes a terrace you can step onto: 0.7 m at 6 m out, 18.6 m at 10 m, 35.5 m at 14 m. That is what flare is for.
To a hill it is a footprint. Convert a closed stroke to Hill and you get a mound: high in the middle, running out to nothing at the line you drew.
Height comes from distance to the drawn edge, which is what lets one rule cover every shape:
| you draw | you get |
|---|---|
| a circle | an even cone — the summit at the centre, falling away the same all round |
| an oval | a summit at the centre, but longer and shallower along the long axis |
| round one side, drawn out the other | steep on the round side, long and gentle on the drawn-out side |
Measured on a mound 6 m high: a circle of radius 8 falls at 36.7° all round; an oval 20×8 falls at 16.7° on its long axis and 36.7° on its short; and a shape that is round one side and drawn out the other gives exactly 36.7° and 16.7° on its two sides.
The summit sits at the point furthest from any edge, not at the centroid — on a lopsided shape the centroid drifts toward the long end and the summit does not. The profile is a cosine, so the mound meets the ground gently and rounds off at the top rather than coming to a spike.
Open strokes are unaffected: a hill drawn as a line is still a swept ridge.
Three treatments of the same stroke, and the difference between the last two is worth knowing:
| underside | |
|---|---|
| Stairs, Fill Underneath on | solid all the way down to the grid |
| Stairs, Fill Underneath off | a raking soffit — one connected solid with a slanted underside |
| Floating Stairs | none at all; treads on a cut stringer, open between them |
A floating stair is therefore not a stair with the fill switched off. It has no soffit at all — you see daylight between the treads.
The treads are not free-floating slabs. They sit on a sawtooth stringer running the whole climb, so the stair is one connected solid that could actually stand. An earlier version gave every tread its own shell: it looked right and was structurally nonsense.
The stringer is deliberately slim — under a fifth of the tread width. A beam heavy enough to rival the treads defeats the point, and at one setting the "floating" stair held more material than the solid one it is meant to be the light alternative to.
Tread thickness is clamped to a fraction of the riser so there is always a gap to see through — that being the entire point of the style. Set a low Step Count for a dramatic one. Fill Underneath is hidden on floating stairs, since there is nothing underneath to fill.
Floors, bridges, ramps, stairs, floating stairs and hills all take a Surface style. Seven ship, and each carries one numeric lever, because the same resource looks completely different depending on a single quantity:
| style | lever | 0 | 1 |
|---|---|---|---|
| Grass | Age | freshly mown | meadow, gone to seed |
| Flower Field | Density | scattered | thick with blooms |
| Desire Path | Age | freshly trodden | worn to bare earth |
| Stone Path | Heave | evenly laid | shifted and uneven |
| Wooden | Age | newly laid, flat and tight | ruined, boards missing |
| Sand | Dunes | flat with wind ripples | rolling dunes |
| Water | Tranquility | choppy | glassy |
These are geometry, not colour and not textures. The add-on makes untextured blockout, so most styles are a height function displacing the deck — worn earth, laid stone, ripples, swell. Two are not: grass grows real blades and wood lays real planks, because neither can be said as a height at all. Both read in Solid shading, in a render, and after export, with nothing to bake or unwrap.
Relief has real height. Shallow displacement on a deck several metres wide is just a rough plane: grass at five centimetres reads as scuffed concrete. Tussocks stand about a third of a metre, flower heads half a metre, chop close to one. Grass is a field of discrete cones rather than smooth noise, because a rolling lump is not a clump — the surface has to fall back to the ground between tussocks to read as turf.
Colour deliberately plays no part: floors take the same plain family colour as walls. A grey deck with the right relief reads as stone; a green flat plane does not read as grass.
Wood is the second surface that is not a height function, and it failed the same way grass did. A height function gives one height per point of the deck, and none of what age does to a floor can be said that way: a missing plank is a change of topology, a board snapped in half needs a real edge where it broke, and a board with one end lifted is multi-valued — there is air under the raised end.
So the boards are real geometry. Each plank is its own closed solid, lofted section by section along its length and cut from the deck's own sampling, so a board curves with a curved floor and follows a bridge's camber without anything having to be told which it is lying on.
Building a board as a run of sections rather than a flat box is what lets it carry detail:
- Both top edges are chamfered. This is the single thing that makes a new floor read at all. A new floor is not a flat plane with slots in it — it is a field of separate boards, and the eased edge is what says so, because it puts a line of shadow at every joint when nothing has moved.
- Cup across the board, twist along it, and sag between supports — three different ways a board leaves flat, not one amplitude turned up.
- Snapped ends are ragged. Every point of a break carries its own distance along the board, so a break is angled and torn rather than sawn square. Timber never breaks square.
- Splinters. A break sheds fibres along the grain. Without them a ruined floor reads as a heap of broken slabs rather than as wood.
- Grain along the board's face, faint when sawn and pronounced when weathered, and arrises that round off as a floor ages.
Boards are 120-180 mm, not all milled to the same width, and they lie on joists with air beneath them. That last part matters more than any of the rest: a joint is only a line of shadow if there is somewhere dark for it to be. Laid flat on the deck at deck height, boarding reads as a plane with scratches on it however much detail each board carries.
Wood has three named ages, on the lever or one click away in the panel and the right-click menu:
| age | boards | character |
|---|---|---|
| New | flat, 2 mm joints | tight, level, freshly laid |
| Aged | 5–25 mm joints, sitting ±15 mm | ill-fitting but sound; nothing broken |
| Ruined | gaps, breaks, boards standing up | planks missing, some snapped, some lifted |
The joints are a hairline at New rather than truly zero: two solids butted at exactly zero share coincident faces and z-fight in the viewport.
Aged is a guarantee, not a probability. Nothing breaks, nothing goes missing and nothing tilts until the lever passes 0.6, so a floor set to Aged is always a whole floor that merely fits badly. That is the difference between a board that has moved and a board that has failed, and it is the line the three ages are drawn around.
At Ruined about a seventh of the boards are gone, a fifth have snapped in half — each half free to be lost or to stand on its own — and roughly one in ten of what remains has an end lifted a quarter to two-fifths of a metre out of the floor.
What shows through a gap depends on what is underneath. A floor keeps its slab, so a missing plank is a recess of subfloor. A bridge has no slab: the boards are carried on two bearers along the deck edges, so a missing plank is daylight. Boards over nothing would be the mistake floating stair treads already made once.
Blade count has an equivalent here: boarding is capped, and a very large deck gets wider boards rather than a deck that runs out of them halfway across.
Limit: hills take no boarding. A mound is parametrised by edge index and distance to the summit rather than by metres along and across, so there is no board to cut from it — and a hill is ground rather than decking.
Grass is the one surface that is not a height function. A displaced deck gives a bumpy sheet, and a bumpy sheet reads as clay or velvet however finely it is tuned — there is no setting at which a continuous surface becomes a field of separate thin things with daylight between them.
So the deck under grass carries only what genuinely is a surface: the ground, and the low mat of thatch at its base. The grass itself is real geometry — tapered blades, scattered in tufts, leaning and drooping, each a closed solid so the manifold guarantee still holds.
Flower fields and desire paths grow the same blades. A desire path's wear function drives both the hollow in the ground and the missing grass above it, so the bare earth and the gap in the sward can never disagree.
Limits: blade count is capped per object — it is a responsiveness budget, since a rebuild runs on every property change. A small plot gets its full density (~120 blades/m²); a very large one thins out. For a dense lawn at scale you would want Blender's own instancing, which is outside what a mesh generator should do.
Grass has three named ages, on the lever or one click away in the panel and the right-click menu:
| age | canopy | character |
|---|---|---|
| Mown | ~1 cm | short, even, fine-textured |
| Regrowing | ~5 cm | patchy, recovering unevenly |
| Meadow | ~20 cm, heads to 65 cm | tussocky, gone to seed |
Age changes four things together — height, clumpiness, patchiness and seed heads — so these are three states of one lawn rather than one lawn at three heights. Patchiness peaks in the middle band on purpose: a fresh cut is even and an established meadow is evenly tussocky; only the recovery between them is blotchy.
Flower fields and desire-path verges sit on the same turf, so each states its own age — a meadow for the flowers, half-grown for a verge beside a trodden track.
Draw a Desire Path floor along the route people actually walk. The track wears down its own centreline and wanders slightly rather than running straight. Age drives three things at once — the track widens, the grass in it thins, and the earth beneath it hollows — which is what separates a fresh path from an old one rather than merely making it deeper.
Relief tapers to nothing at the deck's border, so the floor keeps a clean straight edge.
Surfaces ride on whatever they are applied to, they never reshape it. A bridge keeps its camber, a ramp keeps its slope, a stair keeps its treads — a grass ramp is a ramp with grass growing on it. Surfaces compose with the ramp family's own options too: Fill Underneath, Hill and Stairs all work with any style.
Hills are the exception to how relief is applied. A hill is a dome rather than a band, so its relief is attenuated by how upward-facing the surface is: grass grows thickly on the crown and thins to nothing on the near-vertical flanks, where vertical displacement would only smear it.
Walls and blocks deliberately take no surface. They are not decks.
Noise is a deterministic hash, never random. The same floor always rebuilds
to exactly the same mesh, which is what keeps rebuilding idempotent.
Sand that banks against walls, water that responds to its scene, and properly irregular stone paving are v3 — see ROADMAP. They depend on what surrounds an object rather than on its own design.
New objects get a flat viewport colour by family, so blockout geometry reads instead of vanishing into Blender's grey:
| family | colour |
|---|---|
| Ramp / Stairs / Hill | warm orange |
| Floor / Bridge | teal |
| Wall / Arch | slate blue |
| Block | green |
Both the Solid-mode colour and the Principled base colour are set, so it looks the same in Solid, Material Preview and renders.
Materials you assign yourself are never touched. Ours are tagged internally; anything untagged is yours and survives every rebuild and conversion. Turn the whole thing off with Auto Colour in the Draw panel.
A swept surface folds through itself when
inner_radius = turn_radius - width / 2 <= 0
The stroke is validated live against this and turns red before you commit. Deliberate corners are exempt: a mitred 90-degree corner has a near-zero curvature radius by definition, so a rectangular enclosure is not a fold.
blender --background --python efficiency_construction/tests/run_tests.py
282 tests. Builders are pure functions, so most run without a scene. They assert vertex counts, height ranges, manifoldness, positive volume (which catches inverted normals), zero folded sections, even risers, and that conversion chains and inverse edits return the exact original geometry.
builders/ pure geometry, no bpy.ops and no scene access
core.py smoothing, corner detection, densification, the sweep routine
profiles/ ten styles as registry data; curves.py, shafts.py shared
mouldings.py the moulding vocabulary a column profile is written in
details.py three column detail groups as moulding runs
ornament.py volutes, crockets and basket ribs as swept solids
voussoirs.py archivolt, keystone and imposts as separate stones
surfaces.py seven surface styles as height functions
confines.py what a deck knows about its own edges
facings.py masonry on a vertical face; walls take these, not surfaces
masonry.py a wall's stones, each its own closed solid
railings.py ten railing styles as fixtures on a deck's edges
blades.py scattered blade geometry for the grasses
noise.py deterministic hashes, shared by surfaces and blades
relief.py applies a style to any swept cross-section
floating.py cantilevered treads, one shell each
mound.py closed strokes raised into hills
grids/ construction planes, coordinate conversion, snapping
strokes/ the draw modal, GPU overlay, validation
ops/ rebuild and the context-menu operators
ui/ panel and menu
Textures and UVs (flat viewport colours do ship — see Colour), railings and trim, tilted grids, automatic constraints between objects. Carved ornament was on this list and came off it in v3 — volutes, crockets and basket ribs ship, though foliage and figures still do not.
Design notes: docs/superpowers/specs/2026-08-23-efficiency-construction-design.md
Scope and versions: ROADMAP.md