Jump to content
Sign in to follow this  

Static Prop Combine in CS:GO


Radix

spc_header.png.849b454905c458e59dac78c81f6a4201.png

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.

prop_combine.png.9320d8a89bb30d8d286a9f61daa498e5.png

 

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:

  • *.qc
  • reference mesh (supported formats are *.smd, *.dmx and *.fbx)
  • physics mesh

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:

single_props.png.f7995a2573a5693fda9b5ca837f72dc7.png

You can download the example files here (contains the *.qc and *.smd files) :

example.zip

 

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:

 

source_files.png.75852e01893bfa32660049205b1162f2.png

These are our QCs:

pipe_straight.qc

Quote

$modelname         "props\example\pipe_straight.mdl"
$staticprop
$body "pipe_straight"    "pipe_straight_reference.smd"
$surfaceprop         "metal"
$cdmaterials         "models\props\de_nuke\hr_nuke\metal_pipe_001"
$collisionmodel     "pipe_straight_physics.smd" { $concave }
$sequence "idle"    "pipe_straight_reference.smd"

pipe_curved.qc

Quote

$modelname         "props\example\pipe_curved.mdl"
$staticprop
$body "pipe_curved"    "pipe_curved_reference.smd"
$surfaceprop         "metal"
$cdmaterials         "models\props\de_nuke\hr_nuke\metal_pipe_001"
$collisionmodel     "pipe_curved_physics.smd" { $concave }    
$sequence "idle"    "pipe_curved_reference.smd"


Notes:
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\"

 

spcombinerules.png.2bbf124abc6857afa2057ab6e3770041.png
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.

Quote

"combine rules"
{
    "pipe_combine"
    {
        // this is a stub qc that will be used to generate combined models
        "qc_template_path"    "scripts/hammer/spcombinerules/qc_templates/example/pipe_combine.qc"
        
        // max models per cluster using these peers
        "cluster_limit" 24
        
        // don't cluster models greater than this far apart
        "distance_limit" 500

        // these are models that can combine with each other
        "peers"
        {
            "models/props/example/pipe_straight.mdl" ""
            "models/props/example/pipe_curved.mdl" ""
        }
    }
}

 


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:

  • $staticprop
  • $surfaceprop
  • $cdmaterials
  • 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":


stub_qc.png.4d07aa575196d1414e4a63e7bfa8b42f.png

Copy and paste the following into "pipe_combine.qc" and save it:

Quote

$staticprop
$surfaceprop     "metal"

$cdmaterials    "models\props\de_nuke\hr_nuke\metal_pipe_001\"
$texturegroup     metal_pipe
{
        { "metal_pipe_001" }
}

 

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

Quote

-staticpropcombine -staticpropcombine_mininstances 3 -keepsources -game $gamedir $path\$file

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_PrintCombineRules to the compile parameters, instances of combined props are colored in CS:GO.

 

7. Additional notes

Hammer:
keyvalues.png.d790dd8ff542fda7acf63d3ab445c5cb.png


- 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 overriden 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:

  • Skin
  • Color
  • Disable Flashlight

 

TO DO

  • 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

 

Sign in to follow this  


User Feedback

Recommended Comments

There are no comments to display.



Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...