Difference between revisions of "ShaderDX9simmaterials"
From SimsWiki
(EP2-NL) |
(EP5-SS) |
||
(2 intermediate revisions by one user not shown) | |||
Line 1: | Line 1: | ||
<pre> | <pre> | ||
− | + | EP5-SS | |
0xCD7FE87A | 0xCD7FE87A | ||
0x1C0532FA | 0x1C0532FA | ||
Line 129: | Line 129: | ||
define DX9SimSkinCompositingMaterial() | define DX9SimSkinCompositingMaterial() | ||
− | + | if (viewerRenderType = $kRenderTypeShadow) | |
create SimShadowDX9() | create SimShadowDX9() | ||
+ | elseif (viewerRenderType = $kRenderTypeShadowMap) | ||
+ | create SimShadowMapDX9() | ||
else | else | ||
create SimSkinPerPixelCompositingRendering() | create SimSkinPerPixelCompositingRendering() | ||
Line 157: | Line 159: | ||
− | if (&singleTextureFlag) | + | if (&singleTextureFlag) |
alphaTest true 128 | alphaTest true 128 | ||
alphaTestFunction acceptIfGreaterOrEqual | alphaTestFunction acceptIfGreaterOrEqual | ||
Line 199: | Line 201: | ||
setb alphaBlendingOn false | setb alphaBlendingOn false | ||
− | + | if (viewerRenderType = $kRenderTypeShadow) | |
create SimShadowDX9() | create SimShadowDX9() | ||
+ | elseif (viewerRenderType = $kRenderTypeShadowMap) | ||
+ | create SimShadowMapDX9() | ||
else | else | ||
create SimsShaderPreCreate() | create SimsShaderPreCreate() | ||
Line 207: | Line 211: | ||
setb alphaBlendingOn true | setb alphaBlendingOn true | ||
endif | endif | ||
− | + | ||
if (numLightsOfType(${kShapeColorLight}) > 0) | if (numLightsOfType(${kShapeColorLight}) > 0) | ||
− | + | setb alphaBlendingOn true | |
− | + | endif | |
− | + | ||
− | seti layerToAdd ($simHairFlag ? 3 : | + | seti layerToAdd ($simHairFlag ? 3 : 17) |
− | seti layerNumber ($stdMatLayer * | + | seti layerNumber ($stdMatLayer * 18 + ($alphaBlendingOn ? $layerToAdd : 0)) |
#trace "Dx9 sim standard: $currentMaterialName, layer : $layerNumber alphaBlend: $alphaBlendingOn" | #trace "Dx9 sim standard: $currentMaterialName, layer : $layerNumber alphaBlend: $alphaBlendingOn" | ||
Line 236: | Line 240: | ||
#trace "Sim standard $currentMaterialName with shapeColor active" | #trace "Sim standard $currentMaterialName with shapeColor active" | ||
− | create GhostPrepZPass(true $stdMatBaseTextureName) | + | if (strstr("$currentMaterialName", "lobot") = 0) |
+ | create GhostPrepZPass(true $stdMatBaseTextureName) | ||
+ | endif | ||
endif | endif | ||
Line 252: | Line 258: | ||
pass | pass | ||
− | fillmode $stdMatFillMode | + | fillmode $stdMatFillMode |
#fillmode wireframe | #fillmode wireframe | ||
Line 263: | Line 269: | ||
create NonStandardLighting() | create NonStandardLighting() | ||
+ | |||
if ($simHairFlag) | if ($simHairFlag) | ||
Line 563: | Line 570: | ||
enddef | enddef | ||
+ | |||
+ | define SimShadowMapDX9() | ||
+ | shader | ||
+ | |||
+ | viewerRenderTypePred $kRenderTypeShadowMap | ||
+ | |||
+ | create SimMaterialSetup() | ||
+ | |||
+ | pass | ||
+ | shaderProgram -method link -target vertexProgram | ||
+ | create BindsForHardwareVS2Transforms(true $doMorphing) | ||
+ | create TransformFragments($doSkinning true false $doMorphing $numPosMorphs $numNormMorphs false 2_0) | ||
+ | end | ||
+ | |||
+ | create ShadowMapPS() | ||
+ | end | ||
+ | |||
+ | end | ||
+ | enddef | ||
Line 572: | Line 598: | ||
create SimMaterialSetup() | create SimMaterialSetup() | ||
− | pass | + | pass |
− | + | ||
shaderProgram -method link -target vertexProgram | shaderProgram -method link -target vertexProgram | ||
create BindsForHardwareVS2Transforms(true $doMorphing) | create BindsForHardwareVS2Transforms(true $doMorphing) |
Latest revision as of 15:06, 10 July 2007
EP5-SS 0xCD7FE87A 0x1C0532FA 0x8852F2DC 0xFFDA7307 # dx9simmaterials setb edgeLighting false define SimMaterialTransformSetupDX9(eyeShifterEnable) setb transformNormals true create BindsForHardwareVS2Transforms($doSkinning $doMorphing) set lightingMode $kFullLighting if ($totalLights = 0) set lightingMode $kAmbientOnly setb transformNormals false 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) if ($lightingMode = $kFullLighting and $vs2LoopsFunctional) create SupportedRenderShaderContextFFPredicates() endif create BindsForLighting($lightingMode) 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 # skinning can be turned off for some sim cases, like CAS, so I have to honor this setting. create TransformFragments($doSkinning false false $doMorphing $numPosMorphs $numNormMorphs $transformNormals 2_0) # hasTangents is a good substitute for a bumpmapping flag on the sim materials, since it always tends to be on. # create a tangent space matrix to transform our light vectors. setb localBumpmappingFlag false if ($hasTangents and $bumpMapping and $lightingMode = $kFullLighting) setb localBumpmappingFlag true endif if ($localBumpmappingFlag) if ($doSkinning) shaderFragment TransformTangentSpaceWithCompositeMatrix2_0 else shaderFragment TransformTangentSpaceNoSkinning2_0 endif endif if ($totalLights > 0) if ($vs2LoopsFunctional) #trace "$vs2LoopsFunctional <- loops active" create AddLoopingLightFragments($localBumpmappingFlag false 2_0) else create StandardLightFragmentsDX9(false $localBumpmappingFlag 2_0) endif else set stdMatEnvCubeMode none shaderFragment AmbientLightingHDR2_0 endif # For edge lighting # if ($localBumpmappingFlag) # shaderFragment TransformViewVectorToLocalSpace2_0 # endif if (&eyeShifterEnable) shaderFragment EyeShifterTexGen2_0 else if (strcmp("${stdMatEnvCubeMode}", "none") = 0) if ($hasTexcoords) shaderFragment NoTextureMagic2_0 endif else if ($hasTexcoords) shaderFragment NoTextureMagic2_0 endif if ($transformNormals) #trace "$currentMaterialName : xform normals $transformNormals , env cube mode: $stdMatEnvCubeMode" shaderFragment CreateReflectionVector2_0 shaderFragment TexgenReflectionVector2_0 endif endif endif enddef define DX9SimSkinCompositingMaterial() if (viewerRenderType = $kRenderTypeShadow) create SimShadowDX9() elseif (viewerRenderType = $kRenderTypeShadowMap) create SimShadowMapDX9() else create SimSkinPerPixelCompositingRendering() endif enddef define GhostPrepZPass(singleTextureFlag textureName) pass depthTest true -enableDepthWrite true #colorWriteEnable -red false -green false -blue false -alpha false alphaBlend srcFactor(zero) add dstFactor(one) shaderProgram -target vertexProgram -method link create BindsForHardwareVS2Transforms(true $doMorphing) create TransformFragments($doSkinning false false $doMorphing $numPosMorphs $numNormMorphs false 2_0) shaderFragment NoTextureMagic2_0 end if (&singleTextureFlag) alphaTest true 128 alphaTestFunction acceptIfGreaterOrEqual shaderProgram -target pixelProgram -method assemble shaderSource ps_1_1 tex t0 mov r0, t0.a endShaderSource end sampler 0 texture &textureName textureAddressing clamp clamp clamp end else shaderProgram -target pixelProgram -method assemble shaderSource ps_1_1 def c0,0,0,0,0 mov r0, c0 endShaderSource end endif end #end pass enddef define CreateSimStandardMaterialDX9() setf cubeCoefCheck 0.0 material setb alphaBlendingOn false if (viewerRenderType = $kRenderTypeShadow) create SimShadowDX9() elseif (viewerRenderType = $kRenderTypeShadowMap) create SimShadowMapDX9() 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)) #trace "Dx9 sim standard: $currentMaterialName, layer : $layerNumber alphaBlend: $alphaBlendingOn" shader -layer $layerNumber create SimMaterialSetup() if (numLightsOfType(${kShapeColorLight}) > 0) seti shapeColorLightCount (numLightsOfType(${kShapeColorLight})) ##trace "Sim standard, shape color count: $shapeColorLightCount" seti stdMatShapeColorIndex 0 endif if ($stdMatShapeColorIndex = 0) set stdMatAlphaBlendMode blend #trace "Sim standard $currentMaterialName with shapeColor active" if (strstr("$currentMaterialName", "lobot") = 0) create GhostPrepZPass(true $stdMatBaseTextureName) endif endif #trace "SimStandardDX9, tangents: $hasTangents" setb localNormalMappingFlag false seti perPixelLightCount 0 if ($stdMatNormalMapTextureEnabled) if ($hasTangents) setb localNormalMappingFlag true endif endif pass fillmode $stdMatFillMode #fillmode wireframe 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 create NonStandardLighting() if ($simHairFlag) create SimHairAlphaState($stdMatAlphaBlendMode) else create StandardShaderFBAlphaState($stdMatAlphaBlendMode) endif #trace "SimStandard(sub): Eye gizmo: $eyeGizmoEnable $currentMaterialName" shaderProgram -target vertexProgram -method link create SimMaterialTransformSetupDX9($eyeMotion) end shaderProgram -target pixelProgram -method assemble if ($vs2LoopsFunctional) bindConstants 12 -bindingID perPixelLightColors -constantType float -constantCount 3 else bindConstants 12 -bindingID allStandardLightColors -constantType float -constantCount 3 endif if ($stdMatShapeColorIndex = 0) bindConstants 4 -bindingID shapeColorIndex0 -constantType float else bindConstants 4 -bindingID immediateData -data (1,1,1,1) -constantType float endif if (strcmp("${stdMatEnvCubeMode}","reflection") = 0) setv3 cubeCoef (($stdMatEnvCubeCoef).xyz) bindConstants 7 -bindingID immediateData -data ($cubeCoef, $stdMatUntexturedDiffAlpha) -constantType float endif bindConstants 8 -bindingID immediateData -data(0,0,0,$simMaterialLightingScale) if ($contentViewer = false) if ($vs2LoopsFunctional) # in the loop system, 3 lights always exist, but some or all might be black. create SimStandardPixelShaderDX9($localNormalMappingFlag 3 false) else create SimStandardPixelShaderDX9($localNormalMappingFlag $perPixelLightCount false) endif else create SimStandardManniquinComposite($localNormalMappingFlag 3) #$perPixelLightCount) endif end create SimStandardSamplersPS2($localNormalMappingFlag) end #end the pass end # end shader endif #shadow or not end #end the material enddef define SimStandardPixelShaderDX9(normalMapFlag pixelLightCount specularMask) bindConstants 15 -bindingID immediateData -data ($finalShaderDiffuse, $stdMatAlphaMultiplier) -constantType float setb cubemap false if (strcmp("${stdMatEnvCubeMode}", "reflection") = 0) setb cubemap true endif shaderSource ps_2_0 def c0,0,0.5,1,2 def c3, 0,0,1,0 def c5, 6, 0,0,0 def c16, -0.5771,0.5771,-0.5771,0 endShaderSource if ($stdMatBaseTextureEnabled) shaderSource "dcl t0.xy ; the main set of texcoords" endif if ($cubemap) shaderSource "dcl t1.xyz ; reflection map vector" endif shaderSource dcl t2.xyz ; HDR diffuse endShaderSource if (&pixelLightCount > 0) shaderSource "dcl t4.xyz" endif if (&pixelLightCount > 1) shaderSource "dcl t5.xyz" endif if (&pixelLightCount > 2) shaderSource "dcl t6.xyz" endif shaderSource "dcl_2d s0 ; base texture 0" if (&normalMapFlag) shaderSource "dcl_2d s1 ; normal map" endif if ($cubemap) shaderSource "dcl_cube s2 ; reflection map, if used. " endif if ($stdMatBaseTextureEnabled) shaderSource "texld r10, t0, s0 ; load diffuse color directly" else shaderSource "mov r10, c15 ; preload with base color" endif if (&pixelLightCount) #trace "$currentMaterialName normal mapping in simstandard material: count of pixel lights: &pixelLightCount" if (&normalMapFlag) #trace "Normal map texture enabled" shaderSource texld r9, t0, s1 ; load from the normal map sampler (bx2 happens in lighting code below) mad r9.rgb, r9, c0.w, -c0.z ; x * 2 - 1 nrm r11, r9 endShaderSource else shaderSource "mov r11, c3" endif if (&pixelLightCount = 1) create SimSkinOneLightBumpDiffuse() endif if (&pixelLightCount = 2) create SimSkinTwoLightsBumpDiffuse() endif if (&pixelLightCount = 3) create SimSkinThreeLightsBumpDiffuse() endif else shaderSource mov r9.xyz, t2 ; no bump map, copy diffuse endShaderSource endif shaderSource mul r8.rgb, r10, r9 ; multiply by diffuse mov r8.a, r10.a endShaderSource if (&pixelLightCount > 0 and $edgeLighting) create EdgeLighting(&pixelLightCount) endif if (strcmp("${stdMatEnvCubeMode}", "reflection") = 0) shaderSource texld r1, t1, s2 mad r8.rgb, r1, c7, r8 ; scale by the cube coeff color, and add to final color. endShaderSource endif shaderSource mul r8, c4, r8 ; multiply in shapeColor mov oC0, r8 endShaderSource enddef define SimSkinThreeLightsBumpDiffuse() #trace "3 bump lights" shaderSource dp3_sat r0.x, r11, t4 ; N.L for light 1 dp3_sat r0.y, r11, t5 ; N . L #2 dp3_sat r0.z, r11, t6 ; N . L #3 mul r0.xyz, r0, c8.w ; apply the 'simMaterialLightingScale' mul r4.rgb, r0.x, c12 //apply light 1 color mad r4.rgb, r0.y, c13, r4 ; light 2 color mad r4.rgb, r0.z, c14, r4 ; light 3 color add r9.rgb, t2, r4 ; add vertex and pixel lighting. endShaderSource enddef define SimSkinTwoLightsBumpDiffuse() #trace "2 bump lights" shaderSource dp3_sat r0.x, r11, t4 ; N.L for light 1 dp3_sat r0.y, r11, t5 ; N . L light 2 mul r0.xy, r0, c8.w ; apply the 'simMaterialLightingScale' mul r4.rgb, r0.x, c12 //apply light 1 color mad r4.rgb, r0.y, c13, r4 ; light 2 color add r9.rgb, t2, r4 ; accumulate into diffuse color endShaderSource enddef define SimSkinOneLightBumpDiffuse() #trace "1 bump lights" shaderSource dp3_sat r0.x, r11, t4 ; N.L for light 1 mul r0.x, r0, c8.w ; apply the 'simMaterialLightingScale' mad r9.rgb, r0.x, c12, t2 //apply light 1 color add vertex diffuse endShaderSource enddef define SimStandardSamplersPS2(bumpMapping) if ($stdMatBaseTextureEnabled) if (strcmp("${stdMatBaseTextureName}", "") != 0 or $numTexturesToComposite = 0) sampler 0 texture $stdMatBaseTextureName textureAddressing clamp clamp clamp end endif endif if (&bumpMapping) if (strcmp("${stdMatNormalMapTextureName}", "") != 0) sampler 1 texture $stdMatNormalMapTextureName textureAddressing clamp clamp clamp end endif endif if (strcmp("${stdMatEnvCubeMode}", "reflection") = 0) # reflection mode if (strcmp("${stdMatEnvCubeTextureName}", "") != 0) # non-null name. sampler 2 texture $stdMatEnvCubeTextureName textureAddressing clamp clamp clamp end endif endif enddef define SimShadowMapDX9() shader viewerRenderTypePred $kRenderTypeShadowMap create SimMaterialSetup() pass shaderProgram -method link -target vertexProgram create BindsForHardwareVS2Transforms(true $doMorphing) create TransformFragments($doSkinning true false $doMorphing $numPosMorphs $numNormMorphs false 2_0) end create ShadowMapPS() end end enddef define SimShadowDX9() shader viewerRenderTypePred $kRenderTypeShadow create SimMaterialSetup() pass shaderProgram -method link -target vertexProgram create BindsForHardwareVS2Transforms(true $doMorphing) create TransformFragments($doSkinning true false $doMorphing $numPosMorphs $numNormMorphs false 2_0) 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 EdgeLighting(perPixelLightCount) shaderSource ; r8 = input/output base color ; r9 = total light ; r10 = composited base color dp3_sat r1, r11, t7 ; N . V ; View dependant add r1, c0.z, -r1 ; 1 - Q pow r4, r1.x, c5.x endShaderSource if (&perPixelLightCount = 3) shaderSource dp3_sat r2.x, t4, r11 ; N.L ; Light/Surface dependant dp3_sat r2.y, t5, r11 ; N.L ; Light/Surface dependant dp3_sat r2.z, t6, r11 ; N.L ; Light/Surface dependant mul r3, r2.x, c10 ; light 0 color mad r3, r2.y, c11, r3 ; light 1 color mad r3, r2.z, c12, r3 ; light 2 color endShaderSource endif if (&perPixelLightCount = 2) shaderSource dp3_sat r2.x, t4, r11 ; N.L ; Light/Surface dependant dp3_sat r2.y, t5, r11 ; N.L ; Light/Surface dependant mul r3, r2.x, c10 ; light 0 color mad r3, r2.y, c11, r3 ; light 1 color endShaderSource endif if (&perPixelLightCount = 1) shaderSource dp3_sat r2.x, t4, r11 ; N.L ; Light/Surface dependant mul r3, r2.x, c10 ; light 0 color endShaderSource endif shaderSource mul_sat r4, r4, r3 add r5, r10, r10 ; double base color is the max. mad r8.rgb, r4, r5, r8 ; add in edge. endShaderSource enddef