Overview
TheEntitySource class is a decompiling module responsible for writing point and brush entities converted from various BSP lumps. It handles the reconstruction of all entity types including brush entities, point entities, overlays, static props, cubemaps, ladders, and special entities like areaportals and occluders.
This module is based on several entity building methods from Vmex.
Package: info.ata4.bspsrc.decompiler.modules.entity
Constructor
BSP file reader for accessing BSP data
VMF writer for outputting entity data
Configuration settings for decompilation
BrushSource module for writing entity brushes
FaceSource module for writing face-based brushes
Texture source module for material handling
BSP protection handler
VMF metadata handler for UIDs and visgroups
Mapper for brush side to face relationships
Factory for creating winding geometry
Utility for calculating brush bounding boxes
Areaportal reallocation data
Occluder reallocation data
Public Methods
writeEntities
- Brush entities with associated models
- Point entities (lights, triggers, logic, etc.)
- func_areaportal entities
- func_occluder entities
- worldspawn (handled separately)
- env_cubemap (use
writeCubemaps()) - info_overlay (use
writeOverlays()) - prop_static (use
writeStaticProps()) - func_detail brushes (use
writeDetails()) - info_ladder entities (engine-only)
- Reuses hammerid from BSP when available
- Applies entity rotation fixing if
config.fixEntityRotis enabled - Writes entity I/O connections
- Organizes entities into visgroups (instances, protection flags, objectives)
- Handles areaportal and occluder brush writing or rebuilding
writeDetails
func_detail entities by identifying detail-flagged brushes.
Behavior:
- Filters brushes marked as detail, solid, or translucent
- Groups detail brushes if
config.detailMergeis enabled - Merges nearby brushes within
config.detailMergeThreshdistance - Writes protected brushes separately with visgroup metadata
writeVisClusters
func_viscluster entities reconstructed from BSP visibility data.
Behavior:
- Groups BSP leaves by cluster ID
- Calculates bounding boxes for each cluster
- Writes trigger brushes representing visibility clusters
- Adds debug leaf geometry if
config.debugis enabled
writeOverlays
info_overlay entities.
Behavior:
- Calculates U/V basis vectors from overlay data
- Maps overlays to brush side IDs
- Handles both displacement and brush side overlays
- Writes fade distances and system levels if present
- Links overlays to info_overlay_accessor targetnames
- Skips overlays with origins or UV points outside map bounds
writeStaticProps
prop_static entities.
Behavior:
- Writes all static prop properties (origin, angles, skin, fade distances, etc.)
- Creates
info_lightingentities for lighting origins - Handles version-specific properties (DX levels, scaling, diffuse modulation)
- Supports various static prop versions (v4-v13)
writeCubemaps
env_cubemap entities.
Behavior:
- Writes cubemap position and size
- Attempts to map cubemaps to brush sides
- Limits side list if count exceeds
config.maxCubemapSides
writeLadders
func_ladder entities from ladder-flagged brushes.
Behavior:
- Scans world brushes for ladder content flag
- Writes each ladder brush as a func_ladder entity
setNmo
NMO file data containing objective and extraction information
- Enables objective/anti-objective visgroup organization
- Reuses extraction entity IDs from NMO data
- Reserves visgroup IDs for objectives
Configuration Options
This module respects the following configuration options fromBspSourceConfig:
- writePointEntities - Enable writing point entities
- writeBrushEntities - Enable writing brush entities
- writeAreaportals - Enable writing func_areaportal entities
- writeOccluders - Enable writing func_occluder entities
- writeLadders - Enable writing func_ladder entities
- writeDetails - Enable writing func_detail entities
- writeDisp - Enable displacement data in face brushes
- fixEntityRot - Apply rotation to entity brushes (“bake” rotation)
- detailMerge - Merge nearby detail brushes into groups
- detailMergeThresh - Distance threshold for detail brush merging
- maxCubemapSides - Maximum brush sides to assign to cubemaps
- brushMode - Brush writing mode (BRUSHPLANES or FACES)
- sourceFormat - VMF format conversion (OLD/NEW/AUTO)
- debug - Write debugging metadata
Usage Example
Implementation Details
Entity Processing
The constructor callsprocessEntities() which:
- Fixes worldspawn properties (removes world_mins/maxs, rebuilds mapversion)
- Converts VMF format (old vs new I/O separator) if requested
- Processes
func_simpleladder→func_ladderconversion (L4D branch) - Fixes light entities (style/defaultstyle handling)
- Creates camera positions from info_player_* entities
- Blacklists hammerids to prevent UID conflicts
Entity Rotation Fixing
WhenfixEntityRot is enabled:
- Brush entity rotations are “baked” into brush geometry
- Origin and angles are applied to all brush sides
- The
angleskeyvalue is removed from the entity - Improves Hammer editor display (Hammer doesn’t show entity rotation)
Detail Brush Merging
WhendetailMerge is enabled:
- Detail brushes are grouped by spatial proximity
- Bounding boxes are expanded by
detailMergeThresh - Intersecting groups are merged together
- Reduces entity count in output VMF
Visgroup Organization
Entities are automatically organized into visgroups:- Reallocated - Areaportals/occluders using original brush data
- Rebuild - Areaportals/occluders rebuilt from face geometry
- Instances - Entities with instance prefix in targetname (e.g., “prefix-name”)
- VMEX flagged entities - Entities with protection flags
- Objectives - NMRIH objective-related entities (when NMO data is set)
Areaportal & Occluder Handling
These entities have special handling:- Brush Mode (BRUSHPLANES): Uses reallocated original brushes if available
- Face Mode: Rebuilds from areaportal/occluder geometry
- Validates portal numbers and geometry before writing
- Debug mode writes additional visualization entities
Overlay Mapping
Overlays are mapped to brush sides differently based on brush mode:- BRUSHPLANES: Maps overlay faces → original faces → brush sides
- FACES: Maps overlay faces directly to written face IDs
- Handles displacement overlays via dispinfo UID mapping
Related Modules
- BrushSource - Brush geometry writing
- FaceSource - Face-based brush writing
- TextureSource - Texture and material handling