ShaderImposters

From SimsWiki
Jump to: navigation, search

EP7-FT
0xCD7FE87A
0x1C0532FA
0xA335F05F
0xFFD7EBE7
# imposters

#
# Shaders for imposters
#

# NOTE: because imposters are generated by
# rendering the lot to textures, all imposter
# textures effectively have pre-multiplied alpha.


# This parameter gets used for lots saved prior to ~12/20/03. For the
# new lots, this parameter gets set in code. This parameter is used to
# slightly tint the imposter terrain surface to make it slightly stand out
# in the neighborhood terrain.
setc lightMapTint (1.0, 1.0, 1.0)

#layer ID of neighborhood terrain canvas
seti  nhoodCanvasLayer -8

setb isQuad false

# Used for double-sided slices, which are assumed to be 
# drawn in correct front/back order.
define ImposterDualPackedSliceMaterial()
# params: page
   material
      shader -layer (($stdMatLayer * 8))
         vertexFormatPred position      0 true
         numLightsPred $kShadeLight (numLightsOfType(${kShadeLight}))
         
         pass -fixedFunction
			   create LightingStatesNoStdLights()

            # the imposters are saved with pre-multiplied alpha.
			   alphaBlend srcFactor(one) add dstFactor(invSrcAlpha)

            alphaTest true 127
            alphaTestFunction acceptIfGreater                        
            
            fillmode $stdMatFillMode
            
            create ImposterColorScalarWithTextureLight(true)
            
            stage
               texture "slices_${page}"
                                             
               textureMIPFilterHint disabled
               textureFilterHint point point

               textureBlend multiply(texture colorScalar) multiply(texture colorScalar)
            end    
         end
         
           if (tsHasSnow >= 1)   
               pass -fixedFunction
			         create LightingStatesNoStdLights()

                  # the imposters are saved with pre-multiplied alpha.
			         alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)

                  alphaTest true 0
                  alphaTestFunction acceptIfGreaterOrEqual
                  
                  #ffDepthOffset 1
                  depthTest true -enableDepthWrite false            
                  depthTestFunction acceptIfEqual      

                  
                  fillmode $stdMatFillMode
                  
                  create ImposterColorScalarWithTextureLight(true)
                     
                  stage
                     texture "snow-light-pass1"
                     textureAddressing tile tile
                     ffTextureCoordsSource fromPosition
                     ffTextureMatrix -cameraToGlobal -scalev (23, 23) -invert               
                     textureBlend multiply(texture colorScalar) multiply(texture colorScalar)
                  end
                  
                  stage
                     texture "snow-light-pass2"
                     textureAddressing tile tile
                     ffTextureMatrix  -cameraToGlobal -scalev (17, 17) -invert
                     ffTextureCoordsSource fromPosition
                     textureBlend multiplyAdd(texture colorScalar outRegister) multiplyAdd(texture colorScalar outRegister)                  
                  end   
                                    
               end            
            endif                                               
      end
   end
enddef


setb includeLightMap false
setb includeHighlight false
set textureCoordSet 0

define ImposterTerrainMaterial()
   material
      shader -layer (($nhoodCanvasLayer + 5)* 8)
         vertexFormatPred position      0 true
         numLightsPred $kShadeLight (numLightsOfType(${kShadeLight}))                  
         
         setb isTypeQuad ($isQuad)
         
         if ($includeLightMap)
            pass -fixedFunction
               create NonStandardLighting()
            
               alphaBlend srcFactor(destColor) add dstFactor(invSrcAlpha)
               fillmode $stdMatFillMode
               
               alphaTest true 0
               alphaTestFunction acceptIfGreater    
               depthTest true -enableDepthWrite false                           
                                       
               
               if ($isTypeQuad)
                  #always accept it as we its alpha and we are writing over terrain
                  depthTest true -enableDepthWrite false
                  ffDepthOffset 100
                  depthTestFunction acceptIfLessOrEqual
               endif
               
                          
               colorScalar $lightMapTint 1
               stage
                  if ($isTypeQuad)
                     texture $lmapTexture
                  else
                     texture "terrainLmap"
                  endif
                  
                  textureFilterHint bilinear bilinear
                  textureAddressing tile tile
                  ffTextureCoordsSource $textureCoordSet
   
                  textureBlend multiply(texture colorScalar) select(texture)
               end  
            end   
            
            
         endif

    seti snowLevel (tsHasSnow)           
    
    # only draw terrain paint layer if no snow covering it up
    
    if ($snowLevel < 1)   
        pass -fixedFunction
            create NonStandardLighting()
               alphaBlend srcFactor(one) add dstFactor(invSrcAlpha)
            fillmode $stdMatFillMode
            
            alphaTest true 0
            alphaTestFunction acceptIfGreater   
            depthTest true -enableDepthWrite false
            
            if ($isTypeQuad)
               #always accept it as its alpha and we are writing over terrain
               ffDepthOffset 100
               depthTest true -enableDepthWrite false
               depthTestFunction acceptIfLessOrEqual               
            endif
                        
            # use shape light only in neighborhood mode
            # we don't want to make the terrain fade as it looks bad                        
            create ImposterColorScalarWithTextureLight(tsIsInNeighborhood)
            
            stage
               if ($isTypeQuad)                  
                  texture $terrainTexture
               else
                  texture "terrain"
               endif
               
               textureFilterHint bilinear bilinear
               textureAddressing clamp clamp
               
               textureBlend multiply(texture colorScalar) multiply(texture colorScalar)
            end  
            
        end # pass                  
    endif
         
         
         if ($includeHighlight)
            pass -fixedFunction
               create NonStandardLighting()
               alphaBlend srcFactor(srcAlpha) add dstFactor(one)
               fillmode $stdMatFillMode
               
               alphaTest true 0
               alphaTestFunction acceptIfGreater 
               
               colorScalar (0.2, 1, 0.2) 0.3

               stage                  
                  textureBlend select(colorScalar) select(colorScalar)
               end  
            end         
         endif
      end
   end
enddef

define ImposterWallMaterial()
   material
      shader -layer ($stdMatLayer * 8)
         vertexFormatPred position      0 true
         numLightsPred $kShadeLight (numLightsOfType(${kShadeLight}))
                  
         pass -fixedFunction
            create NonStandardLighting()
                        

            if (numLightsOfType(${kShapeColorLight}) > 0 and not tsIsInNeighborhood)               
               alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
               depthTest true -enableDepthWrite false
            else               
               alphaBlend srcFactor(one) add dstFactor(invSrcAlpha)
               depthTest true -enableDepthWrite true
               depthTestFunction acceptIfLessOrEqual
            endif
            
            alphaTest true 64
            alphaTestFunction acceptIfGreater
			   
            fillmode $stdMatFillMode
            cullmode cullClockwise
            
            create ImposterColorScalarWithTextureLight(true)

            stage
               texture "walls_${page}"
                              
               textureMIPFilterHint disabled
               textureFilterHint point point 
               
               textureBlend multiply(texture colorScalar) multiply(texture colorScalar)
            end              
         end   
      end
   end
enddef

define ImposterRoofMaterial()
   material
      shader -layer ($stdMatLayer * 8)
         vertexFormatPred position 0 true
         numLightsPred $kShadeLight (numLightsOfType(${kShadeLight}))

         pass
            create NonStandardLighting()
            
            shaderProgram -target vertexProgram -method assemble
               bindConstants 0 -bindingID geomToClip -constantCount 4
                              
               setf invRoofTextureTiles (1 / 64)
               
               shaderSource
                  vs_1_1
                  def c4, $invRoofTextureTiles, -$invRoofTextureTiles, 0, 1
                  dcl_position v0
                     
                  m4x4 oPos, v0, c0
                  mad oT0.xy, v0, c4.xy, c4.zw
               endShaderSource
            end
   
			   
            fillmode $stdMatFillMode
            cullmode none
            
            if (numLightsOfType(${kShapeColorLight}) > 0 and not tsIsInNeighborhood)
               alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
               depthTest true -enableDepthWrite false
            else
               alphaBlend srcFactor(one) add dstFactor(zero)
            endif
            
            create ImposterColorScalarWithTextureLight(true)
            
            
            stage
               texture "roofs"
               
               textureFilterHint bilinear bilinear 
               textureAddressing clamp clamp
               
               textureBlend multiply(texture colorScalar) select(colorScalar)
            end                                                  
         end   
         
         if (tsHasSnow >= 1)
            pass 
               shaderProgram -target vertexProgram -method assemble
                  bindConstants 0 -bindingID geomToClip -constantCount 4
                                 
                  setf invRoofTextureTiles (1/8)
                  
                  shaderSource
                     vs_1_1
                     def c4, $invRoofTextureTiles, -$invRoofTextureTiles, 0, 1
                     dcl_position v0
                        
                     m4x4 oPos, v0, c0
                     mad oT0.xy, v0, c4.xy, c4.zw
                  endShaderSource
               end
               
               alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
               
               fillmode $stdMatFillMode      
               ffDepthOffset 1
               depthTest true -enableDepthWrite false            
               depthTestFunction acceptIfLessOrEqual      
               
               create ImposterColorScalarWithTextureLight(true)
                  
               stage
                  texture "snow-light-roof-pass1"
                  textureAddressing tile tile
                  textureFilterHint bilinear bilinear
                  textureBlend multiply(texture colorScalar) multiply(texture diffuse)
               end                       
               
               stage
                  textureBlend select(outRegister) multiply(outRegister colorScalar)
               end                      
            end        
         endif
      end
   end
enddef

define ImposterColorScalarWithTextureLight(useShapeColor)
   # Allow shade colour, but only if we're not being highlighted.
   if (&useShapeColor)   
      colorScalar (1, 1, 1, 1) -applyShapeColor 0 -applyTextureLightColor 0 0
   else
      colorScalar (1, 1, 1, 1) -applyTextureLightColor 0 0
   endif
   
   if (numLightsOfType(${kShadeLight}) != 0 and numLightsOfType(${kShapeColorLight}) = 0)
      tsUserLight shadeLight 0
   endif            
enddef

define ImposterColorScalar()
   # Allow shade colour, but only if we're not being highlighted.
   colorScalar (1, 1, 1, 1) -applyShapeColor 0 
   if (numLightsOfType(${kShadeLight}) != 0 and numLightsOfType(${kShapeColorLight}) = 0)
      tsUserLight shadeLight 0
   endif            
enddef

Personal tools
Namespaces

Variants
Actions
Navigation
game select
Toolbox