This is a collection of other tools and scripts I've made over the years
I don't actively maintain these but perhaps others might find them useful..
Discord to discuss the tools: Join
NOTE: If you intend to redistribute the map compilers in your Source mod,
you must ask me for permission. DM me at @ficool2 on Discord
VBSP++
VBSP++ is a modification of SDK2013 VBSP with various new features and improvements
Changelog:
- Automatically reduces brushes and brushsides usage of the map by 10-30% (MAX_MAP_BRUSHES, MAX_MAP_BRUSHSIDES)
- Automatically reduces planes usage of the map up to 40% if limit is hit (MAX_MAP_PLANES)
- If plane limit is exceeded, VRAD++ must be used or lighting will be broken
- No t-junction limit
- No detail prop limit
- Raised overlay limit to 8192 and internal entity limit to 65536
- Increased maximum switchable lights from 32 to 96
- "-leaktest" is now enabled by default, i.e. stops compile on leaks
- Added "-noleaktest" to disable this behavior
- Added appid mounting in gameinfo.txt
- Added support for mounting custom shaders in mods
- Added support for custom $surfaceprops on clip brushes
- Added support for compiling 4-way blends (for games that support it)
- Added func_detail_blocker (like newer VBSPs)
- Added -blocksize (default is 1024)
- Useful to compute visibility faster on open, large maps like surf (I recommend 2048)
- Using a higher blocksize also reduces your vertex count, useful to circumvent vertex limit
- Added -allowdynamicpropsasstatic (allows any props to used as static props)
- Note that some props might work right with this, particularly props that aren't compiled with "$staticprop"
- Added per-prop ambient occlusion toggle
- To use, set "disableambientocclusion 1" keyvalue on the entity
- Does not work on HL2/Singleplayer BSPs due to older static prop format
- Added proper support for compiling power of 4 displacements (like CS:GO)
- Update: this is now reverted due to causing crashes on Linux servers. Slammin is also affected by this.
- Added parallax_obb entity support for mods that have parallax cubemaps
- Added func_detail_illusionary (identical to func_detail but non solid)
- Added func_nobevel support
- VBSP generates bounding box brushsides for angled geometry to improve collision accuracy
- But a problem is that these can eat up brushsides quickly
- Surround angled brushes with this to skip creating these extra brushsides
- Accurate collision isn't needed for areas the player can't reach anyway (like out of bounds)
- You can also specifiy a "vbsp_nobevel" 1 keyvalue in a brush entity to disable bevels
- Added -nobevel (disables brushsides for all angled geometry. I do not recommend using this, use func_nobevel instead)
- Added optimization to automatically disable vertex lighting for props with $bumpmap/$phong
- Reduces time spent in VRAD with -staticproplighting
- Use "-showineligiblevertexlitprops" to show what props were marked ineligible for vertex lighting
- Added logging if FGD has parsing errors
- Added -nonamefixup to disable default instance name prefixing with "InstanceAuto"
- Added "-singleplayer" option to compile maps for HL2 (SDK13 Singleplayer) BSP format
- Added warning if using info_lighting on dynamic entities
- Added %compileNoShadows support
- Added support for compiling lightmaps on Water if $lightmapwaterfog is set
- Added support for high lightmap sizes (useful for games that support -maxlightmapdim)
- Added support for saving "enablelightbounce" flag for static props
- Added support for reading decimal values from face lightmap scales
- Added -nohdrcubemap to not write HDR cubemaps to BSP, useful if map is compiled in LDR only
- Likewise -noldrcubemap exists to not write LDR cubemaps
- Added "-nobump" (disables bumpmap lightmaps on all faces)
- Added "-maxluxelscale" (clamps maximum luxel scale, default is no limit)
- Added "-report_search_paths" to list current search paths for debugging
- "-leaktest" will now stop on areaportal leaks
- Restored support for -maxlightmapdim and -defaultluxelsize parameters
- func_occluder, func_areaportal, func_viscluster, func_nobevel, parallax_obb no longer count towards the brush limit
- Improved clarity of some warnings and removed useless ones
- Fixed instances not collapsing correctly if FGD had unrecognized types
- Fixed instance names prefixed with ! being remapped
- Fixed remapped instance I/O always using ESC separators (fixes HL2 compatibility)
- Fixed smoothing groups not working on func_detail
- Fixed displacements not being rotated correctly in instances
- Fixed occluders not being collapsed correctly in instances
- Fixed missing texture cubemaps if skybox has mismatched side dimensions
- Fixed crash if an instance overflowed brush or brushsides limit
- Fixed crash if instance name was too long
- Fixed crash if no surfaceprops were loaded
- Fixed bug where brushside count was varying depending on the CPU
Installation:
Place into your game's bin/x64/ or bin/win64/ folder (where normal vbsp.exe is)
Update Hammer's game configuration to use vbspplusplus.exe as the BSP compiler
Supported branches:
- Garry's Mod
- 64-bit SDK2013-based games, etc: Team Fortress 2, Counter-Strike: Source, Day of Defeat: Source, Half-Life 2: Deathmatch
Compiling maps for Half-Life 2 or SDK 2013 Singleplayer is supported
However you must still install VBSP++ in a 64-bit game, and pass "-singleplayer" to set the correct BSP format
Optionally, add the "tools_plusplus.fgd" FGD file into Hammer's game configuration
Tools -> Options -> Game Configurations -> click Add beside Game Data files
Download (Last updated: 18th January, 2026)
VVIS++
VVIS++ is a modification of SDK2013 VVIS, with the main upgrade being massive improvement in compile time Changelog: - Huge performance improvement over normal VVIS. Speed up ranges from 50% to 2700% faster (!!) -- See this benchmark image for a comparison -- Produces the same results as normal VVIS - Scales up to 64 threads - Added appid mounting in gameinfo.txt Installation: Place into your game's bin/x64/ or bin/win64/ folder (where normal vvis.exe is) Update Hammer's game configuration to use vvisplusplus.exe as the VIS compiler Supported branches: - Garry's Mod (x86-x64 beta) - 64-bit SDK2013-based games, etc: Team Fortress 2, Counter-Strike: Source, Day of Defeat: Source, Half-Life 2: Deathmatch Maps for Half-Life 2 or SDK 2013 Singleplayer are supported. However you must still install VVIS++ in a 64-bit game Download (Last updated: 18th January, 2026) Wall of Testimonials: - "wow" - "I am shocked that my map now compiles in 20 seconds, took 5-10 mins before" - "from 29 seconds to 16, thats really good boost" - "im down from a total compile of over 6 minutes to a bit over 1 minutes" - "its like 5x faster, not just 2x" - "HOLY FUCK THIS IS SO MUCH FASTER" - "those time improves are bonkers" - "this vvis compile went from 20:24 -> 3:40, what the fuck did you put in this thing" - "This is awesome" - ":hyenastare:" - "FROM LIKE AN HOUR TO QUICKER THAN IT TAKES TO MAKE A CUPPA" - "its so much better lmfao" - "this used to be over 1 hour total, oh my fucking fuckedy fuck, black magic" - "portal flow was near instant, no need to fix the nodraw corridors underneath the map, thank god" - "test compile of well, vvis went from 10 minutes to 1:30, truly amazing stuff" - "portalflow is about 6 times faster with this" - "cordon compile to test lighting: 32 minutes, 48 seconds elapsed -> 4 minutes, 51 seconds, this is incredible" - "ts so juicy dude" - "You're pawesome" - "1 hour 12 minutes down to 5 minutes on my map :cracksoldier:, and my cpu isn't even great either" - "absolutely insane" - "4:56:30 time elapsed (gmod vvis), 5:43 time elapsed (vis++), i wish i was joking" - "its great god bless vvis++" - "From 24 hours to around 20mins. It's amazing. I was getting ready to not have a computer the whole day"
VRAD++
VRAD++ is a modification of SDK2013 VRAD with various new features and improvements
Changelog:
- Scales up to 64 threads
- Small performance optimizations
- Shared LDR/HDR compiling:
- When using -both, LDR lighting data will be redirected to HDR at no extra file size cost
- This means you don't need to compile VRAD twice for LDR and HDR users anymore (compatible with both)
- Passing in -ldr or -hdr will still explicitly compile in LDR or HDR mode only, respectively
- HDR data will not be remapped if LDR data is already present
- Therefore if you need different LDR and HDR lighting, compile with -ldr and -hdr separately
- NOTE: before the 22/10/25 update, VRAD++ would run in HDR mode by Default
- This has been reverted to stock behavior, with LDR mode being default
- Only -both will do the data remapping
- This was done for compatibility with other branches which VRAD++ is being ported to
- Bypassed "numplanes + fakeplanes >= MAX_MAP_PLANES" limit
- You will never see it again!
- Light count is now unlimited instead of capped at 8192
- Added appid mounting in gameinfo.txt
- Added shadow casting for dynamic props
- Set "vrad_model_cast_shadows 1" in the entity to enable this
- This is intended for props that won't move and can't be a static prop, for example resupply lockers in TF2
- Uses the first frame of sequence 0, or uses the animation set by "DefaultAnim" (like on "prop_dynamic")
- Modelscale is supported
- Added new "light_projected" light type
- Behaves like a env_projectedtexture but applied at compile time to lightmaps
- Same properties as light_spot, with an additional texturename key (path to VTF)
- Outer angle controls "size" of projected angle
- Alpha channel is multiplied with the output light (black - no light contribution)
- Non-square aspect ratios and roll angle are supported
- Renamed to "light_spot" after compilation so it can be toggled in-game
- Added support for "light_directional" light type
- Renamed to "light_spot" after compilation so it can be toggled in-game
- Added ambient occlusion baking
- Custom implementation that is an order of magnitude faster than AO in Slammin/CS:GO (!)
- Set -ambientocclusion to enable this
- Customize with -aoradius, -aoscale, -aopropsamples, -aofacesamples
- Samples are automatically adjusted for -fast and -final mode
- Default AO radius and scale is 32 units and 0.5 respectively
- Radius in 3D sky is correctly scaled (every other VRAD AO implementation has this bug)
- Use "-aodebug" to visualize ambient occlusion
- Added new QMC sampler for ambient, sunlight and ambient occlusion
- This allows lighting to converage to the ground truth faster
- Same sampler as used by modern raytracers, such as in Blender
- Less samples are required for a good result
- Since less samples are required, "-final" has now been reduced to "-extrasky 8" by default (from 16)
- Added soft lights
- When "_light_radius" keyvalue on a light is set, the light is treated as a sphere/disk
- Allows for casting softer shadows
- Note that soft lights will take longer to compile than hard lights
- Added "-extrasoft" parameter to control sample multiplier for soft lights
* Defaults are 1, 0.25 on "-fast", 4 on "-final"
- Currently only supports "light" and "light_spot"
- Added "-StaticPropSampleScale"
- Controls sample multiplier for prop vertex lighting (default is 1)
- Defaults to 4 with "-final", which will slightly increase compile times
- However this will improve quality of prop lighting in areas starved of sunlight or bounced surfaces
- Added -reflectivityscale
- Added -worldtextureshadows
- Allows $alphatest brush textures to cast proper shadows like props
- Requires -textureshadows
- Fixed bug where textureshadows doesn't work if top-left pixel is opaque
- Added -translucentshadows
- Similar to -worldtextureshadows but for $translucent brush textures
- Requires -textureshadows and -worldtextureshadows
- Added -forcetextureshadows
- Forces texture shadows to be enabled on all props
- Added DXT3 format support for texture shadows
- Added support for %alphatexture
- Allows overriding texture used for texture shadows on geometry
- Added experimental support for static props to shadow ambient cubes
- Disabled by default, use "-propambient" to enable
- Uses collision model of the static prop as the approximation
- Ambient cubes won't be generated inside solid static props
- Vertex lighting from the props will contribute to the ambient cubes
- "-StaticPropLighting" does not need to be enabled
- Note that this won't solve sunlight applying to entities shadowed by static props, as the engine ignores prop visiblity at runtime
- See this pagefor detailed info about this issue
- Added experimental support for named "light_environment" and "light_directional"
- Fixes static props having black lighting
- To use: you must "jail" the light entity by itself inside a nodraw cube in the void
- Not doing so will potentially lead to bad performance
- Named light environment still has engine bugs, mainly that props may have broken light after toggling the sunlight
- This can be workarounded by flipping the value of "r_radiosity" in console
- In GMod, Lua can be used for this
- In singleplayer games, you can issue a command with "point_clientcommand" or VScript
- Added support for "Patch" materials for loadng texture shadows
- Added support for processing HL2 (SDK13 Singleplayer) BSP formats
- Added "-patchlightmapsize" to set minimum lightmap size for patches (default is 16)
- This controls how faces with lower lightmap scales get subdivided for bounced lighting
- Lower values will subdivide more, at the cost of increased compile time and memory usage
- This may sometimes solve issues with thin surfaces obstructed by geometry not receiving light
- Added support for using decimals in lightmap scales
- Added "-report_search_paths" to list current search paths for debugging
- Added "-propdebug" for tracking down what props take a long time to compile
- Significantly improved performance and memory usage of bounced lighting on faces with low lightmap scales
- Improved vertex lighting for props
- Added -StaticPropIndirectMode to use old behavior if desired
- See this page for a comparison
- Fixed maps with more than 13 million triangles taking a very, very long time to compile
- Fixed rays missing exact diagonal corner intersections
- Both of these bug exists in all other versions of VRAD
- Fixed prop lightmaps being dumped into wrong color space with "-dumppropmaps"
- Prop lightmaps are also now dumped into "sp_lightmaps" directory of the game
- Fixed prop lightmaps always using "fast" lighting samples and ignoring "-extrasky"
- As a result, prop lightmaps will take slightly longer to compile, but will look significantly better
- Fixed maps with radial vis (FarZ set in "env_fog_controller") drawing 3D sky in 2Dsky-only areas
- Fixed light_environment SunSpreadAngle not using more samples under "-final"
- Maps using a spread angle greather than 0 will take slightly longer to compile with "-extrasky" as a result, but the result looks better compared to stock
- Redundant vertex lighting is skipped for lightmapped props (saves compile time and file size)
- .dx90.vtx data is loaded for vertex lighting instead of .dx80.vtx
- Broken vertex data for props will now be skipped over when compiling
- Fixed bug where broken vertex data in props skipped vertex lighting for other props
- Removed memory column from BSP statistics as its useless
- Named or styled lights are now sorted by brightness priority for faces
- Reduces occurence of bad lighting from overlapping named/styled lights
- Static prop lighting is no longer skipped on "-fast" mode
- Added -scale, -ambient, -dlight, -sky, -notexscale, -coring debug options
- Unlimited texlight support in .rad files
- Comments in .rad files are now skipped
- Cleaned up formatting of some messages and warnings
Installation:
Place into your game's bin/x64/ or bin/win64/ folder (where normal vrad.exe is)
Update Hammer's game configuration to use vradplusplus.exe as the RAD compiler
Supported branches:
- Garry's Mod (x86-x64 beta)
- 64-bit SDK2013-based games, etc: Team Fortress 2, Counter-Strike: Source, Day of Defeat: Source, Half-Life 2: Deathmatch
Maps for Half-Life 2 or SDK 2013 Singleplayer are supported. However you must still install VRAD++ in a 64-bit game
Optionally, add the "tools_plusplus.fgd" FGD file into Hammer's game configuration
Tools -> Options -> Game Configurations -> click Add beside Game Data files
Download (Last updated: 18th January, 2026)
BSPZIP++
BSPZIP++ is a rewrite of SDK2013 BSPZIP with some improvements
Changelog:
- Multithreaded LZMA compression
- Threads can be adjusted with "-threads N" parameter
- ".mp3", ".wav", ".ani" and ".vcs" (shaders) files are no longer compressed
- This prevents caching bugs in the engine
- See this page for more info
- Supports maps that exceed soft limits such as overlays, lights and entities
- Supports Garry's Mod
- GMod's BSPZIP does not support compression (even though GMod's engine can load compressed maps)
- Now you can use BSPZIP++ to compress maps for GMod
- Supports SDK2013 Singleplayer BSPs
- Note that compression is NOT supported on the singleplayer engine
- Added "-verbose" flag for more detailed information
Installation:
Place into your game's bin/x64/ or bin/win64/ folder (where normal bspzip.exe is)
Update the tool you use for packing (e.g. CompilePal, bspzipgui) to use bspzipplusplus.exe instead of bspzip.exe
Supported branches:
- Garry's Mod (x86-x64 beta)
- 64-bit SDK2013-based games, etc: Team Fortress 2, Counter-Strike: Source, Day of Defeat: Source, Half-Life 2: Deathmatch
Maps for Half-Life 2 or SDK 2013 Singleplayer are supported. However you must still install BSPZIP++ in a 64-bit game
Download (Last updated: 18th January, 2026)
StudioMDL++
StudioMDL++ is a modification of SDK2013 StudioMDL with various new features and improvements Changelog: - Added appid mounting in gameinfo.txt - Added -nodx80 option to not emit .dx80.vtx files - Added "reverse" command for $sequence - Added "pos" and "rot" options to "match" command for animations - Added "copy" command for animations - Added basic "if"/"else"/"else if" conditionals to animations - Added default argument support to macros - Added new $endmacro terminator for macros, allows omitting \\ - Made offset optional for $attachment, can be explicitly defined with "offset" token - Significantly faster compilation - Raised maximum amount of source bones to 1024 - $collisionmodel and $replacemodel no longer require explicitly providing extension name - Fixed $renamebone not affecting the collision model - Fixed crash if source bones limit is exceeded - Fixed crash if blank bodygroup was used with $staticprop - Reduced default weight culling from 5% to 0.01% - Removed .sw.vtx output Installation: Place into your game's bin/x64/ folder (where normal studiomdl.exe is) Update Crowbar (or Hammer's) game configuration to use studiomdlplusplus.exe as the MDL compiler The only supported games are 64-bit SDK2013-based games, for example: - Team Fortress 2, Counter-Strike: Source, Day of Defeat: Source, Half-Life 2: Deathmatch Garry's Mod is NOT supported. Download (Last updated: 11th December, 2025)
bsp_iidefeat
Tool to recover map textures from the infamous IID nodraw anti-decompile protection on BSPs Recovers majority of brush textures in the map. A bit of manual cleanup may still be needed. If you encounter a protected map that does not work with this tool, let me know! Updated: now supports fully removing "bspProtect" protection by Jakob Sailer. Updated: now supports removing crashing/junk entities from "BSP Protection" by SpySpaille Updated 30th September: supports removing latest version of bspProtect Updated 1st October: supports recovering hint brushes. Pass -nohint to disable this if it causes issues Updated 3rd October: added -entrecovery option to recover brush entities and lights from entity-stripped maps Updated 14th October: fixed bugs with light recovery, corrupt lumps are now skipped Usage: run from cmd to see help options Download (Last updated: 14th October, 2025)
check_mdl
Python script to check MDLs for corrupted vertex data There is an unknown compiler bug where models very rarely have corrupt LOD data Such corrupt models cause client crashes when decals are applied or users have lower graphics settings This tool can identify those so they can be recompiled Originally made to identify problematic props in the Greek Theme Pack for TF2 Usage: install Python, run the script inside a folder of models you want to check Download (Last updated: 9th March, 2024)
cubemap2hdr
Converts a cubemap in LDR color format to HDR Particularly useful for Left 4 Dead 2 where LDR cubemaps will look broken Usage: drag and drop a cubemap onto the exe Download (Last updated: November 11th, 2024)
tga2skybox
Converts 6 tga files into a cubemap VTF, and automatically creates a LDR and HDR version Applies correction to the edges to blur seams as well Useful for fake skyboxes with WindowImposter shader Usage: run the tool and follow instructions Download (Last updated: 31st May, 2024)
vtf_downscale
CLI tool to downscale a VTF to a lower mipmap losslessly. Useful to reduce file size without re-compressing the texture Supports mass-automatic downscaling (for example to only downscale all 2048x2048 or higher textures) Usage: run from cmd to see help options Download (Last updated: 15th August, 2024)
vtfstripalpha
CLI tool to remove the alpha channel from VTFs without quality loss. Useful to reduce file size Supports mass-automatic detection and removal of blank (white) alpha channels Unfortunately, I lost the source code for this tool... Usage: run from cmd to see help options Download (Last updated: 24th August, 2022)
proptexelvtf
Converts a prop_static lightmap (.ppl file extracted from BSP) into VTF Usage: drag and drop a .ppl onto the exe Download (Last updated: Jan 11, 2021)
vtf_fix_mip2
Removes LOD settings from VTFs Was useful to make some TF2 textures appear high-resolution, now obsolete as mat_picmip -10 is allowed again Usage: put the exe into the desired folder of textures and run Download (Last updated: 13th April, 2021)
dds_to_vtf
Converts a DDS texture to VTF directly without quality loss (automatically chooses closest matching format) Mainly made this to easily convert textures from IW engine to Source, not tested on many types of DDS files Usage: drag and drop a .dds onto the exe Download (Last updated: 6th March, 2024)
file_to_nut
Converts binary file to Squirrel array Usage: drag and drop a file Download (Last updated: 22nd September, 2023)
sq
Standalone version of Squirrel language interpreter that supports bytecode disassembly of scripts Usage: sq -c myscript.nut > myscript.cnut Download (Last updated: 8th April, 2025)