ShaderLotskirt

From SimsWiki
Revision as of 07:20, 7 September 2007 by Niol (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

EP6-BV
0xCD7FE87A
0x1C0532FA
0x0C50FBBF
0xFF439C10
# lotskirt

#
# Shaders for lot skirt
#
#


seti  lotSkirtLayer -6
seti kSpring 0
seti kSummer 1
seti kFall   2
seti kWinter 3
set weatherSuffix ""

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

define LotSkirtMaterialDefinition()
   create DetermineHardwareSupport()
   seti snowLevel (tsHasSnow)
   if (($useHWShader2Path or $useHWShader1Path) and $snowLevel > 1)
		create LotSkirtMaterialDefinitionVSPS1()		
	else   
      create LotSkirtMaterialDefinitionFF()
   endif      
enddef


define LotSkirtMaterialDefinitionFF()

   setb hasColor false
   seti totalLights 0

   material
      setc stdMatDiffCoef $terrainMatDiffCoef
      
      shader -layer ($lotSkirtLayer * 8)
         validateRenderShaderContext -vertexFormat position      0 required
         validateRenderShaderContext -vertexFormat normal        0 required
         validateRenderShaderContext -vertexFormat texcoord      0 required

      
         # not all lots seem to have this data, causing validation errors, making this a dynamic predicate solves this problem.
         setb  hasColor (hasVertexFormat(color,0))
         if ($hasColor)
            validateRenderShaderContext -vertexFormat      color   0 required
         endif                  
                
         pass -fixedFunction
            create LightingStates()
            
            depthTestFunction acceptIfLessOrEqual
            ffDepthOffset -1

            create AttenuatedMatCoef(1.0)
            alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
            fillmode $stdMatFillMode                        
            
            seti currSeason 4
            
            if (tsIsDay)
               seti currSeason (tsSeasonEnum)
               colorScalar (0.965,0.965,1,1)
            else
               colorScalar (0.96,0.96,0.96,1) 
            endif
                        

            if (not tsIsCloudy)                           
               if ($currSeason = $kFall)
                  colorScalar (1,0.95,0.95,1)
               elseif ($currSeason = $kSpring)
                  colorScalar (1,1,0.98,1)
               elseif ($currSeason = $kWinter)
                  colorScalar (0.965,0.965,1,1)
               elseif ($currSeason = $kSummer)
                  colorScalar (1,1,1,1) #summer
               else
                  colorScalar (0.96,0.96,0.96,1) 
               endif
            endif
               
            stage
               texture $surfaceTexture
               textureAddressing tile tile
               textureBlend multiply(texture diffuse) select(diffuse)
            end        
            
            
            stage
               textureBlend multiply(colorScalar outRegister) select(outRegister)
            end
         end       
        
        seti snowLevel (tsHasSnow)
        seti hailLevel (tsHasHail)
        
        if ($snowLevel >= 1 or $hailLevel >= 1)
            pass -fixedFunction
               alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
               
               create LightingStates()
            
               create AttenuatedMatCoef(1.0)
               fillmode $stdMatFillMode      
               ffDepthOffset 1
               depthTest true -enableDepthWrite false            
               depthTestFunction acceptIfLessOrEqual      
               
               setv2 scaleStage1 (23, 23)
               
               if (tsIsDay)
                  colorScalar (0.5, 0.5, 0.52, 1)
               else
                  colorScalar (0.15, 0.15, 0.375, 1)
               endif
                              
                                 
               stage
                  if ($snowLevel = 1)
                     texture "snow-light-pass2"
                     textureAddressing tile tile
                     ffTextureCoordsSource fromPosition
                     ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert               
                     textureBlend select(texture) select(texture)
                  elseif ($hailLevel = 1)
                     texture "hail-ground-surface"
                     setv2 scaleStage1 (4, 4)
                     textureAddressing tile tile
                     ffTextureCoordsSource fromPosition
                     ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert               
                     textureBlend select(texture) select(texture)
                  else
                     texture "snow-ground-diffuse"                 
                     setv2 scaleStage1 (2, 2)
                     textureAddressing tile tile
                     ffTextureCoordsSource fromPosition
                     ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert               
                     textureBlend multiply(texture colorScalar) select(colorScalar)
                  endif                                    
               end
               
               if ($snowLevel = 1)              
                  stage
                     texture "snow-light-pass1"
                     textureAddressing tile tile
                     ffTextureMatrix  -cameraToGlobal -scalev (17, 17) -invert
                     ffTextureCoordsSource fromPosition
                     textureBlend add(texture outRegister) add(texture outRegister)
                  end                                 
               endif                 
               
               if ($hailLevel = 1)              
                  stage
                     texture "hail-ground-surface"
                     textureAddressing tile tile
                     ffTextureMatrix  -cameraToGlobal -scalev (3, 3) -invert
                     ffTextureCoordsSource fromPosition
                     textureBlend add(texture outRegister) add(texture outRegister)
                  end                                 
               endif                 
               
               if ($snowLevel = 1)
                  if (not tsIsDay)                  
                     stage 
                        textureBlend multiply(diffuse outRegister) select(outRegister)
                     end  
                  else
                     stage 
                        textureBlend select(outRegister) multiply(outRegister diffuse)
                     end                               
                  endif
               elseif ($snowLevel = 2)                  
                  stage 
                     texture "snow-ground-diffuse"
                     textureAddressing tile tile  
                     ffTextureCoordsSource fromPosition
                     ffTextureMatrix -cameraToGlobal -scalev (13, 13) -invert                            
                     textureBlend multiplyAdd(texture colorScalar outRegister) select(diffuse)
                  end          
               else
                  stage 
                     textureBlend multiply(diffuse outRegister) multiply(diffuse outRegister)
                  end             
               endif
             
            end   
         endif   
     
		 create DetermineHardwareSupport()
         
         if ($useHWShader2Path or $useHWShader1Path)
			pass -fixedFunction
               alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
               
               create LightingStates()
            
               create AttenuatedMatCoef(1.0)
               fillmode $stdMatFillMode      
               ffDepthOffset 1
               depthTest true -enableDepthWrite false            
               depthTestFunction acceptIfLessOrEqual
               
               stage
				texture "alphaRamp" # texture name
				textureAddressing clamp clamp
				ffTextureCoordsSource 1
				textureBlend select(texture) select(texture)
               end
               
			   if (tsIsDay)
			    colorScalar (0.965,0.965,1,1)
			   else
				colorScalar (0.3, 0.3, 0.7, 1)
			   endif
               
               stage
				texture "lot-sand-02"
				textureAddressing tile tile
				ffTextureCoordsSource 0
				textureBlend select(texture) multiply(outRegister diffuse)
               end
               
			   stage
				textureBlend multiply(colorScalar outRegister) select(outRegister)
               end
            end
         endif
         
         if ($useHWShader2Path or $useHWShader1Path)
			pass -fixedFunction
               alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
               
               create LightingStates()
            
               create AttenuatedMatCoef(1.0)
               fillmode $stdMatFillMode      
               ffDepthOffset 1
               depthTest true -enableDepthWrite false            
               depthTestFunction acceptIfLessOrEqual
               
               stage
				texture "alphaRamp" # texture name
				textureAddressing clamp clamp
				ffTextureCoordsSource 2
				textureBlend select(texture) select(texture)
               end
           
			   if (tsIsDay)
			    colorScalar (0.965,0.965,1,1)
			   else
				colorScalar (0.4,0.4,0.4,1) 
			   endif
               
               stage
                texture "terrain-deepwatersand"
				textureAddressing tile tile
				ffTextureCoordsSource 0
				textureBlend select(texture) multiply(outRegister diffuse)
               end
               
			   stage
				textureBlend multiply(colorScalar outRegister) select(outRegister)
               end
            end
         endif    
         
      end #end shader
   end #end material
enddef

define LotSkirtMaterialDefinitionVSPS1()
   material
      shader -layer ($lotSkirtLayer * 8)         
         validateRenderShaderContext -vertexFormat position 0 required
         validateRenderShaderContext -vertexFormat normal 0 required
         validateRenderShaderContext -vertexFormat texcoord 0 required         
         
         create DetermineHardwareSupport()
                          
         pass 
            alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
            
            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, 1, 1, 1)         
               else
                  bindConstants 10 -bindingID immediateData -data (0.46, 0.46, 0.91, 1)         
               endif
               
               bindConstants 12 -bindingID geomToGlobal -constantCount 3
                              
               bindConstants 22 -bindingID cameraToClipWithDepthOffset -constantCount 4 -data(0.5, 0.5, 0.5, 0.5) 
			      
			      shaderSource
			         float4x4 modelviewproj : register(c0);
			         float4x3 modelview : register(c4);
				      float4x3 modelviewInv : register(c7);				      				      
                  // light direction
				      float4 lightDir0 : register(c18);
				      float4x4 cameraToClipWithDOMatrix : register(c22);
                  float4 ambient : register(c15);                                   
                  float4x3 modelToWorld : register(c12);
				      				      
				      struct a2v 
                  {
                     float4 pos		: POSITION;                     
                     float3 normal	: NORMAL;
                     float4 color   : COLOR0;
                  };

                  struct v2f
                  {
                     float4 hpos		 : POSITION;                                          
	                  float4 color : COLOR0;	                  	                  
	                  float3 worldPos : TEXCOORD0;
	                  float2 bumpCoords : TEXCOORD1;	                  	                  	                  	                  
	                  float3 tanLightDir : TEXCOORD2;    	               	                         	            
	                  float2 bumpCoords2 : TEXCOORD3;      
                  };
                  
                  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(1, 0, 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));
	                  
	                  float3 worldPos = mul(float4(IN.pos.xyz, 1.0f), modelToWorld);
	                  OUT.bumpCoords = float2(worldPos.x, worldPos.y);
	                  OUT.bumpCoords2 = float2(worldPos.x, worldPos.y)*0.4f;
	                  
	                  // 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 = IN.color.a;	                  
	                  return OUT;
                  }
                  			         
			      endShaderSource
            end # end shader program
            
            if ($useHWShader1Path)
               shaderProgram -target pixelProgram -method compile -version 1_1 # -disassemble "c:\sims2ep5\hlslPS1_1.txt"                                                          
            else
               shaderProgram -target pixelProgram -method compile -version ${psVersion}_0 
            endif
            
               if (tsIsDay)         
                  bindConstants 0 -bindingID immediateData -data (1.1, 1.1, 1.175, 1)         
               else
                  bindConstants 0 -bindingID immediateData -data (0.35, 0.35, 1.0, 1)         
               endif
                        
            
               shaderSource                         
                  float4 colorFactor : register(c0);
                  sampler normmap;                                                      
                  sampler normmap2;
            
                  
                  struct v2f
                  { 
                     float4 hpos	: POSITION;                             
	                  float4 color : COLOR0;	                     	                     
	                  float3 worldPos : TEXCOORD0;              
	                  float2 bumpCoords : TEXCOORD1;               	                     
	                  float3 tanLightDir : TEXCOORD2;  
	                  float2 bumpCoords2 : TEXCOORD3; 	   	                     	              
                  };

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

define LotSkirtRoadMaterialDefinition()
   
   setb hasColor false
   seti totalLights 0

   material
      shader -layer ($lotSkirtLayer * 8)
         validateRenderShaderContext -vertexFormat position      0 required
         validateRenderShaderContext -vertexFormat normal        0 required
         validateRenderShaderContext -vertexFormat texcoord      0 required
     

         setb  hasColor (hasVertexFormat(color,0))
         
         if ($hasColor)
               validateRenderShaderContext -vertexFormat  color         0 required
         endif
         
         pass -fixedFunction
            create LightingStates()
            #create LightingStatesNoStdLights()
            create AttenuatedMatCoef(1.0)
            alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
            fillmode $stdMatFillMode
            
            seti currSeason 4
            
            if (tsIsDay)
               seti currSeason (tsSeasonEnum)
               colorScalar (0.81,0.85,1,1)
            else
               colorScalar (0.83,0.83,0.94,1) 
            endif                                    
                        
            if (not tsIsCloudy)
               if ($currSeason = $kFall)
                  colorScalar (0.975,0.82,0.9,1)
               elseif ($currSeason = $kSpring)
                  colorScalar (0.99,1,0.94,1)
               elseif ($currSeason = $kWinter)
                  colorScalar (0.81,0.85,1,1)
               elseif ($currSeason = $kSummer)
                  colorScalar (1,1,1,1) #summer
               else
                  colorScalar (0.83,0.83,0.94,1) 
               endif
            endif
            
            set weatherSuffix ""
            seti snowLevel (tsHasSnow)               
            if (strstr("$surfaceTexture", "f04") != 0 or strstr("$surfaceTexture", "304") != 0)                              
               if ($snowLevel > 1)                  
                  set weatherSuffix "_HSNOW"
               endif
               if ($snowLevel > 0 and $snowLevel < 2)                  
                  set weatherSuffix "_LSNOW"
               endif
            endif
                        
               
            stage               
               texture "${surfaceTexture}${weatherSuffix}"						
               textureAddressing clamp clamp
               textureBlend multiply(texture diffuse) multiply(texture diffuse)
            end 
            
            stage
               textureBlend multiply(colorScalar outRegister) select(outRegister)
            end
         end
         
         seti hailLevel (tsHasHail)
         if (tsHasSnow >= 1 or $hailLevel >= 1)
            pass -fixedFunction
               alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
               
               fillmode $stdMatFillMode                     
               depthTest true -enableDepthWrite false            
               depthTestFunction acceptIfLessOrEqual      
               
               if (tsIsDay)
                  colorScalar (1.0, 1.0, 1.0, 1.0) -applyTextureLightColor 0 0
               else
                  colorScalar (0.485, 0.485, 0.6, 1) -applyTextureLightColor 0 0
               endif
               
               setv2 scaleStage1 (23, 23)
                  
               stage
                  if ($hailLevel)
                     texture "hail-ground-surface"
                     setv2 scaleStage1 (4, 4)
                  else
                     texture "snow-light-pass2"
                  endif
                  textureAddressing tile tile
                  ffTextureCoordsSource fromPosition
                  ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert               
                  
                  if (not tsIsDay)
                     textureBlend multiply(texture diffuse) multiply(texture diffuse)
                  else
                     textureBlend select(texture) multiply(texture diffuse)
                  endif
               end                                                                                               
            end        
         endif


      end
   end
enddef

define LotSkirtRoadMaterialInstance(materialName textureName)
   materialDefinition &materialName
      setDefinition LotSkirtRoadMaterialDefinition
      addParam surfaceTexture &textureName
   end
enddef

define LotSkirtBoundaryClipMaterial()
   material
      shader -layer (($lotSkirtLayer - 1) * 8)
         pass -fixedFunction -clipAlways
            colorScalar (1, 1, 1, 1)
            depthTest true -enableDepthWrite true
            alphaBlend srcFactor(destColor) add dstFactor(zero)            
            depthTestFunction acceptIfLess
				cullmode cullCounterClockwise
            stage
               textureBlend select(colorScalar) select(colorScalar)				
            end
         end
      end
   end
enddef

materialDefinition lotSkirtBoundaryClip
   setDefinition LotSkirtBoundaryClipMaterial
end

# ==============================================================================
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00005700 lotskirtroad_desert_00005704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00020700 lotskirtroad_desert_00020704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00000f00 lotskirtroad_desert_00000f04)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00000300 lotskirtroad_desert_00000304)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00004b00 lotskirtroad_desert_00004b04)

create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00005700 lotskirtroad_temperate_00005704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00020700 lotskirtroad_temperate_00020704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00000f00 lotskirtroad_temperate_00000f04)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00000300 lotskirtroad_temperate_00000304)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00004b00 lotskirtroad_temperate_00004b04)

create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00005700 lotskirtroad_european_00005704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00020700 lotskirtroad_european_00020704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00000f00 lotskirtroad_european_00000f04)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00000300 lotskirtroad_european_00000304)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00004b00 lotskirtroad_european_00004b04)

create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00005700 lotskirtroad_dirt_00005704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00020700 lotskirtroad_dirt_00020704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00000f00 lotskirtroad_dirt_00000f04)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00000300 lotskirtroad_dirt_00000304)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00004b00 lotskirtroad_dirt_00004b04)

create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00005700 lotskirtroad_concrete_00005704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00020700 lotskirtroad_concrete_00020704)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00000f00 lotskirtroad_concrete_00000f04)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00000300 lotskirtroad_concrete_00000304)
create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00004b00 lotskirtroad_concrete_00004b04)

Personal tools
Namespaces

Variants
Actions
Navigation
game select
Toolbox