func_detail
func_detail
is an internal brush entity available in all Source games. It is not an actual brush entity, but rather moves all contained brushes to worldspawn
and flags them as CONTENTS_DETAIL
, resulting in them not affecting visibility or chopping non-detail brushes. All brushwork that does not form the 'backbone' of the world (and that is not tied to a real entity) should be detail, with the exception of translucent glass (which suffers from alpha sorting issues when not "structural").
Valve provides an example map at sourcesdk_content\hl2\mapsrc\sdk_func_detail.vmf
. You can also load up the HL2 map sources and hide detail brushes with their auto visgroup to see where Valve used them.
r_drawfuncdetail 0
to hide detail brushes in any map while it is running.World brushes using %CompileDetail
materials will always be treated as if they were tied to func_detail.
Water and Slime brushes cannot be detail. VBSP automatically removes detail contents from liquids, and modifying VBSP to remove this quirk results in the liquids being invisible in-game (although still swimmable).
Effects
The point of creating a detail brush entity is to avoid creating an unnecessary number of visleaves for a mere detail of the map, hence the name of the entity. VBSP will allow visleaves to overlay details, and thus minimize visleaves and compile time.
Above are a world brush (left cylinder) and a detail brush (right cylinder). The blue lines are visleaf boundaries. The world brush has chopped the map into nine oddly-shaped segments, leading to longer compile times and marginally lower performance, while the detail brush has not changed anything.
Caveats
- Detail brushes cannot be used to seal a map, or areaportal areas.
- Because detail brushes do not chop world brushes, light can seep underneath them if the other surface's lightmap scale is larger than the detail brush is wide/tall. If you encounter this, manually slice the underlying brush in multiple parts (with ⇧ Shift+X), and texture underneath with nodraw.
- This effect can cause detail brushes with lots of surface contact to become inefficient, because the surface beneath them is being rendered too! Structural faces which are completely obscured by func_detail should be textured with nodraw.
- Detail brushes do chop each other, however. Vanilla VBSP does not support detail levels as seen in HLBSP, so all detail brushes will chop each over with no bias.
- Tip:DeathByNuke's fork of VBSP has
%CompileChopLow
,%CompileChopHigh
, and%CompileChopAll
material map compile flags which give some control over what chops what.
- Surfaces on very thin (about 2 units thick) detail brushes have been known to disappear at certain distances. As a workaround, use func_brush instead.
- World brushes with translucent and/or transparent materials applied, or which are displacements, do not affect VIS, and cannot seal areas.
- Detail brushes will, in some cases, merge faces with other detail brushes, and on occasion, world brushes, which can cause them to create leaves.
- Under normal conditions, any time a detail brush contacts a world brush, VBSP will note the junction and optimize it. This connection is known alternately as a T-junction and a water index, and there is a limit to the number of T-Junctions VBSP will attempt to fix (65,535). Excessive use of detail brushes in contact with world geometry could cause VBSP to abort compilation with an error. Using the
-notjunc
option will skip this optimization at the price of possible visual inconsistencies.
- Note:Water, for unknown reasons, causes the t-junction count to skyrocket. Removing/reshaping bodies of water can overcome this.
Good candidates
Any brush which doesn't significantly block the player's view should probably be detail. Specific examples include:
- Pillars, plinths and supports
- Free-standing walls
- Suspended walkways
- Steps (create a smooth wedge-shaped world brush underneath)
- Small buildings
- Rotated brushes
- Very small or thin brushes
Keyvalues
- Minimum / Maximum DX Level
(mindxlevel / maxdxlevel)
<integer choices> (removed since ) - The entity will not exist if the engine is running outside the given range of DirectX Versions.
Warning:
|