|
|
(18 intermediate revisions by one user not shown) |
Line 1: |
Line 1: |
− | #
| + | define TransparentMirrorReflection() |
− | # Shaders for terrain tiles
| + | material |
− | #
| + | if (viewerRenderType = $kRenderTypeShadow) |
− | #
| + | create StandardShaderShadow() |
− | | + | |
− | 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 | | else |
− | depthTestFunction acceptIfLessOrEqual | + | if (viewerRenderType = $kRenderTypeThumbnail) |
| + | create TransparentBlankMirrorMaterial($kRenderTypeThumbnail) |
| + | else |
| + | if (not $mirrorReflectionsEnabled) |
| + | set currentType (viewerRenderType) |
| + | create TransparentBlankMirrorMaterial($currentType) |
| + | else |
| + | create TransparentMirrorReflectionMaterial() |
| + | endif |
| + | endif |
| endif | | 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 | | end |
| enddef | | enddef |
| | | |
− | define TerrainCanvasShaderShaderFF() | + | define TransparentBlankMirrorMaterial(renderType) |
− | 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 | | shader |
− | end
| + | validateRenderShaderContext -viewerRenderType &renderType |
− | 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 | + | pass |
− | alphaTestFunction acceptIfGreater
| + | shaderProgram -target vertexProgram -method assemble |
− |
| + | bindConstants 0 -bindingID geomToClip -constantCount 4 |
− | depthTest true -enableDepthWrite false
| + | shaderSource |
− |
| + | vs_1_1 |
− | if (viewerRenderType = $kRenderTypeImposter)
| + | dcl_position v0 |
− | depthTestFunction acceptIfLessOrEqual | + | m4x4 oPos, v0, c0 |
− | else
| + | endShaderSource |
− | 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
| + | |
− | if (viewerRenderType = $kRenderTypeImposter)
| + | |
− | depthTestFunction acceptIfLessOrEqual
| + | |
− | else
| + | |
− | depthTestFunction acceptIfEqual
| + | |
− | endif
| + | |
− |
| + | |
− | 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 | | 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
| |
| | | |
| + | colorScalar (0,0,0) 0.5 |
| stage | | stage |
− | texture $paintTexture
| + | textureBlend select(colorScalar) select(colorScalar) |
− | textureAddressing tile tile
| + | end |
− | textureBlend multiplyScale2(texture diffuse) select(texture) | + | end |
− | end | + | end |
− | end | + | |
− | end | + | |
− | end
| + | |
| enddef | | enddef |
| | | |
− | define TerrainWaterShader(withBumpMap) | + | define TransparentMirrorReflectionMaterial() |
− | 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 | + | shader -layer -9998 # this material must render first |
− | # disable lighting, disable normalize normals, enable local viewer
| + | validateRenderShaderContext -viewerRenderType $kRenderTypeMirror # reflection render |
− | if ($useSWVertexShaderPath) | + | |
− | create LightingStatesNoStdLights()
| + | |
− | else
| + | |
− | create LightingStatesNoStdLightsParam(false true)
| + | |
− | endif
| + | |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | |
| | | |
− | fillmode $stdMatFillMode | + | pass -renderEachFrame |
− | colorScalar (1, 1, 1) -applyTextureLightColor 0 0
| + | renderTarget $reflectionRenderTarget -setViewport viewportFromParentRenderContext |
− |
| + | |
− | stage
| + | |
− | if ($cubeMapSupport) | + | |
− | texture reflectionoutdoorwater-envcube
| + | |
− | textureMIPFilterHint disabled
| + | |
| | | |
− | ffTextureCoordsSource fromReflectionVector
| + | depthTest true -enableDepthWrite true |
− | textureTransformType vector3
| + | |
− | ffTextureMatrix -orientCameraToGlobal
| + | |
| | | |
− | textureAddressing clamp clamp clamp
| + | applyStencilStateForOverlappingReflections |
− | 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
| + | |
| | | |
| + | alphaBlend srcFactor(zero) add dstFactor(one) |
| | | |
− | #==============================================================================
| + | cullmode none |
− | define TerrainWater()
| + | |
− | material
| + | |
− | # only activate the water w/ bump shader for pixel shader capable HW
| + | |
− | if (tsFrozenPond)
| + | |
− | create TerrainWaterFrozen()
| + | |
− | else
| + | |
− | if (queryIntegerGraphicsDeviceCap(maxPixelProgramVersionMajor) != 0)
| + | |
− | create TerrainWaterShader(true) | + | |
− | endif
| + | |
− | create TerrainWaterShader(false) # fallback without bumps
| + | |
− | endif
| + | |
− | end
| + | |
− | enddef
| + | |
| | | |
− | define TerrainWaterFrozen()
| + | shaderProgram -target vertexProgram -method assemble |
− | shader -layer 1
| + | bindConstants 0 -bindingID geomToClipFromParentView -constantCount 4 |
− | pass -fixedFunction
| + | shaderSource |
− | create LightingStatesNoStdLightsParam(false false)
| + | vs_1_1 |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | dcl_position v0 |
− | fillmode $stdMatFillMode
| + | def c5, 1,0,0,1 |
− | colorScalar (0.45, 0.45, 0.5, 0.475) -applyTextureLightColor 0 0
| + | m4x4 r0, v0, c0 |
− |
| + | mov oPos.x, -r0 |
− | stage
| + | mov oPos.yzw, r0 |
− | texture "ice-pond-surface"
| + | endShaderSource |
− | textureAddressing tile tile
| + | end |
− | ffTextureCoordsSource fromPosition
| + | |
− | ffTextureMatrix -cameraToGlobal -scale (5) -invert
| + | |
− | textureBlend multiply(texture colorScalar) select(colorScalar)
| + | |
− | end
| + | |
− |
| + | |
− | stage
| + | |
− | texture "ice-pond-surface"
| + | |
− | textureAddressing tile tile
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | ffTextureMatrix -cameraToGlobal -scale (17) -invert
| + | |
− | textureBlend multiplyAdd(texture colorScalar outRegister) add(colorScalar outRegister)
| + | |
− | end
| + | |
− | end
| + | |
− | end
| + | |
− | enddef
| + | |
− | | + | |
− | #==============================================================================
| + | |
− | | + | |
− | define TerrainSnowShader()
| + | |
− | create DetermineHardwareSupport()
| + | |
− | if ($useHWShader1Path or $useHWShader2Path)
| + | |
− | create TerrainSnow()
| + | |
− | else
| + | |
− | create TerrainSnowFF()
| + | |
− | endif
| + | |
− | enddef
| + | |
− | | + | |
− | define TerrainSnowFF()
| + | |
− | material
| + | |
− | shader -layer 0
| + | |
− | pass -fixedFunction
| + | |
− | depthTest true -enableDepthWrite true
| + | |
− | if (tsIsDay)
| + | |
− | colorScalar (0.5, 0.5, 0.52, 1)
| + | |
− | else
| + | |
− | colorScalar (0.15, 0.15, 0.375, 1)
| + | |
− | endif
| + | |
− |
| + | |
− | stage
| + | |
− | texture "snow-ground-diffuse" | + | |
− | textureAddressing tile tile
| + | |
− | ffTextureCoordsSource fromPosition | + | |
− | ffTextureMatrix -cameraToGlobal -scalev (2, 2) -invert
| + | |
− | textureBlend multiply(texture colorScalar) select(colorScalar) | + | |
− | end | + | |
− |
| + | |
− | stage
| + | |
− | texture "snow-ground-diffuse"
| + | |
− | textureAddressing tile tile
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | ffTextureMatrix -cameraToGlobal -scalev (13, 13) -invert
| + | |
− | textureBlend multiplyAdd(texture colorScalar outRegister) select(colorScalar)
| + | |
− | end
| + | |
| end | | end |
| end | | end |
− | end
| |
− | enddef
| |
| | | |
− | define TerrainSnowPS1()
| + | shader -layer 6 |
− | shaderProgram -target pixelProgram -method compile -version 1_1 # -disassemble "c:\sims2ep5\hlslPS1_1.txt"
| + | validateRenderShaderContext -viewerRenderType $kRenderTypeNormal |
− | bindConstants 0 -bindingID cursorTerrainPosition -constantCount 1 -constantType float | + | pass -modifiedEachFrameHint |
− | if (tsIsDay)
| + | shaderProgram -target vertexProgram -method assemble |
− | bindConstants 1 -bindingID immediateData -data (1.1, 1.1, 1.175, 1) | + | bindConstants 0 -bindingID geomToClip -constantCount 4 |
− | else
| + | bindConstants 4 -bindingID clipToViewTarget -constantCount 4 |
− | bindConstants 1 -bindingID immediateData -data (0.35, 0.35, 1.0, 1)
| + | shaderSource |
− | endif
| + | vs_1_1 |
− |
| + | dcl_position v0 |
− | shaderSource
| + | def c8, -0.5, -0.5, 1, 1 |
− | sampler normmap;
| + | def c9, 0.5, 0.5, 0, 0 |
− |
| + | def c10, 0.25, 0.25, 0, 0 |
− | float4 cursorPos : register(c0);
| + | m4x4 r0, v0, c0 |
− | float4 colorFactor : register(c1);
| + | mov oPos, r0 |
− |
| + | mul r2, c9, r0.w |
− | struct v2f
| + | mad r4, r0, c8, r2 |
− | {
| + | rcp r3.x, c4.x |
− | float4 hpos : POSITION;
| + | rcp r3.y, c5.y |
− | float4 color : COLOR0;
| + | mov r3.zw, c9.zw |
− | float3 worldPos : COLOR1;
| + | mul r3, r3, c10 |
− | float3 bumpCoords : TEXCOORD0;
| + | mad r6, r0, r3, r4 |
− | float3 tanLightDir : TEXCOORD1;
| + | mov oT0, r6.xyww |
− | };
| + | endShaderSource |
− | | + | end |
− | float4 PixelMain(v2f pi) : COLOR
| + | |
− | {
| + | |
− | float4 normal = 2.0f * (tex2D(normmap, pi.bumpCoords) - 0.5f);
| + | |
− | float3 diffuse = saturate(dot(pi.tanLightDir, normal.xyz))*colorFactor.xyz;
| + | |
− | return float4(diffuse.xyz + pi.color, 1.0f);
| + | |
− | }
| + | |
− | endShaderSource
| + | |
− | end
| + | |
− |
| + | |
− | sampler normmap
| + | |
− | texture "snow-ground-bump"
| + | |
− | textureAddressing tile tile
| + | |
− | end
| + | |
− |
| + | |
− | enddef
| + | |
− | | + | |
− | define TerrainSnowPS2()
| + | |
− | shaderProgram -target pixelProgram -method compile -version ${psVersion}_0 # -disassemble "c:\sims2ep5\hlslPS1_1.txt"
| + | |
− | bindConstants 0 -bindingID cursorTerrainPosition -constantCount 1 -constantType float
| + | |
− | if (tsIsDay)
| + | |
− | bindConstants 1 -bindingID immediateData -data (1.1, 1.1, 1.175, 1) | + | |
− | else
| + | |
− | bindConstants 1 -bindingID immediateData -data (0.35, 0.35, 1.0, 1)
| + | |
− | endif
| + | |
− | | + | |
− | shaderSource
| + | |
− |
| + | |
− | sampler normmap;
| + | |
− |
| + | |
− | float4 cursorPos : register(c0);
| + | |
− | float4 colorFactor : register(c1);
| + | |
− |
| + | |
− | struct v2f
| + | |
− | {
| + | |
− | float4 hpos : POSITION; | + | |
− | float4 color : COLOR0;
| + | |
− | float3 worldPos : COLOR1;
| + | |
− | float2 bumpCoords : TEXCOORD0;
| + | |
− | float3 tanLightDir : TEXCOORD1;
| + | |
− | };
| + | |
− | | + | |
− | float4 PixelMain(v2f pi) : COLOR
| + | |
− | {
| + | |
− | float4 normal0 = 2.0f * (tex2D(normmap, pi.bumpCoords) - 0.5f);
| + | |
− | float4 normal1 = 2.0f * (tex2D(normmap, pi.bumpCoords*0.4f) - 0.5f);
| + | |
− | float4 normal = 0.5f*(normal0+normal1);
| + | |
− | float3 diffuse0 = saturate(dot(pi.tanLightDir, normal.xyz))*colorFactor.xyz;
| + | |
− |
| + | |
− | float3 diffVec = cursorPos-pi.worldPos;
| + | |
− | diffVec *= 64.0f;
| + | |
− | float blend = saturate(dot(diffVec, diffVec));
| + | |
− | return float4(saturate(float3(diffuse0.xyz + pi.color.xxx)), blend);
| + | |
− | }
| + | |
− | endShaderSource
| + | |
− | end
| + | |
− |
| + | |
− | sampler normmap
| + | |
− | texture "snow-ground-bump"
| + | |
− | textureAddressing tile tile
| + | |
− | end
| + | |
− |
| + | |
− | enddef
| + | |
− | | + | |
− | define TerrainSnowVS1()
| + | |
− | shaderProgram -target vertexProgram -method compile -version 1_1
| + | |
− | bindConstants 0 -bindingID geomToClip -constantCount 4
| + | |
− | bindConstants 4 -bindingID geomToCamera -constantCount 3
| + | |
− | bindConstants 7 -bindingID cameraToGeom -constantCount 3
| + | |
− | bindConstants 15 -bindingID ambientLight -constantCount 1 -constantType float
| + | |
− | bindConstants 18 -bindingID allStandardLightData -constantCount 4 -constantType float
| + | |
− |
| + | |
− | if (tsIsDay)
| + | |
− | bindConstants 10 -bindingID immediateData -data (1.2, 1.2, 1.2, 1)
| + | |
− | else
| + | |
− | bindConstants 10 -bindingID immediateData -data (0.64, 0.64, 1.1, 1)
| + | |
− | endif
| + | |
− |
| + | |
− | bindConstants 12 -bindingID geomToGlobal -constantCount 3
| + | |
− |
| + | |
− | bindConstants 22 -bindingID cameraToClipWithDepthOffset -constantCount 4 -data(0, 0, 0, 0)
| + | |
− |
| + | |
− | shaderSource
| + | |
− | float4x4 modelviewproj : register(c0);
| + | |
− | float4x3 modelview : register(c4);
| + | |
− | float4x3 modelviewInv : register(c7);
| + | |
− | // light direction
| + | |
− | float4 lightDir0 : register(c18);
| + | |
− | float4 lightDir1 : register(c26);
| + | |
− | float4x4 cameraToClipWithDOMatrix : register(c22);
| + | |
− | float4 ambient : register(c15);
| + | |
− | float4x3 modelToWorld : register(c12);
| + | |
− |
| + | |
− | struct a2v
| + | |
− | {
| + | |
− | float4 pos : POSITION;
| + | |
− | float3 normal : NORMAL;
| + | |
− | float2 tangent : TEXCOORD0;
| + | |
− | float2 bumpcoord : TEXCOORD1;
| + | |
− | };
| + | |
− | | + | |
− | struct v2f
| + | |
− | {
| + | |
− | float4 hpos : POSITION;
| + | |
− | float4 color : COLOR0;
| + | |
− | float3 worldPos : COLOR1;
| + | |
− | float2 bumpCoords : TEXCOORD0;
| + | |
− | float3 tanLightDir : TEXCOORD1;
| + | |
− | };
| + | |
− |
| + | |
− | v2f VertexMain(a2v IN)
| + | |
− | {
| + | |
− | v2f OUT;
| + | |
− | | + | |
− | // vertex position in object space
| + | |
− | float4 pos = float4(IN.pos.x,IN.pos.y,IN.pos.z,1.0);
| + | |
− |
| + | |
− | float3 tangent = float3(IN.tangent.x, IN.tangent.y, 0);
| + | |
− |
| + | |
− | // compute binormal
| + | |
− | float3 binormal = normalize(cross(IN.normal, tangent));
| + | |
− |
| + | |
− | // tangent space matrix
| + | |
− | float3x3 tbn = float3x3(tangent, binormal, IN.normal);
| + | |
− |
| + | |
− | // light direction in object space
| + | |
− | float3 lt0 = mul(lightDir0, (float3x3)modelviewInv);
| + | |
− |
| + | |
− | // light 0 direction in tangent space
| + | |
− | OUT.tanLightDir = normalize(mul(tbn, lt0));
| + | |
− |
| + | |
− | OUT.bumpCoords = float2(IN.bumpcoord.x, IN.bumpcoord.y);
| + | |
− |
| + | |
− | // compute tangent space view vector
| + | |
− | // object space view point
| + | |
− | float3 viewPoint = mul(float4(0, 0, 0, 1), modelviewInv).xyz;
| + | |
− | float3 viewVecObj = normalize(viewPoint - IN.pos.xyz);
| + | |
− |
| + | |
− | // object space light
| + | |
− | float3 lightDirObj = normalize(mul(lightDir0, (float3x3)modelviewInv));
| + | |
− |
| + | |
− | // half angle vector in object space
| + | |
− | float3 halfWayVector = normalize(lightDirObj + viewVecObj);
| + | |
− |
| + | |
− | // transform half angle vector to tangent space
| + | |
− | //OUT.tanHalfAngle.xyz = normalize(mul(tbn, halfWayVector));
| + | |
− |
| + | |
− | // specular shadowing term
| + | |
− | //OUT.tanHalfAngle.w = max(dot(halfWayVector, IN.normal), 0);
| + | |
− |
| + | |
− | // vertex position in clip space
| + | |
− | float3 hposView = mul(pos, modelview);
| + | |
− | OUT.hpos = mul(float4(hposView, 1), cameraToClipWithDOMatrix);
| + | |
− |
| + | |
− | // vertex position in world space
| + | |
− | OUT.worldPos = mul(pos, modelToWorld)/64.0f;
| + | |
− |
| + | |
− | OUT.color.xyz = ambient.xyz*0.3f;
| + | |
− | OUT.color.w = 1.0;
| + | |
− | return OUT;
| + | |
− | }
| + | |
− |
| + | |
− | endShaderSource
| + | |
− | end # end shader program
| + | |
− | enddef
| + | |
− | | + | |
− | define TerrainSnow()
| + | |
− | material
| + | |
− | shader -layer 1
| + | |
− | validateRenderShaderContext -vertexFormat position 0 required
| + | |
− | validateRenderShaderContext -vertexFormat normal 0 required
| + | |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| + | |
− | validateRenderShaderContext -vertexFormat texcoord 1 required
| + | |
− |
| + | |
− | create DetermineHardwareSupport()
| + | |
− |
| + | |
− | pass
| + | |
− | alphaTest true 5
| + | |
− | alphaTestFunction acceptIfGreater
| + | |
| | | |
| alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) | | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) |
− | depthTest true -enableDepthWrite true | + | depthTest true -enableDepthWrite false |
− | | + | colorScalar (0,0,0) 0.25 |
− | create TerrainSnowVS1()
| + | |
− |
| + | |
− | if ($useHWShader1Path)
| + | |
− | create TerrainSnowPS1()
| + | |
− | elseif ($useHWShader2Path)
| + | |
− | create TerrainSnowPS2()
| + | |
− | endif
| + | |
− |
| + | |
− | end # end pass
| + | |
− |
| + | |
− | end #end shader
| + | |
− | end # end material
| + | |
− | enddef
| + | |
| | | |
− | define XRayCursorMaterial()
| |
− | material
| |
− | shader -layer (0)
| |
− | pass -fixedFunction -modifiedEachFrameHint
| |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| |
− | depthTest true -enableDepthWrite false
| |
− |
| |
− | colorScalar (1, 1, 0, 0.0)
| |
| stage | | stage |
− | textureBlend select(colorScalar) select(colorScalar) | + | textureTransformType vector3 homogeneous |
| + | textureAddressing clamp clamp |
| + | texture $reflectionRenderTarget |
| + | textureBlend select(texture) select(colorScalar) |
| end | | end |
| + | |
| end | | end |
| end | | end |
− | end
| |
− | enddef
| |
− |
| |
− | define LightSnowDayPS(psFullVersion)
| |
− | shaderProgram -target pixelProgram -method compile -version &psFullVersion
| |
− | if ($singlePass)
| |
− | bindConstants 0 -bindingID immediateData -data (0, 0, 0, 0) -constantType float
| |
− | else
| |
− | bindConstants 0 -bindingID immediateData -data (1, 0, 0, 0) -constantType float
| |
− | endif
| |
| | | |
− | shaderSource | + | shader -layer 6 |
− | float scale2Factor : register(c0); | + | validateRenderShaderContext -viewerRenderType $kRenderTypeNormal |
− |
| + | pass -modifiedEachFrameHint |
− | sampler base; | + | shaderProgram -target vertexProgram -method assemble |
− | sampler base2;
| + | bindConstants 0 -bindingID geomToClip -constantCount 4 |
− | struct cInputPixel
| + | bindConstants 4 -bindingID clipToViewTarget -constantCount 4 |
− | {
| + | shaderSource |
− | float2 txScale1 : TEXCOORD0;
| + | vs_1_1 |
− | float2 txScale2 : TEXCOORD1;
| + | dcl_position v0 |
− | };
| + | def c8, -0.5, -0.5, 1, 1 |
− |
| + | def c9, 0.5, 0.5, 0, 0 |
− | float4 PixelMain(cInputPixel pi) : COLOR
| + | def c10, 0.25, 0.25, 0, 0 |
− | {
| + | m4x4 r0, v0, c0 |
− | float4 scale1Color = tex2D(base, pi.txScale1);
| + | mov oPos, r0 |
− | float4 scale2Color = tex2D(base2, pi.txScale2)*scale2Factor.x;
| + | mul r2, c9, r0.w |
− | float4 result = (scale1Color + scale2Color);
| + | mad r4, r0, c8, r2 |
− | return result;
| + | rcp r3.x, c4.x |
− | }
| + | rcp r3.y, c5.y |
− | endShaderSource
| + | mov r3.zw, c9.zw |
− | end # end shader program
| + | mul r3, r3, c10 |
− | enddef
| + | mad r1, r0, r3, r4 |
| + | rcp r1.w, r1.w |
| + | mul oT0.xy, r1.w, r1.xy |
| + | endShaderSource |
| + | end |
| | | |
− | define LightSnowNightPS(psFullVersion)
| + | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) |
− | shaderProgram -target pixelProgram -method compile -version &psFullVersion
| + | depthTest true -enableDepthWrite false |
− | if ($singlePass)
| + | colorScalar (0,0,0) 0.25 |
− | bindConstants 0 -bindingID immediateData -data (0, 0, 0, 0) -constantType float
| + | |
− | else
| + | |
− | bindConstants 0 -bindingID immediateData -data (1, 1, 0, 0) -constantType float
| + | |
− | endif
| + | |
− |
| + | |
− | shaderSource
| + | |
− | float2 scale2Factor : register(c0);
| + | |
− |
| + | |
− | sampler base;
| + | |
− | sampler base2;
| + | |
− | sampler lightMap;
| + | |
− | struct cInputPixel
| + | |
− | {
| + | |
− | float2 txScale1 : TEXCOORD0;
| + | |
− | float2 txScale2 : TEXCOORD1;
| + | |
− | float2 txltMap : TEXCOORD2;
| + | |
− | };
| + | |
− |
| + | |
− | float4 PixelMain(cInputPixel pi) : COLOR
| + | |
− | {
| + | |
− | float4 scale1Color = tex2D(base, pi.txScale1);
| + | |
− | scale1color.xyz = scale1color.xyz;
| + | |
− | float4 scale2Color = tex2D(base2, pi.txScale2)*scale2Factor.x;
| + | |
− | float4 result = (scale1Color + scale2Color);
| + | |
− | float4 lightMapColor = tex2D(lightMap, pi.txltMap);
| + | |
− | return float4(result.xyz*lightMapColor.xyz, result.w);
| + | |
− | }
| + | |
− | endShaderSource
| + | |
− | end # end shader program
| + | |
− | enddef
| + | |
| | | |
− | | + | stage |
− | define LightSnowVS_PS()
| + | textureAddressing clamp clamp |
− | pass
| + | texture $reflectionRenderTarget |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | textureBlend select(texture) select(colorScalar) |
− | depthTest true -enableDepthWrite false
| + | end |
− | depthTestFunction acceptIfEqual
| + | |
− |
| + | |
− | shaderProgram -target vertexProgram -method compile -version 1_1
| + | |
− | bindConstants 0 -bindingID geomToClip -constantCount 4
| + | |
− | bindConstants 4 -bindingID geomToGlobal -constantCount 3
| + | |
− | bindConstants 8 -bindingID immediateData -data (1/(($scaleStage1).x), 1/(($scaleStage1).y), 1/(($scaleStage2).x), 1/(($scaleStage2).y)) -constantType float
| + | |
− |
| + | |
− | shaderSource
| + | |
− | float4x4 clipSpaceMatrix : register(c0);
| + | |
− | float4x3 modelToWorld : register(c4);
| + | |
− | float4 scaleData : register(c8);
| + | |
− |
| + | |
− | struct InputVertex
| + | |
− | {
| + | |
− | float3 position: POSITION0;
| + | |
− | float2 txCoord : TEXCOORD0;
| + | |
− | };
| + | |
− |
| + | |
− | struct OutputVertex
| + | |
− | {
| + | |
− | float4 clipPosition : POSITION;
| + | |
− | float2 txScale1 : TEXCOORD0;
| + | |
− | float2 txScale2 : TEXCOORD1;
| + | |
− | float2 txltMap : TEXCOORD2;
| + | |
− | };
| + | |
− |
| + | |
− | OutputVertex VertexMain( InputVertex i)
| + | |
− | {
| + | |
− | OutputVertex o;
| + | |
− | o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix);
| + | |
− | float3 worldPos = mul(float4(i.position.xyz, 1.0f), modelToWorld);
| + | |
− | o.txScale1 = worldPos.xy * scaleData.xy;
| + | |
− | o.txScale2 = worldPos.xy * scaleData.zw;
| + | |
− | o.txltMap = i.txCoord;
| + | |
− | return o;
| + | |
− | }
| + | |
− | endShaderSource
| + | |
− | end # end shader program
| + | |
− |
| + | |
− | if (tsIsDay)
| + | |
− | if ($useHWShader1Path)
| + | |
− | create LightSnowDayPS("1_1")
| + | |
− | else
| + | |
− | create LightSnowDayPS(${psVersion}_0) | + | |
− | endif
| + | |
− | else
| + | |
− | if ($useHWShader1Path)
| + | |
− | create LightSnowNightPS("1_1")
| + | |
− | else
| + | |
− | create LightSnowNightPS(${psVersion}_0)
| + | |
− | endif
| + | |
− | endif
| + | |
− |
| + | |
− | sampler base
| + | |
− | texture "${snowTexture}"
| + | |
− | textureAddressing tile tile
| + | |
− | end
| + | |
− |
| + | |
− | sampler base2
| + | |
− | texture "${snowTexture2}"
| + | |
− | textureAddressing tile tile
| + | |
− | end
| + | |
− |
| + | |
− | if (not tsIsDay)
| + | |
− | sampler lightMap
| + | |
− | texture "floorLightMap_${page}" | + | |
− | textureAddressing tile tile
| + | |
| end | | end |
− | endif
| |
− | end
| |
− | enddef
| |
− |
| |
− | define LightSnowFF()
| |
− | pass -fixedFunction
| |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| |
− | fillmode $stdMatFillMode
| |
− | depthTest true -enableDepthWrite false
| |
− |
| |
− | if ($kRaiseLightSnowFF)
| |
− | ffDepthOffset 2
| |
− | depthTestFunction acceptIfLessOrEqual
| |
− | else
| |
− | depthTestFunction acceptIfEqual
| |
− | endif
| |
− |
| |
− | stage
| |
− | texture $snowTexture
| |
− | textureAddressing tile tile
| |
− | ffTextureCoordsSource fromPosition
| |
− | ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert
| |
− | textureBlend select(texture) select(texture)
| |
| end | | end |
− |
| |
− | if (not $singlePass)
| |
− | stage
| |
− | texture $snowTexture2
| |
− | textureAddressing tile tile
| |
− | ffTextureMatrix -cameraToGlobal -scalev $scaleStage2 -invert
| |
− | ffTextureCoordsSource fromPosition
| |
− | textureBlend add(texture outRegister) add(outRegister texture)
| |
− | end
| |
− | else
| |
− | # a dummy stage so if the shader has to fail it should fail
| |
− | stage
| |
− | texture "floorLightMap_${page}"
| |
− | textureBlend select(outRegister) select(outRegister)
| |
− | end
| |
− | endif
| |
− |
| |
− |
| |
− | if (not tsIsDay)
| |
− | stage
| |
− | texture "floorLightMap_${page}"
| |
− | textureAddressing tile tile
| |
− | ffTextureCoordsSource 0
| |
− | textureBlend multiplyScale2(texture outRegister) select(outRegister)
| |
− | end
| |
− | endif
| |
− |
| |
− | # a dummy stage so if the shader has to fail it should fail
| |
− | stage
| |
− | texture "floorLightMap_${page}"
| |
− | textureBlend select(outRegister) select(outRegister)
| |
− | end
| |
− |
| |
− | end
| |
| enddef | | enddef |
| | | |
− | define LightSnowFFLowEnd()
| + | #---------------------------------------------------------------------------------------------------------------# |
− | pass -fixedFunction
| + | |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | |
− | fillmode $stdMatFillMode
| + | |
− | depthTest true -enableDepthWrite false
| + | |
− | ffDepthOffset 1
| + | |
− | depthTestFunction acceptIfLessOrEqual
| + | |
− |
| + | |
− | if (tsIsDay)
| + | |
− | colorScalar (1, 1, 1, 1)
| + | |
− | else
| + | |
− | colorScalar (0.17, 0.17, 0.43, 1)
| + | |
− | endif
| + | |
− |
| + | |
− | stage
| + | |
− | texture $snowTexture
| + | |
− | textureAddressing tile tile
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert
| + | |
− | textureBlend multiply(texture colorScalar) select(texture)
| + | |
− | end
| + | |
− |
| + | |
− | if (not $singlePass)
| + | |
− | stage
| + | |
− | texture $snowTexture
| + | |
− | textureAddressing tile tile
| + | |
− | ffTextureMatrix -cameraToGlobal -scalev $scaleStage2 -invert
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | textureBlend multiplyAdd(texture colorScalar outRegister) add(outRegister texture)
| + | |
− | end
| + | |
− | else
| + | |
− | stage
| + | |
− | texture $snowTexture
| + | |
− | textureAddressing tile tile
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert
| + | |
− | textureBlend multiplyAdd(texture colorScalar outRegister) select(outRegister)
| + | |
− | end
| + | |
− | endif
| + | |
| | | |
− | end
| + | materialDefinition transparent_mirror_reflection |
− | enddef
| + | setDefinition TransparentMirrorReflection |
− | | + | |
− | define LightSnow()
| + | |
− | material
| + | |
− | setv2 scaleStage1 (23, 23)
| + | |
− | setv2 scaleStage2 (17, 17)
| + | |
− |
| + | |
− | if (tsHasHail)
| + | |
− | set snowTexture "hail-ground-surface"
| + | |
− | set snowTexture2 "hail-ground-surface"
| + | |
− | setv2 scaleStage1 (4, 4)
| + | |
− | setv2 scaleStage2 (3, 3)
| + | |
− | endif
| + | |
− | | + | |
− | shader -layer (-1)
| + | |
− | create DetermineHardwareSupport()
| + | |
− | if ((not $kRaiseLightSnowFF and $useHWShader1Path) or $useHWShader2Path)
| + | |
− | create LightSnowVS_PS()
| + | |
− | else
| + | |
− | create LightSnowFF() # can use more than two stages
| + | |
− | endif
| + | |
− | end
| + | |
− |
| + | |
− | shader -layer (-1) #if the above shader fails for some reason
| + | |
− | create LightSnowFFLowEnd()
| + | |
− | end
| + | |
− | end
| + | |
− | enddef
| + | |
− | | + | |
− | materialDefinition TerrainSnowMaterial | + | |
− | setDefinition TerrainSnowShader | + | |
| end | | end |
− |
| |
− | materialDefinition RoadSnowMaterial
| |
− | setDefinition LightSnow
| |
− | addParam snowTexture snow-light-pass2
| |
− | addParam snowTexture2 snow-light-pass1
| |
− | addParam singlePass true
| |
− | addParam page 0
| |
− | end
| |
− |
| |
− | materialDefinition LightSnowMaterial
| |
− | setDefinition LightSnow
| |
− | addParam snowTexture snow-light-pass2
| |
− | addParam snowTexture2 snow-light-pass1
| |
− | addParam singlePass false
| |
− | addParam page 0
| |
− | end
| |
− |
| |
− | materialDefinition terrainLightingMaterial
| |
− | setDefinition TerrainLighting
| |
− | end
| |
− |
| |
− | materialDefinition waterOnTerrain
| |
− | setDefinition TerrainWater
| |
− | end
| |
− |
| |
− | materialDefinition XrayCursorBoxDirtyRectMaterial
| |
− | setDefinition XRayCursorMaterial
| |
− | end
| |
− |
| |
− | define GeneralSnowMaterialFF()
| |
− | material
| |
− | shader -layer ($stdMatLayer)
| |
− | pass -fixedFunction
| |
− | create LightingStatesParam(false false)
| |
− | setv3 half (0.5,0.5,0.5)
| |
− | if ($stdMatSpecPower != 0)
| |
− | ffMatCoef -amb ($stdMatDiffCoef * $half) -ambAlpha $stdMatAlphaMultiplier -diff ($stdMatDiffCoef * $half) -diffAlpha $stdMatAlphaMultiplier -spec $stdMatSpecCoef -specPow $stdMatSpecPower
| |
− | addSpecular true
| |
− | else
| |
− | ffMatCoef -amb ($stdMatDiffCoef * $half) -ambAlpha $stdMatAlphaMultiplier -diff ($stdMatDiffCoef * $half) -diffAlpha $stdMatAlphaMultiplier -spec (0,0,0) -specPow 0
| |
− | endif
| |
− |
| |
− | create StandardShaderFBAlphaState($stdMatAlphaBlendMode)
| |
− |
| |
− |
| |
− | stage
| |
− | texture $stdMatBaseTextureName
| |
− | textureBlend multiplyScale2(diffuse texture) select(texture)
| |
− | end
| |
− |
| |
− | if (tsIsDay)
| |
− | colorScalar $colorToAdd
| |
− | stage
| |
− | textureBlend add(outRegister colorScalar) select(outRegister)
| |
− | end
| |
− | endif
| |
− |
| |
− | end
| |
− |
| |
− | end
| |
− | end
| |
− | enddef
| |
− |
| |
− | define GeneralReflectiveMaterial()
| |
− | create StandardMaterial()
| |
− | enddef
| |
− |
| |
− | materialDefinition puddle_liquid_rain
| |
− | setDefinition GeneralReflectiveMaterial
| |
− | addParam deprecatedStdMatInvDiffuseCoeffMultiplier 1.2
| |
− | addParam forceHighQualitySkinning 0
| |
− | addParam forceIgnoreShapeBlend 0
| |
− | addParam reflectivity 0.1
| |
− | addParam stdMatAlphaBlendMode blend
| |
− | addParam stdMatAlphaMultiplier 0.5
| |
− | addParam stdMatAlphaRefValue 127
| |
− | addParam stdMatAlphaTestEnabled 0
| |
− | addParam stdMatBaseTextureAlphaReplicate 0
| |
− | addParam stdMatCullMode cullClockwise
| |
− | addParam stdMatDiffCoef 0.39,0.46,0.49
| |
− | addParam stdMatEmissiveCoef 0,0,0
| |
− | addParam stdMatEnvCubeBlurFactor 0.000000
| |
− | addParam stdMatEnvCubeCoef 0.3,0.3,0.3
| |
− | addParam stdMatEnvCubeLockedToCamera 0
| |
− | addParam stdMatEnvCubeMode reflection
| |
− | addParam stdMatEnvCubeTextureName reflectionkitchenhighcontrast-envcube
| |
− | addParam stdMatFillMode solid
| |
− | addParam stdMatLayer 0
| |
− | addParam stdMatLightingEnabled 1
| |
− | addParam stdMatMinLightRangeHint 4
| |
− | addParam stdMatSpecCoef 0.54,0.72,0.76
| |
− | addParam stdMatSpecPower 22
| |
− | addParam stdMatAddLayer -10
| |
− | end
| |
− |
| |
− | materialDefinition puddle_liquid_blue
| |
− | setDefinition GeneralReflectiveMaterial
| |
− | addParam deprecatedStdMatInvDiffuseCoeffMultiplier 1.2
| |
− | addParam forceHighQualitySkinning 0
| |
− | addParam forceIgnoreShapeBlend 0
| |
− | addParam reflectivity 0.1
| |
− | addParam stdMatAlphaBlendMode blend
| |
− | addParam stdMatAlphaMultiplier 0.5
| |
− | addParam stdMatAlphaRefValue 127
| |
− | addParam stdMatAlphaTestEnabled 0
| |
− | addParam stdMatBaseTextureAlphaReplicate 0
| |
− | addParam stdMatCullMode cullClockwise
| |
− | addParam stdMatDiffCoef 0.23,0.41,0.49
| |
− | addParam stdMatEmissiveCoef 0,0,0
| |
− | addParam stdMatEnvCubeBlurFactor 0.000000
| |
− | addParam stdMatEnvCubeCoef 0.1,0.1,0.1
| |
− | addParam stdMatEnvCubeLockedToCamera 0
| |
− | addParam stdMatEnvCubeMode reflection
| |
− | addParam stdMatEnvCubeTextureName reflectionkitchenhighcontrast-envcube
| |
− | addParam stdMatFillMode solid
| |
− | addParam stdMatLayer 0
| |
− | addParam stdMatLightingEnabled 1
| |
− | addParam stdMatMinLightRangeHint 4
| |
− | addParam stdMatSpecCoef 0.55,0.55,0.55
| |
− | addParam stdMatSpecPower 6.1
| |
− | addParam stdMatAddLayer -10
| |
− | end
| |
− |
| |
− |
| |
− | #endshader
| |