ShaderWallPS
From SimsWiki
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