Difference between revisions of "ShaderTerrain"
From SimsWiki
(EP3-OFB) |
(EP4-PETS) |
||
| Line 1: | Line 1: | ||
<pre> | <pre> | ||
| − | + | EP4-Pets | |
0xCD7FE87A | 0xCD7FE87A | ||
0x1C0532FA | 0x1C0532FA | ||
| Line 26: | Line 26: | ||
setf paintTextureScale 20 | setf paintTextureScale 20 | ||
setf paintDetailTextureScale 4.0 | setf paintDetailTextureScale 4.0 | ||
| + | setb hasCutout false | ||
#============================================================================== | #============================================================================== | ||
| − | define | + | define TerrainCanvasShaderShaderVS_PS() |
| − | + | pass | |
| − | + | fillmode $stdMatFillMode | |
| − | + | depthTest true -enableDepthWrite true | |
| − | + | ||
| − | + | if ($hasCutout) | |
| − | + | depthTestFunction acceptIfEqual | |
| − | + | else | |
| − | + | depthTestFunction acceptIfLessOrEqual | |
| − | + | endif | |
| − | + | ||
| − | + | shaderProgram -target vertexProgram -method compile -version 1_1 | |
| − | + | bindConstants 0 -bindingID geomToClip -constantCount 4 | |
| − | + | bindConstants 4 -bindingID immediateData -data (1/$canvasBaseTextureScale, 1/$canvasDetailTextureScale, 0, 0) | |
| − | + | ||
| − | + | shaderSource | |
| − | + | float4x4 clipSpaceMatrix : register(c0); | |
| − | + | float4 textureConstants : register(c4); | |
| − | + | ||
| − | + | struct InputVertex | |
| − | + | { | |
| − | + | float3 position: POSITION0; | |
| − | + | float2 texcoord : TEXCOORD0; | |
| − | + | }; | |
| − | + | ||
| − | end | + | struct OutputVertex |
| − | + | { | |
| − | + | float4 clipPosition : POSITION; | |
| − | + | float2 txBase : TEXCOORD0; | |
| − | + | float2 txDetail: TEXCOORD1; | |
| − | + | }; | |
| − | + | ||
| − | + | OutputVertex VertexMain( InputVertex i) | |
| − | + | { | |
| − | end | + | OutputVertex o; |
| + | o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix); | ||
| + | o.txBase = i.texcoord * textureConstants.x; | ||
| + | o.txDetail = i.texcoord * textureConstants.y; | ||
| + | return o; | ||
| + | } | ||
| + | endShaderSource | ||
| + | end # end shader program | ||
| + | |||
| + | |||
| + | shaderProgram -target pixelProgram -method compile -version 1_1 | ||
| + | shaderSource | ||
| + | sampler base; | ||
| + | sampler detail; | ||
| + | struct cInputPixel | ||
| + | { | ||
| + | float2 tcBase : TEXCOORD0; | ||
| + | float2 tcDetail : TEXCOORD1; | ||
| + | }; | ||
| + | |||
| + | float4 PixelMain(cInputPixel pi) : COLOR | ||
| + | { | ||
| + | float4 baseColor = tex2D(base, pi.tcBase); | ||
| + | float4 detailColor = tex2D(detail, pi.tcDetail); | ||
| + | float4 result = (detailColor.a * detailColor) + ((1 - detailColor.a) * baseColor); | ||
| + | return result; | ||
| + | } | ||
| + | endShaderSource | ||
| + | end # end shader program | ||
| + | |||
| + | sampler base | ||
| + | texture "${texture}" | ||
| + | textureAddressing tile tile | ||
| + | end | ||
| + | |||
| + | sampler detail | ||
| + | texture "${texture}_detail" | ||
| + | textureAddressing tile tile | ||
| + | end | ||
end | end | ||
enddef | enddef | ||
| + | define TerrainCanvasShaderShaderFF() | ||
| + | pass -fixedFunction | ||
| + | fillmode $stdMatFillMode | ||
| + | |||
| + | depthTest true -enableDepthWrite true | ||
| + | |||
| + | if ($hasCutout) | ||
| + | depthTestFunction acceptIfEqual | ||
| + | else | ||
| + | depthTestFunction acceptIfLessOrEqual | ||
| + | endif | ||
| + | |||
| + | stage | ||
| + | texture "${texture}" | ||
| + | textureAddressing tile tile | ||
| + | ffTextureMatrix -scalev ($canvasBaseTextureScale, $canvasBaseTextureScale) -invert | ||
| + | ffTextureCoordsSource 0 | ||
| + | textureBlend select(texture) select(texture) | ||
| + | end | ||
| + | stage | ||
| + | texture "${texture}_detail" | ||
| + | textureAddressing tile tile | ||
| + | ffTextureMatrix -scalev ($canvasDetailTextureScale, $canvasDetailTextureScale) -invert | ||
| + | ffTextureCoordsSource 0 | ||
| + | textureBlend lerpTextureAlpha(texture outRegister) select(outRegister) | ||
| + | end | ||
| + | end | ||
| + | enddef | ||
define TerrainCanvasShader() | define TerrainCanvasShader() | ||
material | material | ||
| − | + | shader -layer (($terrainMatLayer - 3) * 8) | |
| − | create | + | vertexFormatPred position 0 true |
| − | + | vertexFormatPred normal 0 true | |
| − | + | vertexFormatPred texcoord 0 true | |
| + | viewerRenderTypePred viewerRenderType | ||
| + | |||
| + | create DetermineHardwareSupport() | ||
| + | if (viewerRenderType = $kRenderTypeShadowMap) | ||
| + | create ShadowMapVS_PS() | ||
| + | else | ||
| + | if ($useHWShader1Path or $useHWShader2Path) | ||
| + | create TerrainCanvasShaderShaderVS_PS() | ||
| + | else | ||
| + | create TerrainCanvasShaderShaderFF() | ||
| + | endif | ||
| + | endif | ||
| + | end | ||
| + | |||
shader | shader | ||
end | end | ||
end | end | ||
enddef | enddef | ||
| − | |||
| − | |||
#============================================================================== | #============================================================================== | ||
| + | |||
| + | define TerrainPaintShaderVS_PS() | ||
| + | shader -layer (($terrainMatLayer - 2) * 8) | ||
| + | vertexFormatPred position 0 true | ||
| + | vertexFormatPred texcoord 0 true | ||
| + | pass | ||
| + | fillmode $stdMatFillMode | ||
| + | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) | ||
| + | |||
| + | alphaTest true 10 | ||
| + | alphaTestFunction acceptIfGreater | ||
| + | |||
| + | depthTest true -enableDepthWrite false | ||
| + | if (viewerRenderType = $kRenderTypeImposter) | ||
| + | depthTestFunction acceptIfLessOrEqual | ||
| + | else | ||
| + | depthTestFunction acceptIfEqual | ||
| + | endif | ||
| + | |||
| + | shaderProgram -target vertexProgram -method compile -version 1_1 | ||
| + | bindConstants 0 -bindingID geomToClip -constantCount 4 | ||
| + | bindConstants 4 -bindingID immediateData -data (1/$canvasBaseTextureScale, 1/$canvasDetailTextureScale, $alphaMapScaleU, $alphaMapScaleV) | ||
| + | |||
| + | shaderSource | ||
| + | float4x4 clipSpaceMatrix : register(c0); | ||
| + | float4 textureConstants : register(c4); | ||
| + | |||
| + | struct InputVertex | ||
| + | { | ||
| + | float3 position: POSITION0; | ||
| + | float2 texcoord : TEXCOORD0; | ||
| + | }; | ||
| + | |||
| + | struct OutputVertex | ||
| + | { | ||
| + | float4 clipPosition : POSITION; | ||
| + | float2 txBase : TEXCOORD0; | ||
| + | float2 txDetail: TEXCOORD1; | ||
| + | float2 txAlpha : TEXCOORD2; | ||
| + | }; | ||
| + | |||
| + | OutputVertex VertexMain( InputVertex i) | ||
| + | { | ||
| + | OutputVertex o; | ||
| + | o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix); | ||
| + | o.txBase = i.texcoord * textureConstants.x; | ||
| + | o.txDetail = i.texcoord * textureConstants.y; | ||
| + | o.txAlpha = i.texcoord.xy * textureConstants.zw; | ||
| + | return o; | ||
| + | } | ||
| + | endShaderSource | ||
| + | end # end shader program | ||
| + | |||
| + | |||
| + | shaderProgram -target pixelProgram -method compile -version 1_1 | ||
| + | shaderSource | ||
| + | sampler base; | ||
| + | sampler detail; | ||
| + | sampler alphaMap; | ||
| + | struct cInputPixel | ||
| + | { | ||
| + | float2 tcBase : TEXCOORD0; | ||
| + | float2 tcDetail : TEXCOORD1; | ||
| + | float2 tcAlpha : TEXCOORD2; | ||
| + | }; | ||
| + | |||
| + | float4 PixelMain(cInputPixel pi) : COLOR | ||
| + | { | ||
| + | float4 baseColor = tex2D(base, pi.tcBase); | ||
| + | float4 detailColor = tex2D(detail, pi.tcDetail); | ||
| + | float4 alphaColor = tex2D(alphaMap, pi.tcAlpha); | ||
| + | float4 result = (detailColor.a * detailColor) + ((1 - detailColor.a) * baseColor); | ||
| + | result.a = alphaColor.a; | ||
| + | return result; | ||
| + | } | ||
| + | endShaderSource | ||
| + | end # end shader program | ||
| + | |||
| + | sampler base | ||
| + | texture $paintTexture | ||
| + | textureAddressing tile tile | ||
| + | end | ||
| + | |||
| + | sampler detail | ||
| + | texture "${paintTexture}_detail" | ||
| + | textureAddressing tile tile | ||
| + | end | ||
| + | |||
| + | sampler alphaMap | ||
| + | texture $alphaMap | ||
| + | textureAddressing clamp clamp | ||
| + | end | ||
| + | end | ||
| + | end | ||
| + | enddef | ||
define TerrainPaintShader(addDetail) | define TerrainPaintShader(addDetail) | ||
shader -layer (($terrainMatLayer - 2) * 8) | shader -layer (($terrainMatLayer - 2) * 8) | ||
vertexFormatPred position 0 true | vertexFormatPred position 0 true | ||
| − | |||
vertexFormatPred texcoord 0 true | vertexFormatPred texcoord 0 true | ||
| − | |||
| − | |||
| − | |||
| − | pass -fixedFunction | + | pass -fixedFunction |
| − | + | ||
fillmode $stdMatFillMode | fillmode $stdMatFillMode | ||
| Line 101: | Line 270: | ||
alphaTestFunction acceptIfGreater | alphaTestFunction acceptIfGreater | ||
| − | if ( | + | depthTest true -enableDepthWrite false |
| + | depthTestFunction acceptIfEqual | ||
| + | |||
| + | if (&addDetail) | ||
stage | stage | ||
| − | texture $ | + | texture $paintTexture |
| − | textureBlend | + | textureAddressing tile tile |
| + | ffTextureMatrix -scalev ($paintTextureScale, $paintTextureScale) -invert | ||
| + | textureTransformType vector2 | ||
| + | ffTextureCoordsSource 0 | ||
| + | textureBlend select(texture) select(outRegister) | ||
| + | end | ||
| + | stage | ||
| + | texture "${paintTexture}_detail" | ||
| + | textureAddressing tile tile | ||
| + | ffTextureMatrix -scalev ($paintDetailTextureScale, $paintDetailTextureScale) -invert | ||
| + | textureTransformType vector2 | ||
| + | ffTextureCoordsSource 0 | ||
| + | textureBlend lerpTextureAlpha(texture outRegister) select(outRegister) | ||
end | end | ||
else | else | ||
| − | + | stage | |
| − | + | texture $paintTexture | |
| − | + | textureAddressing tile tile | |
| − | + | ffTextureMatrix -scalev ($paintTextureScale, $paintTextureScale) -invert | |
| − | + | textureTransformType vector2 | |
| − | + | ffTextureCoordsSource 0 | |
| − | + | textureBlend select(texture) select(outRegister) | |
| − | + | end | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
endif | endif | ||
stage | stage | ||
| Line 149: | Line 314: | ||
define TerrainPaint() | define TerrainPaint() | ||
material | material | ||
| − | if ($ | + | create DetermineHardwareSupport() |
| − | create | + | |
| − | + | if (viewerRenderType != $kRenderTypeShadowMap) | |
| − | + | if ($useHWShader1Path or $useHWShader2Path) | |
| − | + | create TerrainPaintShaderVS_PS() | |
| − | + | else | |
| − | + | create TerrainPaintShader(true) | |
| + | create TerrainPaintShader(false) | ||
| + | shader | ||
| + | end | ||
| + | endif | ||
| + | endif | ||
end | end | ||
enddef | enddef | ||
| Line 161: | Line 331: | ||
#============================================================================== | #============================================================================== | ||
| + | define TerrainLightingVS_PS() | ||
| + | pass | ||
| + | fillmode $stdMatFillMode | ||
| + | alphaBlend srcFactor(destColor) add dstFactor(zero) | ||
| + | depthTest true -enableDepthWrite false | ||
| + | depthTestFunction acceptIfEqual | ||
| + | |||
| + | shaderProgram -target vertexProgram -method compile -version 1_1 | ||
| + | bindConstants 0 -bindingID geomToClip -constantCount 4 | ||
| + | bindConstants 4 -bindingID immediateData -data (1/64, 0, 0, 0) | ||
| + | |||
| + | shaderSource | ||
| + | float4x4 clipSpaceMatrix : register(c0); | ||
| + | float4 textureConstants : register(c4); | ||
| + | |||
| + | struct InputVertex | ||
| + | { | ||
| + | float3 position: POSITION0; | ||
| + | float2 texcoord : TEXCOORD0; | ||
| + | }; | ||
| + | |||
| + | struct OutputVertex | ||
| + | { | ||
| + | float4 clipPosition : POSITION; | ||
| + | float2 txBase : TEXCOORD0; | ||
| + | }; | ||
| + | |||
| + | OutputVertex VertexMain( InputVertex i) | ||
| + | { | ||
| + | OutputVertex o; | ||
| + | o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix); | ||
| + | o.txBase = i.texcoord * textureConstants.xx; | ||
| + | return o; | ||
| + | } | ||
| + | endShaderSource | ||
| + | end # end shader program | ||
| + | |||
| + | |||
| + | shaderProgram -target pixelProgram -method compile -version 1_1 | ||
| + | bindConstants 0 -bindingID immediateData -data ($terrainMatDiffCoef.x, $terrainMatDiffCoef.y, $terrainMatDiffCoef.z, 1) | ||
| + | |||
| + | shaderSource | ||
| + | float4 terrainDiffCoef : register(c0); | ||
| + | |||
| + | sampler base; | ||
| + | struct cInputPixel | ||
| + | { | ||
| + | float2 tcBase : TEXCOORD0; | ||
| + | }; | ||
| + | |||
| + | float4 PixelMain(cInputPixel pi) : COLOR | ||
| + | { | ||
| + | float4 baseColor = tex2D(base, pi.tcBase); | ||
| + | float4 result = 2.0*(baseColor*terrainDiffCoef); | ||
| + | result.a = terrainDiffCoef.w; | ||
| + | return result; | ||
| + | } | ||
| + | endShaderSource | ||
| + | end # end shader program | ||
| + | |||
| + | sampler base | ||
| + | texture "floorLightMap_0" # at the moment is deterministically mapped to page 0 | ||
| + | textureAddressing tile tile | ||
| + | end | ||
| + | end | ||
| + | enddef | ||
| + | |||
define TerrainLighting() | define TerrainLighting() | ||
material | material | ||
| Line 167: | Line 404: | ||
shader -layer (($terrainMatLayer - 1) * 8) | shader -layer (($terrainMatLayer - 1) * 8) | ||
vertexFormatPred position 0 true | vertexFormatPred position 0 true | ||
| − | |||
vertexFormatPred texcoord 0 true | vertexFormatPred texcoord 0 true | ||
| − | + | if (viewerRenderType != $kRenderTypeShadowMap) | |
| − | + | if ($useHWShader2Path or $useHWShader1Path) | |
| + | create TerrainLightingVS_PS() | ||
| + | else | ||
| + | pass -fixedFunction | ||
| + | fillmode $stdMatFillMode | ||
| − | + | alphaBlend srcFactor(destColor) add dstFactor(zero) | |
| − | + | ||
| − | + | ||
| − | + | colorScalar $terrainMatDiffCoef 1 # important that alpha be one for ARGB capture. | |
| − | + | ffDepthOffset 0 | |
| + | depthTest true -enableDepthWrite false | ||
| + | depthTestFunction acceptIfEqual | ||
| − | + | stage | |
| − | + | texture "floorLightMap_0" # at the moment is deterministically mapped to page 0 | |
| + | # A page holds 64x64 tiles. A tile is one world unit wide. | ||
| + | ffTextureMatrix -scalev (1/64, 1/64) | ||
| + | textureTransformType vector2 | ||
| + | ffTextureCoordsSource 0 | ||
| + | textureBlend multiplyScale2(texture colorScalar) select(colorScalar) | ||
| + | end | ||
| + | end | ||
| + | |||
| + | pass -fixedFunction | ||
| + | create LightingStatesNoStdLights() | ||
| + | fillmode $stdMatFillMode | ||
| − | + | alphaBlend srcFactor(zero) add dstFactor(one) | |
| − | + | ||
| − | + | ffDepthOffset 0 | |
| − | + | depthTest true -enableDepthWrite false | |
| − | + | alphaTest true 100 | |
| − | + | alphaTestFunction acceptIfLess | |
| − | + | ||
| − | + | stage | |
| − | + | texture "floorLightMap_0" # at the moment is deterministically mapped to page 0 | |
| − | + | ffTextureMatrix -scalev (1/64, 1/64) | |
| − | + | textureTransformType vector2 | |
| − | + | ffTextureCoordsSource 0 | |
| − | + | textureBlend select(texture) select(texture) | |
| − | + | end | |
| − | + | end | |
| − | + | endif | |
| − | + | endif | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
end | end | ||
end | end | ||
Revision as of 10:18, 14 April 2007
EP4-Pets
0xCD7FE87A
0x1C0532FA
0x4CE399AB
0xFF1AFA1C
# terrain
#
# Shaders for terrain tiles
#
#
setf waterbumpMapScale 4.0
setv3 thumbnailMatDiffCoef (0.75, 0.93, 0.75)
seti terrainMatLayer -2
# multiplier on terrain (grass/paints) both on the lot and
# lot skirts. (See lotSkirt.matShad.)
setc terrainMatDiffCoef (0.9, 0.9, 0.9)
# Specifies the number of tiles over which the paint & bump textures should be applied.
setf canvasDetailTextureScale 4
setf canvasBaseTextureScale 20
setf paintTextureScale 20
setf paintDetailTextureScale 4.0
setb hasCutout false
#==============================================================================
define TerrainCanvasShaderShaderVS_PS()
pass
fillmode $stdMatFillMode
depthTest true -enableDepthWrite true
if ($hasCutout)
depthTestFunction acceptIfEqual
else
depthTestFunction acceptIfLessOrEqual
endif
shaderProgram -target vertexProgram -method compile -version 1_1
bindConstants 0 -bindingID geomToClip -constantCount 4
bindConstants 4 -bindingID immediateData -data (1/$canvasBaseTextureScale, 1/$canvasDetailTextureScale, 0, 0)
shaderSource
float4x4 clipSpaceMatrix : register(c0);
float4 textureConstants : register(c4);
struct InputVertex
{
float3 position: POSITION0;
float2 texcoord : TEXCOORD0;
};
struct OutputVertex
{
float4 clipPosition : POSITION;
float2 txBase : TEXCOORD0;
float2 txDetail: TEXCOORD1;
};
OutputVertex VertexMain( InputVertex i)
{
OutputVertex o;
o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix);
o.txBase = i.texcoord * textureConstants.x;
o.txDetail = i.texcoord * textureConstants.y;
return o;
}
endShaderSource
end # end shader program
shaderProgram -target pixelProgram -method compile -version 1_1
shaderSource
sampler base;
sampler detail;
struct cInputPixel
{
float2 tcBase : TEXCOORD0;
float2 tcDetail : TEXCOORD1;
};
float4 PixelMain(cInputPixel pi) : COLOR
{
float4 baseColor = tex2D(base, pi.tcBase);
float4 detailColor = tex2D(detail, pi.tcDetail);
float4 result = (detailColor.a * detailColor) + ((1 - detailColor.a) * baseColor);
return result;
}
endShaderSource
end # end shader program
sampler base
texture "${texture}"
textureAddressing tile tile
end
sampler detail
texture "${texture}_detail"
textureAddressing tile tile
end
end
enddef
define TerrainCanvasShaderShaderFF()
pass -fixedFunction
fillmode $stdMatFillMode
depthTest true -enableDepthWrite true
if ($hasCutout)
depthTestFunction acceptIfEqual
else
depthTestFunction acceptIfLessOrEqual
endif
stage
texture "${texture}"
textureAddressing tile tile
ffTextureMatrix -scalev ($canvasBaseTextureScale, $canvasBaseTextureScale) -invert
ffTextureCoordsSource 0
textureBlend select(texture) select(texture)
end
stage
texture "${texture}_detail"
textureAddressing tile tile
ffTextureMatrix -scalev ($canvasDetailTextureScale, $canvasDetailTextureScale) -invert
ffTextureCoordsSource 0
textureBlend lerpTextureAlpha(texture outRegister) select(outRegister)
end
end
enddef
define TerrainCanvasShader()
material
shader -layer (($terrainMatLayer - 3) * 8)
vertexFormatPred position 0 true
vertexFormatPred normal 0 true
vertexFormatPred texcoord 0 true
viewerRenderTypePred viewerRenderType
create DetermineHardwareSupport()
if (viewerRenderType = $kRenderTypeShadowMap)
create ShadowMapVS_PS()
else
if ($useHWShader1Path or $useHWShader2Path)
create TerrainCanvasShaderShaderVS_PS()
else
create TerrainCanvasShaderShaderFF()
endif
endif
end
shader
end
end
enddef
#==============================================================================
define TerrainPaintShaderVS_PS()
shader -layer (($terrainMatLayer - 2) * 8)
vertexFormatPred position 0 true
vertexFormatPred texcoord 0 true
pass
fillmode $stdMatFillMode
alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
alphaTest true 10
alphaTestFunction acceptIfGreater
depthTest true -enableDepthWrite false
if (viewerRenderType = $kRenderTypeImposter)
depthTestFunction acceptIfLessOrEqual
else
depthTestFunction acceptIfEqual
endif
shaderProgram -target vertexProgram -method compile -version 1_1
bindConstants 0 -bindingID geomToClip -constantCount 4
bindConstants 4 -bindingID immediateData -data (1/$canvasBaseTextureScale, 1/$canvasDetailTextureScale, $alphaMapScaleU, $alphaMapScaleV)
shaderSource
float4x4 clipSpaceMatrix : register(c0);
float4 textureConstants : register(c4);
struct InputVertex
{
float3 position: POSITION0;
float2 texcoord : TEXCOORD0;
};
struct OutputVertex
{
float4 clipPosition : POSITION;
float2 txBase : TEXCOORD0;
float2 txDetail: TEXCOORD1;
float2 txAlpha : TEXCOORD2;
};
OutputVertex VertexMain( InputVertex i)
{
OutputVertex o;
o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix);
o.txBase = i.texcoord * textureConstants.x;
o.txDetail = i.texcoord * textureConstants.y;
o.txAlpha = i.texcoord.xy * textureConstants.zw;
return o;
}
endShaderSource
end # end shader program
shaderProgram -target pixelProgram -method compile -version 1_1
shaderSource
sampler base;
sampler detail;
sampler alphaMap;
struct cInputPixel
{
float2 tcBase : TEXCOORD0;
float2 tcDetail : TEXCOORD1;
float2 tcAlpha : TEXCOORD2;
};
float4 PixelMain(cInputPixel pi) : COLOR
{
float4 baseColor = tex2D(base, pi.tcBase);
float4 detailColor = tex2D(detail, pi.tcDetail);
float4 alphaColor = tex2D(alphaMap, pi.tcAlpha);
float4 result = (detailColor.a * detailColor) + ((1 - detailColor.a) * baseColor);
result.a = alphaColor.a;
return result;
}
endShaderSource
end # end shader program
sampler base
texture $paintTexture
textureAddressing tile tile
end
sampler detail
texture "${paintTexture}_detail"
textureAddressing tile tile
end
sampler alphaMap
texture $alphaMap
textureAddressing clamp clamp
end
end
end
enddef
define TerrainPaintShader(addDetail)
shader -layer (($terrainMatLayer - 2) * 8)
vertexFormatPred position 0 true
vertexFormatPred texcoord 0 true
pass -fixedFunction
fillmode $stdMatFillMode
alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
alphaTest true 10
alphaTestFunction acceptIfGreater
depthTest true -enableDepthWrite false
depthTestFunction acceptIfEqual
if (&addDetail)
stage
texture $paintTexture
textureAddressing tile tile
ffTextureMatrix -scalev ($paintTextureScale, $paintTextureScale) -invert
textureTransformType vector2
ffTextureCoordsSource 0
textureBlend select(texture) select(outRegister)
end
stage
texture "${paintTexture}_detail"
textureAddressing tile tile
ffTextureMatrix -scalev ($paintDetailTextureScale, $paintDetailTextureScale) -invert
textureTransformType vector2
ffTextureCoordsSource 0
textureBlend lerpTextureAlpha(texture outRegister) select(outRegister)
end
else
stage
texture $paintTexture
textureAddressing tile tile
ffTextureMatrix -scalev ($paintTextureScale, $paintTextureScale) -invert
textureTransformType vector2
ffTextureCoordsSource 0
textureBlend select(texture) select(outRegister)
end
endif
stage
texture $alphaMap
textureAddressing clamp clamp
ffTextureMatrix -scalev ($alphaMapScaleU, $alphaMapScaleV)
ffTextureCoordsSource 0
textureBlend select(outRegister) select(texture)
end
end
end
enddef
define TerrainPaint()
material
create DetermineHardwareSupport()
if (viewerRenderType != $kRenderTypeShadowMap)
if ($useHWShader1Path or $useHWShader2Path)
create TerrainPaintShaderVS_PS()
else
create TerrainPaintShader(true)
create TerrainPaintShader(false)
shader
end
endif
endif
end
enddef
#==============================================================================
define TerrainLightingVS_PS()
pass
fillmode $stdMatFillMode
alphaBlend srcFactor(destColor) add dstFactor(zero)
depthTest true -enableDepthWrite false
depthTestFunction acceptIfEqual
shaderProgram -target vertexProgram -method compile -version 1_1
bindConstants 0 -bindingID geomToClip -constantCount 4
bindConstants 4 -bindingID immediateData -data (1/64, 0, 0, 0)
shaderSource
float4x4 clipSpaceMatrix : register(c0);
float4 textureConstants : register(c4);
struct InputVertex
{
float3 position: POSITION0;
float2 texcoord : TEXCOORD0;
};
struct OutputVertex
{
float4 clipPosition : POSITION;
float2 txBase : TEXCOORD0;
};
OutputVertex VertexMain( InputVertex i)
{
OutputVertex o;
o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix);
o.txBase = i.texcoord * textureConstants.xx;
return o;
}
endShaderSource
end # end shader program
shaderProgram -target pixelProgram -method compile -version 1_1
bindConstants 0 -bindingID immediateData -data ($terrainMatDiffCoef.x, $terrainMatDiffCoef.y, $terrainMatDiffCoef.z, 1)
shaderSource
float4 terrainDiffCoef : register(c0);
sampler base;
struct cInputPixel
{
float2 tcBase : TEXCOORD0;
};
float4 PixelMain(cInputPixel pi) : COLOR
{
float4 baseColor = tex2D(base, pi.tcBase);
float4 result = 2.0*(baseColor*terrainDiffCoef);
result.a = terrainDiffCoef.w;
return result;
}
endShaderSource
end # end shader program
sampler base
texture "floorLightMap_0" # at the moment is deterministically mapped to page 0
textureAddressing tile tile
end
end
enddef
define TerrainLighting()
material
create DetermineHardwareSupport()
shader -layer (($terrainMatLayer - 1) * 8)
vertexFormatPred position 0 true
vertexFormatPred texcoord 0 true
if (viewerRenderType != $kRenderTypeShadowMap)
if ($useHWShader2Path or $useHWShader1Path)
create TerrainLightingVS_PS()
else
pass -fixedFunction
fillmode $stdMatFillMode
alphaBlend srcFactor(destColor) add dstFactor(zero)
colorScalar $terrainMatDiffCoef 1 # important that alpha be one for ARGB capture.
ffDepthOffset 0
depthTest true -enableDepthWrite false
depthTestFunction acceptIfEqual
stage
texture "floorLightMap_0" # at the moment is deterministically mapped to page 0
# A page holds 64x64 tiles. A tile is one world unit wide.
ffTextureMatrix -scalev (1/64, 1/64)
textureTransformType vector2
ffTextureCoordsSource 0
textureBlend multiplyScale2(texture colorScalar) select(colorScalar)
end
end
pass -fixedFunction
create LightingStatesNoStdLights()
fillmode $stdMatFillMode
alphaBlend srcFactor(zero) add dstFactor(one)
ffDepthOffset 0
depthTest true -enableDepthWrite false
alphaTest true 100
alphaTestFunction acceptIfLess
stage
texture "floorLightMap_0" # at the moment is deterministically mapped to page 0
ffTextureMatrix -scalev (1/64, 1/64)
textureTransformType vector2
ffTextureCoordsSource 0
textureBlend select(texture) select(texture)
end
end
endif
endif
end
end
enddef
#==============================================================================
define TerrainToolThumbnail()
material
shader -layer ($terrainMatLayer * 8)
vertexFormatPred position 0 true
vertexFormatPred normal 0 true
vertexFormatPred texcoord 0 true
vertexFormatPred blendindices 0 false
vertexFormatPred targetindices 0 false
pass -fixedFunction
create LightingStates()
alphaBlend srcFactor(srcAlpha) add dstFactor(zero)
colorScalar $thumbnailMatDiffCoef
fillmode $stdMatFillMode
stage
texture $paintTexture
textureAddressing tile tile
textureBlend multiplyScale2(texture diffuse) select(texture)
end
end
end
end
enddef
define TerrainWaterShader(withBumpMap)
shader -layer 1
vertexFormatPred position 0 true
vertexFormatPred normal 0 true
vertexFormatPred color 0 true
vertexFormatPred texcoord 0 true
vertexFormatPred blendindices 0 false
vertexFormatPred targetindices 0 false
viewerRenderTypePred viewerRenderType
setb cubeMapSupport (queryBooleanGraphicsDeviceCap(hasCubeMapSupport))
create DetermineHardwareSupport()
pass -fixedFunction
# disable lighting, disable normalize normals, enable local viewer
if ($useSWVertexShaderPath)
create LightingStatesNoStdLights()
else
create LightingStatesNoStdLightsParam(false true)
endif
alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
fillmode $stdMatFillMode
colorScalar (1, 1, 1) -applyTextureLightColor 0 0
stage
if ($cubeMapSupport)
texture reflectionoutdoorwater-envcube
textureMIPFilterHint disabled
ffTextureCoordsSource fromReflectionVector
textureTransformType vector3
ffTextureMatrix -orientCameraToGlobal
textureAddressing clamp clamp clamp
textureBlend multiply(texture colorScalar) select(diffuse)
else
colorScalar (0.3,0.5,1.0) -applyTextureLightColor 0 0
textureBlend select(colorScalar) select(diffuse)
endif
end
end
if (&withBumpMap)
pass -fixedFunction
create LightingStatesNoStdLights()
alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
fillmode $stdMatFillMode
colorScalar (1.0, 1.0, 1.0, 0.3) -applyTextureLightColor 0 0
stage
texture "water-1-bump"
textureAddressing tile tile
# -atrans waveformType cycles/sec offset (startU, startV) (endU, endV)
textureMatrixAnimation -targetType fixedFunction -aorigin (0, 0) -atrans sine 0.04 0 (0, 0) (1, 0) -ascale sawtooth 1 0 ($waterbumpMapScale, $waterbumpMapScale)
textureTransformType vector2
ffTextureCoordsSource 0
textureBlend select(texture) select(texture)
end
stage
texture "water-2-bump"
textureAddressing tile tile
# -atrans waveformType cycles/sec offset (startU, startV) (endU, endV)
textureMatrixAnimation -targetType fixedFunction -aorigin (0, 0) -atrans sine 0.04 0 (1, 0) (0, 0) -ascale sawtooth 1 0 ($waterbumpMapScale, $waterbumpMapScale)
textureTransformType vector2
ffTextureCoordsSource 0
textureBlend multiply(texture outRegister) select(texture)
end
stage
# does this work out on GF2 due to reg combiners?
textureBlend multiply(outRegister colorScalar) select(colorScalar)
end
end
endif
end
enddef
#==============================================================================
define TerrainWater()
material
# only activate the water w/ bump shader for pixel shader capable HW
if (queryIntegerGraphicsDeviceCap(maxPixelProgramVersionMajor) != 0)
create TerrainWaterShader(true)
endif
create TerrainWaterShader(false) # fallback without bumps
end
enddef
#==============================================================================
materialDefinition terrainLightingMaterial
setDefinition TerrainLighting
end
materialDefinition waterOnTerrain
setDefinition TerrainWater
end
#endshader