Static Prop Combine

Static Prop Combine, or informally speaking "autocombine", is a feature in 's VBSP. It allows VBSP to merge together multiple static props into a single static prop, either automatically or with user-defined rules. This has the effect of both reducing the overall number of static props in the map, while also reducing the number of performance-eating draw calls. To enable it, run VBSP with -staticpropcombine.
== Operation ==
Static prop combine performs the following operations:
;Identify props to be combined.
: It either does this according to the rules specified in spcombinerules.txt or automatically based off of model use. 
: 
;Scan the QC source for each model it's combining, and extract certain info.
: This includes the names and locations of reference and physics meshes, the model's upaxis, the model's scale, and whether it's concave or not.
: It locates the QC by reading the qc_path keyvalue from the model, which is always considered relative to the game's content directory - even if it's an absolute path!
: 
;Use that info, plus a stub QC, to generate its own QC.
: $contentrootrelative, $appendsource, and $addconvexsrc are all new commands designed specifically for static prop combine, the latter two being ways to "add" geometry to a model with an arbitrary offset, rotation, and scale.
;Call studiomdl to compile this generated QC into a combined model.
: Combined models will always contain _autocombine_ in their name.
;BSPZIP all combined models into the BSP's pack.
: 
== Usage ==
=== VBSP Options ===
See VBSP.
=== Hammer Options ===
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)
In addition, you can manually disable static prop combine for individual props with the Disable Prop Combine keyvalue.
=== Prop Setup ===
In order to use a prop with static prop combine, you MUST have the source files for the prop! 
The QC for the prop must be compiled from the game's content folder. For , this should be SteamApps/common/content/csgo/. 
There are quite a few restrictions that are put in place. These include:
* Only the first $body is recognized.
* $model is not recognized.
* $appendsource and $addconvexsrc are not recognized.
* You can only use $upaxis Z or Y.
=== Rules Setup ===
Rules for static prop combine are defined in scripts/hammer/spcombinerules/spcombinerules.txt. It is a standard KeyValues-formatted text file. Each entry follows this format:
	"example_combined" //name of the combine group, used for the final model name in the level
	{
		// this is a stub qc that will be used to generate combined models
		"qc_template_path"	"scripts/hammer/spcombinerules/qc_templates/example.qc"
		
		// max models per cluster using these peers
		"cluster_limit" 8
		
		// don't cluster models greater than this far apart
		"distance_limit" 12
		// these are models that can combine with each other
		"peers"
		{
			"models/examples/example_A.mdl" ""
			"models/examples/example_B.mdl" ""
			"models/examples/example_C.mdl" ""
		}
	}
If you don't want to bother with creating rules, you can run -staticpropcombine_autocombine. However, this can cause issues if you do not have the source files for the models VBSP tries to combine.
== Stub QCs ==
Stub QCs are QCs or QCIs which contain a base template for the QCs which static prop combine generates. Generally, they should only include:
* $cdmaterials
* $surfaceprop
* $staticprop
* Any $texturegroups used by the models. 
=== Stub QC Example ===
$cdmaterials models\props\de_venice\venice_window_3
$staticprop
$surfaceprop "Plaster"
$texturegroup venice_window_3 {
	{ "venice_window_3" }
	{ "venice_window_3_lit" }
}
== See also ==
*VBSP