If parts of the brush geometry disappear or disappear when looked at from a certain angle there is a BSP-Hole in the map. BSP-Holes come up when people work messy. The problem with searching, fixing or examining the causes of BSP-holes is that not every mistake causes one and some only cause problems much later on in the mapping process. The most common tip given to newbies to avoid BSP-holes is to stay on the grid and sometimes it is even recommended to stay at a certain minimum grid size like 4 or even 16. While this certainly doesn't hurt the cleanliness of the map, straying from the grid is not a cause for bsp-errors. I can only pass on the recommendation to stay on the grid whenever applicable
but I also want to go into some of the real causes.Non-planar faces
The main cause for bsp-errors in my experience are non-planar faces. UnrealEd operates with triangles. StaticMeshes are automatically triangalized and brushes are too though it's not visible in UnrealEd. A triangle is perfectly defined by its three vertices. If one vertex is moved it is still a perfectly defined triangle. When mapping, one doesn't stick to triangle shapes, however. The most common shape for brushes are variations of cubes. A cube consists of quadrangles. Quadrangles need four vertices. If one of the vertices is moved out of the plane of the quadrangle it is not exactly defined anymore because there are two possibilities to see it now. Point A was moved to point A'.
What was an exactly defined quadrangle before can now be seen as the blue shape or the light blue shape. Extremely simplified speaking, the UnrealEd doesn't know how to treat the shape, messes up and generates bsp-errors.Never use non-planar faces!Subtracts from subtracts, adds to adds
Inside a subtract thereios no matter. Cutting something out of nothing isn't possible. Inside an add there is matter. It is not possible to increase the density by adding another add into it. One subtract that sticks into another subtract isn't going to cause problems but once this is done too often or worse too often in one place and shit gets layered it seems to be as hard for the UnrealEd as it is for the mapper to keep track of things. Only subtract from matter and only add to nothingness!Make sure adds don't overlap with adds and subtracts don't overlap with subtracts!Inside-out brushes
Changing the DrawScale to a negative value mirrors StaticMeshes along the respective axis, which is quite handy. "Mirroring" a brush doesn't really mirror it but it turns its inside out while "mirroring" it. The following object on the left is mirrored along the light blue face so it looks like the object on the right:
In wireframe view it looks like it worked, however the blue side is still pointing in the same direction as it did before! Imagine that in 3d. Escher can, we can't and neither can the UnrealEd. Don't do this!
Another way to create inside-out brushes is the 2d Shape Editor. When opened the starting shape is a square in UnrealEd 3.0 and a triangle in the old UnrealEd. It looks as if we could just move the points around until we get a shape that looks right to our eyes, however for the unrealEd the starting shape is actually like a piece of cloth and if we move its edges in a way that would partially or completely turn over the piece of cloth the brush we generate out of this shape becomes flawed. Keep in mind the cloth metaphor when working with this tool!
If you suspect your builderbrush is turned inside out, click Brush -> Reset All and create its shape anew from scratch!Dublicate faces
The easiest example for this is created by adding any Builder Brush shape twice in the same place. Of course the faces of the added brush overlap now. If a brush and a StaticMesh overlap they flicker because it isn't clear which of the two should be shown so it changes from frame to frame. As StaticMeshes are lit differently there is a visible difference between them and the brush they may overlap with and that's why we see flickering. When two brush-surfaces overlap we see no flickering because they look exactly alike but just because the problem isn't visible doesn't mean it isn't there. UnrealEd doesn't know which surface to prefer, messes up and creates BSP-errors. Again, simplified speaking, but experience told me this is more or less true.
Dublicate faces can also appear when working with concave objects. The following object was created with the 2d Shape Editor:
The blue shape was what I set up in the 2d Shape Editor and then I gave it depth. The Builder Brush in the UnrealEd had an additional line now. The green one (it was red, of course, just like the rest of the Builder Brush. This is just an illustration). I ignored it at first but is part of an additional face of the object which shouldn't be there. The new face (KBE) was overlapping with the "real" face (KBAE) and produced a bsp-error. It's especially bad if this sticks into other brushes. So check your creations for lines you didn't build! Careful though, sometimes the UnrealEd just adds a line to cut a face in two (maybe so it can process it more easily, I don't know). Those are ok.Very small angles
I have no rational explanation for why this causes problems but in my experience very small angles between brushes can cause bsp-errors too. Either triangle with one point very far from the others or just two brushes that have surfaces which meet, or almost meet, at a very low angle. I'm talking very low. Like not more than 5 degree. Don't get overcautious here and stop using low angles in your geometry if you need them. Just know that if you are searching for causes of a bsp-hole and you ruled out the other errors, search for low angles.Surfaces that are too close to each-other
If you treat UnrealEd like it was a "normal" 3d modeling program like, for example, Maya and you just move two cubes together until they are kind of together in your eyes this is not exact enough for UnrealEd. To get you an idea: It's almost impossible to get two surfaces to match up exactly when grid-snapping is turned off, even when you are zoomed in completely and it looks fine to you. So use grid-snapping whenever you want surfaces of brushes to meet.