Growing a layer of meat over dungeon walls and doorways
A meat layer for dungeon interiors, driven by one number and built as 56 Blender models. It blocks only by the room it takes, and a doorway can grow shut.
I built a layer of meat that grows over a dungeon’s walls, floors, ceilings, doorways and furniture, and it’s driven by one number from 0 to 1. It’s a study of 56 models and none of them are in the game yet. The grading from the burst vat looks really good, but the shapes on the hallways are a bit too circular and perfect, so the look needs another pass.
How does one number grow the meat?
The layer is its own model laid over a host that never changes. For each host there’s a file per value, named with the value times 100, laid at the host’s origin in the host’s axes. At 0 there’s no file at all, so a clean wall costs nothing. The host’s bytes and triangles are the same at every value, and the price is one more draw call per host. Every layer shares one material and one 512 pixel picture set.
To build one, the kit puts the host’s triangles in a BVH and scatters points over its surface by area. Each point knows what kind of place it is (seam, crevice, foot, ledge, top, underside), how shut in it is, and gets a score. The number is compared with the score, so a bigger value adds points and never moves the ones already there.
At 0.3 that’s a film of draped fans a few millimeters off the host, plus veins that climb a corner when they meet one. From 0.6 there are growths: mounds with a foot on the host, stalked polyps on level places, and curtains under overhangs, which are ropes that sag between two roots and beaded threads. Every piece is sunk into the host, a check makes sure none floats, and a carve step removes faces no eye can reach.

One room, 1.0 at the vat and round it, then 0.6, then 0.3, and clean at the door.
A room is graded by squares from the vat. Squares 0 and 1 get 1.0, two squares get 0.6, three get 0.3, and further out gets none. Walls pick one of three growths, floors and ceilings one of two, turned half round on every other pair so a run of them doesn’t repeat.
I threw out several looks on the way. The glossy flat fan on a wall looked like red glass, deep fingers on the film looked like starfish, smooth domes on the desk looked like beans, pale cones under the ceiling looked like icicles, and five-sided cords in the doorway looked like girders. One growth set shared by every host didn’t sit right at 1.0, so each host got a fitted set.
Why does meat block by the room it takes?
The open question was whether meat should block movement below fully choked. I decided it should depend on whether the party can fit through, not on the meat existing. So the number never blocks anything. The layer takes real room, and a body passes where it still fits.
The kit reads the sizes out of the game’s code with regexes: the 3 m square, the 4 m ceiling, a party 0.8 m wide, the widest monster 2.0 m, the narrowest 0.6 m, and 0.1 m spare for each body. Then it takes every vertex of the solid pieces (mounds, clots, trunks, heaps) between 0.30 m, low enough to walk over, and the tallest body. A wall gets a way_m, how far the meat stands into its square, plus one or two 1.5 m wide collision boxes. A doorway gets a gap_m, the opening minus what grew in from one jamb.

A corridor and a doorway at 0.6, 0.8 and 1.0 with a stand-in body in the way.
I measured it on a 3 m corridor with both walls grown. It keeps 2.40 m at 0.6, 1.54 m at 0.8 and 0.61 m at 1.0. A 2.5 m doorway keeps 2.50 m, 1.29 m and nothing. So at 0.6 everything passes, at 0.8 the party fits and the widest monster doesn’t, and at 1.0 the corridor is too narrow for the party and the doorway is shut.
Growing a doorway shut
The doorway at 1.0 is the meat choke. Eight trunks run from sill to lintel and jamb to jamb, 0.07 to 0.12 m in radius, each bowed and snaking. Eleven thin webs run from a trunk’s middle third to the edge, four clots hang where trunks cross, and six heaps sit on the sill and at the jambs.

The doorway at 1.0 from 5 m, 2 m, 0.8 m and from the far side.
It has to block and still be seen past, so I ray-cast through the opening on a 5 cm grid. 36% of it is open, the widest hole is 0.60 m, and the manifest has one solid box across the whole opening.
Adding a layer class to the pipeline
The model pipeline got a class for this, layer. It has a budget of 2,000 triangles near and 800 far, with a cap of 2,600 for a choke, two solid shapes per piece, and the rule that a layer isn’t asked to reach under its origin. A layer adds between 362 and 2,312 triangles near. The film’s captions give a desk at 1.0 as 1,137 triangles of meat and a dead body at 0.3 as 396.
All 56 pieces went through every step. 52 pass. The four that fail are alternatives that fail by the rule: two with the film’s edge cut out of its picture, which the validator refuses, and two with the stain painted into the host’s picture at 0.3. Each piece built twice from scratch gave the same bytes, 56 of 56.
One bug came out of the film. The dead body’s layer had been built around Blender’s bone-shape icosphere, so the meat lay about a meter off the body.
What’s left?
I want the round shapes to be eggs or rough instead, and bone added, so a third pass on the look is running. I still need to build the game side, meaning what the dungeon loader and the movement code do with the layer, and the film is still opaque. I’ve decided to allow the cut edge, and that goes in with the third pass.