ShaderWallPS

From SimsWiki
Jump to: navigation, search

EP6-BV
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 2_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
            if (varExists(page))
               texture "wallLightMap_${page}"
            else
               texture "wallLightMap_0"
            endif
            
            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()			
		else
			pass 		   		
			   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)

# 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, t1.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 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


#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

Personal tools
Namespaces

Variants
Actions
Navigation
game select
Toolbox