Semi-solids are the mysterious wonder of UnrealEd level design. They reduce your node count (and that’s a good thing!), increase framerates, and generally make things better. However, there is something of a debate about how and why they work, and when they should be used.
The later issue is relevant to a larger population and as such has been re-hashed many times in many ways. It seems that the only real rule that everyone agrees on is "use semi-solids when they make the level better". From my experience, there are a couple situations you should NEVER use semi-solids:
- When they will later be subtracted from
- as walls, unless you first put a real wall "inside" them
- around non-solids, Unless you're REALLY careful.
There are, however, many very GOOD places to use semi-solids:
- As the steps for a stairway - Create the stairway as a slope and add the steps as a semi-solid.
- For decorations that you'd like to have solid
- Any kind of decorative tubing
With these general guidelines in mind, there are some remaining issues with semi-solids.
1. The geometry parser will often ignore faces on semi-solids that are co-planar with faces on previously existing geometry. This means that if, for example, you try to add two semi-solid pillars on top of each other, the second one added may loose some of its faces. One thing that sometimes fixes this is to create the semi-solid objects with co-planar faces as, or combine them into, a single brush.
2. A more interesting and rarer occurrence with semi-solids is for the collision detection code to loose portions of polys. This happens when you have near-co-planar surfaces. Everything will draw just fine, but you'll be able to shot, walk, or fall through part of the semi-solid object. This is, in reality, an invisible BSP hole, and should be treated in the same ways.
3. Another issue is that in some circumstances you'll find bots trying to shoot through semi-solids. The problem is that bots do not "see" semi-solids at all. The best fix for this is to either make them solid, or add simple, solid, cores to them.
Now for the real mystery... How do semi-solids work? A good question and one that I'm sorry to say I cannot give a definite answer to. However, my theory goes something like this.
Semi-solids are ignored for the bulk of geometry creation. The level is "built" as if the semi-solids did not exist. After the geometry and BSP for the adds and subtracts is done, it goes through and adds the semi-solids. First it determines which BSP leaves the semi-solid intersects, and slices it into chunks to fit into each leaf. This causes the disappearing surface problem, because if the semi-solid is sliced along a plane containing a poly, the poly is included in neither of the halves that come out. Once the brush has be sliced up into pieces for each BSP leaf, the resulting polygon lists are inserted into the polygon lists for their respective leaves. It also adds the semi-solid's geometry to the collision BSP and looks through the level geometry for the affected leaves and marks poly fragments that lie completely inside the semi-solid as invisible (in a special zone?). I'm not sure how it handles draw order with the software renderer, but the hardware renderers I would assume rely on the z-buffer.