Ok, let’s take a look at how walls are built.
House.SimpleWalls are, well, simple. I have an asset that is a simple cube mesh, and I place it in the entire frame.
There could be some polygonal optimizations to this, as a lot of the sides of these cubes are never going to be visible.
Apparance lets you build your own mesh if you turn on Experimental Features and there you could specify which sides of the Cubes to draw based on where they are placed, but that’s something for another day.
Now the House.ExteriorWall is a little bit more fun, we’ll see some recursion happening there already.
First let’s look at the node itself and its inputs.

Frame: We have a frame (that’s the size of the wall)
Select: Used by Stacker.Splitter and Stacker.Merger operators. I think these nodes need their own tutorial https://apparance.uk/manual-operators.htm#Construction
Door Width and Height: these parameters get exposed all the way out so you can configure at the instance level in Unreal
Seed: What random seed this wall will be using
Axis: Which way (X or Y) this Wall is facing.
Frame Width: How thick the door frames are supposed to be (passed into the House.DoorBuilder procedure:
Window Sill: the height from the floor the window starts
Window Height: the height of the window, I don’t do any clever invariant checks here such as capping the window height to the ceiling height, although it would be fairly easy to implement. so you can actually push the windows out of the frame ![]()

Original Frame: Since we do many frame operations during recursion I keep a reference of the full original frame.
Side: This is some sort of ID I added for the future (I’m not using it in any way right now).
This is the House.ExteriorWall procedure.
This procedure relies on the Stacker.Splitter set or operators
1 - It places simple walls in Upper and Lower Caps.
2 - It sets the Openings to have DoorWidth (as Spacers, which are fixed-size things in a frame split by the stacker splitter). So in my Case, Doors and windows have the same size. it would be possible to have them be different, but it would complicate the procedure a bit. so same it is for now.
3 - So for the spacer frame, it has a chance of placing a door (10%), if it fails, it sees if it should instead place a window (30% chance), if it fails that check, just places a regular wall.
4 - Places Simple Wall in the Object slots, which are fillers of whatever frame size is left after you placed the spacers, so they are, for the lack of a better term, “stretchy”
I think there is a probability here to have a house with NO DOORS
if my high-school math is right that probability is 0.01% (since I’m choosing to have a door at each side 10% of the time). in the grand scheme of things, it’s actually quite high. One in every 10.000 houses will have no doors. gotta do something about it.
NOTE: I collect Door and Window Segment Pairs on these
Stacker.MergerLthese are information on where the doors and windows are, so in the future, when dividing the house I don’t place a wall across it.
Calculating those House.OpeningOffsets and House.CreateDoorPair was very hard, and I needed @sam to help me figure it out and point me in the right direction as this is a problem that he had encountered/solved before. (earlier in this thread).

