Difference between revisions of "ShaderWallPS"
From SimsWiki
(EP3-OFB) |
(EP4-PETS) |
||
Line 1: | Line 1: | ||
<pre> | <pre> | ||
− | + | EP4-PETS | |
0xCD7FE87A | 0xCD7FE87A | ||
0x1C0532FA | 0x1C0532FA | ||
Line 7: | Line 7: | ||
0xFFDE6F3E | 0xFFDE6F3E | ||
# pixelshaderwalls | # pixelshaderwalls | ||
+ | |||
+ | setb PoolWallCurved false | ||
+ | |||
+ | define WallsPS3() | ||
+ | shaderProgram -target pixelProgram -method compile -version 3_0 | ||
+ | bindConstants 2 -bindingID allTextureLights -constantCount 1 | ||
+ | |||
+ | if ($PoolWallCurved) | ||
+ | bindConstants 1 -bindingID immediateData -data ( 0.0, 0.38, 1, 1) | ||
+ | else | ||
+ | bindConstants 1 -bindingID immediateData -data ( 1.0, 0.0, 0, 0) | ||
+ | endif | ||
+ | |||
+ | shaderSource | ||
+ | float4 textureLight : register(c2); | ||
+ | float4 curvedWall : register(c1); | ||
+ | |||
+ | |||
+ | sampler base; | ||
+ | sampler lightmap; | ||
+ | sampler caustics; | ||
+ | sampler shadowMap; | ||
+ | struct cInputPixel | ||
+ | { | ||
+ | float2 txBase : TEXCOORD0; | ||
+ | float2 txLightMap: TEXCOORD1; | ||
+ | float2 txCaustics: TEXCOORD2; | ||
+ | float4 vPosLight : TEXCOORD3; | ||
+ | float4 shadowTex : TEXCOORD4; | ||
+ | float dotNL : COLOR0; | ||
+ | }; | ||
+ | |||
+ | float OffsetLookup(sampler2D map, float4 loc, float4 offset) | ||
+ | { | ||
+ | return tex2Dproj(map, loc+offset).r; | ||
+ | } | ||
+ | |||
+ | |||
+ | float4 PixelMain(cInputPixel pi) : COLOR | ||
+ | { | ||
+ | float4 baseColor = tex2D(base, pi.txBase); | ||
+ | float4 lightMapColor = tex2D(lightmap, pi.txLightMap); | ||
+ | lightMapColor = textureLight.r < 0.5 ? (lightMapColor) : 0.5f.xxxx; | ||
+ | float4 causticsColor = tex2D(caustics, pi.txCaustics); | ||
+ | float4 result = baseColor * saturate(lightMapColor*2.0); | ||
+ | |||
+ | float4 vTexCoords[25]; | ||
+ | vTexCoords[0] = float4(-0.000976563f, -0.000976563f, 0.0f, 0.0f ); | ||
+ | vTexCoords[1] = float4(-0.000976563f, -0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[2] = float4(-0.000976563f, 0.000000000f, 0.0f, 0.0f ); | ||
+ | vTexCoords[3] = float4(-0.000976563f, 0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[4] = float4(-0.000976563f, 0.000976563f, 0.0f, 0.0f ); | ||
+ | vTexCoords[5] = float4(-0.000488281f, -0.000976563f, 0.0f, 0.0f ); | ||
+ | vTexCoords[6] = float4(-0.000488281f, -0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[7] = float4(-0.000488281f, 0.000000000f, 0.0f, 0.0f ); | ||
+ | vTexCoords[8] = float4(-0.000488281f, 0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[9] = float4(-0.000488281f, 0.000976563f, 0.0f, 0.0f ); | ||
+ | vTexCoords[10] = float4(0.000000000f, -0.000976563f, 0.0f, 0.0f ); | ||
+ | vTexCoords[11] = float4(0.000000000f, -0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[12] = float4(0.000000000f, 0.000000000f, 0.0f, 0.0f ); | ||
+ | vTexCoords[13] = float4(0.000000000f, 0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[14] = float4(0.000000000f, 0.000976563f, 0.0f, 0.0f ); | ||
+ | vTexCoords[15] = float4(0.000488281f, -0.000976563f, 0.0f, 0.0f ); | ||
+ | vTexCoords[16] = float4(0.000488281f, -0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[17] = float4(0.000488281f, 0.000000000f, 0.0f, 0.0f ); | ||
+ | vTexCoords[18] = float4(0.000488281f, 0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[19] = float4(0.000488281f, 0.000976563f, 0.0f, 0.0f ); | ||
+ | vTexCoords[20] = float4(0.000976563f, -0.000976563f, 0.0f, 0.0f ); | ||
+ | vTexCoords[21] = float4(0.000976563f, -0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[22] = float4(0.000976563f, 0.000000000f, 0.0f, 0.0f ); | ||
+ | vTexCoords[23] = float4(0.000976563f, 0.000488281f, 0.0f, 0.0f ); | ||
+ | vTexCoords[24] = float4(0.000976563f, 0.000976563f, 0.0f, 0.0f ); | ||
+ | |||
+ | float4 vWeights[6] = {{0.0232468,0.0338240,0.0383276,0.0338240}, | ||
+ | {0.0232468,0.0338240,0.0492136,0.0557663}, | ||
+ | {0.0492136,0.0338240, 0.0383276,0.0557663}, | ||
+ | {0.0631915,0.0557663,0.0383276, 0.0338240}, | ||
+ | {0.0492136,0.0557663,0.0492136,0.0338240}, | ||
+ | {0.0232468,0.0338240,0.0383276,0.0338240}}; | ||
+ | |||
+ | float lastWeight = 0.0232468; | ||
+ | |||
+ | float4 depth = (pi.vPosLight.z / pi.vPosLight.w) - 0.011; | ||
+ | |||
+ | float lightAmount = 0.0f; | ||
+ | |||
+ | float4 depths[6]; | ||
+ | int i = 0; | ||
+ | for(int j = 0; j < 6; i+=4, ++j) | ||
+ | { | ||
+ | float4 results; | ||
+ | results.x = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i]); | ||
+ | results.y = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+1]); | ||
+ | results.z = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+2]); | ||
+ | results.w = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+3]); | ||
+ | depths[j] = results > depth ? vWeights[j] : float4(0.0, 0.0, 0.0, 0.0); | ||
+ | } | ||
+ | float lastDepth = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[24]); | ||
+ | lightAmount += lastDepth <= depth ? lastWeight : 0.0f; | ||
+ | lightAmount += dot(depths[0] + depths[1] + depths[2] + depths[3] + depths[4] + depths[5], pi.dotNL); | ||
+ | |||
+ | return result*0.8 + causticsColor*textureLight*lightAmount*pi.txBase.y + 0.2*result*lightAmount; | ||
+ | } | ||
+ | endShaderSource | ||
+ | end # end shader program | ||
+ | enddef | ||
+ | |||
+ | define WallsPS2() | ||
+ | shaderProgram -target pixelProgram -method compile -version 3_0 | ||
+ | bindConstants 2 -bindingID allTextureLights -constantCount 1 | ||
+ | |||
+ | shaderSource | ||
+ | float4 textureLight : register(c2); | ||
+ | |||
+ | |||
+ | sampler base; | ||
+ | sampler lightmap; | ||
+ | sampler caustics; | ||
+ | sampler shadowMap; | ||
+ | struct cInputPixel | ||
+ | { | ||
+ | float2 txBase : TEXCOORD0; | ||
+ | float2 txLightMap: TEXCOORD1; | ||
+ | float2 txCaustics: TEXCOORD2; | ||
+ | float4 vPosLight : TEXCOORD3; | ||
+ | float4 shadowTex : TEXCOORD4; | ||
+ | float dotNL : COLOR0; | ||
+ | }; | ||
+ | |||
+ | float OffsetLookup(sampler2D map, float4 loc, float4 offset) | ||
+ | { | ||
+ | return tex2Dproj(map, loc+offset).r; | ||
+ | } | ||
+ | |||
+ | |||
+ | float4 PixelMain(cInputPixel pi) : COLOR | ||
+ | { | ||
+ | float4 baseColor = tex2D(base, pi.txBase); | ||
+ | float4 lightMapColor = tex2D(lightmap, pi.txLightMap); | ||
+ | lightMapColor = textureLight.r < 0.5 ? lightMapColor : 0.5f.xxxx; | ||
+ | float4 causticsColor = tex2D(caustics, pi.txCaustics); | ||
+ | float4 result = baseColor * saturate(lightMapColor*2.0); | ||
+ | |||
+ | float4 depth = (pi.vPosLight.z / pi.vPosLight.w) - 0.011; | ||
+ | |||
+ | float4 vTexCoords[16]; | ||
+ | vTexCoords[0] = float4(-0.000732422f, -0.000732422f, 0.0f, 0.0f ); | ||
+ | vTexCoords[1] = float4(-0.000732422f, -0.000244141f, 0.0f, 0.0f ); | ||
+ | vTexCoords[2] = float4(-0.000732422f, 0.000244141f, 0.0f, 0.0f ); | ||
+ | vTexCoords[3] = float4(-0.000732422f, 0.000732422f, 0.0f, 0.0f ); | ||
+ | vTexCoords[4] = float4(-0.000244141f, -0.000732422f, 0.0f, 0.0f ); | ||
+ | vTexCoords[5] = float4(-0.000244141f, -0.000244141f, 0.0f, 0.0f ); | ||
+ | vTexCoords[6] = float4(-0.000244141f, 0.000244141f, 0.0f, 0.0f ); | ||
+ | vTexCoords[7] = float4(-0.000244141f, 0.000732422f, 0.0f, 0.0f ); | ||
+ | vTexCoords[8] = float4(0.000244141f, -0.000732422f, 0.0f, 0.0f ); | ||
+ | vTexCoords[9] = float4(0.000244141f, -0.000244141f, 0.0f, 0.0f ); | ||
+ | vTexCoords[10] = float4(0.000244141f, 0.000244141f, 0.0f, 0.0f ); | ||
+ | vTexCoords[11] = float4(0.000244141f, 0.000732422f, 0.0f, 0.0f ); | ||
+ | vTexCoords[12] = float4(0.000732422f, -0.000732422f, 0.0f, 0.0f ); | ||
+ | vTexCoords[13] = float4(0.000732422f, -0.000244141f, 0.0f, 0.0f ); | ||
+ | vTexCoords[14] = float4(0.000732422f, 0.000244141f, 0.0f, 0.0f ); | ||
+ | vTexCoords[15] = float4(0.000732422f, 0.000732422f, 0.0f, 0.0f ); | ||
+ | |||
+ | float4 vWeights[4] = {{0.0479224,0.0615335,0.0615335,0.0479224}, | ||
+ | {0.0615335,0.0790106,0.0790106,0.0615335}, | ||
+ | {0.0615335,0.0790106,0.0790106,0.0615335}, | ||
+ | {0.0479224,0.0615335,0.0615335,0.0479224}}; | ||
+ | |||
+ | float4 depths[4]; | ||
+ | int i = 0; | ||
+ | for(int j = 0; j < 4; i+=4, ++j) | ||
+ | { | ||
+ | float4 results; | ||
+ | results.x = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i]); | ||
+ | results.y = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+1]); | ||
+ | results.z = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+2]); | ||
+ | results.w = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+3]); | ||
+ | depths[j] = results > depth ? vWeights[j] : float4(0.0, 0.0, 0.0, 0.0); | ||
+ | } | ||
+ | float lightAmount = dot(depths[0] + depths[1] + depths[2] + depths[3], pi.dotNL); | ||
+ | |||
+ | return result*0.8 + causticsColor*textureLight*lightAmount*pi.txBase.y + 0.2*result*lightAmount; | ||
+ | } | ||
+ | endShaderSource | ||
+ | end # end shader program | ||
+ | enddef | ||
+ | |||
+ | define PixelShaderWallsWithShadowMapping() | ||
+ | shader -layer $floorLayer | ||
+ | validateRenderShaderContext -vertexFormat position 0 required | ||
+ | validateRenderShaderContext -vertexFormat texcoord 0 required | ||
+ | validateRenderShaderContext -vertexFormat texcoord 1 required | ||
+ | |||
+ | pass -modifiedEachFrameHint -renderEachFrame | ||
+ | setf scaleU (1.0 / $floorMaterialScaleU) | ||
+ | setf scaleV (1.0 / $floorMaterialScaleV) | ||
+ | setv3 evalDiffuse ($stdMatDiffCoef.xyz) | ||
+ | |||
+ | shaderProgram -target vertexProgram -method compile -version 1_1 | ||
+ | bindConstants 0 -bindingID geomToClip -constantCount 4 | ||
+ | bindConstants 4 -bindingID immediateData -data ( $scaleU, $scaleV, 1, 1) | ||
+ | bindConstants 5 -bindingID geomToGlobal -constantCount 3 | ||
+ | bindConstants 8 -bindingID immediateData -data ( 1, -2.5, 0, 0.3) | ||
+ | bindConstants 9 -bindingID immediateData -data ( 1, 1, 1, 0) | ||
+ | bindConstants 10 -bindingID immediateData -data ( 0, 0, 0, 0 ) | ||
+ | bindConstants 11 -bindingID cameraToLightClip -constantCount 4 | ||
+ | bindConstants 15 -bindingID cameraToLightClipAdj -constantCount 4 | ||
+ | bindConstants 19 -bindingID sunLightDir | ||
+ | |||
+ | shaderSource | ||
+ | float4x4 clipSpaceMatrix : register(c0); | ||
+ | float4 textureConstants : register(c4); | ||
+ | float4x3 objToGlobal : register(c5); | ||
+ | float4 projCaustics0 : register(c8); | ||
+ | float4 projCaustics1 : register(c9); | ||
+ | float4 projCaustics2 : register(c10); | ||
+ | float4x4 lightClipSpaceMatrix : register(c11); | ||
+ | float4x4 lightClipSpaceMatrixAdj : register(c15); | ||
+ | float4 sunlightDir : register(c19); | ||
+ | |||
+ | |||
+ | struct InputVertex | ||
+ | { | ||
+ | float3 position: POSITION0; | ||
+ | float3 normal : NORMAL0; | ||
+ | float2 tc0 : TEXCOORD0; | ||
+ | float2 tc1 : TEXCOORD2; | ||
+ | }; | ||
+ | |||
+ | struct OutputVertex | ||
+ | { | ||
+ | float4 clipPosition : POSITION; | ||
+ | float2 txBase : TEXCOORD0; | ||
+ | float2 txLightMap: TEXCOORD1; | ||
+ | float2 txCaustics: TEXCOORD2; | ||
+ | float4 vPosLight : TEXCOORD3; | ||
+ | float4 shadowTex : TEXCOORD4; | ||
+ | float2 dotNL : COLOR0; | ||
+ | }; | ||
+ | |||
+ | OutputVertex VertexMain( InputVertex i) | ||
+ | { | ||
+ | OutputVertex o; | ||
+ | |||
+ | o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix); | ||
+ | o.txBase = textureConstants * i.tc0; | ||
+ | o.txLightMap = i.tc1; | ||
+ | float3 wPosition = mul(i.position, objToGlobal); | ||
+ | float3 wPos = wPosition*0.3; | ||
+ | o.txCaustics.x = (wPos.x * projCaustics0.x) + (wPos.y * projCaustics0.y) + (wPos.z * projCaustics0.z); | ||
+ | o.txCaustics.y = (wPos.x * projCaustics1.x) + (wPos.y * projCaustics1.y) + (wPos.z * projCaustics1.z); | ||
+ | o.vPosLight = mul(float4(wPosition, 1), lightClipSpaceMatrix); | ||
+ | o.dotNL = dot(i.normal, sunlightDir.xyz) > 0.11f ? 1.0f : 0.0f; | ||
+ | o.shadowTex = mul(float4(wPosition, 1), lightClipSpaceMatrixAdj); | ||
+ | return o; | ||
+ | } | ||
+ | endShaderSource | ||
+ | end # end shader program | ||
+ | |||
+ | if ($psVersion >= 3) | ||
+ | create WallsPS3() | ||
+ | else | ||
+ | create WallsPS2() | ||
+ | endif | ||
+ | |||
+ | |||
+ | sampler base | ||
+ | texture ${wallpaperTextureName} | ||
+ | if (viewerRenderType = $kRenderTypeThumbnail) | ||
+ | textureAddressing tile tile | ||
+ | else | ||
+ | textureAddressing clamp tile | ||
+ | endif | ||
+ | end | ||
+ | |||
+ | sampler lightmap | ||
+ | texture "wallLightMap_0" | ||
+ | textureAddressing tile tile | ||
+ | end | ||
+ | |||
+ | sampler caustics | ||
+ | texture causticsTile | ||
+ | textureAddressing tile tile | ||
+ | end | ||
+ | |||
+ | sampler shadowMap | ||
+ | texture poolRenderTarget | ||
+ | textureFilterHint point point | ||
+ | textureMIPFilterHint disabled | ||
+ | textureAddressing clamp clamp | ||
+ | end | ||
+ | |||
+ | end | ||
+ | end | ||
+ | enddef | ||
+ | |||
define PS2WallRendering(wallBumpMaps) | define PS2WallRendering(wallBumpMaps) | ||
Line 25: | Line 321: | ||
if ($caustics) | if ($caustics) | ||
+ | #create PixelShaderWallsWithShadowMapping() | ||
pass -modifiedEachFrameHint | pass -modifiedEachFrameHint | ||
else | else | ||
− | pass | + | pass |
− | + | endif | |
− | + | ||
− | + | if (true) | |
− | + | fillmode $stdMatFillMode | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | create FirstPassWallVertexShader($caustics) | ||
+ | |||
+ | |||
+ | shaderProgram -target pixelProgram -method assemble | ||
+ | |||
+ | bindConstants 1 -bindingID immediateData -data ($wallHighlightIntensity) | ||
+ | |||
+ | shaderSource | ||
+ | ps_2_0 | ||
+ | def c0, 0,0.5,1,2 | ||
endShaderSource | endShaderSource | ||
− | + | ||
− | + | if ($wallMaskOK) | |
− | + | shaderSource "dcl_2d s0 ; cutout" | |
+ | endif | ||
+ | |||
shaderSource | shaderSource | ||
− | + | dcl_2d s1 ; base | |
− | + | dcl t0.xy ; base mapping | |
+ | dcl t1.xy ; light map space | ||
endShaderSource | endShaderSource | ||
− | + | ||
− | + | if ($lightMapping) | |
− | + | shaderSource | |
− | + | dcl_2d s2 ; lightmap | |
− | + | dcl t2.xy ; also incidence space. | |
− | + | ||
− | + | endShaderSource | |
− | + | endif | |
+ | |||
+ | if (&wallBumpMaps) | ||
+ | shaderSource | ||
+ | dcl_2d s3 ; normalmap | ||
+ | dcl_2d s4 ; incidence | ||
+ | endShaderSource | ||
+ | endif | ||
+ | |||
+ | |||
+ | if ($wallHighlightOn) | ||
+ | shaderSource "dcl_2d s5 ; highlight texture" | ||
+ | endif | ||
+ | |||
+ | if ($caustics) | ||
+ | shaderSource | ||
+ | dcl_2d s6 ; caustics texture | ||
+ | dcl t3.xy ; caustics projection | ||
+ | dcl v0 ; wall height, so caustics can fade off in a pool | ||
+ | endShaderSource | ||
+ | endif | ||
+ | |||
+ | |||
+ | |||
+ | if ($wallMaskOK) | ||
+ | shaderSource | ||
+ | texld r11, t0, s0 | ||
+ | sub r10, r11.a, c0.y ; any values under 127 become clip pixels. | ||
+ | texkill r10 | ||
+ | endShaderSource | ||
+ | endif | ||
+ | |||
shaderSource | shaderSource | ||
− | + | texld r0, t1, s1 ; base map | |
− | + | ||
− | + | ||
endShaderSource | endShaderSource | ||
− | + | ||
− | + | if ($lightMapping) | |
− | + | ||
− | + | shaderSource | |
− | + | texld r1, t2, s2 ; light map | |
+ | mul r2.rgb, r0, r1 | ||
+ | endShaderSource | ||
+ | else | ||
+ | shaderSource "mul r2, r0, c0.y" | ||
+ | endif | ||
+ | |||
shaderSource | shaderSource | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | mul r2.rgb, r2, c0.w ; result * 2 | |
+ | |||
+ | endShaderSource | ||
+ | |||
+ | if (&wallBumpMaps) | ||
+ | shaderSource | ||
+ | texld r3, t1, s3 | ||
+ | texld r4, t2, s4 | ||
+ | |||
+ | mad r5, r3, c0.w, -c0.z ; 2x-1 | ||
+ | mad r6, r4, c0.w, -c0.z ; 2x-1 | ||
+ | |||
+ | dp3_sat r2.a, r5, r6 ; incidence dot normal | ||
+ | mul r2, r2, r2.a ; roll this into the lightmap. | ||
+ | |||
+ | endShaderSource | ||
+ | endif | ||
+ | |||
+ | if ($caustics) | ||
+ | shaderSource | ||
+ | texld r8, t3, s6 | ||
+ | mad r2.rgb, v0, r8, r2 | ||
+ | endShaderSource | ||
+ | endif | ||
+ | |||
+ | if ($wallHighlightOn) | ||
+ | shaderSource | ||
+ | texld r7, t0, s5 | ||
+ | |||
+ | mad r2.rgb, r2, r7.a, c1 | ||
+ | |||
+ | endShaderSource | ||
+ | endif | ||
− | + | shaderSource | |
− | + | mov r2.a, c0.z | |
− | + | mov oC0, r2 | |
− | + | ||
− | + | endShaderSource | |
− | + | end #shader program | |
− | + | ||
+ | if ($wallMaskOK) | ||
+ | sampler 0 | ||
+ | textureAddressing clamp clamp | ||
+ | texture ${wallMaskTextureName} | ||
+ | end | ||
+ | endif | ||
− | |||
− | + | sampler 1 | |
− | + | texture ${wallpaperTextureName} | |
− | + | if (viewerRenderType = $kRenderTypeThumbnail) | |
− | + | textureAddressing tile tile | |
− | + | else | |
− | + | textureAddressing clamp tile | |
− | + | endif | |
− | + | end | |
− | + | ||
− | + | ||
− | + | if ($lightMapping) | |
− | + | sampler 2 | |
− | + | texture "wallLightMap_${page}" | |
− | + | end | |
− | + | ||
− | + | if (&wallBumpMaps) | |
− | + | sampler 3 | |
− | + | texture "${wallpaperNormalMapTextureName}" | |
+ | end | ||
+ | |||
+ | sampler 4 | ||
+ | texture "wallIncidenceMap_${page}" | ||
+ | end | ||
+ | endif | ||
+ | |||
+ | endif | ||
+ | |||
+ | if ($wallHighlightOn) | ||
+ | sampler 5 | ||
+ | texture "wall_selection_colors" | ||
+ | textureAddressing clamp clamp | ||
+ | end | ||
+ | endif | ||
+ | |||
if ($caustics) | if ($caustics) | ||
− | + | sampler 6 | |
− | + | texture causticsTile | |
− | + | textureAddressing tile tile | |
− | + | end | |
endif | endif | ||
− | + | end #pass | |
− | + | endif | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end #shader | end #shader | ||
Line 413: | Line 715: | ||
sampler 0 | sampler 0 | ||
texture $wallpaperTextureName ${wallpaperTextureParam} | texture $wallpaperTextureName ${wallpaperTextureParam} | ||
− | textureAddressing tile tile | + | if (viewerRenderType = $kRenderTypeThumbnail) |
+ | textureAddressing tile tile | ||
+ | else | ||
+ | textureAddressing clamp tile | ||
+ | endif | ||
end | end | ||
Line 526: | Line 832: | ||
sampler 1 | sampler 1 | ||
texture $wallpaperTextureName ${wallpaperTextureParam} | texture $wallpaperTextureName ${wallpaperTextureParam} | ||
− | textureAddressing tile tile | + | if (viewerRenderType = $kRenderTypeThumbnail) |
+ | textureAddressing tile tile | ||
+ | else | ||
+ | textureAddressing clamp tile | ||
+ | endif | ||
end | end | ||
Line 604: | Line 914: | ||
sampler 1 | sampler 1 | ||
texture $wallpaperTextureName ${wallpaperTextureParam} | texture $wallpaperTextureName ${wallpaperTextureParam} | ||
− | textureAddressing tile tile | + | if (viewerRenderType = $kRenderTypeThumbnail) |
+ | textureAddressing tile tile | ||
+ | else | ||
+ | textureAddressing clamp tile | ||
+ | endif | ||
end | end | ||
Revision as of 09:16, 24 March 2007
EP4-PETS 0xCD7FE87A 0x1C0532FA 0x3035AF69 0xFFDE6F3E # pixelshaderwalls setb PoolWallCurved false define WallsPS3() shaderProgram -target pixelProgram -method compile -version 3_0 bindConstants 2 -bindingID allTextureLights -constantCount 1 if ($PoolWallCurved) bindConstants 1 -bindingID immediateData -data ( 0.0, 0.38, 1, 1) else bindConstants 1 -bindingID immediateData -data ( 1.0, 0.0, 0, 0) endif shaderSource float4 textureLight : register(c2); float4 curvedWall : register(c1); sampler base; sampler lightmap; sampler caustics; sampler shadowMap; struct cInputPixel { float2 txBase : TEXCOORD0; float2 txLightMap: TEXCOORD1; float2 txCaustics: TEXCOORD2; float4 vPosLight : TEXCOORD3; float4 shadowTex : TEXCOORD4; float dotNL : COLOR0; }; float OffsetLookup(sampler2D map, float4 loc, float4 offset) { return tex2Dproj(map, loc+offset).r; } float4 PixelMain(cInputPixel pi) : COLOR { float4 baseColor = tex2D(base, pi.txBase); float4 lightMapColor = tex2D(lightmap, pi.txLightMap); lightMapColor = textureLight.r < 0.5 ? (lightMapColor) : 0.5f.xxxx; float4 causticsColor = tex2D(caustics, pi.txCaustics); float4 result = baseColor * saturate(lightMapColor*2.0); float4 vTexCoords[25]; vTexCoords[0] = float4(-0.000976563f, -0.000976563f, 0.0f, 0.0f ); vTexCoords[1] = float4(-0.000976563f, -0.000488281f, 0.0f, 0.0f ); vTexCoords[2] = float4(-0.000976563f, 0.000000000f, 0.0f, 0.0f ); vTexCoords[3] = float4(-0.000976563f, 0.000488281f, 0.0f, 0.0f ); vTexCoords[4] = float4(-0.000976563f, 0.000976563f, 0.0f, 0.0f ); vTexCoords[5] = float4(-0.000488281f, -0.000976563f, 0.0f, 0.0f ); vTexCoords[6] = float4(-0.000488281f, -0.000488281f, 0.0f, 0.0f ); vTexCoords[7] = float4(-0.000488281f, 0.000000000f, 0.0f, 0.0f ); vTexCoords[8] = float4(-0.000488281f, 0.000488281f, 0.0f, 0.0f ); vTexCoords[9] = float4(-0.000488281f, 0.000976563f, 0.0f, 0.0f ); vTexCoords[10] = float4(0.000000000f, -0.000976563f, 0.0f, 0.0f ); vTexCoords[11] = float4(0.000000000f, -0.000488281f, 0.0f, 0.0f ); vTexCoords[12] = float4(0.000000000f, 0.000000000f, 0.0f, 0.0f ); vTexCoords[13] = float4(0.000000000f, 0.000488281f, 0.0f, 0.0f ); vTexCoords[14] = float4(0.000000000f, 0.000976563f, 0.0f, 0.0f ); vTexCoords[15] = float4(0.000488281f, -0.000976563f, 0.0f, 0.0f ); vTexCoords[16] = float4(0.000488281f, -0.000488281f, 0.0f, 0.0f ); vTexCoords[17] = float4(0.000488281f, 0.000000000f, 0.0f, 0.0f ); vTexCoords[18] = float4(0.000488281f, 0.000488281f, 0.0f, 0.0f ); vTexCoords[19] = float4(0.000488281f, 0.000976563f, 0.0f, 0.0f ); vTexCoords[20] = float4(0.000976563f, -0.000976563f, 0.0f, 0.0f ); vTexCoords[21] = float4(0.000976563f, -0.000488281f, 0.0f, 0.0f ); vTexCoords[22] = float4(0.000976563f, 0.000000000f, 0.0f, 0.0f ); vTexCoords[23] = float4(0.000976563f, 0.000488281f, 0.0f, 0.0f ); vTexCoords[24] = float4(0.000976563f, 0.000976563f, 0.0f, 0.0f ); float4 vWeights[6] = {{0.0232468,0.0338240,0.0383276,0.0338240}, {0.0232468,0.0338240,0.0492136,0.0557663}, {0.0492136,0.0338240, 0.0383276,0.0557663}, {0.0631915,0.0557663,0.0383276, 0.0338240}, {0.0492136,0.0557663,0.0492136,0.0338240}, {0.0232468,0.0338240,0.0383276,0.0338240}}; float lastWeight = 0.0232468; float4 depth = (pi.vPosLight.z / pi.vPosLight.w) - 0.011; float lightAmount = 0.0f; float4 depths[6]; int i = 0; for(int j = 0; j < 6; i+=4, ++j) { float4 results; results.x = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i]); results.y = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+1]); results.z = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+2]); results.w = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+3]); depths[j] = results > depth ? vWeights[j] : float4(0.0, 0.0, 0.0, 0.0); } float lastDepth = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[24]); lightAmount += lastDepth <= depth ? lastWeight : 0.0f; lightAmount += dot(depths[0] + depths[1] + depths[2] + depths[3] + depths[4] + depths[5], pi.dotNL); return result*0.8 + causticsColor*textureLight*lightAmount*pi.txBase.y + 0.2*result*lightAmount; } endShaderSource end # end shader program enddef define WallsPS2() shaderProgram -target pixelProgram -method compile -version 3_0 bindConstants 2 -bindingID allTextureLights -constantCount 1 shaderSource float4 textureLight : register(c2); sampler base; sampler lightmap; sampler caustics; sampler shadowMap; struct cInputPixel { float2 txBase : TEXCOORD0; float2 txLightMap: TEXCOORD1; float2 txCaustics: TEXCOORD2; float4 vPosLight : TEXCOORD3; float4 shadowTex : TEXCOORD4; float dotNL : COLOR0; }; float OffsetLookup(sampler2D map, float4 loc, float4 offset) { return tex2Dproj(map, loc+offset).r; } float4 PixelMain(cInputPixel pi) : COLOR { float4 baseColor = tex2D(base, pi.txBase); float4 lightMapColor = tex2D(lightmap, pi.txLightMap); lightMapColor = textureLight.r < 0.5 ? lightMapColor : 0.5f.xxxx; float4 causticsColor = tex2D(caustics, pi.txCaustics); float4 result = baseColor * saturate(lightMapColor*2.0); float4 depth = (pi.vPosLight.z / pi.vPosLight.w) - 0.011; float4 vTexCoords[16]; vTexCoords[0] = float4(-0.000732422f, -0.000732422f, 0.0f, 0.0f ); vTexCoords[1] = float4(-0.000732422f, -0.000244141f, 0.0f, 0.0f ); vTexCoords[2] = float4(-0.000732422f, 0.000244141f, 0.0f, 0.0f ); vTexCoords[3] = float4(-0.000732422f, 0.000732422f, 0.0f, 0.0f ); vTexCoords[4] = float4(-0.000244141f, -0.000732422f, 0.0f, 0.0f ); vTexCoords[5] = float4(-0.000244141f, -0.000244141f, 0.0f, 0.0f ); vTexCoords[6] = float4(-0.000244141f, 0.000244141f, 0.0f, 0.0f ); vTexCoords[7] = float4(-0.000244141f, 0.000732422f, 0.0f, 0.0f ); vTexCoords[8] = float4(0.000244141f, -0.000732422f, 0.0f, 0.0f ); vTexCoords[9] = float4(0.000244141f, -0.000244141f, 0.0f, 0.0f ); vTexCoords[10] = float4(0.000244141f, 0.000244141f, 0.0f, 0.0f ); vTexCoords[11] = float4(0.000244141f, 0.000732422f, 0.0f, 0.0f ); vTexCoords[12] = float4(0.000732422f, -0.000732422f, 0.0f, 0.0f ); vTexCoords[13] = float4(0.000732422f, -0.000244141f, 0.0f, 0.0f ); vTexCoords[14] = float4(0.000732422f, 0.000244141f, 0.0f, 0.0f ); vTexCoords[15] = float4(0.000732422f, 0.000732422f, 0.0f, 0.0f ); float4 vWeights[4] = {{0.0479224,0.0615335,0.0615335,0.0479224}, {0.0615335,0.0790106,0.0790106,0.0615335}, {0.0615335,0.0790106,0.0790106,0.0615335}, {0.0479224,0.0615335,0.0615335,0.0479224}}; float4 depths[4]; int i = 0; for(int j = 0; j < 4; i+=4, ++j) { float4 results; results.x = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i]); results.y = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+1]); results.z = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+2]); results.w = OffsetLookup(shadowMap, pi.shadowTex, vTexCoords[i+3]); depths[j] = results > depth ? vWeights[j] : float4(0.0, 0.0, 0.0, 0.0); } float lightAmount = dot(depths[0] + depths[1] + depths[2] + depths[3], pi.dotNL); return result*0.8 + causticsColor*textureLight*lightAmount*pi.txBase.y + 0.2*result*lightAmount; } endShaderSource end # end shader program enddef define PixelShaderWallsWithShadowMapping() shader -layer $floorLayer validateRenderShaderContext -vertexFormat position 0 required validateRenderShaderContext -vertexFormat texcoord 0 required validateRenderShaderContext -vertexFormat texcoord 1 required pass -modifiedEachFrameHint -renderEachFrame setf scaleU (1.0 / $floorMaterialScaleU) setf scaleV (1.0 / $floorMaterialScaleV) setv3 evalDiffuse ($stdMatDiffCoef.xyz) shaderProgram -target vertexProgram -method compile -version 1_1 bindConstants 0 -bindingID geomToClip -constantCount 4 bindConstants 4 -bindingID immediateData -data ( $scaleU, $scaleV, 1, 1) bindConstants 5 -bindingID geomToGlobal -constantCount 3 bindConstants 8 -bindingID immediateData -data ( 1, -2.5, 0, 0.3) bindConstants 9 -bindingID immediateData -data ( 1, 1, 1, 0) bindConstants 10 -bindingID immediateData -data ( 0, 0, 0, 0 ) bindConstants 11 -bindingID cameraToLightClip -constantCount 4 bindConstants 15 -bindingID cameraToLightClipAdj -constantCount 4 bindConstants 19 -bindingID sunLightDir shaderSource float4x4 clipSpaceMatrix : register(c0); float4 textureConstants : register(c4); float4x3 objToGlobal : register(c5); float4 projCaustics0 : register(c8); float4 projCaustics1 : register(c9); float4 projCaustics2 : register(c10); float4x4 lightClipSpaceMatrix : register(c11); float4x4 lightClipSpaceMatrixAdj : register(c15); float4 sunlightDir : register(c19); struct InputVertex { float3 position: POSITION0; float3 normal : NORMAL0; float2 tc0 : TEXCOORD0; float2 tc1 : TEXCOORD2; }; struct OutputVertex { float4 clipPosition : POSITION; float2 txBase : TEXCOORD0; float2 txLightMap: TEXCOORD1; float2 txCaustics: TEXCOORD2; float4 vPosLight : TEXCOORD3; float4 shadowTex : TEXCOORD4; float2 dotNL : COLOR0; }; OutputVertex VertexMain( InputVertex i) { OutputVertex o; o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix); o.txBase = textureConstants * i.tc0; o.txLightMap = i.tc1; float3 wPosition = mul(i.position, objToGlobal); float3 wPos = wPosition*0.3; o.txCaustics.x = (wPos.x * projCaustics0.x) + (wPos.y * projCaustics0.y) + (wPos.z * projCaustics0.z); o.txCaustics.y = (wPos.x * projCaustics1.x) + (wPos.y * projCaustics1.y) + (wPos.z * projCaustics1.z); o.vPosLight = mul(float4(wPosition, 1), lightClipSpaceMatrix); o.dotNL = dot(i.normal, sunlightDir.xyz) > 0.11f ? 1.0f : 0.0f; o.shadowTex = mul(float4(wPosition, 1), lightClipSpaceMatrixAdj); return o; } endShaderSource end # end shader program if ($psVersion >= 3) create WallsPS3() else create WallsPS2() endif sampler base texture ${wallpaperTextureName} if (viewerRenderType = $kRenderTypeThumbnail) textureAddressing tile tile else textureAddressing clamp tile endif end sampler lightmap texture "wallLightMap_0" textureAddressing tile tile end sampler caustics texture causticsTile textureAddressing tile tile end sampler shadowMap texture poolRenderTarget textureFilterHint point point textureMIPFilterHint disabled textureAddressing clamp clamp end end end enddef define PS2WallRendering(wallBumpMaps) #PS2.0 # Pass 1: # Basemap * (LightMap * (normal dot incidence)) # TexKill = cutout - 0.5 shader -layer $wallLayer validateRenderShaderContext -vertexFormat position 0 required validateRenderShaderContext -vertexFormat normal 0 required validateRenderShaderContext -vertexFormat texcoord 0 required validateRenderShaderContext -vertexFormat texcoord 1 required validateRenderShaderContext -vertexFormat texcoord 2 required if ($caustics) #create PixelShaderWallsWithShadowMapping() pass -modifiedEachFrameHint else pass endif if (true) fillmode $stdMatFillMode create FirstPassWallVertexShader($caustics) shaderProgram -target pixelProgram -method assemble bindConstants 1 -bindingID immediateData -data ($wallHighlightIntensity) shaderSource ps_2_0 def c0, 0,0.5,1,2 endShaderSource if ($wallMaskOK) shaderSource "dcl_2d s0 ; cutout" endif shaderSource dcl_2d s1 ; base dcl t0.xy ; base mapping dcl t1.xy ; light map space endShaderSource if ($lightMapping) shaderSource dcl_2d s2 ; lightmap dcl t2.xy ; also incidence space. endShaderSource endif if (&wallBumpMaps) shaderSource dcl_2d s3 ; normalmap dcl_2d s4 ; incidence endShaderSource endif if ($wallHighlightOn) shaderSource "dcl_2d s5 ; highlight texture" endif if ($caustics) shaderSource dcl_2d s6 ; caustics texture dcl t3.xy ; caustics projection dcl v0 ; wall height, so caustics can fade off in a pool endShaderSource endif if ($wallMaskOK) shaderSource texld r11, t0, s0 sub r10, r11.a, c0.y ; any values under 127 become clip pixels. texkill r10 endShaderSource endif shaderSource texld r0, t1, s1 ; base map endShaderSource if ($lightMapping) shaderSource texld r1, t2, s2 ; light map mul r2.rgb, r0, r1 endShaderSource else shaderSource "mul r2, r0, c0.y" endif shaderSource mul r2.rgb, r2, c0.w ; result * 2 endShaderSource if (&wallBumpMaps) shaderSource texld r3, t1, s3 texld r4, t2, s4 mad r5, r3, c0.w, -c0.z ; 2x-1 mad r6, r4, c0.w, -c0.z ; 2x-1 dp3_sat r2.a, r5, r6 ; incidence dot normal mul r2, r2, r2.a ; roll this into the lightmap. endShaderSource endif if ($caustics) shaderSource texld r8, t3, s6 mad r2.rgb, v0, r8, r2 endShaderSource endif if ($wallHighlightOn) shaderSource texld r7, t0, s5 mad r2.rgb, r2, r7.a, c1 endShaderSource endif shaderSource mov r2.a, c0.z mov oC0, r2 endShaderSource end #shader program if ($wallMaskOK) sampler 0 textureAddressing clamp clamp texture ${wallMaskTextureName} end endif sampler 1 texture ${wallpaperTextureName} if (viewerRenderType = $kRenderTypeThumbnail) textureAddressing tile tile else textureAddressing clamp tile endif end if ($lightMapping) sampler 2 texture "wallLightMap_${page}" end if (&wallBumpMaps) sampler 3 texture "${wallpaperNormalMapTextureName}" end sampler 4 texture "wallIncidenceMap_${page}" end endif endif if ($wallHighlightOn) sampler 5 texture "wall_selection_colors" textureAddressing clamp clamp end endif if ($caustics) sampler 6 texture causticsTile textureAddressing tile tile end endif end #pass endif end #shader enddef # Handles: # PS2 case # PS1.4 case # no bumpmap PS1.1 case # the 'glowy reflection map' gizmo is applied to the wall gradient multiplier here in the VS, which saves cycles. define FirstPassWallVertexShader(caustics) shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClip -constantCount 4 if ($wallMaskMirrorFlag) bindConstants 4 -bindingID immediateData -data (-1,1,1,0) else bindConstants 4 -bindingID immediateData -data (1,1,0,0) endif seti textureLights (numLightsOfType(environmentCube)) if ($caustics) bindConstants 5 -bindingID geomToGlobal -constantCount 3 if ($textureLights) bindConstants 10 -bindingID allTextureLights -constantCount 1 endif endif shaderSource vs_1_1 ; matrix for caustics projection def c11, 1, -2.5, 0, 0.3 def c12, 1, 1, 1, 0 def c13, 0, 0, 0, 0 ; This won't be used dcl_position v0 dcl_normal v1 dcl_texcoord0 v2 ; base, normal maps dcl_texcoord1 v3 ; mask dcl_texcoord2 v4 ; lightmaps, incidence maps m4x4 oPos, v0, c0 mad oT0.xy, v3, c4.xy, c4.zw ; cutout mov oT1.xy, v2 ; texcoords 0 = base texture, normal maps mov oT2.xy, v4 ; texcoords 2 = lightmap/incidence map endShaderSource if ($wallHighlightOn) shaderSource "mov oT3.xy, v2" else if ($caustics) shaderSource m4x3 r0, v0, c5 ; object to world space. mul r0.xyz, r0.xyz, c11.w ; mul by 0.3 m3x3 oT3, r0, c11 ; project and emit. endShaderSource if ($textureLights) shaderSource "mul oD0, v2.y, c10 ; scale by the 'night light" else shaderSource "mov oD0, v2.y" endif endif endif end #vertex program enddef define PS1WallRendering(wallBumps) if ($wallMaskOK = false) # generally an error condition, so only do the basics create PS1MasklessWallRendering(lightMapping) else if (&wallBumps) create PS1BumpMapWallRendering() else create PS1BasicWallRendering( ) endif endif enddef # bumpmaps for PS 1.1 # first pass does: # RGB =(Incidence dot Normal) # Alpha = Cutout # Second pass does: # Base * lightmap * 2 # multiplies by dest color define BasePassWallVertexShader() shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClip -constantCount 4 if ($wallMaskMirrorFlag) bindConstants 4 -bindingID immediateData -data (-1,1,1,0) else bindConstants 4 -bindingID immediateData -data (1,1,0,0) endif shaderSource vs_1_1 dcl_position v0 dcl_texcoord0 v1 ; base map dcl_texcoord2 v2 ; light map m4x4 oPos, v0, c0 mov oT0.xy, v1 ; texcoords 0 = base Map mov oT1.xy, v2 ; tc 2 = light maps mov oT3.xy, v1 ; for the highlight endShaderSource end #vertex program enddef define PS1BumpMapWallRendering() shader -layer $wallLayer validateRenderShaderContext -vertexFormat position 0 required validateRenderShaderContext -vertexFormat texcoord 0 required validateRenderShaderContext -vertexFormat texcoord 1 required validateRenderShaderContext -vertexFormat texcoord 2 required validateRenderShaderContext -viewerRenderType viewerRenderType pass alphaTest true 127 alphaTestFunction acceptIfGreater create FirstPassWallVertexShader($caustics) shaderProgram -target pixelProgram -method assemble shaderSource ps_1_1 tex t0 tex t1 tex t2 dp3_sat r0.rgb, t1_bx2, t2_bx2 mov r0.a, t0.a endShaderSource end sampler 0 textureAddressing clamp clamp texture $wallMaskTextureName ${wallMaskTextureParam} end sampler 1 texture "${wallpaperNormalMapTextureName}" end sampler 2 texture "wallIncidenceMap_${page}" end end pass fillmode $stdMatFillMode alphaBlend srcFactor(destColor) add dstFactor(zero) depthTest true -enableDepthWrite false depthTestFunction acceptIfEqual create BasePassWallVertexShader() shaderProgram -target pixelProgram -method assemble shaderSource ps_1_1 tex t0 tex t1 mul_x2 r0, t0, t1 endShaderSource end sampler 0 texture $wallpaperTextureName ${wallpaperTextureParam} if (viewerRenderType = $kRenderTypeThumbnail) textureAddressing tile tile else textureAddressing clamp tile endif end sampler 1 texture "wallLightMap_${page}" end end #pass end #shader enddef define PS1BasicWallRendering() # only handles Base * lightmap. shader -layer $wallLayer validateRenderShaderContext -vertexFormat position 0 required validateRenderShaderContext -vertexFormat normal 0 required validateRenderShaderContext -vertexFormat texcoord 0 required validateRenderShaderContext -vertexFormat texcoord 1 required validateRenderShaderContext -vertexFormat texcoord 2 required if ($caustics) pass -modifiedEachFrameHint else pass endif alphaTest true 127 alphaTestFunction acceptIfGreater fillmode $stdMatFillMode create FirstPassWallVertexShader($caustics) if ($lightMapping) shaderProgram -target pixelProgram -method assemble bindConstants 0 -bindingID immediateData -data ($wallHighlightIntensity) shaderSource ps_1_1 tex t0 tex t1 tex t2 endShaderSource if ($caustics) shaderSource "tex t3" endif shaderSource mul_x2 r0.rgb, t1, t2 +mov r0.a, t0.a endShaderSource if ($caustics) shaderSource "mad r0.rgb, t3, v0, r0" endif end else shaderProgram -target pixelProgram -method assemble bindConstants 0 -bindingID immediateData -data ($wallHighlightIntensity) shaderSource ps_1_1 tex t0 ; mask tex t1 ; texture endShaderSource # if ($caustics or $wallHighlightOn) shaderSource "tex t3" #endif shaderSource mov_x2 r0.rgb, t1 +mov r0.a, t0.a endShaderSource if ($wallHighlightOn) shaderSource mad r0.rgb, t1, t3.a, c0 endShaderSource else if ($caustics) shaderSource "add r0.rgb, r0, t3" endif endif end endif sampler 0 textureAddressing clamp clamp texture $wallMaskTextureName ${wallMaskTextureParam} end sampler 1 texture $wallpaperTextureName ${wallpaperTextureParam} if (viewerRenderType = $kRenderTypeThumbnail) textureAddressing tile tile else textureAddressing clamp tile endif end if ($lightMapping) sampler 2 texture "wallLightMap_${page}" end endif if ($wallHighlightOn) sampler 3 texture "wall_selection_colors" textureAddressing clamp clamp end else if ($caustics) sampler 3 texture causticsTile textureAddressing tile tile end endif endif end #pass end #shader enddef # no mask case, should be rare, but can happen in some situations. define PS1MasklessWallRendering(lightMapping) shader -layer $wallLayer pass create BasePassWallVertexShader() shaderProgram -target pixelProgram -method assemble bindConstants 0 -bindingID immediateData -data ($wallHighlightIntensity) shaderSource ps_1_1 tex t1 endShaderSource if (&lightMapping) shaderSource "tex t2" endif if ($wallHighlightOn) shaderSource "tex t3" endif if (&lightMapping) shaderSource "mul_x2 r0, t1, t2" else shaderSource "mov r0, t1" endif if ($wallHighlightOn) shaderSource mad r0.rgb, r0, t3.a, c0 endShaderSource endif end sampler 1 texture $wallpaperTextureName ${wallpaperTextureParam} if (viewerRenderType = $kRenderTypeThumbnail) textureAddressing tile tile else textureAddressing clamp tile endif end if (&lightMapping) sampler 2 texture "wallLightMap_${page}" end endif if ($wallHighlightOn) sampler 3 texture "wall_selection_colors" textureAddressing clamp clamp end else end end enddef #Empricially, only used to render a thumbnail define PixelShaderWallTextureShader() shader -layer $wallLayer validateRenderShaderContext -vertexFormat position 0 required validateRenderShaderContext -vertexFormat normal 0 required validateRenderShaderContext -vertexFormat texcoord 2 required pass depthTestFunction accept fillmode $stdMatFillMode shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClip -constantCount 4 shaderSource vs_1_1 dcl_position v0 dcl_texcoord0 v1 ; base map m4x4 oPos, v0, c0 mov oT0.xy, v1 mov oT1.xy, v1 endShaderSource end #vertex program shaderProgram -target pixelProgram -method assemble shaderSource ps_1_1 def c0,1,1,1,1 tex t0 endShaderSource if ($lightMapping) shaderSource tex t1 mul_x2 r0.rgb, t0, t1 mov r0.a, c0 endShaderSource else shaderSource mov r0.rgb, t0 mov r0.a, c0 endShaderSource endif end sampler 0 texture $stdMatBaseTextureName ${stdMatBaseTextureParam} textureAddressing tile tile end if ($lightMapping) sampler 1 texture "wallLightMap_${page}" end endif end end enddef define DebugPixelShaderWalls() shader -layer $wallLayer validateRenderShaderContext -vertexFormat position 0 required validateRenderShaderContext -vertexFormat normal 0 required validateRenderShaderContext -vertexFormat texcoord 0 required validateRenderShaderContext -vertexFormat texcoord 1 required validateRenderShaderContext -vertexFormat texcoord 2 required pass fillmode $stdMatFillMode alphaTest true 127 alphaTestFunction acceptIfGreater create FirstPassWallVertexShader($caustics) # mov oT1.xy, v2 ; texcoords 0 = base texture, normal maps # mov oT2.xy, v4 ; texcoords 2 = lightmap/incidence map shaderProgram -target pixelProgram -method assemble shaderSource ps_1_1 tex t0 tex t1 tex t2 mov r0, t0 endShaderSource if ($lightMapping and $debugShowWallLightmap) shaderSource "mov_x2 r0, t2" endif if ($debugShowWallIncidence) shaderSource "mov r0, t2" endif if ($debugShowWallNormalMap) shaderSource "mov r0, t1" endif if ($debugWallLighting) shaderSource "dp3 r0.rgb, t1_bx2, t2_bx2" endif end if ($lightMapping and $debugShowWallLightmap) sampler 2 texture "wallLightMap_${page}" end endif if (($debugShowWallIncidence or $debugWallLighting) and $lightMapping) sampler 2 texture "wallIncidenceMap_${page}" end endif if (($debugShowWallNormalMap or $debugWallLighting) and $wallBumps) sampler 1 texture "${wallpaperNormalMapTextureName}" end endif end end enddef