ShaderTerrain

From SimsWiki
Jump to: navigation, search

EP6-BV
0xCD7FE87A
0x1C0532FA
0x4CE399AB
0xFF1AFA1C
# terrain

#
# Shaders for terrain tiles
#
#

setf  waterbumpMapScale    4.0
setv3 thumbnailMatDiffCoef (0.75, 0.93, 0.75)
seti  terrainMatLayer -2

# multiplier on terrain (grass/paints) both on the lot and
# lot skirts. (See lotSkirt.matShad.)
setc terrainMatDiffCoef (0.9, 0.9, 0.9)

# Specifies the number of tiles over which the paint & bump textures should be applied.
setf  canvasDetailTextureScale            4
setf  canvasBaseTextureScale             20
setf  paintTextureScale                  20
setf  paintDetailTextureScale            4.0
setb  hasCutout false

#==============================================================================

define TerrainCanvasShaderShaderVS_PS()
   pass
      fillmode $stdMatFillMode      
      depthTest true -enableDepthWrite true                  
      
      if ($hasCutout)                         
         depthTestFunction acceptIfEqual
      else
         depthTestFunction acceptIfLessOrEqual
      endif
      
      shaderProgram -target vertexProgram -method compile -version 1_1
         bindConstants 0 -bindingID geomToClip -constantCount 4			
			bindConstants 4 -bindingID immediateData -data (1/$canvasBaseTextureScale, 1/$canvasDetailTextureScale, 0, 0)
			
			shaderSource
			   float4x4 clipSpaceMatrix  : register(c0);
			   float4   textureConstants : register(c4);
			
			struct InputVertex
				{
					float3 position: POSITION0;
					float2 texcoord : TEXCOORD0;
				};
				
				struct OutputVertex
				{
					float4 clipPosition : POSITION;
					float2 txBase  : TEXCOORD0;
					float2 txDetail: TEXCOORD1;
				};
				
				OutputVertex VertexMain( InputVertex i)
				{
				   OutputVertex o;
				   o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix);
				   o.txBase   = i.texcoord * textureConstants.x;
				   o.txDetail = i.texcoord * textureConstants.y;				   
				   return o;
				}
			endShaderSource  
      end # end shader program
      
      
      shaderProgram -target pixelProgram -method compile -version 1_1      
         shaderSource                            
            sampler base;
            sampler detail;
            struct cInputPixel
            {               
               float2 tcBase : TEXCOORD0;
               float2 tcDetail : TEXCOORD1;
            };
            
            float4 PixelMain(cInputPixel pi) : COLOR
            {         
               float4 baseColor   = tex2D(base, pi.tcBase);                                                
               float4 detailColor = tex2D(detail, pi.tcDetail);                              
               float4 result = (detailColor.a * detailColor) + ((1 - detailColor.a) * baseColor);               
               return result;                        
            }
         endShaderSource
      end # end shader program      
         
      sampler base
         texture "${texture}"
         textureAddressing tile tile
      end
      
      sampler detail
         texture "${texture}_detail"
         textureAddressing tile tile
      end      
   end
enddef

define TerrainCanvasShaderShaderFF()
   pass -fixedFunction         
      fillmode $stdMatFillMode
      
      depthTest true -enableDepthWrite true                  
      
      if ($hasCutout)                         
         depthTestFunction acceptIfEqual
      else
         depthTestFunction acceptIfLessOrEqual
      endif
               
      stage
         texture "${texture}"
         textureAddressing tile tile
         ffTextureMatrix -scalev ($canvasBaseTextureScale, $canvasBaseTextureScale) -invert
         ffTextureCoordsSource 0
         textureBlend select(texture) select(texture)
      end 
      stage
         texture "${texture}_detail"
         textureAddressing tile tile
         ffTextureMatrix -scalev ($canvasDetailTextureScale, $canvasDetailTextureScale) -invert
         ffTextureCoordsSource 0
         textureBlend lerpTextureAlpha(texture outRegister) select(outRegister)
      end 
   end       
enddef

define TerrainCanvasShader()
   material
      shader -layer (($terrainMatLayer - 3) * 8)
         vertexFormatPred position      0 true
         vertexFormatPred normal        0 true
         vertexFormatPred texcoord      0 true
         viewerRenderTypePred viewerRenderType
         
         create DetermineHardwareSupport()
         if (viewerRenderType = $kRenderTypeShadowMap)
	         create ShadowMapVS_PS()
	      else
            if ($useHWShader1Path or $useHWShader2Path)	
		         create TerrainCanvasShaderShaderVS_PS()		
	         else   
               create TerrainCanvasShaderShaderFF()
            endif
         endif
      end
      
      shader
      end
   end
enddef

#==============================================================================

define TerrainPaintShaderVS_PS()
   shader -layer (($terrainMatLayer - 2) * 8)
      vertexFormatPred position      0 true
      vertexFormatPred texcoord      0 true
      pass
         fillmode $stdMatFillMode
         alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
         
         alphaTest true 10
         alphaTestFunction acceptIfGreater
         
         depthTest true -enableDepthWrite false
         if (viewerRenderType = $kRenderTypeImposter)
            depthTestFunction acceptIfLessOrEqual
         else
            depthTestFunction acceptIfEqual
         endif
         
         shaderProgram -target vertexProgram -method compile -version 1_1
            bindConstants 0 -bindingID geomToClip -constantCount 4			
			   bindConstants 4 -bindingID immediateData -data (1/$canvasBaseTextureScale, 1/$canvasDetailTextureScale, $alphaMapScaleU, $alphaMapScaleV)
   			
			   shaderSource
			      float4x4 clipSpaceMatrix  : register(c0);
			      float4   textureConstants : register(c4);
   			
			   struct InputVertex
				   {
					   float3 position: POSITION0;
					   float2 texcoord : TEXCOORD0;
				   };
   				
				   struct OutputVertex
				   {
					   float4 clipPosition : POSITION;
					   float2 txBase  : TEXCOORD0;
					   float2 txDetail: TEXCOORD1;
					   float2 txAlpha : TEXCOORD2;
				   };
   				
				   OutputVertex VertexMain( InputVertex i)
				   {
				      OutputVertex o;
				      o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix);
				      o.txBase   = i.texcoord * textureConstants.x;
				      o.txDetail = i.texcoord * textureConstants.y;				   
				      o.txAlpha  = i.texcoord.xy * textureConstants.zw;
				      return o;
				   }
			   endShaderSource  
         end # end shader program
         
         
         shaderProgram -target pixelProgram -method compile -version 1_1      
            shaderSource                            
               sampler base;
               sampler detail;
               sampler alphaMap;
               struct cInputPixel
               {               
                  float2 tcBase : TEXCOORD0;
                  float2 tcDetail : TEXCOORD1;
                  float2 tcAlpha  : TEXCOORD2;
               };
               
               float4 PixelMain(cInputPixel pi) : COLOR
               {         
                  float4 baseColor   = tex2D(base, pi.tcBase);                                                
                  float4 detailColor = tex2D(detail, pi.tcDetail);                              
                  float4 alphaColor  = tex2D(alphaMap, pi.tcAlpha);
                  float4 result = (detailColor.a * detailColor) + ((1 - detailColor.a) * baseColor);               
                  result.a = alphaColor.a;
                  return result;                        
               }
            endShaderSource
         end # end shader program      
            
         sampler base
            texture $paintTexture
            textureAddressing tile tile
         end
         
         sampler detail
            texture "${paintTexture}_detail"
            textureAddressing tile tile
         end
         
         sampler alphaMap
            texture $alphaMap
            textureAddressing clamp clamp
         end      
      end
   end
enddef

define TerrainPaintShader(addDetail)
   shader -layer (($terrainMatLayer - 2) * 8)
      vertexFormatPred position      0 true
      vertexFormatPred texcoord      0 true
      
      pass -fixedFunction         
         fillmode $stdMatFillMode

         alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
         
         alphaTest true 10
         alphaTestFunction acceptIfGreater
         
         depthTest true -enableDepthWrite false
         if (viewerRenderType = $kRenderTypeImposter)
            depthTestFunction acceptIfLessOrEqual
         else
            depthTestFunction acceptIfEqual
         endif
         
         if (&addDetail)
            stage
               texture $paintTexture
               textureAddressing tile tile
               ffTextureMatrix -scalev ($paintTextureScale, $paintTextureScale) -invert
               textureTransformType vector2
               ffTextureCoordsSource 0
               textureBlend select(texture) select(outRegister)
            end 
            stage
               texture "${paintTexture}_detail"
               textureAddressing tile tile
               ffTextureMatrix -scalev ($paintDetailTextureScale, $paintDetailTextureScale) -invert
               textureTransformType vector2
               ffTextureCoordsSource 0
               textureBlend lerpTextureAlpha(texture outRegister) select(outRegister)
            end 
         else
            stage
               texture $paintTexture
               textureAddressing tile tile
               ffTextureMatrix -scalev ($paintTextureScale, $paintTextureScale) -invert
               textureTransformType vector2
               ffTextureCoordsSource 0
               textureBlend select(texture) select(outRegister)
            end 
         endif
         stage
            texture $alphaMap
            textureAddressing clamp clamp
            ffTextureMatrix -scalev ($alphaMapScaleU, $alphaMapScaleV)
            ffTextureCoordsSource 0
            textureBlend select(outRegister) select(texture)
         end 
      end       
   end
enddef


define TerrainPaint()
   material
      create DetermineHardwareSupport()
      
      if (viewerRenderType != $kRenderTypeShadowMap)   
         if ($useHWShader1Path or $useHWShader2Path)	
		      create TerrainPaintShaderVS_PS()
	      else            
            create TerrainPaintShader(true)
            create TerrainPaintShader(false)
            shader
            end
         endif      
      endif      
   end
enddef


#==============================================================================
define TerrainLightingVS_PS()
   pass
      fillmode $stdMatFillMode
      alphaBlend srcFactor(destColor) add dstFactor(zero)            
      depthTest true -enableDepthWrite false            
      depthTestFunction acceptIfEqual
      
      shaderProgram -target vertexProgram -method compile -version 1_1
         bindConstants 0 -bindingID geomToClip -constantCount 4			
			bindConstants 4 -bindingID immediateData -data (1/64, 0, 0, 0)			
			
			shaderSource
			   float4x4 clipSpaceMatrix  : register(c0);
			   float4   textureConstants : register(c4);			   
			
			struct InputVertex
				{
					float3 position: POSITION0;
					float2 texcoord : TEXCOORD0;
				};
				
				struct OutputVertex
				{
					float4 clipPosition : POSITION;
					float2 txBase  : TEXCOORD0;					
				};
				
				OutputVertex VertexMain( InputVertex i)
				{
				   OutputVertex o;
				   o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix);
				   o.txBase   = i.texcoord * textureConstants.xx;				   
				   return o;
				}
			endShaderSource  
      end # end shader program
      
      
      shaderProgram -target pixelProgram -method compile -version 1_1
         bindConstants 0 -bindingID immediateData -data ($terrainMatDiffCoef.x, $terrainMatDiffCoef.y, $terrainMatDiffCoef.z, 1)         
         
         shaderSource   
            float4   terrainDiffCoef  : register(c0);
                                     
            sampler base;            
            struct cInputPixel
            {               
               float2 tcBase : TEXCOORD0;               
            };
            
            float4 PixelMain(cInputPixel pi) : COLOR
            {         
               float4 baseColor   = tex2D(base, pi.tcBase);                                                               
               float4 result = 2.0*(baseColor*terrainDiffCoef);               
               result.a = terrainDiffCoef.w;
               return result;                        
            }
         endShaderSource
      end # end shader program      
         
      sampler base
         texture "floorLightMap_0"  # at the moment is deterministically mapped to page 0
         textureAddressing tile tile
      end            
   end   
enddef

define TerrainLighting()
   material
   	create DetermineHardwareSupport()

      shader -layer (($terrainMatLayer - 1) * 8)
         vertexFormatPred position      0 true
         vertexFormatPred texcoord      0 true
         if (viewerRenderType != $kRenderTypeShadowMap)            
            if ($useHWShader2Path or $useHWShader1Path)
               create TerrainLightingVS_PS()
            else
               pass -fixedFunction            
                  fillmode $stdMatFillMode

                  alphaBlend srcFactor(destColor) add dstFactor(zero)

                  colorScalar $terrainMatDiffCoef 1  # important that alpha be one for ARGB capture.

                  ffDepthOffset 0
                  depthTest true -enableDepthWrite false            
                  depthTestFunction acceptIfEqual

                  stage
                     texture "floorLightMap_0"  # at the moment is deterministically mapped to page 0
                     # A page holds 64x64 tiles. A tile is one world unit wide.
                     ffTextureMatrix -scalev (1/64, 1/64)
                     textureTransformType vector2
                     ffTextureCoordsSource 0
                     textureBlend multiplyScale2(texture colorScalar) select(colorScalar)
                  end 
               end                     
                           
               pass -fixedFunction
                  create LightingStatesNoStdLights()
                  fillmode $stdMatFillMode

                  alphaBlend srcFactor(zero) add dstFactor(one)
      
                  ffDepthOffset 0
                  depthTest true -enableDepthWrite false
                  alphaTest true 100
                  alphaTestFunction acceptIfLess
      
                  stage
                     texture "floorLightMap_0"  # at the moment is deterministically mapped to page 0
                     ffTextureMatrix -scalev (1/64, 1/64)
                     textureTransformType vector2
                     ffTextureCoordsSource 0
                     textureBlend select(texture) select(texture)
                  end 
               end             
            endif         
         endif
      end
   end
enddef

#==============================================================================
define TerrainToolThumbnail()
   material
      shader -layer ($terrainMatLayer * 8)
         vertexFormatPred position      0 true
         vertexFormatPred normal        0 true
         vertexFormatPred texcoord      0 true
         vertexFormatPred blendindices  0 false
         vertexFormatPred targetindices 0 false

         pass -fixedFunction
            create LightingStates()
            alphaBlend srcFactor(srcAlpha) add dstFactor(zero)
            colorScalar $thumbnailMatDiffCoef
            fillmode $stdMatFillMode
            
            stage
               texture $paintTexture
               textureAddressing tile tile
               textureBlend multiplyScale2(texture diffuse) select(texture)
            end 
         end       
      end
   end
enddef

define TerrainWaterShader(withBumpMap)
   shader -layer 1
      vertexFormatPred position      0 true
      vertexFormatPred normal        0 true
      vertexFormatPred color         0 true
      vertexFormatPred texcoord      0 true
      vertexFormatPred blendindices  0 false
      vertexFormatPred targetindices 0 false
      viewerRenderTypePred viewerRenderType
         
      setb cubeMapSupport (queryBooleanGraphicsDeviceCap(hasCubeMapSupport))   
      create DetermineHardwareSupport()            
      
      pass -fixedFunction         
         # disable lighting, disable normalize normals, enable local viewer
         if ($useSWVertexShaderPath)
            create LightingStatesNoStdLights()
         else
            create LightingStatesNoStdLightsParam(false true)            
         endif         
         alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)                  

         fillmode $stdMatFillMode
         colorScalar (1, 1, 1) -applyTextureLightColor 0 0                           
                  
         stage
            if ($cubeMapSupport)
               texture reflectionoutdoorwater-envcube
               textureMIPFilterHint disabled 

               ffTextureCoordsSource fromReflectionVector
               textureTransformType vector3
               ffTextureMatrix -orientCameraToGlobal

               textureAddressing clamp clamp clamp
               textureBlend multiply(texture colorScalar) select(diffuse)
            else
               colorScalar (0.3,0.5,1.0)  -applyTextureLightColor 0 0     
               textureBlend select(colorScalar) select(diffuse)
            endif
         end           
      end   
      
      if (&withBumpMap)         
         pass -fixedFunction
            create LightingStatesNoStdLights()
            alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
            fillmode $stdMatFillMode
            colorScalar (1.0, 1.0, 1.0, 0.3) -applyTextureLightColor 0 0
         
            stage 
               texture "water-1-bump"
               textureAddressing tile tile
               # -atrans waveformType cycles/sec offset (startU, startV)  (endU, endV)
               textureMatrixAnimation -targetType fixedFunction -aorigin (0, 0) -atrans sine 0.04 0 (0, 0) (1, 0)  -ascale sawtooth 1 0 ($waterbumpMapScale, $waterbumpMapScale)
               textureTransformType vector2
               ffTextureCoordsSource 0
               textureBlend select(texture) select(texture)
            end 
   
            stage
               texture "water-2-bump"
               textureAddressing tile tile
               # -atrans waveformType cycles/sec offset (startU, startV)  (endU, endV)
               textureMatrixAnimation -targetType fixedFunction -aorigin (0, 0) -atrans sine 0.04 0 (1, 0) (0, 0)  -ascale sawtooth 1 0 ($waterbumpMapScale, $waterbumpMapScale)
               textureTransformType vector2
               ffTextureCoordsSource 0
               textureBlend multiply(texture outRegister) select(texture)
            end 
            
            stage
               # does this work out on GF2 due to reg combiners?
               textureBlend multiply(outRegister colorScalar) select(colorScalar)
            end 
         end  
      endif
   end
enddef


#==============================================================================
define TerrainWater()
   material
      # only activate the water w/ bump shader for pixel shader capable HW      
      if (tsFrozenPond)
         create TerrainWaterFrozen()
      else
         if (queryIntegerGraphicsDeviceCap(maxPixelProgramVersionMajor) != 0)         
            create TerrainWaterShader(true)
         endif
         create TerrainWaterShader(false)  # fallback without bumps         
      endif
   end
enddef

define TerrainWaterFrozen()
   shader -layer 1
      pass -fixedFunction
            create LightingStatesNoStdLightsParam(false false)                           
         alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
         fillmode $stdMatFillMode
         colorScalar (0.45, 0.45, 0.5, 0.475) -applyTextureLightColor 0 0
         
         stage
            texture "ice-pond-surface"
            textureAddressing tile tile                                                   
            ffTextureCoordsSource fromPosition
            ffTextureMatrix -cameraToGlobal -scale (5) -invert
            textureBlend multiply(texture colorScalar) select(colorScalar)
         end                         
         
         stage
            texture "ice-pond-surface"
            textureAddressing tile tile                                                   
            ffTextureCoordsSource fromPosition
            ffTextureMatrix -cameraToGlobal -scale (17) -invert                    
            textureBlend multiplyAdd(texture colorScalar outRegister) add(colorScalar outRegister)
         end
      end                       
   end
enddef 

#==============================================================================

define TerrainSnowShader()   
   create DetermineHardwareSupport()
   if ($useHWShader1Path or $useHWShader2Path)
		create TerrainSnow()		
	else   
      create TerrainSnowFF()
   endif      
enddef

define TerrainSnowFF()
   material
      shader -layer 0
         pass -fixedFunction
            depthTest true -enableDepthWrite true
            if (tsIsDay)
               colorScalar (0.5, 0.5, 0.52, 1)
            else
               colorScalar (0.15, 0.15, 0.375, 1)
            endif
               
               stage                                         
                  texture "snow-ground-diffuse"
                  textureAddressing tile tile  
                  ffTextureCoordsSource fromPosition
                  ffTextureMatrix -cameraToGlobal -scalev (2, 2) -invert                            
                  textureBlend multiply(texture colorScalar) select(colorScalar)
               end            
               
               stage                                         
                  texture "snow-ground-diffuse"
                  textureAddressing tile tile  
                  ffTextureCoordsSource fromPosition
                  ffTextureMatrix -cameraToGlobal -scalev (13, 13) -invert                            
                  textureBlend multiplyAdd(texture colorScalar outRegister) select(colorScalar)
               end            
         end
      end
   end
enddef

define TerrainSnowPS1()   
   shaderProgram -target pixelProgram -method compile -version 1_1 # -disassemble "c:\sims2ep5\hlslPS1_1.txt"                            
      bindConstants 0 -bindingID cursorTerrainPosition -constantCount 1 -constantType float
      if (tsIsDay)         
         bindConstants 1 -bindingID immediateData -data (1.1, 1.1, 1.175, 1)         
      else
         bindConstants 1 -bindingID immediateData -data (0.35, 0.35, 1.0, 1)         
      endif
            
      shaderSource 
         sampler normmap;
                                                                                                
         float4 cursorPos : register(c0);
         float4 colorFactor : register(c1);
         
         struct v2f
         {
            float4 hpos	: POSITION;                             
            float4 color : COLOR0;	             
	         float3 worldPos : COLOR1;	               
	         float3 bumpCoords : TEXCOORD0;
	         float3 tanLightDir : TEXCOORD1;	                                 
         };

         float4 PixelMain(v2f pi) : COLOR
         {      
            float4 normal = 2.0f * (tex2D(normmap, pi.bumpCoords) - 0.5f);  
            float3 diffuse = saturate(dot(pi.tanLightDir, normal.xyz))*colorFactor.xyz;            
            return float4(diffuse.xyz + pi.color, 1.0f);                        
         }
      endShaderSource                                                                                                             
   end                                            
   
   sampler normmap
      texture "snow-ground-bump"
      textureAddressing tile tile
   end 
   
enddef

define TerrainSnowPS2()   
   shaderProgram -target pixelProgram -method compile -version ${psVersion}_0  # -disassemble "c:\sims2ep5\hlslPS1_1.txt"                            
      bindConstants 0 -bindingID cursorTerrainPosition -constantCount 1 -constantType float                        
  		if (tsIsDay)         
         bindConstants 1 -bindingID immediateData -data (1.1, 1.1, 1.175, 1)         
      else
         bindConstants 1 -bindingID immediateData -data (0.35, 0.35, 1.0, 1)         
      endif

      shaderSource                         
         
         sampler normmap;         
         
         float4 cursorPos : register(c0);
         float4 colorFactor : register(c1);
         
         struct v2f
         {
            float4 hpos	: POSITION;                             
	         float4 color : COLOR0;	                     	                     
	         float3 worldPos : COLOR1;              
	         float2 bumpCoords : TEXCOORD0;               	                     
	         float3 tanLightDir : TEXCOORD1;   	   	                     	      	         
         };

         float4 PixelMain(v2f pi) : COLOR
         {                                                  
            float4 normal0 = 2.0f * (tex2D(normmap, pi.bumpCoords) - 0.5f);                        
            float4 normal1 = 2.0f * (tex2D(normmap, pi.bumpCoords*0.4f) - 0.5f);
            float4 normal = 0.5f*(normal0+normal1);
            float3 diffuse0 = saturate(dot(pi.tanLightDir, normal.xyz))*colorFactor.xyz;            
            
            float3 diffVec = cursorPos-pi.worldPos;            
            diffVec *= 64.0f;
            float blend = saturate(dot(diffVec, diffVec));                                                                                                
            return float4(saturate(float3(diffuse0.xyz + pi.color.xxx)), blend);                        
         }
      endShaderSource
   end                                            
   
   sampler normmap
      texture "snow-ground-bump"
      textureAddressing tile tile
   end               
   
enddef

define TerrainSnowVS1()
   shaderProgram -target vertexProgram -method compile -version 1_1
      bindConstants 0 -bindingID  geomToClip     -constantCount 4        
      bindConstants 4 -bindingID  geomToCamera   -constantCount 3
		bindConstants 7 -bindingID  cameraToGeom   -constantCount 3			
		bindConstants 15 -bindingID ambientLight -constantCount 1 -constantType float	                   			      
		bindConstants 18 -bindingID allStandardLightData -constantCount 4 -constantType float			      
		
		if (tsIsDay)         
         bindConstants 10 -bindingID immediateData -data (1.2, 1.2, 1.2, 1)         
      else
         bindConstants 10 -bindingID immediateData -data (0.64, 0.64, 1.1, 1)         
      endif
      
      bindConstants 12 -bindingID geomToGlobal -constantCount 3
                     
      bindConstants 22 -bindingID cameraToClipWithDepthOffset -constantCount 4 -data(0, 0, 0, 0) 
		
		shaderSource
			float4x4 modelviewproj : register(c0);
			float4x3 modelview : register(c4);
			float4x3 modelviewInv : register(c7);				      				      
         // light direction
			float4 lightDir0 : register(c18);
			float4 lightDir1 : register(c26);
			float4x4 cameraToClipWithDOMatrix : register(c22);
         float4 ambient : register(c15);                                   
         float4x3 modelToWorld : register(c12);
				      			
			struct a2v 
         {
            float4 pos		: POSITION;                     
            float3 normal	: NORMAL;
            float2 tangent	: TEXCOORD0; 
            float2 bumpcoord : TEXCOORD1;                    
         };

         struct v2f
         {
            float4 hpos		 : POSITION;                                          
	         float4 color : COLOR0;	                  	                  
	         float3 worldPos : COLOR1;	         
	         float2 bumpCoords : TEXCOORD0;
	         float3 tanLightDir : TEXCOORD1;    	               	                 	                  	                  	               	                 	                  	                  
         };
         
         v2f VertexMain(a2v IN)
         {
	         v2f OUT;

	         // vertex position in object space
	         float4 pos = float4(IN.pos.x,IN.pos.y,IN.pos.z,1.0);	  
	         
	         float3 tangent = float3(IN.tangent.x, IN.tangent.y, 0);
	                  	         
	         // compute binormal
	         float3 binormal = normalize(cross(IN.normal, tangent));
	         
	         // tangent space matrix
	         float3x3 tbn = float3x3(tangent, binormal, IN.normal);
	         
	         // light direction in object space	                  
	         float3 lt0 = mul(lightDir0, (float3x3)modelviewInv);
	         
	         // light 0 direction in tangent space	                  	                  
	         OUT.tanLightDir = normalize(mul(tbn, lt0));
	         	         	         
	         OUT.bumpCoords = float2(IN.bumpcoord.x, IN.bumpcoord.y);
	         
	         // compute tangent space view vector
	         // object space view point
	         float3 viewPoint = mul(float4(0, 0, 0, 1), modelviewInv).xyz;
	         float3 viewVecObj = normalize(viewPoint - IN.pos.xyz);
	         
	         // object space light
	         float3 lightDirObj = normalize(mul(lightDir0, (float3x3)modelviewInv));
	         
	         // half angle vector in object space
	         float3 halfWayVector = normalize(lightDirObj + viewVecObj);	                  
	         
	         // transform half angle vector to tangent space
	         //OUT.tanHalfAngle.xyz = normalize(mul(tbn, halfWayVector));
	         
	         // specular shadowing term
	         //OUT.tanHalfAngle.w = max(dot(halfWayVector, IN.normal), 0);	                  
	         
	         // vertex position in clip space
	         float3 hposView = mul(pos, modelview);
            OUT.hpos = mul(float4(hposView, 1), cameraToClipWithDOMatrix);                     	                   
            
            // vertex position in world space
            OUT.worldPos = mul(pos, modelToWorld)/64.0f;                                             
	                  	                                    		         
	         OUT.color.xyz = ambient.xyz*0.3f;
	         OUT.color.w = 1.0;	         
	         return OUT;
         }
                  			
		endShaderSource
   end # end shader program   
enddef

define TerrainSnow()
   material
      shader -layer 1         
         validateRenderShaderContext -vertexFormat position 0 required
         validateRenderShaderContext -vertexFormat normal 0 required
         validateRenderShaderContext -vertexFormat texcoord 0 required
         validateRenderShaderContext -vertexFormat texcoord 1 required
         
         create DetermineHardwareSupport()
                          
         pass 
            alphaTest true 5
            alphaTestFunction acceptIfGreater

            alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
            depthTest true -enableDepthWrite true
            
            create TerrainSnowVS1()
            
            if ($useHWShader1Path)
               create TerrainSnowPS1()
            elseif ($useHWShader2Path)               
               create TerrainSnowPS2()
            endif
                                                   
         end # end pass
         
      end #end shader
   end # end material
enddef

define XRayCursorMaterial()
   material
      shader -layer (0)
         pass -fixedFunction -modifiedEachFrameHint
            alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
            depthTest true -enableDepthWrite false
                        
            colorScalar (1, 1, 0, 0.0)
            stage
               textureBlend select(colorScalar) select(colorScalar)
            end
         end
      end
   end
enddef

define LightSnowDayPS(psFullVersion)
   shaderProgram -target pixelProgram -method compile -version &psFullVersion
      if ($singlePass)
         bindConstants 0 -bindingID immediateData -data (0, 0, 0, 0) -constantType float
      else
         bindConstants 0 -bindingID immediateData -data (1, 0, 0, 0) -constantType float
      endif
      
      shaderSource     
         float scale2Factor : register(c0);         
                                 
         sampler base;            
         sampler base2;
         struct cInputPixel
         {               
            float2 txScale1  : TEXCOORD0;
				float2 txScale2  : TEXCOORD1;
         };
         
         float4 PixelMain(cInputPixel pi) : COLOR
         {         
            float4 scale1Color = tex2D(base, pi.txScale1);                                                
            float4 scale2Color = tex2D(base2, pi.txScale2)*scale2Factor.x;                              
            float4 result = (scale1Color + scale2Color);            
            return result;                        
         }
      endShaderSource
   end # end shader program      
enddef

define LightSnowNightPS(psFullVersion)
   shaderProgram -target pixelProgram -method compile -version &psFullVersion
      if ($singlePass)
         bindConstants 0 -bindingID immediateData -data (0, 0, 0, 0) -constantType float
      else
         bindConstants 0 -bindingID immediateData -data (1, 1, 0, 0) -constantType float
      endif
      
      shaderSource     
         float2 scale2Factor : register(c0);         
                                 
         sampler base;  
         sampler base2;
         sampler lightMap;          
         struct cInputPixel
         {               
            float2 txScale1  : TEXCOORD0;
				float2 txScale2  : TEXCOORD1;
				float2 txltMap   : TEXCOORD2;
         };
         
         float4 PixelMain(cInputPixel pi) : COLOR
         {         
            float4 scale1Color = tex2D(base, pi.txScale1);                                                
            scale1color.xyz = scale1color.xyz;
            float4 scale2Color = tex2D(base2, pi.txScale2)*scale2Factor.x;
            float4 result = (scale1Color + scale2Color);               
            float4 lightMapColor = tex2D(lightMap, pi.txltMap);
            return float4(result.xyz*lightMapColor.xyz, result.w);                        
         }
      endShaderSource
   end # end shader program      
enddef


define LightSnowVS_PS()
   pass
      alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
      depthTest true -enableDepthWrite false      
      depthTestFunction acceptIfEqual
      
      shaderProgram -target vertexProgram -method compile -version 1_1
         bindConstants 0 -bindingID geomToClip -constantCount 4						
         bindConstants 4 -bindingID geomToGlobal -constantCount 3
         bindConstants 8 -bindingID immediateData -data (1/(($scaleStage1).x), 1/(($scaleStage1).y), 1/(($scaleStage2).x), 1/(($scaleStage2).y)) -constantType float
			
			shaderSource
			   float4x4 clipSpaceMatrix  : register(c0);			   
			   float4x3 modelToWorld : register(c4);
			   float4 scaleData : register(c8);
			
			struct InputVertex
				{
					float3 position: POSITION0;					
					float2 txCoord : TEXCOORD0;
				};
				
				struct OutputVertex
				{
					float4 clipPosition : POSITION;
					float2 txScale1  : TEXCOORD0;
					float2 txScale2  : TEXCOORD1;
					float2 txltMap    : TEXCOORD2;
				};
				
				OutputVertex VertexMain( InputVertex i)
				{
				   OutputVertex o;
				   o.clipPosition = mul(float4(i.position, 1), clipSpaceMatrix);
				   float3 worldPos = mul(float4(i.position.xyz, 1.0f), modelToWorld);
				   o.txScale1   = worldPos.xy * scaleData.xy;
				   o.txScale2   = worldPos.xy * scaleData.zw;
				   o.txltMap  = i.txCoord;
				   return o;
				}
			endShaderSource  
      end # end shader program
      
      if (tsIsDay)
         if ($useHWShader1Path)	
		      create LightSnowDayPS("1_1")
	      else   
            create LightSnowDayPS(${psVersion}_0)
         endif
      else
         if ($useHWShader1Path)	
		      create LightSnowNightPS("1_1")
	      else   
            create LightSnowNightPS(${psVersion}_0)
         endif
      endif
         
      sampler base
         texture "${snowTexture}"
         textureAddressing tile tile
      end
      
      sampler base2
         texture "${snowTexture2}"
         textureAddressing tile tile
      end
      
      if (not tsIsDay)
         sampler lightMap
            texture "floorLightMap_${page}"
            textureAddressing tile tile
         end
      endif
   end
enddef

define LightSnowFF()
   pass -fixedFunction         
      alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
      fillmode $stdMatFillMode            
      depthTest true -enableDepthWrite false                        
      
      if ($kRaiseLightSnowFF)
         ffDepthOffset 2
         depthTestFunction acceptIfLessOrEqual      
      else
         depthTestFunction acceptIfEqual      
      endif      
              
      stage
         texture $snowTexture
         textureAddressing tile tile
         ffTextureCoordsSource fromPosition
         ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert               
         textureBlend select(texture) select(texture)
      end
      
      if (not $singlePass)           
         stage
            texture $snowTexture2
            textureAddressing tile tile
            ffTextureMatrix  -cameraToGlobal -scalev $scaleStage2 -invert
            ffTextureCoordsSource fromPosition
            textureBlend add(texture outRegister) add(outRegister texture)
         end
      else
         # a dummy stage so if the shader has to fail it should fail
         stage            
            texture "floorLightMap_${page}"
            textureBlend select(outRegister) select(outRegister)
         end
      endif      

      
      if (not tsIsDay)
         stage
            texture "floorLightMap_${page}"
            textureAddressing tile tile
            ffTextureCoordsSource 0                                            
            textureBlend multiplyScale2(texture outRegister) select(outRegister)
         end
      endif
      
      # a dummy stage so if the shader has to fail it should fail
      stage            
         texture "floorLightMap_${page}"
         textureBlend select(outRegister) select(outRegister)
      end
   
   end      
enddef

define LightSnowFFLowEnd()
   pass -fixedFunction         
      alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
      fillmode $stdMatFillMode            
      depthTest true -enableDepthWrite false                  
      ffDepthOffset 1
      depthTestFunction acceptIfLessOrEqual      
      
      if (tsIsDay)         
         colorScalar (1, 1, 1, 1)         
      else
         colorScalar (0.17, 0.17, 0.43, 1)         
      endif
              
      stage
         texture $snowTexture
         textureAddressing tile tile
         ffTextureCoordsSource fromPosition
         ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert               
         textureBlend multiply(texture colorScalar) select(texture)
      end
      
      if (not $singlePass)           
         stage
            texture $snowTexture
            textureAddressing tile tile
            ffTextureMatrix  -cameraToGlobal -scalev $scaleStage2 -invert
            ffTextureCoordsSource fromPosition
            textureBlend multiplyAdd(texture colorScalar outRegister) add(outRegister texture)
         end
      else
         stage
            texture $snowTexture
            textureAddressing tile tile
            ffTextureCoordsSource fromPosition
            ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert               
            textureBlend multiplyAdd(texture colorScalar outRegister) select(outRegister)
         end
      endif      

   end      
enddef

define LightSnow()
   material
      setv2 scaleStage1 (23, 23)
      setv2 scaleStage2 (17, 17)
      
      if (tsHasHail)
         set snowTexture "hail-ground-surface"
         set snowTexture2 "hail-ground-surface"
         setv2 scaleStage1 (4, 4)
         setv2 scaleStage2 (3, 3)
      endif

      shader -layer (-1)
         create DetermineHardwareSupport()            
         if ((not $kRaiseLightSnowFF and $useHWShader1Path) or $useHWShader2Path)	
		      create LightSnowVS_PS()		
	      else   
            create LightSnowFF() # can use more than two stages
         endif
      end
      
      shader -layer (-1)      #if the above shader fails for some reason
         create LightSnowFFLowEnd()
      end
   end   
enddef

materialDefinition TerrainSnowMaterial
   setDefinition TerrainSnowShader     
end

materialDefinition RoadSnowMaterial
   setDefinition LightSnow
   addParam snowTexture snow-light-pass2   
   addParam snowTexture2 snow-light-pass1   
   addParam singlePass true
   addParam page 0
end

materialDefinition LightSnowMaterial
   setDefinition LightSnow
   addParam snowTexture snow-light-pass2
   addParam snowTexture2 snow-light-pass1
   addParam singlePass false
   addParam page 0   
end 

materialDefinition terrainLightingMaterial
   setDefinition TerrainLighting
end

materialDefinition waterOnTerrain
   setDefinition TerrainWater
end

materialDefinition XrayCursorBoxDirtyRectMaterial
   setDefinition XRayCursorMaterial
end

define GeneralSnowMaterialFF()
   material      
      shader -layer ($stdMatLayer)
         pass -fixedFunction            
            create LightingStatesParam(false false)      
            setv3 half (0.5,0.5,0.5)
            if ($stdMatSpecPower !=	0)
		         ffMatCoef -amb ($stdMatDiffCoef * $half) -ambAlpha	$stdMatAlphaMultiplier -diff ($stdMatDiffCoef * $half)	-diffAlpha $stdMatAlphaMultiplier -spec $stdMatSpecCoef -specPow	$stdMatSpecPower
		         addSpecular	true
	         else
		         ffMatCoef -amb ($stdMatDiffCoef * $half) -ambAlpha	$stdMatAlphaMultiplier -diff ($stdMatDiffCoef * $half)	-diffAlpha $stdMatAlphaMultiplier -spec (0,0,0) -specPow	0
	         endif
   	      
	         create StandardShaderFBAlphaState($stdMatAlphaBlendMode)
   	         	         	      
   	      
	         stage
	            texture $stdMatBaseTextureName
	            textureBlend multiplyScale2(diffuse texture) select(texture)
	         end	         
	         
	         if (tsIsDay)
	         colorScalar $colorToAdd
	            stage	            
	               textureBlend add(outRegister colorScalar) select(outRegister)
	            end	         	         
	         endif
	         
	      end
	      	      
      end
   end
enddef

define GeneralReflectiveMaterial()
   create StandardMaterial()
enddef

materialDefinition puddle_liquid_rain
   setDefinition GeneralReflectiveMaterial
   addParam deprecatedStdMatInvDiffuseCoeffMultiplier 1.2
   addParam forceHighQualitySkinning 0
   addParam forceIgnoreShapeBlend 0
   addParam reflectivity 0.1
   addParam stdMatAlphaBlendMode blend
   addParam stdMatAlphaMultiplier 0.5
   addParam stdMatAlphaRefValue 127
   addParam stdMatAlphaTestEnabled 0
   addParam stdMatBaseTextureAlphaReplicate 0
   addParam stdMatCullMode cullClockwise
   addParam stdMatDiffCoef 0.39,0.46,0.49
   addParam stdMatEmissiveCoef 0,0,0
   addParam stdMatEnvCubeBlurFactor 0.000000
   addParam stdMatEnvCubeCoef 0.3,0.3,0.3
   addParam stdMatEnvCubeLockedToCamera 0
   addParam stdMatEnvCubeMode reflection
   addParam stdMatEnvCubeTextureName reflectionkitchenhighcontrast-envcube
   addParam stdMatFillMode solid
   addParam stdMatLayer 0
   addParam stdMatLightingEnabled 1
   addParam stdMatMinLightRangeHint 4
   addParam stdMatSpecCoef 0.54,0.72,0.76
   addParam stdMatSpecPower 22      
   addParam stdMatAddLayer -10
end

materialDefinition puddle_liquid_blue
   setDefinition GeneralReflectiveMaterial
   addParam deprecatedStdMatInvDiffuseCoeffMultiplier 1.2
   addParam forceHighQualitySkinning 0
   addParam forceIgnoreShapeBlend 0
   addParam reflectivity 0.1
   addParam stdMatAlphaBlendMode blend
   addParam stdMatAlphaMultiplier 0.5
   addParam stdMatAlphaRefValue 127
   addParam stdMatAlphaTestEnabled 0
   addParam stdMatBaseTextureAlphaReplicate 0
   addParam stdMatCullMode cullClockwise
   addParam stdMatDiffCoef 0.23,0.41,0.49
   addParam stdMatEmissiveCoef 0,0,0
   addParam stdMatEnvCubeBlurFactor 0.000000
   addParam stdMatEnvCubeCoef 0.1,0.1,0.1
   addParam stdMatEnvCubeLockedToCamera 0
   addParam stdMatEnvCubeMode reflection
   addParam stdMatEnvCubeTextureName reflectionkitchenhighcontrast-envcube
   addParam stdMatFillMode solid
   addParam stdMatLayer 0
   addParam stdMatLightingEnabled 1
   addParam stdMatMinLightRangeHint 4
   addParam stdMatSpecCoef 0.55,0.55,0.55
   addParam stdMatSpecPower 6.1   
   addParam stdMatAddLayer -10
end


#endshader

Personal tools
Namespaces

Variants
Actions
Navigation
game select
Toolbox