Static Prop Combine in Counter-Strike: Global Offensive
A step by step guide thanks to @untor
What is Static Prop Combine?
Static prop combine, or informally speaking "autocombine", is a new feature in CS:GO's VBSP.
It allows VBSP to merge together multiple static props into a single static prop, either automatically or with user-defined rules.
What is static prop combine good for? Static prop combine is another feature to optimize your maps. Most people might think that "the less geometry rendered the better". So if you use small props, it's easier to hide what is not visible.
That's not wrong. But there is a problem:
In Source, there is one draw call per model per material. And these draw calls are very performance-hungry.
That's where static prop combine comes into play:
By combining models sharing the same materials, less draw calls are performed, which greatly helps optimization.
Valve has stated that Nuke runs 40% faster after they implemented static prop combine.
How do I use static prop combine? The static prop combine feature was added in 2016 with the release of the reworked de_nuke. But since then it was not (?) used by community mappers, there are no (?) guides on the Internet except this documentation. @untor helped me to make static prop combine feature do its job. So we decided that it's time to publish a step by step guide how to use static prop combine.
We presuppose that you are already familiar with the creation of props
0. Backup your CS:GO folder (optional) We do not take responsibility for any damage done to your files. So it's time to backup your game files now if you have not already. In general we recommend to duplicate your "Counter-Strike Global Offensive" folder, so you can use a separate installation of CS:GO for mapping while keeping the other one clean for playing.
1. Source files You must have the source files of the models you want to be combined. Usually 3 files for each prop:
reference mesh (supported formats are *.smd, *.dmx and *.fbx)
So if you want to combine props made by you, you should already have these files.
If you want to combine props made by Valve, you will need to decompile them first. And then change the names - otherwise, the version of the prop that is packed in the VPK would overwrite your version.
In this guide we will use two different pipe props:
You can download the example files here (contains the *.qc and *.smd files) :
Browse to "...\Steam\steamapps\common\content\csgo\"
Create a folder "models". In our example we have another subfolder "example". Save the model source files there:
These are our QCs:
Restrictions for the *.qc:
Only the first $body is recognized.
$model is not recognized.
$appendsource and $addconvexsrc are not recognized.
You can only use $upaxis Z or Y.
2. Compile your props Your models have to be compiled from this directory now:
Open your model compile tool (I use Crowbar) Then browse to "...\Steam\steamapps\common\content\csgo\models\example\" and compile the QCs.
The compiled model files should be in "...\Steam\steamapps\common\Counter-Strike Global Offensive\csgo\models\props\example\" now.
3. spcombinerules.txt Browse to "...\Steam\steamapps\common\Counter-Strike Global Offensive\csgo\scripts\hammer\spcombinerules\"
There you will find "spcombinerules.txt". In this file the combine rules for Valves props are defined. It is a standard KeyValues-formatted text file. Each entry follows the format below.
Rename it to "spcombinerules_valve.txt" (or whatever you want) and create a new text file "spcombinerules.txt".
Then copy and paste the following into "spcombinerules.txt" and save it.
4. Stub QCs Stub QCs are QCs which contain a base template for the QCs which static prop combine generates. Generally, they should only include:
Any $texturegroups used by the models.
Browse to "...\Steam\steamapps\common\Counter-Strike Global Offensive\csgo\scripts\hammer\spcombinerules\qc_templates\".
In our example we create a new subfolder "example", open it and then create a text file and rename it to "pipe_combine.qc":
Copy and paste the following into "pipe_combine.qc" and save it:
5. Compile your map Add some of our example props to your map in Hammer and compile the map.
In our example we use the following compile parameters for VBSP
Compile parameters (full list here) :
-StaticPropCombine: Merges static props together according to the rules defined in scripts/hammer/spcombinerules/spcombinerules.txt. This lowers the number of draw calls, increasing performance. It can also be used to lower the number of static props present in a map.
-StaticPropCombine_AutoCombine: Automatically generate static prop combine rules for props that VBSP deems should be combined. Note: This does not write to spcombinerules.txt.
-StaticPropCombine_ConsiderVis: Instead of using the distance limit, combine all props in the group that share visclusters.
-StaticPropCombine_SuggestRules: Lists models sharing the same material that should be added to spcombinerules.txt.
-StaticPropCombine_MinInstances <int>: Set the minimum number of props in a combine group required to create a combined prop. Tip:Valve had this set to 3 for the new Dust 2.
-StaticPropCombine_PrintCombineRules: Confirm: Prints the combine rules?
-StaticPropCombine_ColorInstances: Instances of combined props get colored.
-KeepSources: Don't delete the autogenerated QCs and unpacked model files after finishing.
-CombineIgnore_FastReflection: Combine props, even if they have differing Render in Fast Reflections settings.
-CombineIgnore_Normals: Combine props, even if they have differing Ignore Normals settings.
-CombineIgnore_NoShadow: Combine props, even if they have differing Disable Shadows settings.
-CombineIgnore_NoVertexLighting: Combine props, even if they have differing Disable Vertex lighting settings.
-CombineIgnore_NoFlashlight: Combine props, even if they have differing Disable flashlight settings.
-CombineIgnore_NoSelfShadowing: Combine props, even if they have differing Disable Self-Shadowing settings.
-CombineIgnore_DisableShadowDepth: Combine props, even if they have differing Disable ShadowDepth settings.
6. Success? The combined props look exactly like the single props. So how can you be sure that the static prop combine process was successful?
- Once the map is compiled, the combined props will be packed into your *.bsp automatically.
- If you add -keepsources to the compile parameters, you can also find the combined props in "...\Steam\steamapps\common\Counter-Strike Global Offensive\csgo\models\props\autocombine\*name of your map*\"
and their QCs in "...\Steam\steamapps\common\content\csgo\models\props\autocombine\*name of your map*\".
- If you add -StaticPropCombine_ColorInstances to the compile parameters, instances of combined props are colored in CS:GO.
7. Additional notes
- You can manually disable static prop combine for individual props with the "Disable Prop Combine" keyvalue.
- Prop scaling (Uniform Scale Override) is not supported yet (?)
- If the original props don't have a collision model, you will have to set collisions to "Not Solid" in the properties. Otherwise the combined prop will be solid (automatically generated collision mesh; causes problems).
- If the props differ in specific keyvalues, in most cases the default (e.g. Alpha) or the higher value will be used (e.g. fade distances)
- Props that differ in the below keyvalues will NOT be combined, unless manually overridden with the appropriate VBSP option:
Render in Fast Reflections (-combineignore_fastreflection)
Ignore Normals (-combineignore_normals)
Disable Shadows (-combineignore_noshadows)
Disable Vertex lighting (-combineignore_novertexlighting)
Disable Flashlight (-combineignore_noflashlight)
Disable Self-Shadowing (-combineignore_noselfshadowing)
Disable ShadowDepth (-combineignore_disableshadowdepth)
- Props that differ in the below keyvalues will NOT be combined:
some fps tests with an actual map!
which gives better results: " -StaticPropCombine_ConsiderVis" or prop combining based on distances?
Is there a console command to display the number of performed draw calls/props?
______________________________________________________________________ Sources: https://developer.valvesoftware.com/wiki/Static_Prop_Combine https://developer.valvesoftware.com/wiki/QC https://developer.valvesoftware.com/wiki/VBSP