Material proxies: Difference between revisions
| m (Inserted HeliBlade.) | m (categorise) | ||
| Line 1: | Line 1: | ||
| [[Category:List of Shader Parameters]] | |||
| == The basics == | == The basics == | ||
| Material proxies allow materials to change their rendering properties (color, alpha values, etc) using game state and scripted equations. Proxies are defined as a block of text, using key/value pairing, inside of the [[VMT]] description of a material. Proxies are available for all materials. | Material proxies allow materials to change their rendering properties (color, alpha values, etc) using game state and scripted equations. Proxies are defined as a block of text, using key/value pairing, inside of the [[VMT]] description of a material. Proxies are available for all materials. | ||
Revision as of 15:20, 13 May 2008
The basics
Material proxies allow materials to change their rendering properties (color, alpha values, etc) using game state and scripted equations. Proxies are defined as a block of text, using key/value pairing, inside of the VMT description of a material. Proxies are available for all materials.
A proxy is defined as in the following example:
"LightmappedGeneric"
{
	"$basetexture" "shadertest/LightmappedTexture"
	// Inside these braces are where all the proxies go
	"Proxies"
	{
		// This is a sine proxy
		"Sine"
		{
			// This is the data for the sine proxy
			// Notice there is no '$' on the proxy variables
			"resultVar"	"$alpha"
			"sineperiod"	8
			"sinemin"	0
			"sinemax"	1
		}
	}
}
The above block of text instructs the material to use the Sine material proxy to modify the alpha value of the material when rendered. The other entries define parameters for the proxy to use in its calculations. Here the sine wave has a sineperiod of 8 seconds and oscillates between a value of "0" and "1".
It is possible to define multiple proxies in one material within the Proxies section of that material's definition. If multiple proxies are defined, they are executed in a top to bottom order.
"Proxies" 
{ 
	// This is executed first
	"A"
	{
		. . .
	}
	// This is executed second
	"B"
	{
		. . .
	}
}
Variables
Like a standard programming language, the material proxies may declare temporary local variables to be used to store intermediate values for further use later in the proxy. Variables are declared outside of the Proxies block and have default values specified on their right-hand side.
"LightmappedGeneric"
{
	"$basetexture" "shadertest/LightmappedTexture"
	// A local variable for this material, defaulting to "0.5"
	"$myScale" 0.5
	"Proxies"
	{
		. . .
	}
}
There is no practical limit to the number of local variables declared. Local variables may be used to store results from proxies, or to pass data into proxies as parameters. They are often employed to chain mathematic function proxies (i.e. Add, Subtract, etc) together into longer equations for rendering values.
Common result variables
The following values are commonly used as $resultVar variables.
| $alpha | Fade value (0 = transparent, 1 = opaque) | 
| $color | Modulation color (R,G,B) (1,1,1) = white, (0,0,0) = black | 
| $envmapmaskscale | An amount to scale the environment map mask | 
| $frame | Frame number of an animated texture | 
| $envmaptint | Modulation color for the environment map | 
| $selfillumtint | Modulation color for the self-illumination | 
 Note:
Note:$alpha and $color values are clamped between 0 and 1. Note:Certain variables like
Note:Certain variables like $color and $baseTextureOffset can be accessed like an array. "$color[0]" would access the red component of the variable.Writing material proxy implementations
Although many generic proxies are included in the client already, it will sometimes be necessary to create a custom material proxy for your MOD. To do this, code will be required on the client-side. Material proxies are descended from the IMaterialProxy interface class. The proxy has three main functions to do its work in. The first is the Init() function, defined as:
bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); pMaterial Material we're acting on pKeyValues List of key-value pairs for this material
The Init() function is called when a material is first created in a session. This function allows you to setup internal state for the material proxy, usually consisting of obtaining references to material variables for later use.
void OnBind( void *pC_BaseEntity ); pC_BaseEntity Entity this material is being applied to (if any)
The OnBind() function is called every time Bind() is called on a material. This is where most of the material proxy's work is done.
Finally, the proxy must expose its interface so that the named reference to the proxy can be linked up to the class implementation. This is done via the EXPOSE_INTERFACE macro.
EXPOSE_INTERFACE( className, interfaceName, proxyName IMATERIAL_PROXY_INTERFACE_VERSION );
 Note:See
Note:See DummyProxy.cpp for an example of a simple material proxy.Proxy list
The following proxies are defined in the client DLL for use in any Source game.
| Proxy Name | Description | Variables | 
|---|---|---|
| Add | Adds two variables together. | srcVar1 
 srcVar2 
 resultVar 
 | 
| Multiply | Multiplies two variables together. | srcVar1 
 srcVar2 
 resultVar 
 | 
| Subtract | Subtracts the second variable from the first. | srcVar1 
 srcVar2 
 resultVar 
 | 
| Divide | Divides the first variable by the second. | srcVar1 
 srcVar2 
 resultVar 
 | 
| Equals | Copies a variable to the result variable. | srcVar1 
 resultVar 
 | 
| Abs | Computes the absolute value of a variable. | srcVar1 
 resultVar 
 | 
| Frac | Returns the fractional component of a number.  Note:If a vector type variable is provided, this function will return the fractional component of each member of the array. | srcVar1 
 | 
| Exponential | Computes ( A * e (srcVar1+B) ). | srcVar1 
 scale 
 offset 
 minVal 
 maxVal 
 resultVar 
 | 
| Clamp | Clamps a variable to a specified range of values. | srcVar1 
 min 
 max 
 resultVar 
 | 
| LessOrEqual | Returns different values based relation of supplied variables. | srcVar1 
 srcVar1 
 lessEqualVar 
 greaterVar 
 resultVar 
 | 
| Sine | Creates a sine wave. | sineperiod 
 sinemin 
 sinemax 
 timeoffset 
 resultVar 
 | 
| LinearRamp | Produces an ever increasing value. | rate 
 initialValue 
 resultVar 
 | 
| UniformNoise | Produces a noisy signal where each value is equally likely to occur | minVal 
 maxVal 
 resultVar 
 | 
| GaussianNoise | Produces a noisy signal where values are near the average. | mean 
 halfWidth 
 minVal 
 maxVal 
 resultVar 
 | 
| MatrixRotate | Creates a rotation matrix from the provided axis and angle. | axisVar 
 angle 
 resultVar 
 | 
| PlayerProximity | Stores the distance from the entity the material is on to the player into a variable.  Note:Does not work on world surfaces. | scale 
 resultVar 
 | 
| PlayerView | Stores the dot product of the view direction + the direction from the camera to the entity the material is on.  Note:Does not work on world surfaces. | scale 
 resultVar 
 | 
| PlayerSpeed | Stores the speed of the player into a variable. | scale 
 resultVar 
 | 
| PlayerPosition | Stores the player's position into a variable.  Note:Only works for vector variables like $baseTextureOffsetor$color. | scale 
 resultVar 
 | 
| EntitySpeed | Stores the entity's speed into a variable.  Note:Does not work on world surfaces. | scale 
 resultVar 
 | 
| TextureTransform | Generates a texture transform matrix. | centerVar 
 scaleVar 
 rotateVar 
 translateVar 
 resultVar 
 | 
| Empty | Used to comment out proxies. Surround a bunch of proxies with the empty proxy to cause those proxies to not operate. | |
| TextureScroll | Returns a transform matrix or vector that will translate a texture at a given angle at a given rate. | textureScrollVar 
 textureScrollRate 
 textureScrollAngle 
 | 
| ToggleTexture | Toggles a texture based on the frame number set by the attached entity.  Note:Must be attached to an entity. | toggleTextureVar 
 toggleTextureFrameNumVar 
 toggleShouldWrap 
 | 
| RandomEntity | A proxy that returns a random number associated with the entity the material is applied to. Can be helpful for making animated textures not all be in sync. | scale 
 resultVar 
 | 
| CurrentTime | Returns the current time as a float. | resultVar 
 | 
| PlayerHealth | Stores the player health (0-1) in a variable. | scale 
 resultVar 
 | 
| PlayerDamageTime | Stores the time since the player was last damaged, in a variable. | scale 
 resultVar 
 | 
| MaterialModify | Sets the base texture to a value held by the entity (used for entity controlled texture animations).  Note:Only works when attached to an entity. | No return value. | 
| WaterLOD | Coordinates water LOD values between the map's env_waterlodentity and the materials internal values. | 
 
  Note:must be set outside of proxy block. 
 
  Note:must be set outside of proxy block. No return value. | 
| BreakableSurface | Sets the base texture to a material name held by the entity (used for switching surface material on shatter)  Note:Must be attached to a func_breakablesurfaceentity. | No return value. | 
| ConveyorScroll | Returns the scroll parameters for a texture used as a conveyor.  Note:Must be attached to func_conveyorentity. | textureScrollVar 
  Note:must be a matrix or vector type variable (i.e. $baseTextureOffset). | 
| LampBeam | Modulates the material's alpha value based on angle between the beam's direction and the viewer's eye point. This is used to make the beams of volumetric light on lights fade as you look at them dead on.  Note:Must be attached to entity for angle use. | No return value. | 
| LampHalo | Modulates the material's alpha value based on angle between the beam's direction and the viewer's eye point. Like the LampBeam proxy, but used for the halo at the beam's base.  Note:Must be attached to entity for angle use. | No return value. | 
| AnimatedTexture | Increments frame variable | animatedtexturevar 
 animatedtextureframenumvar 
 animatedtextureframerate 
 | 
| Camo |  Note:Only used by material "Dev\dev_camo.vmt". | camopatterntexture camoboundingboxmin camoboundingboxmax surfaceprop | 
| HeliBlade | ||
| ParticleSphereProxy |  Note:Only used by material "particle\SmokeStack.vmt". particle_proxies.cpp. Valve remark: "FIXME:  Is this even needed any more?" | No known parameters. | 
| Shadow |  Note:Only used by material "Decals\rendershadow.vmt". | No known parameters. | 
| ShadowModel |  Note:Only used by material "Decals\rendermodelshadow.vmt". | No known parameters. |