$seamless scale

From Valve Developer Community
Revision as of 04:06, 22 June 2016 by Fayti1703 (talk | contribs)
Jump to navigation Jump to search

$seamless_scale is a material command supported by LightmappedGeneric and WorldVertexTransition in the Orange Box. It was created to sidestep texture stretching issues on displacement surfaces.

Basic syntax

$seamless_scale <float>
LightMappedGeneric
{
	$basetexture Example\Example01
	$surfaceprop concrete
	$seamless_scale 0.005
}

Caveats

  • This is not a total solution - there are still some situations where stretching will occur (such as sudden 90° outcroppings). It's handled as best it can be, though.
  • You can no longer scale the material with the Hammer Face Edit Dialog. The parameter's value must instead changed in the material itself.
  • Hammer's 3D view renders the material itself correctly, but others will stop working.
  • Standard normal mapping isn't supported, only its self-shadowing cousin.
  • $detail textures are unsupported.
    Todo: Investigate $seamless_detail.

History

According to Episode Two's developer commentary, this feature was added in response to difficulties experienced with the creation of the antlion caves section. The complicated topography of the areas exaggerated a previously bearable material-stretching effect.

This effect is a result of how Source usually handles displacements: a UV map is locked to the vertices of a displacement surface, and when a vertex on it is translated the polygons linking it to its neighbours stretch or contract accordingly, carrying the texture with them. This can lead to polygons with squashed textures sitting beside others with stretched and blurred ones; an unpleasant effect.

$seamless_scale separates the material's coordinate system from the vertices of the displacement, allowing it to maintain a regular scale across an entire surface without any designer effort.

Matching 0.25 scale

Assuming a texture size of 1024x1024, setting $seamless_scale to 0.001953125 will match the 0.25 scale in hammer. This was achieved by dividing (1 / (texture size * desired scale)). You can achieve different scales by changing the numerator or the divisor. An easy way to find the scale you want is to multiply the texture size by the desired scale, then divide 1 by the result.

For example, if texture size was 1024x1024:

  • Scale = 1 / (1024 * scale)
  • 0.25 = 0.001953125 (1 / 256)
  • 0.50 = 0.0009765625 (1 / 512)
  • 0.75 = 0.00065104166 (1 / 768)
  • 1.00 = 0.00048828125 (1 / 1024)
  • 1.25 = 0.000390625 (1 / 1280)

Additionally, it appears textures are rotated -90 degrees.