My program doesn't have bugs. It just develops random features.
Theories on how semisolids work & why they sometimes go wrong. Add, discuss & mercilessly refactor.
Semisolids are first split into pieces according to the BSP regions, so for example a large beam that crosses several rooms is split between the subtracts.
Then the polys are added to the poly list of each BSP leaf.
This explains the following semisol problems:
- faces that vanish at the edge of a region (presumably because the splitting code doesn't handle a face that's on a boundary if there's no part of the semi within the region where the boundary face is visible)
- collision errors
- You could prove the theory by splitting the single semi-solid beam into a few smaller semi-solids to see if the problem still occurs. Of course – you can't see the semi-solids in the BSP view (I've ordered every semi-solid brush to the end of the brush list in my level so that might also be why I can't see them).
Another possible way of proving that would be to merge all of the co-planar ceiling brushes as this seems to lessen the effect of polygon boundaries.
here's a plunder from one of my old forum posts:
My theory was that the polys of a semisolid are defined as belonging to a particular BSP region. If the semisol brush isn't entirely within a region, it's split by the BSP and polys are handled for each region.
Problems arise when the edge of a semisolid brush is flush with a plane that markes a BSP cut.
Let's say we have a room made of two subtracts, side by side. (Maybe we've built it like that to get a T-shape floorplan or something...)
Now imagine a crate on the floor, positioned so one side of the crate is flush with the join in the room.
The crate has 5 visible polys. 3 sides and the top belong to BSP region A, which is the region in which the semisol brush itself sits.
The last poly is on the BSP cut. It's visible from region B, but no part of its parent semisolid brush is in the region: hence the vanishing poly.
The geometry rebuild looks for semisolids in each region and considers the relevant faces. It doesn't account for this special case where a semisolid face is in a region but the brush isn't.
Now take a look at the picture:
I was going through my level in zone view, and the tops of those two semisolids had vanished on my latest rebuild. As I moved around, I went out into solid space to get a better look, and the polys appeared – but in the wrong zone colour!! :eek:
I'm fairly sure that this doesn't always happen with Semisolid Poly Vanish – I seem to remember that usually the face is simply absent no matter where it's viewed from (I'm not about to test that though!)
This does raise an interesting point, that on this occasion, the semisolid face is THERE... but it's been listed as belonging to the wrong zone.
I hereby name this phenomenon the Semisolid Zone Error, a special case of SPV :D