menu_bookDocumentation

ModelRenderer: Body Groups, Material Override, Material Groups, Shadow Modes, and LOD Override

calendar_today May 4, 2026 schedule ~1 min read person patrickjr verified 50

ModelRenderer: Body Groups, Material Override, Shadow Modes, and LOD

ModelRenderer renders a static (non-skinned) model in the world. It creates a SceneObject in the SceneWorld.

Basic Usage

CSHARP
var renderer = AddComponent<ModelRenderer>();
renderer.Model = Model.Load( "models/my_model.vmdl" );
renderer.Tint = Color.Red;
renderer.RenderType = ModelRenderer.ShadowRenderType.On;

Body Groups

Body groups control which mesh parts are visible:

CSHARP
// Set by name and choice name
renderer.SetBodyGroup( "hat", "baseball_cap" );

// Set by name and choice index
renderer.SetBodyGroup( "hat", 1 );

// Set by part index and choice index
renderer.SetBodyGroup( 0, 1 );

// Get current value
int current = renderer.GetBodyGroup( "hat" );

// Set raw bitmask (advanced)
renderer.BodyGroups = 0b1010;

Material Override

CSHARP
// Override all materials with a single material
renderer.MaterialOverride = Material.Load( "materials/my_material.vmat" );

// Clear override (restore original materials)
renderer.MaterialOverride = null;

Material Groups

Material groups are predefined sets of materials on the model:

CSHARP
renderer.MaterialGroup = "team_red";  // switch to a named material group

Note: MaterialGroup and MaterialOverride are mutually exclusive — if MaterialOverride is set, MaterialGroup is ignored.

Shadow Render Types

CSHARP
renderer.RenderType = ModelRenderer.ShadowRenderType.On;           // render + cast shadows (default)
renderer.RenderType = ModelRenderer.ShadowRenderType.Off;          // render, no shadows
renderer.RenderType = ModelRenderer.ShadowRenderType.ShadowsOnly;  // invisible but casts shadows
ShadowsOnly sets SceneObjectFlags.ExcludeGameLayer — the object is excluded from the main render pass but included in shadow passes.

LOD Override

CSHARP
renderer.LodOverride = 0;   // force highest LOD
renderer.LodOverride = 2;   // force LOD 2
renderer.LodOverride = null; // automatic LOD selection

Tags on SceneObject

The SceneObject's tags are automatically synced from the GameObject's tags. This is how trace tag filters work — Scene.Trace.WithTag("solid") checks the SceneObject's tags.

Was this helpful?