ShaderDX8simmaterials
From SimsWiki
EP5-SS
0xCD7FE87A
0x1C0532FA
0x60F6A4D9
0xFFBE97D0
# dx8simmaterials
# lightOffset is for doing 'the next 4 lights' in a pass.
define SimMaterialTransformSetupDX8(eyeShifterEnable ambientFlag bumpMapThisPass lightOffset passLightCount passDistantLightCount passPointCount passSpotLightCount)
#trace "SimMaterialTransformSetupDX8 for $currentMaterialName"
setb cubeMapEnabled false
setb transformNormals false
create BindsForHardwareVS1Transforms(true $doMorphing)
if (&eyeShifterEnable)
bindConstants 11 -bindingID immediateData -data @eyeDirection -constantType float
bindConstants 11 -bindingID immediateData -data @l_eyeStretch -constantType float -startChannel Z
bindConstants 11 -bindingID immediateData -data @r_eyeStretch -constantType float -startChannel W
endif
if (&passLightCount = 0)
set lightingMode $kAmbientOnly
else
set lightingMode $kFullLighting
setb transformNormals true
endif
# apply the sim lighting fudge factor due to my screwup in dx7 material. see sims.matshad for a history
setv3 stdMatDiffCoef (($stdMatDiffCoef.xyz) * $simMaterialLightingScale.xxx)
create BindsForLighting($lightingMode)
create TransformFragments($doSkinning false false $doMorphing $numPosMorphs $numNormMorphs $transformNormals 1_1)
if (&ambientFlag and strcmp("${stdMatEnvCubeMode}","reflection") = 0)
if ($transformNormals)
setb cubeMapEnabled true
endif
endif
if ($cubeMapEnabled)
shaderFragment CreateReflectionVector1_1
shaderFragment TexgenReflectionVectorTex21_1
endif
if (&bumpMapThisPass)
# create a tangent space matrix to transform our light vectors.
if ($doSkinning)
shaderFragment TransformTangentSpaceWithCompositeMatrix1_1
else
shaderFragment TransformTangentSpaceNoSkinning1_1
endif
endif
if (&passLightCount)
create DX8DiffusePassLightFragments(&ambientFlag &bumpMapThisPass &lightOffset &passLightCount &passDistantLightCount &passPointCount &passSpotLightCount 1_1)
else
#trace "Dx8 sim xform setup, ambient only"
shaderFragment AmbientLighting1_1
endif
#trace "SimDx8 xformsetup, pixel lights: $perPixelLightCount"
if (&eyeShifterEnable and hasVertexFormat(texcoord,1) )
shaderFragment EyeShifterTexGen1_1
else
shaderFragment Copy2DTexcoords1_1
endif
enddef
define DX8GhostPass()
pass
fillmode $stdMatFillMode
create NonStandardLighting()
#colorWriteEnable -red false -green false -blue false -alpha false
alphaBlend srcFactor(zero) add dstFactor(one)
alphaTest true 128
alphaTestFunction acceptIfGreaterOrEqual
shaderProgram -target vertexProgram -method link
# sim standard material never has eyes, so false to that modifier.
# otherwise pass through all other flags.
create BindsForHardwareVS1Transforms($doSkinning $doMorphing)
create TransformFragments($doSkinning false false $doMorphing $numPosMorphs $numNormMorphs false 1_1)
shaderFragment Copy2DTexcoords1_1
end
shaderProgram -target pixelProgram -method assemble
shaderSource
ps_1_1
tex t0
mov r0,t0.a
endShaderSource
end
sampler 0
texture $stdMatBaseTextureName
end
end
enddef
define CreateSimStandardMaterialDX8()
setb alphaBlendingOn false
seti layerNumber 0
#trace "---------------------------"
#trace "Starting material: $currentMaterialName"
#trace "SimStandard: nmap: $stdMatNormalMapTextureName"
#trace "nmapE $stdMatNormalMapTextureEnabled"
material
if (viewerRenderType = $kRenderTypeShadow)
create SimShadowDX8()
else
create SimsShaderPreCreate()
if (strcmp("${stdMatAlphaBlendMode}", "none"))
setb alphaBlendingOn true
endif
if (numLightsOfType(${kShapeColorLight}) > 0)
setb alphaBlendingOn true
endif
seti layerToAdd ($simHairFlag ? 3 : 17)
seti layerNumber ($stdMatLayer * 18 + ($alphaBlendingOn ? $layerToAdd : 0))
setb localBumpMapFlag false
setf cubeCoefCheck ($stdMatEnvCubeCoef.x + $stdMatEnvCubeCoef.y + $stdMatEnvCubeCoef.z)
# force cubemapping off if the coefficient makes no sense.
if ($cubeCoefCheck < 0.003)
set stdMatEnvCubeMode none
endif
shader -layer $layerNumber
create SimMaterialSetup()
#trace "dx8 simstandard: Bumpmapping: $bumpMapping tangents: $hasTangents"
# do some sort of per-pixel lighting if bumpmapping flag is on, if there are tangents, and only if the object is opaque.
# shapecolor then effectively shuts *off* bumpmapping.
if ($bumpMapping and $hasTangents and $alphaBlendingOn = false)
setb localBumpMapFlag true
else
# if no tangents, then turn off the texture loads too
#trace "No tangents, disabling normal maps"
setb stdMatNormalMapTextureEnabled false
endif
if ($alphaBlendingOn)
create DX8GhostPass()
endif
create RenderSimStandardDiffuseDX8($localBumpMapFlag)
end # end shader
endif
end #end the material
enddef
define SimShadowDX8()
shader
viewerRenderTypePred $kRenderTypeShadow
create SimMaterialSetup()
pass
shaderProgram -method link -target vertexProgram
create BindsForHardwareVS1Transforms($doSkinning $doMorphing)
create TransformFragments($doSkinning true false $doMorphing $numPosMorphs $numNormMorphs false 1_1)
end
shaderProgram -method assemble -target pixelProgram
bindConstants 0 -bindingID immediateData -data ($stdMatShadowColor) -constantType float
shaderSource
ps_1_1
mov r0, c0
endShaderSource
end
end
end
enddef
define RenderSimStandardDiffuseDX8(bumpMapFlag)
seti slotsLeft 0
seti totalLights ($distantLightCount + $pointLightCount +$spotLightCount)
seti pointSpotCount ($pointLightCount + $spotLightCount)
# special case this one, no danger of blowing out instruction count
if ($totalLights = 5 and $distantLightCount = 5)
create SimStandardDiffusePass(false true false 0 5 5 0 0)
seti totalLights 0
else
if ($totalLights < 4)
if ($totalLights > 0)
create SimStandardDiffusePass(false true &bumpMapFlag 0 $totalLights $distantLightCount $pointLightCount $spotLightCount)
seti totalLights 0
else
# don't add to last, do ambient, no bumpmapping, light offset 0, no lights of any kind...
#trace "Ambient only case for sims"
create SimStandardDiffusePass(false true false 0 0 0 0 0)
endif
else
seti slotsLeft 4
seti pass1DistantLights 0
seti pass1PointLights 0
seti pass1SpotLights 0
seti pass1PointSpotLights 0
if ($distantLightCount < 4)
seti pass1DistantLights $distantLightCount
else
seti pass1DistantLights 4
endif
seti slotsLeft (4 - $pass1DistantLights)
if ($pointLightCount > $slotsLeft) # more point lights than slots left.
seti pass1PointLights $slotsLeft # pass 1 points then are the rest of the slots.
seti slotsLeft 0 # no more slots left.
else
seti slotsLeft ($slotsLeft - $pointLightCount) # there was room, compute new slots left
seti pass1PointLights $pointLightCount # consumes all point lights in the first pass.
endif
if ($spotLightCount > $slotsLeft) # more spot lights than slots left.
seti pass1SpotLights $slotsLeft # pass 1 points then are the rest of the slots.
seti slotsLeft 0 # no more slots left.
else
seti slotsLeft ($slotsLeft - $spotLightCount) # there was room, compute new slots left
seti pass1SpotLights $spotLightCount # consumes all point lights in the first pass.
endif
# don't add to back buffer, apply ambient, start at light 0, do 4 lights.
create SimStandardDiffusePass(false true &bumpMapFlag 0 4 $pass1DistantLights $pass1PointLights $pass1SpotLights)
seti pass2DistantLights ($distantLightCount - $pass1DistantLights)
seti pass2PointLights ($pointLightCount - $pass1PointLights)
seti pass2SpotLights ($spotLightCount - $pass1SpotLights)
seti totalLights ($pass2DistantLights + $pass2PointLights + $pass2SpotLights)
if ($totalLights)
# add to back buffer, add ambient to final lighting, no bumpmaps on the 2nd pass start at light 4...
create SimStandardDiffusePass(true false false 4 $totalLights $pass2DistantLights $pass2PointLights $pass2SpotLights)
endif
endif
endif
enddef
# single layer, or CPU composited materials end up here
define SimStandardDiffusePass(addToLastPass ambientFlag bumpThisPass lightOffset passLightCount passDistantLightCount passPointCount passSpotLightCount)
#trace "Pass light counts: D: &passDistantLightCount P: &passPointCount S: &passSpotLightCount"
pass
fillmode $stdMatFillMode
create NonStandardLighting()
if (&addToLastPass = false)
if ($simHairFlag)
create SimHairAlphaState($stdMatAlphaBlendMode)
else
create StandardShaderFBAlphaState($stdMatAlphaBlendMode)
endif
else
if ($simHairFlag)
alphaBlend srcFactor(srcAlpha) add dstFactor(one)
else
alphaBlend srcFactor(one) add dstFactor(one)
endif
depthTest true -enableDepthWrite false
depthTestFunction acceptIfEqual
endif
shaderProgram -target vertexProgram -method link
# sim standard material never has eyes, so false to that modifier.
# otherwise pass through all other flags.
create SimMaterialTransformSetupDX8($eyeGizmoEnable &ambientFlag &bumpThisPass &lightOffset &passLightCount &passDistantLightCount &passPointCount &passSpotLightCount)
end
shaderProgram -target pixelProgram -method assemble
if (&bumpThisPass)
if ($stdMatNormalMapTextureEnabled)
#trace "current normal map: $stdMatNormalMapTextureName"
create SimStandardBumpPixelShaderPS1($perPixelLightCount $finalPixelLightMask)
else
#trace "No normal map, but per pixel is still enabled"
create SimStandardPerPixelLightPS1($perPixelLightCount $finalPixelLightMask $cubeMapEnabled)
endif
else
#trace "No Bumpmaping"
create SimStandardPixelShaderPS1($cubeMapEnabled)
endif
end
if ($stdMatBaseTextureEnabled)
sampler 0
texture $stdMatBaseTextureName
end
endif
if (&bumpThisPass and $stdMatNormalMapTextureEnabled)
sampler 1
texture $stdMatNormalMapTextureName
end
endif
if ($cubeMapEnabled)
sampler 2
texture $stdMatEnvCubeTextureName
textureAddressing clamp clamp clamp
end
endif
end #end the pass
enddef
###
# SIM MATERIAL PIXEL SHADERS
##
# Vertex lit Non-Layered material, can have a cubemap.
define SimStandardPixelShaderPS1(cubeMapEnabled)
if ($stdMatShapeColorIndex = 0)
bindConstants 0 -bindingID shapeColorIndex0
else
bindConstants 0 -bindingID immediateData -data (1,1,1,1)
endif
bindConstants 3 -bindingID immediateData -data ($finalShaderDiffuse, 1)
if(&cubeMapEnabled)
setv3 cubeCoef (($stdMatEnvCubeCoef).xyz)
bindConstants 1 -bindingID immediateData -data ($cubeCoef, 1)
shaderSource
ps_1_1
def c2,1,1,1,1
endShaderSource
if ($stdMatBaseTextureEnabled)
shaderSource
tex t0
tex t2 ; cubemap
mul_x2 r0.rgb, t0, v0
endShaderSource
else
shaderSource
tex t2 ; cubemap
mul_x2 r0.rgb, c2, v0
endShaderSource
endif
if ($simSkinFlag or $stdMatBaseTextureEnabled = false)
shaderSource "+mov r0.a, c2.a"
else
shaderSource "+mov r0.a, t0.a"
endif
shaderSource
mad r0.rgb, t2, c1, r0 ; add cubemap on top.
mul r0, r0, c0 ; apply shape color and emit.
endShaderSource
else
shaderSource
ps_1_1
def c2,1,1,1,1
endShaderSource
if ($stdMatBaseTextureEnabled)
shaderSource
tex t0
mul_x2 r0.rgb, t0, v0
endShaderSource
else
shaderSource "mul_x2 r0.rgb, c3, v0"
endif
if ($simSkinFlag or $stdMatBaseTextureEnabled = false)
shaderSource "+mov r0.a, c2.a"
else
shaderSource "+mov r0.a, t0.a"
endif
if ($stdMatShapeColorIndex = 0)
shaderSource
mul r0, r0, c0 ; apply shape color and emit.
endShaderSource
endif
endif
enddef
# Non-layered material, no bumpmap, but per-pixel lighting. With Cubemap.
define SimStandardPerPixelLightPS1(pixelLightCount pixelLightMask cubeMapEnabled)
bindConstants 0 -bindingID immediateData -data ($finalShaderDiffuse, 1)
bindConstants 1 -bindingID allStandardLightColorsHalf -constantCount 4
setv3 cubeCoef (($stdMatEnvCubeCoef).xyz)
bindConstants 6 -bindingID immediateData -data ($cubeCoef, 1)
bindConstants 7 -bindingID immediateData -data (0,0,0,$simMaterialLightingScale)
if (&pixelLightMask = 1) # X
set lightColor1 "c1"
set lightColor2 "c1"
endif
if (&pixelLightMask = 3) # XY
set lightColor1 "c1"
set lightColor2 "c2"
endif
if (&pixelLightMask = 5) #XZ
set lightColor1 "c1"
set lightColor2 "c3"
endif
if (&pixelLightMask = 9) #XW
set lightColor1 "c1"
set lightColor2 "c4"
endif
if (&pixelLightCount = 2)
shaderSource
ps_1_1
def c5,0,0,1,0
endShaderSource
if ($stdMatBaseTextureEnabled)
shaderSource "tex t0"
endif
if (&cubeMapEnabled)
shaderSource "tex t2"
endif
shaderSource
texcoord t3
dp3_sat r1, c5, v1_bx2
dp3_sat r1.rgb, c5, t3_bx2
mul r0.rgb, r1.a,$lightColor1
mad r0.rgb, r1, $lightColor2, r0
mul r0.rgb, r0, c7.a ; apply the simMaterialLightingScale
add r0.rgb, r0, v0 ; add ambient
endShaderSource
if ($stdMatBaseTextureEnabled)
shaderSource "mul_x2 r0.rgb, r0, t0"
else
# shaderSource "mul_x2 r0.rgb, r0, c0.a"
shaderSource "mov r0.rgb, c0.a"
endif
if ($simSkinFlag)
shaderSource " +mov r0.a, c5.b"
else
shaderSource " +mov r0.a, t0.a"
endif
if (&cubeMapEnabled)
shaderSource "mad r0.rgb, t2, c4,r0"
endif
endif
if (&pixelLightCount = 1)
shaderSource
ps_1_1
def c5,0,0,1,0
endShaderSource
if ($stdMatBaseTextureEnabled)
shaderSource "tex t0"
endif
if (&cubeMapEnabled)
shaderSource "tex t2"
endif
shaderSource
dp3_sat r1, c5, v1_bx2
mul r0.rgb, r1, $lightColor1
mul r0.rgb, r0, c7.a ; apply the simMaterialLightingScale
add r0.rgb, r0, v0 ; add ambient
endShaderSource
if ($stdMatBaseTextureEnabled)
shaderSource "mul_x2 r0.rgb, r0, t0"
else
#shaderSource "mul_x2 r0.rgb, r0, c0.a"
shaderSource "mov r0.rgb, c0.a"
endif
if ($simSkinFlag)
shaderSource " +mov r0.a, c5.b"
else
shaderSource " +mov r0.a, t0.a"
endif
if (&cubeMapEnabled)
shaderSource "mad r0.rgb, t2, c4, r0"
endif
endif
enddef
# Non-layered material with bumpmap.
# SimSkin with CPU compositing will use this PS.
define SimStandardBumpPixelShaderPS1(pixelLightCount pixelLightMask)
bindConstants 1 -bindingID allStandardLightColorsHalf -constantCount 4
bindConstants 7 -bindingID immediateData -data (0,0,0,$simMaterialLightingScale)
#trace "SimStandard BumpSHader: PLC: &pixelLightCount SS: $simSkinFlag"
if (&pixelLightMask = 1) # X
set lightColor1 "c1"
set lightColor2 "c1"
endif
if (&pixelLightMask = 3) # XY
set lightColor1 "c1"
set lightColor2 "c2"
endif
if (&pixelLightMask = 5) #XZ
set lightColor1 "c1"
set lightColor2 "c3"
endif
if (&pixelLightMask = 9) #XW
set lightColor1 "c1"
set lightColor2 "c4"
endif
if (&pixelLightCount = 2)
if ($simSkinFlag)
shaderSource
ps_1_1
def c5,1,1,1,1
tex t0
tex t1
texcoord t3
dp3_sat r1, t1_bx2, v1_bx2
dp3_sat r1.rgb, t1_bx2, t3_bx2
mul r0.rgb, r1.a, $lightColor1
mad r0.rgb, r1, $lightColor2, r0
mul r0.rgb, r0, c7.a ; apply the simMaterialLightingScale
add r0.rgb, r0, v0 ; add ambient
mul_x2 r0.rgb, r0, t0
+mov r0.a, c5.a ; force alpha to 1.0 for compositing into thumbnails.
endShaderSource
else
shaderSource
ps_1_1
tex t0
tex t1
texcoord t2
texcoord t3
dp3_sat r1, t1_bx2, v1_bx2
dp3_sat r1.rgb, t1_bx2, t3_bx2
mul r0.rgb, r1.a, $lightColor1
mad r0.rgb, r1, $lightColor2, r0
mul r0.rgb, r0, c7.a ; apply the simMaterialLightingScale
add r0.rgb, r0, v0 ; add ambient
mul_x2 r0.rgb, r0, t0
+mov r0.a, t0.a
endShaderSource
endif
endif
if (&pixelLightCount = 1)
if ($simSkinFlag)
shaderSource
ps_1_1
def c5,1,1,1,1
tex t0
tex t1
texcoord t2
dp3_sat r1, t1_bx2, v1_bx2
mul r0.rgb, r1, $lightColor1
mul r0.rgb, r0, c7.a ; apply the simMaterialLightingScale
add r0.rgb, r0, v0 ; add ambient
mul_x2 r0.rgb, r0, t0
+mov r0.a, c5.a ; force 'opaque' alpha.
endShaderSource
else
shaderSource
ps_1_1
tex t0
tex t1
texcoord t2
dp3_sat r1, t1_bx2, v1_bx2
mul r0.rgb, r1, $lightColor1
mul r0.rgb, r0, c7.a ; apply the simMaterialLightingScale
add r0.rgb, r0, v0 ; add ambient
mul_x2 r0.rgb, r0, t0
+mov r0.a, t0.a
endShaderSource
endif
endif
enddef
define CreateSimSkinPerPixelCompositingMaterialPS1()
material
# original
# 0 = eyes
# 1 = lips
# 2 = brows
# 3 = skin
# num to composite = 4
seti totalLights 0
seti slotsLeft 0
seti pointSpotCount 0
setb alphaBlendingOn false
seti layerNumber 0
seti pass1DistantLights 0
seti slotsLeft 4
seti pass1DistantLights 0
seti pass1PointLights 0
seti pass1SpotLights 0
seti pass1PointSpotLights 0
seti pass2DistantLights 0
seti pass2PointLights 0
seti pass2SpotLights 0
seti pass2PointSpotLights 0
seti bumpTextureCount 0
if (viewerRenderType = $kRenderTypeShadow)
create SimShadowDX8()
else
if (strcmp("${stdMatAlphaBlendMode}", "none"))
setb alphaBlendingOn true
endif
if (numLightsOfType(${kShapeColorLight}) > 0)
setb alphaBlendingOn true
endif
seti layerNumber ($stdMatLayer * 18 + ($alphaBlendingOn ? 17 : 0))
shader -layer $layerNumber
create SimMaterialSetup()
if ($numTexturesToComposite < 5) # ie, 4 or less, composite in one go
create SimSkinCompositingPassDX8($numTexturesToComposite false baseTexture simSkinCompositedBaseTexture)
else # more than 4, do 4 at a time, then alpha blend the next batch in.
create SimSkinCompositingPassDX8(4 false baseTexture simSkinCompositedBaseTexture)
seti layersLeft ($numTexturesToComposite-4)
create SimSkinCompositingPassDX8($layersLeft true baseTexture simSkinCompositedBaseTexture)
endif
seti totalLights ($distantLightCount + $pointLightCount +$spotLightCount)
setb localBumpMapFlag false
create BumpTextureCount()
if ($bumpTextureCount)
if ($numTexturesToComposite = 2)
if (strcmp("${bumpTexture1}", "") != 0)
create SimSkinBumpCompositingPassDX8( simSkinCompositedBumpTexture)
setb localBumpMapFlag true
endif
endif
else
if ($bumpMapping and $hasTangents) # permission to use per-pixel lighting (no bumpmap texture required)
setb localBumpMapFlag true
endif
endif
# special case this one, no danger of blowing out instruction count
if ($totalLights = 5 and $distantLightCount = 5)
##trace "5 light special case, DX8"
create SimSkinPass(false true false 0 5 5 0 0)
seti totalLights 0
endif
if ($totalLights < 5)
if ($totalLights > 0)
create SimSkinPass(false true $localBumpMapFlag 0 $totalLights $distantLightCount $pointLightCount $spotLightCount)
seti totalLights 0
endif
else
if ($distantLightCount < 4)
seti pass1DistantLights $distantLightCount
else
seti pass1DistantLights 4
endif
seti slotsLeft (4 - $pass1DistantLights)
if ($pointLightCount > $slotsLeft) # more point lights than slots left.
seti pass1PointLights $slotsLeft # pass 1 points then are the rest of the slots.
seti slotsLeft 0 # no more slots left.
else
seti slotsLeft ($slotsLeft - $pointLightCount) # there was room, compute new slots left
seti pass1PointLights $pointLightCount # consumes all point lights in the first pass.
endif
if ($spotLightCount > $slotsLeft) # more spot lights than slots left.
seti pass1SpotLights $slotsLeft # pass 1 points then are the rest of the slots.
seti slotsLeft 0 # no more slots left.
else
seti slotsLeft ($slotsLeft - $spotLightCount) # there was room, compute new slots left
seti pass1SpotLights $spotLightCount # consumes all point lights in the first pass.
endif
# don't add to back buffer, apply ambient, bumpmaps if called for, start at light 0, do 4 lights.
create SimSkinPass(false true $localBumpMapFlag 0 4 $pass1DistantLights $pass1PointLights $pass1SpotLights)
seti pass2DistantLights ($distantLightCount - $pass1DistantLights)
seti pass2PointLights ($pointLightCount - $pass1PointLights)
seti pass2SpotLights ($spotLightCount - $pass1SpotLights)
seti totalLights ($pass2DistantLights + $pass2PointLights + $pass2SpotLights)
if ($totalLights)
# add to back buffer, add ambient to final lighting, sno bumpmaps tart at light 4...
create SimSkinPass(true false false 4 $totalLights $pass2DistantLights $pass2PointLights $pass2SpotLights)
endif
endif
end #shader
endif
end #end material
enddef
define SimSkinPass(addToLastPass ambientFlag bumpMapThisPass lightOffset passLightCount passDistantLightCount passPointCount passSpotLightCount)
#trace "SimSkinPass $currentMaterialName, add: &addToLastPass, Bump &bumpMapThisPass lights this time: &passLightCount D:&passDistantLightCount P: &passPointCount S: &passSpotLightCount"
pass
fillmode $stdMatFillMode
# always return to the 'true' RT, since the previous passes (probably) were compositing textures.
# if we are doing a second batch of lights or other stuff, set up for alpha blending to the back buffer
if (&addToLastPass)
alphaBlend srcFactor(one) add dstFactor(one)
depthTest true -enableDepthWrite false
depthTestFunction acceptIfEqual
else
renderTarget viewerRenderTarget
if (strcmp("${stdMatAlphaBlendMode}", "blend") = 0)
alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
depthTest true -enableDepthWrite false
endif
endif
if ($eyeGizmoEnable)
if (hasVertexFormat(texcoord,1) = false)
#trace "Eye Movement desired, but no 2nd texcoord channel exists!!"
setb eyeGizmoEnable false
endif
endif
shaderProgram -target vertexProgram -method link
if ($eyeGizmoEnable)
#trace "$currentMaterialName constants bound for eyemotion"
bindConstants 7 -bindingID immediateData -data @eyeAnimation -constantType float
endif
create SimMaterialTransformSetupDX8($eyeGizmoEnable &ambientFlag &bumpMapThisPass &lightOffset &passLightCount &passDistantLightCount &passPointCount &passSpotLightCount)
end
if (&bumpMapThisPass)
if ($bumpTextureCount)
create SimSkinBumpPixelShaderPS1(2)
else
create SimSkinPerPixelLightingPS1(2)
endif
else
create SimSkinPixelShaderPS1()
endif
# use the RTT we just filled in with the composited layers.
sampler 0
texture "simSkinCompositedBaseTexture"
end
if ($bumpTextureCount)
sampler 1
texture "simSkinCompositedBumpTexture"
end
endif
end # pass
enddef
define SimSkinCompositingPassDX8(layerCount secondSet sourceTextureName destTextureName)
pass
renderClipSpaceRect
renderTarget &{destTextureName} -fixed (512, 512) -bppHint 32 -alphaBitsHint 8 -allocateDepthBuffer false
depthTest false -enableDepthWrite false
depthTestFunction accept
if (&secondSet)
alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
endif
shaderProgram -target vertexProgram -method assemble
shaderSource
vs_1_1
dcl_position v0
dcl_texcoord v1
mov oPos, v0 ; clip space quad, no transforms needed.
mov oT0.xy, v1
mov oT1.xy, v1
mov oT2.xy, v1
mov oT3.xy, v1
endShaderSource
end
# always check 'baseTexture0', if that fails, NO names are set
if (strcmp("${baseTexture0}", "") != 0)
shaderProgram -target pixelProgram -method assemble
shaderSource
ps_1_1
def c0, 1,1,1,1
tex t0
endShaderSource
if (&layerCount > 1)
shaderSource "tex t1" # usually 2 layers, but we might be on layer 5, with all previous layers composited.
endif
if (&layerCount > 2)
shaderSource "tex t2"
endif
if (&layerCount > 3)
shaderSource "tex t3"
endif
if (&layerCount = 1)
# problem... any more than 4 layers, and dest alpha will be fubar
shaderSource "mov r0, t0" # let post blender do the blending, or maybe there is only one layer.
else
shaderSource "lrp r0.rgb, t1.a, t1, t0"
shaderSource "+add r0.a, t1.a, t0.a" # adding alphas means to occlude more of the background.
if (&layerCount > 2)
shaderSource "lrp r0.rgb, t2.a, t2, r0"
shaderSource "+add r0.a, r0.a, t2.a"
endif
if (&layerCount > 3)
shaderSource "lrp r0.rgb, t3.a, t3, r0"
shaderSource "+add r0.a, r0.a, t2.a"
endif
endif
end # shader pixel program
if (strcmp("&{sourceTextureName}", "baseTexture")= 0)
if (&secondSet)
create CompositingSamplersLastFourBase( &layerCount)
else
create CompositingSamplersFirstFourBase(&layerCount)
endif
endif
# have bumpmap case here
# bump can only do 2 layers at a time, since I have to load the original base texture to get the alpha for blending the bump.
#(probably never more than 2 layers though...)
if (strcmp("&{sourceTextureName}", "bumpTexture")= 0)
create CompositingSamplersBump(&layerCount )
endif
else # if baseTex 0 is invalid...
shaderProgram -target pixelProgram -method assemble
shaderSource
ps_1_1
def c0, 1,1,1,1
mov r0, c0
endShaderSource
end
endif
end # pass
enddef
define SimSkinBumpCompositingPassDX8(destTextureName)
pass
renderClipSpaceRect
renderTarget &{destTextureName} -fixed (512, 512) -bppHint 32 -alphaBitsHint 8 -allocateDepthBuffer false
depthTest false -enableDepthWrite false
depthTestFunction accept
shaderProgram -target vertexProgram -method assemble
shaderSource
vs_1_1
dcl_position v0
dcl_texcoord v1
mov oPos, v0 ; clip space quad, no transforms needed.
mov oT0.xy, v1
mov oT1.xy, v1
mov oT2.xy, v1
mov oT3.xy, v1
endShaderSource
end
shaderProgram -target pixelProgram -method assemble
shaderSource
ps_1_1
def c0, 0.5,0.5,1,0
tex t0 ; the baseTexture1 ,(base 0 is 'the skin', and doesn't need compositing
tex t1 ; the first layer bumpmap
lrp r0, t0.a, t1, c0 ; LRP between 0,0,1 (skin) or the normal map normal, based on the 'clothing' alpha.
endShaderSource
end # shader pixel program
sampler 0
texture $baseTexture1
textureFilterHint point point
end
sampler 1
texture $bumpTexture1
textureFilterHint point point
end
end # pass
enddef
define CompositingSamplersFirstFourBase(layerCount)
sampler 0
texture $baseTexture0
textureFilterHint point point
end
if (&layerCount > 1)
sampler 1
texture $baseTexture1
textureFilterHint point point
end
endif
if (&layerCount > 2)
sampler 2
texture $baseTexture2
textureFilterHint point point
end
endif
if (&layerCount > 3)
sampler 3
texture $baseTexture3
textureFilterHint point point
end
endif
enddef
define CompositingSamplersBump(layerCount)
sampler 0
texture $baseTexture0
textureFilterHint point point
end
sampler 1
texture $bumpTexture0
textureFilterHint point point
end
if (&layerCount = 2)
sampler 2
texture $baseTexture1
textureFilterHint point point
end
sampler 3
texture $bumpTexture1
textureFilterHint point point
end
endif
enddef
define CompositingSamplersLastFourBase(layerCount)
sampler 0
texture $baseTexture4
textureFilterHint point point
end
if (&layerCount > 1)
sampler 1
texture $baseTexture5
textureFilterHint point point
end
endif
if (&layerCount > 2)
sampler 2
texture $baseTexture6
textureFilterHint point point
end
endif
if (&layerCount > 3)
sampler 3
texture $baseTexture7
textureFilterHint point point
end
endif
enddef
# Renders a GPU composited SimSkin, vertex lit
define SimSkinPixelShaderPS1()
#trace "$currentMaterialName : simskinpixel shader dx8"
shaderProgram -target pixelProgram -method assemble
if ($stdMatShapeColorIndex !=-1)
bindConstants 0 -bindingID shapeColorIndex0
shaderSource
ps_1_1
tex t0
mul_x2 r0, t0, v0 ; *2 to recover 'HDR" lights, (0.5 = "1.0 brightness" before this mul)
mul r0.rgb,r0,c0
+ mov r0.a, c0.a
endShaderSource
else
shaderSource
ps_1_1
tex t0
mul_x2 r0, t0, v0
endShaderSource
endif
end
enddef
# Renders a GPU composited SimSkin, bumpmapping and vertex lit.
define SimSkinBumpPixelShaderPS1(lightCount)
#trace "$currentMaterialName : SimSkin BUMP shader dx8"
shaderProgram -target pixelProgram -method assemble
bindConstants 0 -bindingID allStandardLightColorsHalf -constantCount 3
if (&lightCount = 2)
shaderSource
ps_1_1
tex t0
tex t1
texcoord t2
texcoord t3
dp3_sat r1, t1_bx2, t2_bx2 ; light 1 N.L
dp3_sat r1.rgb, t1_bx2, t3_bx2 ; light 2 N.L
mul r0.rgb, r1.a, c0 ; light 1 color
mad r0.rgb, r1, c2, r0 ; light 2 color
add r0.rgb, r0, v0 ; add ambient, and vertex light
mul_x2 r0.rgb, r0, t0 ; base texture * light result.
+mov r0.a, t0.a
endShaderSource
endif
if (&lightCount = 3)
shaderSource
ps_1_1
tex t0
tex t1
texcoord t2
texcoord t3
dp3_sat r1, t1_bx2, t2_bx2
dp3_sat r1.rgb, t1_bx2, t3_bx2
dp3_sat r0, t1_bx2, v1_bx2 ; 3rd light
mul r0.rgb, r1.a, c0
mad r0.rgb, r1, c1, r0
mad r0.rgb, r0.a, c2, r0
add r0.rgb, r0, v0 ; add any ambient or vertex lighting.
mul_x2 r0.rgb, r0, t0
+mov r0.a, t0.a
endShaderSource
endif
end #end shader program
enddef
# Uses default 0,0,1 normal for per-pixel lighting.
define SimSkinPerPixelLightingPS1(lightCount)
#trace "$currentMaterialName : SimSkin PPL shader dx8"
shaderProgram -target pixelProgram -method assemble
bindConstants 0 -bindingID allStandardLightColorsHalf -constantCount 3
if (&lightCount = 2)
shaderSource
ps_1_1
def c5,0,0,1,0
tex t0
texcoord t2
texcoord t3
dp3_sat r1, c5, t2_bx2 ; light 1 N.L
dp3_sat r1.rgb, c5, t3_bx2 ; light 2 N.L
mul r0.rgb, r1.a, c0 ; light 1 color
mad r0.rgb, r1, c2, r0 ; light 2 color
add r0.rgb, r0, v0 ; add ambient, and vertex light
mul_x2 r0.rgb, r0, t0 ; base texture * light result.
+mov r0.a, t0.a
endShaderSource
endif
if (&lightCount = 3)
shaderSource
ps_1_1
def c5,0,0,1,0
tex t0
texcoord t2
texcoord t3
dp3_sat r1, c5, t2_bx2
dp3_sat r1.rgb, c5, t3_bx2
dp3_sat r0, c5, v1_bx2 ; 3rd light
mul r0.rgb, r1.a, c0
mad r0.rgb, r1, c1, r0
mad r0.rgb, r0.a, c2, r0
add r0.rgb, r0, v0 ; add any ambient or vertex lighting.
mul_x2 r0.rgb, r0, t0
+mov r0.a, t0.a
endShaderSource
endif
end #end shader program
enddef