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