Skip to content
SpannerGames
MarchingBlocks My downloads

User guide

This is the guide built into MarchingBlocks — press F1 in the app — for version 0.9.0. It is generated from the app itself, so its numbers and settings are the app's own.

Getting started

You sculpt one block. The software cuts every tile out of it, and paints worlds with them — no tile to place by hand.

1. Look at the witness

The Geometry workspace (the witness) shows the block your artist will sculpt. Its six colours are six families of tiles — floor, wall and ceiling, in open air or underground — and the legend on the left names them.

It carries 52 tiles: 35 classes, and 17 of them again for the open air. That is a count, not a promise: the tests prove not one is missing.

2. Paint a test world

Open Project, and in step 3 press Slice this layer's witness. The first time takes a few seconds; after that it is cached. Then open World.

Then paint: left click applies the tool, right click does the opposite. Every stroke is undone by one Ctrl+Z.

3. Bring your own art

Export the witness… writes one .glb for Blender, every tile a linked copy. Sculpt it, export it as .glb, then Import the work… to see it as the slicer will read it, and Slice the selected work to paint with your own tiles. The painted world stays: only its tiles change.

Then open Play test and walk it: Z Q S D to move, Space to jump, Shift to run, left drag to orbit the camera (right drag turns it level), the wheel to come closer, F to fly over it (you still bump into the rock). The right-hand bar sets the lighting, the sky, the effects (Reset brings the defaults back) and the weather (rain, blizzard, hurricane, slow snow, hanging particles, heat, fog) — only to judge your world: the weather is never saved nor exported. In water you swim: Space to rise, A to dive (Q on QWERTY); swim into a bank to climb out. You walk on the tiles you see — a step too high or a tunnel too low shows here first. Esc brings you back.

A red cube is a tile your library does not have. Nothing is ever filled in for you: a hole must be seen where it happens.

4. Take it to your engine

Export the tileset… writes the active layer's tiles as a .mbset folder. The free MarchingBlocks Paint plugins for Godot, Unity and Unreal read it: you paint cells in your engine, the tiles follow — exactly as here.

The format is open, and the placement rule is written inside it. The tiles you make are yours.

Painting tools

Two aims, the same tools. The aim only decides WHERE you point; the tool decides what happens there.

Aim — Grid or Sculpt Tab

Grid aims at the floor plane, at height floor y (PgUp PgDn, or Ctrl+click on some matter to put the grid at its height). Good for laying out a map.

Sculpt aims at the matter already there. Add builds on the face you point at; Dig and Select act on the cell you point at. Where the ray meets nothing, it falls back on the floor plane — that is how the first cell of an empty world is placed.

Navigate Space

Navigate is a switch, not an aim: Space turns it on, Space again brings you back to your aim, untouched. You fly around your world: Z S forward and back, Q D sideways, A down, E up (W S A D Q E on a QWERTY keyboard — the keys are read by their place), a right drag looks around. No click paints.

The ray aims at the cells, not at the rendered tiles: a sculpted tile may spill half a cell out of its cell, the cell itself does not.

Tools

A Add — adds matter. Add sees every visible layer, so you can build grass on another layer's rock.

D Dig — removes matter from the active layer.

S Select — paints a selection; Shift adds to it, right click removes.

R Rect — drag a FLAT rectangle on the floor plane, whatever the aim: the whole area becomes the selection, empty cells included. Draw a room's floor, then Fill it.

B Box — drag a box: the whole VOLUME becomes the selection, empty cells included. In Sculpt the corners sit on the matter, so the box is 3D. Hollow box keeps only its skin: walls, floor and ceiling.

Select empty cells too (with Select): the brush also takes the air — paint the outline of a room on the floor grid, then Extend selection ↑ and Fill.

Brush

Size 1 to 7 ([ ]), and a shape: sphere, cube, or disc — flat, across the face you point at, to fill or dig a wall without thickening it. The preview shows the exact cells the click will change: green adds, red digs, blue selects.

While you drag Add, the cells you just placed are transparent to the ray: the stroke lays a skin on the surface instead of a tower towards you.

Selection

Fill, Delete (Del), Clear (Esc, forgets it), Grow, Shrink (drops the edge: a rectangle loses its rim, a line its ends), Connected. Extend selection ↑ / ↓ adds the cells one level above or below it, empty ones too, without adding matter. The six arrow buttons, or the arrow keys (they follow the camera; Shift + up / down lifts it), move the selected matter one cell.

Ctrl+C Ctrl+X Ctrl+V copy, cut and paste — into this layer or any other. The paste follows the mouse; click to place it.

Moving or pasting onto matter merges with it; it never erases it.

Shape operations

Extrude up / down / facing, Widen, Hollow act on the selection if there is one, otherwise on the matter of floor y.

Extrude adds one cell in front of the matter, and the selection and the floor plane follow: click again to keep going (Fill a Rect, then Extrude up to raise a wall). Facing picks the direction most cells face (air in front, matter behind): select a wall to thicken it, a cave ceiling to lower it.

Shift + click extends the selection one cell that way, Alt + click moves it one cell — neither adds matter. Select a floor, Shift + Extrude up three times, then Fill: a block three cells high.

Fix diagonal contacts — two cells that touch only by an edge have no tile (red cubes). Fill adds the two missing cells of each such square, Dig removes the two touching ones when both belong to the active layer (otherwise it fills) — everywhere in the visible world, in one Ctrl+Z. The brush never does it on its own: a red cube shows where the problem is.

Clear the layer erases every cell of the active layer (Ctrl+Z brings them back).

Special shapes

Tunnel digs into a wall, Well into a floor or a ceiling, Bridge builds a deck across the air from a wall, Balcony puts a slab with its rail against a wall, Stairs climb a wall. Pick one, then click on the matter: the preview shows the exact cells, red to dig, green to add.

Stairs — click a wall where the stairs should arrive: the top step is level with the cell you click, and they come down towards you, Step cells deep per step, until they meet the ground (or Length cells out). Each step is solid down to the ground; over the void, the flight is two cells thick. Connect: click a floor, then another floor higher up — the stairs share the climb evenly between them, one cell up per cell across at most. Stairs only add matter: dig the headroom with a tunnel if they run into rock.

Room — drag a rectangle on the floor grid (at least 3 × 3 cells): a room rises from it, Floors cells high inside, with its walls, floor and ceiling, hollow within (Down: the rectangle is the ceiling and the room sinks below it). Inside rock, the inside is dug. [ ] set the floors. It has no door: open one with a tunnel.

Room from selection (Selection section) — any footprint, not just a rectangle: paint it flat with the Select brush (« Select empty cells too », Disc brush), set the floors and Up / Down, and press the button. Its outline becomes the walls, the whole footprint the floor and the ceiling, the inside is hollowed out. One Ctrl+Z undoes it.

Straight — one click: the shape leaves the face square to it. A tunnel or a well goes through to the next cave (or Depth cells deep, a dead end); a bridge runs to the first wall in front, within Reach.

Connect — two clicks, two faces anywhere: two caves, two cliffs. The shape leaves each face square to it, then joins the two ends with a straight run, and both ends stay open. Esc or a right click forgets the first end.

Profiles: Round, Square, Arch (a flat floor and a round vault — a corridor you can walk). Size ([ ]) sets their width; Rail gives a bridge, a balcony or stairs a one-cell rim on their sides.

Slanted walls work: a staircase wall at 45° is read as one slanted face, and the shape leaves it at 45°. Where a slanted shape would make two cells touch by an edge only — which the tiles forbid — it adds the missing cells itself, and says how many.

Variants

Where a tile has variants (made in Witness geometry), World mixes them by a random draw — the same at every rebuild, never shuffled. The Variant tool (section Variants): click a tile to show its next variant (base, 1, 2…), right click to give it back to the draw. Weights set how often each one is drawn for the tile you last pointed at (0: never). On the selection picks Random, Base or a variant for every tile touching the selected cells. Weights and picks belong to the layer and travel in the exported world; every change is one Ctrl+Z.

Fluids

Fluids is a workshop of its own, next to World. Open it and click once: the world decides what the water becomes. In a hollow, of any size, a lake fills it to its brim. On a slope or a ledge, a river runs down the shortest way, falls as a waterfall, fills the hollows it meets and overflows them. In the open air, over nothing, a sea at that height surrounds the matter as far as you can see. A cave fills only if a passage leads to it under the water. Esc or Leave takes you back to World, with the painting tool you had: clicks paint cells again, never water.

Water follows the world: dig a channel, raise a dam, and it flows again — CtrlZ included. It sees the cells of every layer, hidden ones too. A right click on water removes it. Water layers are its own: New, Delete, show, hide or pick each one. River width (1 to 9) lays that many sources side by side, across the river's first step: one click, one wide river, one Ctrl+Z. There is only one sea, and you choose its height before anything is computed: over the void, a flat plane shows where it would be; a first click pins it, the mouse wheel or PgUp / PgDn raise or lower it, and a second click or Enter places it (a sea at another height moves the one there was). A right click or Esc cancels. In the Play test, a river's current pushes you along.

Look sets how a water layer is drawn: Stylized (flat toon colours that darken with depth, a white line on the shore), Clear (you see the bottom through it, bent by the waves; its colour deepens with depth), Reflective (dark and smooth, a mirror at grazing angles: the sky, and the relief that is on screen), Lava (a dark crust split by glowing cracks), Swamp water (murky, with drifting duckweed), Glowing acid (luminous green, bubbling). Lava, swamp and acid flow and fill hollows exactly like water; in the Play test you swim in them too, and the colour you see from under the surface is theirs.

The looks are examples, not a requirement. In your engine you can assign your own water shader from the plugin: it receives the same data — the flow, the kind of water (still, river, waterfall) and the depth.

Transitions

Where two layers meet — sand against rock, moss against stone — the Transitions workshop blends the look of one over the other. The tiles do not change: each one keeps the shape its layer gives it; only the colours blend, in a band about one cell wide on each side of the border, continuous from tile to tile. Tick a pair of layers to turn its transition on; nothing is drawn while no pair is on.

Who covers whom is the higher layer in the layer list, by default (reorder the layers to swap it). A pair has two settings — when the first covers the second, and when the second covers the first — because sand drifting over rock is not rock breaking through sand: Softness (a sharp line or a long blend), Reach (how far the covering layer spreads past the middle of the border), Irregularity and Grain (an uneven edge), Fills hollows (the covering layer settles first in the dark parts of the other's material: sand in the cracks).

The brush chooses who covers, place by place: pick « … covers » in the list, click or drag near a border (Radius, or Alt + wheel); a right click gives the place back to the priority. Painted places show a yellow tint in this workshop only. Each layer has a representative material — by default the one its witness wears most — and that is what spreads over the other layer's tiles; it is projected like a box, so a tileable image works best. Every change is one Ctrl+Z, and everything is saved with the project. Esc goes back to World.

Transitions are drawn by the app; the engine plugins do not have them yet.

Foliage

Foliage is a workshop of its own: the painted world in the view, and nothing to do but plant trees, bushes, grass. Import .glb… brings a 3D model (it is copied into the project). On the pedestal its top is the ground: Ground offset raises or sinks the model (sink the roots), Sit its base on the ground puts its lowest point on it. Scale and Random size set its size, Footprint the ring it keeps clear, Wind how much it sways.

Three ways to plant. In the air: anywhere, on the plane of the grid floor (PgUp / PgDn), even over nothing. Planted · free: on the ground you SEE (the tiles, not the cells), with room around it — refused on a slope steeper than Max slope, in the water, at an edge or against a wall (its footprint must stand on the ground), under an overhang, or on another plant's footprint; a green ghost says yes, a red one no. Planted · overflow: on the ground, free to overflow edges, walls and other plants. One per click or the Brush (Alt + wheel: its size, Shift + wheel: its Density); Spacing keeps plants apart in every mode. A right click removes; a stroke is one Ctrl+Z. Esc goes back to World.

A plant does not follow the ground if you dig under it later. Foliage is not in the exported world (.mbworld) yet, and the engine plugins do not plant it yet.

Layers & projects

Layers

A layer is a witness and a painted world: its own witness — the tiles you sculpt in Geometry and Texturing — and its own cells, painted in World. Type in the field under the list to rename the active layer; Delete layer removes it (Ctrl+Z brings it back).

A cell belongs to one layer only: painting it in the active layer takes it from the others (one CtrlZ gives it back). Where two layers meet, the tiles are chosen as if the world were one piece — no wall, no groove at the border — and each corner is drawn with the tiles of the highest layer in the list among its eight cells: the top layer wins. Up and Down move the active layer in the list. A hidden layer leaves the world, which closes without it.

The layer list is in World and in the witness workshops. Pick a layer and they follow: Geometry edits its witness, World paints its cells. Each row shows a thumbnail of its witness, where the witness comes from (computed, modelled, from Blender, or an unlinked work) and whether its tiles are up to date (« slice again » when the witness changed since it was sliced).

New layer starts from the computed witness. Copy witness starts from a copy of the active layer's: sculpt ice from rock without touching the rock. Editing one layer's witness never changes another layer.

The world follows its witness: a second after you stop sculpting, the layer takes the new tiles by itself — no button. Slice this layer's witness (Project, step 3) does the same on demand. A layer dressed by an unlinked work keeps it.

A linked .glb back from Blender, sliced into a layer, becomes its witness — editable here, textures and UVs included; the previous one is kept next to it (.previous). Slicing a new work into a layer keeps its painting — only the tiles change.

Projects

A project (.mbproj) holds the layers, their cells and where their tiles come from. It saves itself after every change and reopens when you come back — there is no need for Ctrl+S (pressing it only confirms). The title bar says so: ✓ Saved, or ● Saving… for the second a change waits to be written — and ⚠ Not saved if the file could not be written (the report says why). On first launch, MarchingBlocks gives its files their icons in Windows (.mbproj, .mbtiles, and the .mbset / .mbworld folders it exports) and a double-click on a .mbproj opens it — for your Windows account only. Untick File icons & double-click (Project) to remove it. New starts an empty project in its own folder under Documents/MarchingBlocks (untitled, untitled 2…), its witnesses beside it; Open opens one, Save as puts it where you want; it keeps saving itself there. Recent, under them, reopens the last projects in one click. The cache and the settings stay out of sight, in the app data.

Very simple example, in World, opens a small world made with MarchingBlocks: walk it in Play test, open its witnesses, change anything. It lives in its own folder (Documents/MarchingBlocks/Example) and keeps your changes. My world takes you back to yours. MarchingBlocks always starts on your world, never on the example.

The sliced tiles are cached. If the artist saved the .glb again, the layer is sliced again on opening; if the .glb is gone, you see the last tiles sliced from it, and the report says so.

Export the painted world

In World, Painted world → Export the world… writes a .mbworld folder: every layer, in order, with its cells, whether it is shown, and its tiles (one .mbset per tile source, inside the folder). In your engine: Import MarchingBlocks world — Godot (Project → Tools), Unity (Tools → MarchingBlocks) or Unreal (the MarchingBlocks World Import actor). A layer without tiles still travels with its cells, and the engine says it has none.

Modelling the witness

The witness has two workspaces, on the same block: Geometry is a modeller — shape the witness with Blender's gestures and shortcuts, instead of sending it away — and Texturing gives its faces their materials, projections and UVs. In Texturing you select faces, but the geometry keys (G, X, I…) do nothing: the screen sends you to Geometry (there, E is the paint eraser). What you make is saved next to the project; Reset to the computed witness (Geometry, « The modelled witness ») starts the active layer's witness over.

One tile per class, linked copies

The witness is made of the 52 tiles a world uses, and every place it shows a tile is a linked copy of it. Click any copy: you edit that tile, and every copy follows as you move the mouse — what you see is exactly what a painted world will show, joints included. Clicking a copy of another tile switches to that tile (the selection belongs to a tile). Axes stay the world's: G Z moves up, whichever way the copy is turned.

Border vertices are shared. A vertex lying on a cell's cutting plane is the border every neighbouring tile must match. With G R S it slides only within its plane (along the edge if it sits on two), and every matching vertex of every other tile follows: the witness cannot open a crack. One Ctrl+Z undoes it everywhere. A move, rotation or scale also stops before any face folds, in this tile or in any other: past that point the report says where it stopped.

The tiles tab of the strip above the view shows all of them: a photo of each tile in its cell (the ghost cubes are the full half-cells around the corner), open air or under rock, what it does in a world and how many copies the witness shows. Hover a tile to light up its copies; click it to go to the clearest one — in edit mode, it becomes the tile you edit.

Shapes, the other tab of that strip, lists the shapes the witness is built from — canyon, arch, bridge, cave mouth, chimney, overhang… — each with a photo, what it becomes in a world, and how many tiles are cut there. Hover a card to light the shape up in the view, through the rock; click it to look at it from the photo's angle. Twists gathers the few cells no shape explains. The arrow along the strip's edge folds it away.

The other way round, in World: the same strip becomes Where is it from? Point at a tile of the active layer and it names the witness shape it was cut from, with its photo and the exact corner. Show it in the witness takes you there, a white box on the spot: that is what to sculpt to change this tile everywhere. A red cube says no tile exists for that spot.

Editing Tab

Tab enters and leaves edit mode. 1 2 3 select vertices, edges or faces. A click selects what you see; Shift-click adds or removes; Alt-click selects a loop (a ring of faces in face mode). A all, Alt+A none, B a box — only what you see, unless X-ray is on (Alt+Z). Ctrl + right drag draws a lasso (Shift+Ctrl removes). C is the circle: paint the selection with the left button, Shift or the middle button removes, the wheel sizes it, right click, Esc or Enter ends.

Transform

G move, R rotate, S scale. Move the mouse, then click or Enter to confirm, Esc or right click to cancel. X Y Z lock an axis — Z is up, as in Blender. Type a number for an exact value (degrees for R). O turns proportional editing on: nearby vertices follow part of the way; the wheel sets the radius.

Sculpt

Press Sculpt (Witness geometry), then left drag on the witness: Draw pushes out along the surface, Inflate swells, Smooth evens out, Flatten levels, Grab drags. Ctrl digs instead, Shift smooths with any brush. Radius (in cells), strength and hardness are in the Sculpt section; the ring under the mouse shows the radius. Every copy of the tile follows; points on a tile border slide in their cut plane and the tiles around follow, so no joint opens. A stroke stops before folding a face. One Ctrl+Z per stroke.

Mesh

E extrude (faces follow their normal) · I inset · Ctrl+B bevel the selected edges · Ctrl+R loop cut · K knife: click points on the surface — the cut follows it across faces and across tile borders, onto the next copies, so a pattern can run over the joints; Enter cuts · X delete · Ctrl+X dissolve · M merge at center · F fill a hole · Subdivide (button). Every gesture is one Ctrl+Z.

Deleting opens a hole: you see it, and F closes it. Nothing is filled for you. Dissolve removes the same faces and closes their outline with one face: no hole, and a tile border stays where it is.

Tile borders are kept for you. Extruding faces that touch a border pulls their middle and leaves the border vertices on their cut plane. Extruding edges works only on the rim of a hole (an edge between two faces would grow a fin, a border edge would open the world). Merging a border vertex with others merges them ON it; two border vertices at different places are not merged. That way the gestures above never open the world — only Delete does, and Fill holes closes it.

Fill holes closes every hole of the tile you edit (Fill holes · all tiles: of the whole witness), in one Ctrl+Z. The line under the buttons counts the holes of this tile. The open edges that lie ON a cut plane are not holes: they are the tile's border, closed by the next tile in the world. A hole that reaches a cut plane took a piece of that border away: Fill holes rebuilds it with the points the next tiles share, then joins it to the rim — so no gap opens in the world. If some border point cannot be rebuilt, the report says so: close that part by hand (F on the rim).

Borders are shared between layers. Two layers meet in the world: a tile of one stands against a tile of the other. So every layer's witness keeps the same tile borders. Moving or cutting a border here moves or cuts it in the other layers' witnesses too (their worlds follow when you open World), and one Ctrl+Z undoes it everywhere. What is inside a tile stays each layer's own. A layer dressed by an outside work that is not linked is left out: its tiles do not come from its witness.

Borders that already differ — a project from before this, a witness back from Blender, a new layer on the computed witness — are counted on the line under Fill holes. Match other layers to this one moves the other layers' border vertices onto this witness's borders (only the borders: their sculpture inside the tiles stays), in one Ctrl+Z. What cannot be matched is said: a gap stays there.

Variants

A tile that repeats a lot — a cliff, a ground, a run of corners — can have variants: other sculptures of the same tile. Click a copy, then New variant from this copy (section Variants): that copy now shows the variant, and only the copies that show it follow when you sculpt it. This copy shows switches any copy between the base and its variants, so you judge a variant next to its real neighbours. A variant keeps the borders of its tile — move a border point and every tile follows, base and variants alike — so it fits wherever the tile fits.

Sculpt a variant's middle freely; its borders are shared. Up to nine variants per tile.

Materials — in Witness texturing

New material, select faces, Assign. A material has a colour, roughness, metallic, an optional image, and how many cells one copy of the image covers. Images are projected from the position — Box (each face takes the side it faces), or flat from the Top, Front or Side: nothing to unwrap, new faces are textured too. Or UV (unwrapped): U (Unwrap · U) lays the selected faces flat in the 0–1 square, and Export UV layout… writes their outline as a PNG to paint on elsewhere. Image… picks the image — it is copied into the project, with the maps found next to it — and No image keeps the colour only.

Use tileable images whose repeat divides one cell (1, 0.5, 0.25…): the texture then joins from one tile to the next in the painted world. Along the cut planes, the texture must be the same for every tile — an automatic texturing tool that paints the block as one object will look perfect here and break at every seam of the world.

Paint — in Witness texturing

P turns the brush on: left drag paints the image of the material under the mouse, right on the witness — every copy of the tile follows. Alt+click picks a colour. Size (in pixels of the image), hardness and opacity are in the Paint section. A material without an image gets a canvas filled with its colour (1024 × 1024), and its colour turns white so the paint is not darkened. Every stroke is one Ctrl+Z.

Box projection repeats the image, so what you paint repeats too: good for a tileable material, and it keeps the seams right. For paint that does not repeat, use Unwrap all tiles (atlas): every face of the material, in every tile, unwrapped together into one image — each tile gets its own place (U alone unwraps one tile into the whole square, on top of the others). A tile's copies still share its paint: they are the same tile. Faces with the legend colour cannot be painted: assign a material first.

E switches the brush to the eraser: it makes the active layer transparent. On the bottom layer, the canvas comes back as it was before any paint.

Paint layers — the Paint section lists the layers of the current material's canvas, top first. Click a layer to paint on it, the eye hides it; New adds a transparent layer above the active one, Up / Down move it, Delete removes it, Merge down flattens it into the one below (the image does not change); its name and opacity are set below the list. Each change is one Ctrl+Z.

Engines only ever see the flattened image: the layers stay in MarchingBlocks, saved next to the image (a .layers folder). If you change the image in another program, its old layers are set aside and the image becomes a single layer — MarchingBlocks says so.

Under the mouse, the brush outline shows exactly where a dab stops on that face: white for its edge, the brush colour for its hardness (full strength inside). It is drawn in the image's pixels, so it is an ellipse where the unwrap stretches the face, and it grows with the material's repeat. A small red ring means the face has no material.

Seam bands — while painting, pink striped bands mark the cut planes, where one tile meets the next in the painted world. Paint them the same on every tile (a tileable material, or nothing), and keep the free drawing in the middle of the tiles. The bands only show where to be careful; the slicer still checks the texture seams. Untick Seam bands in the Paint section to hide them.

PBR maps — in Witness texturing

Tick Derive PBR maps from the image (PBR maps section) and the material gets a normal, a roughness and an occlusion map, all read from its image: bright parts are high (or the opposite with Dark is high), hollows get darker and rougher. Nothing to paint by hand — they follow every brush stroke on their own, a moment after you stop. Fine detail, Medium and Large weigh the bumps by size, Contrast makes them taller, Normal, Occlusion, Roughness and Variation set the rest; Reset settings brings the defaults back. Only these settings are saved; each change is one Ctrl+Z.

Texture sets — an image that comes with its maps (rock_color.png next to rock_normal_gl.png, rock_roughness.png, rock_ambient_occlusion.png…) uses them as they are: they were made from the real relief, and win over the derived ones. Untick Use the maps found next to the image to derive them instead. A witness back from Blender brings its maps the same way.

Emission — a map named like the image with emission or emissive instead of the colour word (panel_color.png next to panel_emission.png) makes the material glow: black does not glow, every other colour glows in that colour. The Emission slider sets its strength (1 by default); above 1, the Glow of the Play test makes it shine. It travels in the .glb (emissive texture and strength).

Metal is never guessed from the image: the Metallic slider of the material stays in charge. The maps travel in the .glb like any glTF material — Godot, Unity and Unreal read them as they are. They are also written next to the image (a .pbr folder: normal, ORM, and a height map for your own shaders — no engine reads height from a glTF).

Base colour from the geometry — Bake base colour paints the BASE of the canvas from the shape itself: floors, walls and ceilings in their own colour, worn convex edges, shaded hollows. It stays quiet along the cut planes, where any tile may meet any other. It needs the UV projection (Unwrap all tiles (atlas) first): with Box, the image repeats and one pixel is many places. Your paint layers stay on top, and Ctrl+Z gives the old base back.

Animated textures — the Animation workspace

Pick a material of the witness, then add only the tracks you need with Add track (each has its − to remove it). Any map can move: Base colour, Normal, Roughness · metal · AO and Emission.

Scroll slides the map across the faces (Across and Along, in repeats per second): lava, a waterfall on a rock, a conveyor. Frames play a sequence of images, like a video: from image files (played in the order of their names — frame_2 before frame_10), from a sheet (one image cut in a grid, left to right, top to bottom), or blank frames to paint. The frames are copied into the project, at the size of the first. Pulse makes the emission breathe between full and Low. Every gesture is one Ctrl+Z.

Copies in sync — a tile comes back hundreds of times in a world. Ticked, every copy plays together (a scroll stays continuous from tile to tile); unticked, each copy starts at its own moment, drawn from its place, and the repetition shows less. Playback pauses, slows down or speeds up everything, and Hold frame shows one frame on every Frames track.

Painting frames — with the base colour animated by frames, the brush of Texturing paints ONE frame: Frame ◀ ▶ in the Paint section picks it (the witness shows it, time stopped), the copy button adds the next frame from this one. Each frame has its own paint layers. The other maps are imported, not painted.

Tiles are turned by quarter turns in the world: a scroll Along (up or down on a wall, in Box projection) goes the same way on every copy; a scroll Across follows each copy's own turn. A base colour animated by frames gets no derived PBR maps — give it Normal or ORM frames, or a texture set. In the engines, the free plugins receive frame 0 and the settings (glTF extras, mb_animation); they will play them in a later version.

View

Middle drag turns, Shift + middle drag slides, the wheel zooms. Numpad 1 front, 3 right, 7 top (Ctrl: the opposite), 5 orthographic, . frames the selection.

The artist round trip

What the artist receives

One .glb: the whole witness at the origin, built from the tiles the world will use — one tile per class, and every place the witness uses it is a linked copy of it (Blender's linked duplicates: all the copies share one mesh). Sculpt any copy and every copy follows, live. What the witness shows is exactly what a painted world will show, joints included. Tiles are already shrunk to half their cell to show the margin, the six families are six named materials, and the UVs are canonical: paint one copy, you painted the tile.

Bring it back as .glb (File → Export → glTF 2.0): it carries your textures, UVs and materials. It is read tile by tile — nothing is sliced — so relief that spills onto a neighbouring tile stays with the tile you sculpted it on.

Import it with « Merge Vertices » ticked: in glTF every material is a separate primitive, so inside a tile the colour borders arrive cut. The copies stay linked either way.

The contract

Total freedom inside each cell. Relief may spill half a cell into the neighbours.

Do not move, rotate or Join the objects: each tile is identified by its position when it comes back, not its name. A copy sculpted on its own, moved or rotated no longer agrees with its siblings: the report names it, and the most common version is kept.

Do not change which cells are full: the filling fixes the tile classes.

The seams are the artist's responsibility. The slicer cuts straight through the cell centres and judges nothing else — the report lists the seam remarks.

Proving the round trip

A class has ONE tile, the same everywhere it appears. With the linked witness, the rebuilt block is exactly the witness. A single-mesh work (everything joined, or an .obj) only gives the clearest copy of each tile — the report says so: anything sculpted on the other copies does not reach the world. An atlas carries no unique detail.

The same look in your engine

The tiles carry their geometry, normals, UVs and materials. The light is your engine's: to see in your game what you see here, set up the same scene. Every value below is the one this app uses right now.

Shading

Flat, one normal per face — no smoothing. The tiles leave with the normals the modeller shows: import the normals from the file; do not let the engine recompute or smooth them (Unity: Normals → Import; Unreal: Import Normals; Godot keeps them by default).

Materials are standard PBR (base colour, roughness, metallic, texture). The legend colours of the witness are vertex colours on one material: enable « vertex colour as albedo » for it.

Sun — a directional light

Rotation (-48.0, -34.0, 0.0)° (pitch, yaw, roll), energy 1.15, shadows on.

Ambient light

A flat colour #8892a4 at energy 1.10 — not the sky: a world lit by its sky changes tone with it.

Ambient occlusion — SSAO

On, intensity 2.5, and applied to the direct light too (Godot: « Light Affect » 0.6). Left at its default, SSAO only darkens the ambient light and vanishes in the sun.

Bounced light — SSIL

On (screen-space indirect light, default settings): the colour of a floor bleeds into the walls of a pit. Unity and Unreal have their own screen-space GI; any of them gives the same idea.

Reflections

Metals reflect their surroundings instead of being lit: give them something to reflect. Here, a neutral procedural sky — top #8892a4, horizon #9aa2b0, ground #5a606c — used for reflections only.

Without it, a metallic wall in shadow turns black.

Sky of the Play test

A procedural sky: top #2e1a6e, horizon #3c86b4, ground #0c0e18, ground curve 0.6 (the dark ground only shows far below the horizon). It is the background and the reflections in the Play test.

Anti-aliasing

MSAA 4×.

Not used while you work, on purpose: global illumination that is baked or voxel-based (Godot's SDFGI, lightmaps). It does not follow geometry that changes while you sculpt. The Play test's right-hand bar lets you try SDFGI, since nothing changes while you walk.

Shortcuts

World

TabGrid ↔ Sculpt
SpaceNavigate on / off
A Z E Q S DFly (Navigate)
Right dragLook around (Navigate)
A · D · S · R · BAdd · Dig · Select · Rect · Box
[ ]Brush size
PgUp · PgDn · Ctrl + wheelFloor y
FFrame all the matter
² (` on QWERTY)Jump to the matter under the cursor
Ctrl+clickPut the grid at the height of the matter clicked
ArrowsMove the selection (follows the camera)
Shift + ↑ ↓Lift / lower the selection
DelDelete the selection
EscClear the selection · cancel a paste
Ctrl+C · X · VCopy · cut · paste
Ctrl+Z · Ctrl+YUndo · redo
Middle dragTurn the view
Shift + middle dragSlide the view
WheelZoom — see « The mouse wheel » below
F1This guide

The mouse wheel

One rule everywhere: the wheel alone zooms — except during a gesture, where it sets that gesture's size. Alt + wheel sets the tool's main size, Shift + wheel its second one, Ctrl + wheel the floor. A small label by the pointer tells the new value. Over the side panels, the wheel only scrolls: it never changes a slider or a number.

WheelZoom
Wheel while dragging a Rect or a BoxRaise or lower its far corner: a flat Rect becomes a box
Wheel while drawing a RoomFloors
Wheel while pastingPaste one cell higher or lower
Ctrl + wheelFloor y (World, Fluids)
Alt · Shift + wheel — Add, Dig, SelectBrush size · brush shape
Alt · Shift + wheel — with a selection (Select, Rect, Box)Widen or shrink it flat · extend it up or down (empty cells included, no matter added)
Alt · Shift + wheel — Tunnel, Well, Bridge, StairsSize · Depth, Reach or Length
Ctrl + Shift + wheel — StairsStep
Alt · Shift + wheel — RoomFloors · up or down
Alt + wheel — WaterRiver width
Alt · Shift + wheel — Sculpt (Geometry)Radius · strength
Alt · Shift + wheel — Paint (Texturing)Brush size · hardness

Witness (modeller)

TabEdit mode on / off
1 · 2 · 3Vertex · edge · face
Click · Shift · AltSelect · add · loop
A · Alt+A · BAll · none · box
Ctrl+right drag · CLasso · circle
Alt+ZX-ray (box, lasso and circle take what is hidden)
G · R · SMove · rotate · scale
X Y Z · numbersLock an axis · exact value
E · IExtrude · inset
Ctrl+B · Ctrl+R · KBevel · loop cut · knife
Ctrl+XDissolve
X · M · FDelete · merge · fill
OProportional editing
Numpad 1 3 7 · 5 · .Views · ortho · frame
UUnwrap the selected faces
PPaint brush on · off (Texturing)
E · Alt+clickEraser · pick a colour (while painting)

Play test

Z Q S DMove (W A S D on QWERTY)
Space · ShiftJump · run
FFly on · off
Space or E · AFly up · down (E · Q on QWERTY)
Left drag · right dragOrbit the camera · turn it level
WheelCloser · farther
Backspace · EscBack to start · back to World