$bodygroup: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
(Edited page to include information about $lod usage.)
Line 1: Line 1:
{{otherlang2
{{otherlang2|ru=$bodygroup:ru}}
|ru=$bodygroup:ru
}}
'''$bodygroup''' is a [[QC command]] that defines a group of meshes that can be turned on or off. Server code can change their state.


{{note|Bodygroups cannot change [[skeleton]]s or [[collision model]]s.}}
'''$bodygroup''' is a [[QC command]] that defines a group of meshes that can be turned on or off, or changed entirely. Server code can change their state.
 
{{note|Body groups '''cannot''' change [[skeleton|skeletons]] or [[collision model|collision models]].}}


== Example ==
== Example ==
This body group allows a weapon to have iron sights, laser sights, or no sights at all:


<source lang=php>
<source lang=php>
$bodygroup sights
$bodygroup sights
{
{
studio "ironsights.smd"
studio ironsights
studio "laser_dot.smd"
studio laser_dot
blank
blank
}
}
</source>
</source>


This bodygroup allows a weapon to have iron sights, laser sights, or no sights at all.
This body group defines the entire chest region of the model, which spans multiple bones:


<source lang=php>
<source lang=php>
$bodygroup chest
$bodygroup chest
{
{
studio "chest_with_no_armor.smd"
studio chest_with_no_armor
studio "chest_with_light_armor.smd"
studio chest_with_light_armor
studio "chest_with_heavy_armor.smd"
studio chest_with_heavy_armor
studio "chest_with_super_armor.smd"
studio chest_with_super_armor
}
}
</source>
</source>


This bodygroup defines the entire chest region of the model, which probably spans multiple bones.
{{note|Since body group polygons never share vertices with the base mesh in Source models, there need not be seams between properly-made components.}}
 
== Bodygroups in Level of Detail Meshes ==


{{note|Since bodygroup polygons never share vertices with the base mesh in Source models, there need not be seams between properly-made components.}}
Using [[LOD|Level of Detail]] meshes - ''especially for high-poly geometry'' - is '''highly recommended'''. Body groups can be used in <code>[[$lod]]</code> strings in the same method as normal geometry meshes:
 
<source lang=php>
$lod 12
{
replacemodel chest_with_no_armor chest_with_no_armor_lod1
replacemodel chest_with_light_armor chest_with_light_armor_lod1
replacemodel chest_with_heavy_armor chest_with_heavy_armor_lod1
replacemodel chest_with_super_armor chest_with_super_armor_lod1
}
 
$lod 18
{
replacemodel chest_with_no_armor chest_with_no_armor_lod2
replacemodel chest_with_light_armor chest_with_light_armor_lod2
replacemodel chest_with_heavy_armor chest_with_heavy_armor_lod2
replacemodel chest_with_super_armor chest_with_super_armor_lod2
}
$shadowlod
{
replacemodel chest_with_no_armor chest_with_no_armor_lod2
replacemodel chest_with_light_armor chest_with_light_armor_lod2
replacemodel chest_with_heavy_armor chest_with_heavy_armor_lod2
replacemodel chest_with_super_armor chest_with_super_armor_lod2
}
</source>


== Programming ==
== Programming ==

Revision as of 03:11, 26 August 2019

Template:Otherlang2

$bodygroup is a QC command that defines a group of meshes that can be turned on or off, or changed entirely. Server code can change their state.

Note.pngNote:Body groups cannot change skeletons or collision models.

Example

This body group allows a weapon to have iron sights, laser sights, or no sights at all:

$bodygroup sights
{
	studio ironsights
	studio laser_dot
	blank
}

This body group defines the entire chest region of the model, which spans multiple bones:

$bodygroup chest
{
	studio chest_with_no_armor
	studio chest_with_light_armor
	studio chest_with_heavy_armor
	studio chest_with_super_armor
}
Note.pngNote:Since body group polygons never share vertices with the base mesh in Source models, there need not be seams between properly-made components.

Bodygroups in Level of Detail Meshes

Using Level of Detail meshes - especially for high-poly geometry - is highly recommended. Body groups can be used in $lod strings in the same method as normal geometry meshes:

$lod 12
{
	replacemodel chest_with_no_armor chest_with_no_armor_lod1
	replacemodel chest_with_light_armor chest_with_light_armor_lod1
	replacemodel chest_with_heavy_armor chest_with_heavy_armor_lod1
	replacemodel chest_with_super_armor chest_with_super_armor_lod1
}

$lod 18
{
	replacemodel chest_with_no_armor chest_with_no_armor_lod2
	replacemodel chest_with_light_armor chest_with_light_armor_lod2
	replacemodel chest_with_heavy_armor chest_with_heavy_armor_lod2
	replacemodel chest_with_super_armor chest_with_super_armor_lod2
}
$shadowlod
{
	replacemodel chest_with_no_armor chest_with_no_armor_lod2
	replacemodel chest_with_light_armor chest_with_light_armor_lod2
	replacemodel chest_with_heavy_armor chest_with_heavy_armor_lod2
	replacemodel chest_with_super_armor chest_with_super_armor_lod2
}

Programming

To change a body group's state:

static int BodyGroup_Sights = FindBodygroupByName("sights"); // calculate this value once
SetBodygroup( BodyGroup_Sights , 1 ); // laser dot

By default, CBaseAnimating supports 4,294,967,296 combinations (32 bits), and CBaseViewModel supports 256 (8 bits). You can raise either of these by editing the relevant SendProp for m_nBody.

To calculate how many combinations you need, multiply the size of all your bodygroups together. The examples on this page total 3 * 4 = 12...but add two more groups the same size and you're up at 144. The figure grows exponentially.