Generating plant machines from numbers in Blender
A kit that builds vats, pumps, boilers and coils as a chain of stages joined by pipe. 45 study pieces in four themes, and nothing installed yet.
I built a kit that makes the plant’s machines from numbers: vats, a pump, a boiler, a server shrine and a lightning coil, with their runs of pipe. A study builds seven machines in four themes, which is 45 pieces at three levels of detail each. Every machine keeps its top faces now, and each one’s texture is 1,024 pixels. None of them are in the game yet, so the player sees no change.
The plan for the vertical slice lists machines: the juice vat the party climbs out of, the burst meat vat, pumps and boilers, the server shrine and the Tower’s lightning works. Today the opening’s vats are three cylinders made in code, and the Breakout Site’s two chambers are empty.

Top row, the vat in the game today. Bottom row, the kit’s juice vat at 2, 5 and 12 m by lamp light.
I think the size looks good for the juice vat, and the meat vat looks really nice as well.
Building a machine as a chain of stages
A spec lists the machine’s stages in order along a line on the floor. Each stage is a body of one kind (vessel, drum, block, rotor, rack, coil or rod) with ports, and a port is a point on the body’s skin plus the direction out of it. The kit runs a swept pipe from one stage’s out to the next stage’s in. It also runs a stub from the first in and the last out to a flange, the ceiling or the floor.
That means a machine can’t be a pile of parts, because anything that isn’t on the chain has nowhere to go. Bands, a sight glass, a hatch, legs, bolts and the glow all hang on a stage. The work stage is the largest body by far.
Every part is a closed solid lofted from numbers and placed by a turn, not a mirror. The kit takes loft, sweep and slab from the interior kit and adds three more:
lathemakes rings around an axis with flat ends.revolvesweeps a section around an axis to make a hoop.pipeslides a round section along each leg onto the plane that halves the bend, so every bend is a true miter.
Each solid is turned to face outward by the sign of its volume. A vessel’s wall is staves around an axis with hoops and a rim, and each stave is a separate part, so a state can take one away.
The burst vat is data on the whole machine (panels gone, the hatch open, staves bent out) and not a second shape. I built the second shape too and compared them, and it lost.

Each column is one machine and each row is one theme: cyberpunk, steampunk, eldritch and fantasy.
The same seven specs go through all four themes with nothing changed by hand. Materials and the bake go through the theme pipeline, and each machine gets one 1,024 pixel bake.
Why not collapse level 1 to get level 2?
The class has a budget of 3,000, 600 and 60 triangles at its three levels, with caps of 3,450, 690 and 69, and at most 6 solid shapes.
Level 2 was first made by collapsing level 1. A machine is many large parts sunk into each other, and the collapse took the few large parts whole, so a 6.4 m lid became one triangle. Now level 2 is built from the same spec with coarser numbers: half the sides, square pipes with plain miters, no chamfers, no bolts, and the parts marked detail left out.
Level 3 is the far form. It’s a fresh wrap of the bodies, colored one face at a time. It used to follow the outline and take its color from the nearest surface, and both were wrong.
Removing the faces nobody can see
Faces that no eye can reach are dropped, and the floor under the machine counts as a blocker. Eyes are in a ring around the machine, 0.8 to 1.6 m up on a level floor, and there’s now a grid of eyes over the piece as well.
The first version asked the question from the eyes inward, with a ring of eyes around the machine. That lost any face you could only see through a slot. So reach() asks from the face outward: is there a clear straight line from here to anywhere an eye could be? Before that it asks whether the place is buried at all. Then a second set of eyes, sharing no position with the first, counts the open edges that are left, so the carve is checked by eyes it didn’t use.
Keeping the tops on every machine
Every machine keeps its top faces now. seen_from_above is 1 by default for the whole class, and 0 is still there as a knob.
Before this, a spec kept its tops only if it set the flag, and only the coil did. The boiler’s firebox is 1.7 m tall and had no top face. That’s right in a flat room and wrong from a stair, a gallery or a jump. I’m going to reuse these machines and I won’t always know exactly where they’re going to be used, so I wanted tops on all of them.
I kept the old build of the 45 pieces as the “before”, so I could measure the change against it. Then I turned the flag on for every spec and rebuilt.
The flag wasn’t enough on the meat vat, because the carve still dropped the end of a hoop. A print showed that 740 rising directions had missed it. So the carve got a grid of eyes over the piece, added to all three sets of eyes on top of the ring at eye height. reach() now keeps a face if any rising line gets out of it, and it tries 2,950 directions, turned four ways per face.
Level 2 of the burst vat still lost its lid when it was collapsed. It’s now built plainer from the spec: the heap, one spill, a square rim and two rings per twisted stave. Its plinth and heap are kept complete at level 1.
There’s a new check for this called tops(), and it runs inside run.py check. It’s plain Python and numpy on the sealed .glb. It sends rays down at each piece from a gallery, a stair and a jump, and counts the rays that hit the back of a face first, because that means the ray went through a hole. The old build had 18,370 of those at level 1 and 24,813 at level 2, on 33 pieces. Now it’s 0 at all three levels on all 45.

Top three rows: the boiler, the meat vat and the server shrine seen from a gallery, before and now at levels 1 and 2. Bottom two rows: the worn boiler at 2 and 5 m, 2,048 on the left and 1,024 on the right.
Tops cost 6.7% more triangles at level 1. The 45 pieces went from 53,623 to 57,236. The meat vat added the most, going from 1,454 to 1,827. The boiler went from 756 to 782 and the shrine from 580 to 619. Level 2 went from 15,959 to 15,987 over all the pieces. The far level is still 60 triangles each, because it already had a top.
I also corrected the process the generator skill follows. Judge a carve from the face outward, never take the top off something that sits on a floor, and count what a collapse might take before using it.
Why 1,024 and not 2,048?
The texture size for the class is now 1,024, and the scatter notes had said 2,048. The bottom two rows of the sheet above put the worn boiler at 2 and 5 m, by lamp and in daylight, at 2,048 and at 1,024, at the game’s resolution. I couldn’t tell them apart, and 512 looked soft.
One piece has three textures. Unpacked, with their smaller copies, they take 64 MB at 2,048 and 16 MB at 1,024. For the 45 pieces that’s 2,636 MB down to 716 MB.
I also built a version that uses the theme’s shared tiling texture instead of a bake. It loses the dark in the corners and the dimming that a state puts on.
What can you see of a machine at 12 m?
The party’s eye is 1.6 m up with a 70 degree view on 1,080 pixels, so something h meters tall at d meters is about 771 h / d pixels. A 12 cm pipe is 46, 18 and 8 pixels at 2, 5 and 12 m, and a bolt is 12, 5 and 2.
At 12 m a machine is its outline, its pipes as lines and the one lit thing. That’s why every machine has one glowing thing on its work stage. Without it you can’t find a machine at 12 m in dim light.
A machine fills whole squares and the party walks around it. The juice vat takes one square. It’s 2.2 m across with its rim at 2.35 m and juice up to 2.10 m. The meat vat takes nine squares and is 6.4 m across and 3.55 m tall with its lid. The burst vat’s coolant pool reaches 4.63 m from the middle, which is 13 cm past its nine squares, so its manifest says 4 by 4. The pool has no collision and you walk over it.
What did the second pass find?
I had one agent build the kit and the 45 pieces, and a second one read it closely and fix what it found, proving each fault before changing anything. Besides the collapse and the ring of eyes:
- Two stages’ solids didn’t meet, so 27 pieces failed the pipeline’s step 11 and the build hadn’t said so.
- The burst shape wouldn’t build.
- A dome and the flames of a halo weren’t on their polygon.
- Far views past 190 m were drawn at half scale, because the shared camera stops at 200 m.
44 of the 45 pieces pass the model pipeline’s steps 1 to 15. The one that doesn’t is an alternative I kept as a finding. It skins the vat’s wall as one surface from a field of melted masses. It came out at 4,367 triangles against the cap of 3,450, and it looked like a soft bag. After the tops rebuild it’s 4,375, and no other piece went over. Each piece built twice gave the same bytes, 45 of 45.
What’s left?
Nothing is installed. The installing steps (the game test, the film in the game, the credits and the approval) aren’t done for any piece.
The burst vat needs meat. The meat comes from the meat vat, so in its first phase it should have meat outgrowths all over it and all over the floor. The study’s burst vat spills coolant for now.