Multiple Skins for a Single Model

From Valve Developer Community
Revision as of 06:49, 13 March 2009 by Sortie (talk | contribs)
Jump to: navigation, search
1 model, 5 skins

In some cases it can be helpful for a mapper if he can choose between different skins for the model. It's easy to add more variety to your custom models with multiple skins without creating a totally new model.

The advantage of having several skins in one model instead of compiling several new models are:

  • easier to find because the model overview isn't cluttered
  • less disc space and ingame model load
  • faster than compiling a new model for each skin
  • the skins can be changed dynamicly while ingame

Basic example with one skin replaced

The example here is a lamp that is either on or off, a different skin for each situation will make the model look a lot better.

$modelname mymodelfolder/mylamp.mdl
$cdmaterials modeltextures/mytexturefolder
$surfaceprop metal
$body studio "mylamp.smd"
$texturegroup skinfamilies
	{ "lampon"  }
	{ "lampoff" }
$sequence idle "mylamp.smd" fps 1
$collisionmodel "mylamp_phys.smd"
Two skins are used to display the lamp either on or off.
Note.png Note: $texturegroup needs to follow $body.

You define your different textures between $texturegroup skinfamilies { and }. The name of the first texture (in this case "lampon") needs to be similar to the texturename you used in your model (If you are not sure, open the .smd with a text editor, in the triangles block you'll find the name). Otherwise studiomdl.exe doesn't know which one to replace.

In the following lines you can define the new textures between { and } that will be rendered instead of the original one.

Creating Multiple Skin Combinations

In some circumstances you may choose to divide your model texture into more than one material. This allows for multiple combinations that otherwise would require a larger amount of individual models. If, for example, you wanted to create a light that had two housing styles but three bulb colors, you could create these combinations under the $texturegroup.

$texturegroup skinfamilies
	{ "lampnew"   , "lightbulbred"   }
	{ "lampnew"   , "lightbulbgreen" }
	{ "lampnew"   , "lightbulbblue"  }
	{ "lamprusty" , "lightbulbred"   }
	{ "lamprusty" , "lightbulbgreen" }
	{ "lamprusty" , "lightbulbblue"  }

Once again you must ensure that your model uses the material names in the first line.

As you can see, creating a matrix of skin combinations has distinct advantages, however, using multiple materials on the same model creates a significant performance hit, so this technique should be used sparingly!

General definition

Here's a general definition for reference if you have to use several skins:

$texturegroup skinfamilies
	{ "original1"  , "original2"  , ... , "originalX"  }
	{ "replace1_1" , "replace1_2" , ... , "replace1_X" }
	{ ...          , ...          , ... , ...          }
	{ "replaceX_1" , "replaceX_2" , ... , "replaceX_X" }

Further annotations

  • Translucent models will only cast the shadows of the first skin

With the use of $shadowlod you should be able to address the problem