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
(New logo by Yanzl)
I'm sure that by now most of us have our sleeves rolled up and are ready to tackle yet another year, but before we move forward let's take a moment to look back at what 2017 meant for our community. It was a time of immense growth for both professionals and amateurs alike. A time when everyone seemed to have surpassed their former selves. And without slowing down, some have even managed to land their first job in the industry. I don't know what this new year holds, what challenges to overcome will arise, but I know for certain that I'm excited to see everyone become even greater!
2017: Mapcore's Year in Review
Overwatch - Oasis
by Phillip K, Bram Eulaers, Helder Pinto and others
Dishonored 2: Death of the Outsider - Curator level
by electrosheep, kikette and others
Payday 2 - Brooklyn Bank level
by General Vivi
Sniper Elite 4 - Regilino Viaduct
by Beck Shaw and others
Counter-Strike: Global Offensive - Offtime
Team Fortress 2 - Shoreleave
Art pass, props and sound by Freyja
Wolfenstein II: The New Colossus - Farmhouse
Modeled, textured and composed by BJA
Half-Life 2: Downfall
Counter-Strike: Global Offensive - Studio
by ZelZStorm, TanookiSuit3 and Hollandje
Portal 2 - Refraction
Counter Strike: Global Offensive - Breach
by Yanzl and Puddy
Counter-Strike: Global Offensive - Berth
Counter-Strike: Global Offensive - Kaizen
by Andre Valera and Jakuza
Counter-Strike: Global Offensive - Asylum
Half-Life 2: Episode 2 - FusionVille: The Shadow over Ravensmouth
Unreal Engine 4 scene
by Dario Pinto
Counter-Strike: Global Offensive - Grind
by The Horse Strangler, `RZL and MaanMan
Counter-Strike: Global Offensive - Aurelia remake
Counter-Strike: Global Offensive - Tangerine
by Harry Poster
Counter-Strike: Global Offensive - Abbey
by Lizard and TheWhaleMan
Counter-Strike: Global Offensive - Apollo
by Vaya, CrTech, Vorontsov, JSadones
Counter-Strike: Global Offensive - Sirius
by El Exodus
Unreal Engine 4 scene
Counter-Strike: Global Offensive - Subzero
This overview proves how talented our community is. We share, give feedback and learn from one another. Lots of our members have made it into the game industry and continue to make their mark working for high-profile studios. Our articles were shared around the world and our collaborative CS:GO contest was a huge success. We can only conclude that 2015 was again a stellar year for the Core and we are looking forward to an even better 2016!
2015: Mapcore's Year in Review
It was a banner year. Here’s a taste of what our community created:
Temple of Utu by Minos
Corridor by JonnyPhive
Rails by Deh0lise
Cold Fusion by Rusk
Half-Life 2 Scene by Psy
Resort by 'RZL and Yanzl
Zoo by Squad and Yanzl
Santorini by FMPONE and Dimsane
Corridor by RaVaGe
Seat by penE
Half-Life 2 UE4 Corridor by PogoP
Tulip by catfood
Volcano by 2d-chris
Chilly UE4 Scene by TheOnlyDoubleF
High-quality original content:
Contest finalists have been chosen!
Before announcing our finalists, we want to thank everyone for participating and giving your feedback: with over 150 entries, this event has thus far exceeded expectations in every way.
We strongly considered adding an “honorable mentions” addendum to this announcement, but realized there were simply too many maps which came extremely close to becoming finalists, lacking only one of our “big three” judging criteria components.
Now, without futher ado…
(in no particular order)
By Andre Valera
By Ornate Baboon
These exciting levels exhibit competitive potential, excellent visual presentation, AND a satisfying level of polish, making them truly strong representatives for our talented community. As finalists competing for the grand prize, the authors of these levels will be able to update their work based on your feedback, including fine-tuning their competitive layouts using public playtesting over on Reddit. Let's support them on their journey!
To check out the excellent prizes awaiting our finalists (including money prizes + official Valve merchandise), click here.
...but who will be the Grand Prize Winner? Find out September 30th.
P.S. – To all our wonderful participants: don't despair. Level design is an art to be pursued for its own sake, and brilliant work should always be celebrated and studied. Additionally, Valve has consistently supported CS:GO community mapping, and Valve Operations remain a lucrative and thrilling opportunity for community mappers such as yourself. Valve’s criteria for Operations can be found here.