Difference between revisions of "ShaderNeighborhoodswvs"
From SimsWiki
(EP2-NL) |
(EP3-OFB) |
||
Line 1: | Line 1: | ||
<pre> | <pre> | ||
− | + | EP3-OFB | |
0xCD7FE87A | 0xCD7FE87A | ||
0x1C0532FA | 0x1C0532FA |
Revision as of 06:36, 9 September 2007
EP3-OFB 0xCD7FE87A 0x1C0532FA 0x9C954B3C 0xFF226023 # neighborhoodswvs # ============================================================================== setf swvsWaterlineShift -0.50 define NeighborhoodTerrainPrepWorkSWVS() # this material does nothing but prep the z-buffer, and render black. pass shaderProgram -target vertexProgram -method link create BindsForSoftwareVSTransforms(false false) shaderFragment TransformPositionRigidNoLighting2_x shaderFragment NoLighting2_x end colorScalar (0.0, 0.0, 0.0, 1.0) stage textureBlend select(colorScalar) select(colorScalar) end end enddef # ============================================================================== # Used for those triangles in the canvas which are partially under water. # define NeighborhoodWaterlineStraddleSWVS() vertexFormatPred position 0 true vertexFormatPred normal 0 true vertexFormatPred texcoord 0 true viewerRenderTypePred $kRenderTypeReflection pass shaderProgram -target vertexProgram -method link create BindsForSoftwareVSTransforms(false false) bindConstants 11 -bindingID immediateData -data (0,0, 1.0/$waterHeight , -0.25) -constantType float create TransformFragments(false false true false 0 0 false 2_x) shaderFragment TerrainWaterMaskTexGenUVZero2_x end alphaBlend srcFactor(one) add dstFactor(srcAlpha) cullmode none # so that reflections don't "creep under" edge of terrain #colorScalar (0.0, 1.0, 0.1, 0.0) #alphaTest true 128 #alphaTestFunction acceptIfGreater depthTest true -enableDepthWrite true depthTestFunction accept stage # above water -- clip by using depth-based 0/1 texture. texture blackWhite textureAddressing clamp clamp textureFilterHint point point textureMIPFilterHint disabled textureBlend select(texture) select(texture) end end enddef # used to render black on the straddle piece, so other passes can plop stuff on top. define NeighborhoodWaterlineStraddleStandardCameraSWVS() pass shaderProgram -target vertexProgram -method link create BindsForSoftwareVSTransforms(false false) shaderFragment TransformPositionRigidNoLighting2_x shaderFragment NoLighting2_x end #alphaBlend srcFactor(one) add dstFactor(zero) cullmode none # so that reflections don't "creep under" edge of terrain colorScalar (0.0, 0.0, 0.0, 1.0) stage textureBlend select(colorScalar) select(colorScalar) end end enddef # ============================================================================== # Material for terrain geometry that is partially or completely under water. define NeighborhoodUnderWaterTerrainSWVS() pass shaderProgram -target vertexProgram -method assemble create BindsForSoftwareVSTransforms(false false) setf normalizerScale (1.0/($waterHeight)) setv4 texgenData ($normalizerScale, 1, $waterHeight, -0.5) bindConstants 11 -bindingID immediateData -data $texgenData shaderSource vs_1_1 def c12,0, 0.5 ,1,2 dcl_position v0 m4x4 oPos, v0, c4 ; geom to clip mad r0.xyz, v0.zzz, -c11.xxx, c11.yy ; normalize this from 0 to 1. mov oT0.xy, r0 add oT1.xy, r0, -c11.ww ; shift by 0.5, so that the 'clip texture', ends up at the water level. mov oD0, c12.y endShaderSource end alphaBlend srcFactor(zero) add dstFactor(srcColor) cullmode none # so that reflections don't "creep under" edge of terrain alphaTest true 128 alphaTestFunction acceptIfGreater # apply depth-based gradient texture to terrain that is under water. stage texture $waterGradientTexture textureAddressing clamp clamp textureBlend multiply(diffuse texture) select(outRegister) end stage texture blackWhite textureAddressing clamp clamp textureFilterHint point point textureMIPFilterHint disabled textureBlend select(outRegister) select(texture) end #< stage textureBlend select(diffuse) select(diffuse) end #> end enddef # ============================================================================== # renders the terrain colors. The geometry is a patchwork 'quilt' of sorts, with overlapping edges # this overlapping is handled by alpha blending define NeighborhoodMainTerrainShaderSWVS() pass if (not $isImposter) shaderProgram -target vertexProgram -method link create BindsForSoftwareVSTransforms(false false) setv4 texgenData (1.0/$nhoodPaintTextureScale, 1.0/$nhoodPaintTextureScale, $alphaMapScaleU, $alphaMapScaleV ) bindConstants 11 -bindingID immediateData -data $texgenData -constantType float # no morphs, skins or normals shaderFragment TransformPositionRigidNoLighting2_x shaderFragment TerrainPaintTexGen2_x end else shaderProgram -target vertexProgram -method assemble create BindsForSoftwareVSTransforms(false false) setv4 texgenData (1.0/$nhoodPaintTextureScale, 1.0/$nhoodPaintTextureScale, $alphaMapScaleU, $alphaMapScaleV ) bindConstants 11 -bindingID immediateData -data $texgenData shaderSource vs_1_1 def c12,0, 0.5 ,1,2 def c13, 0.0076923, 0.25, 0, 0 dcl_position v0 m4x4 oPos, v0, c4 mov oT0.xy, c13.yy mul oT1.xy, c11.xy, v0.xy endShaderSource end endif alphaBlend srcFactor(srcAlpha) add dstFactor(one) cullmode none # so that reflections don't "creep under" edge of terrain #colorScalar $nhoodSunDirBiased depthTest true -enableDepthWrite false depthTestFunction acceptIfEqual colorScalar 1.0,1.0,1.0,1.0 stage texture $alphaMap textureAddressing clamp clamp textureBlend select(colorScalar) select(texture) end stage texture $paintTexture textureAddressing tile tile textureBlend multiply(texture outRegister) select(outRegister) end end enddef # ============================================================================== define NeighborhoodWaterSWVS() shader -layer (($waterLayer) * 8 + 7) validateRenderShaderContext -viewerRenderType viewerRenderType pass fillmode $stdMatFillMode alphaBlend srcFactor(one) add dstFactor(srcAlpha) shaderProgram -target vertexProgram -method assemble create BindsForSoftwareVSTransforms(false false) shaderSource vs_1_1 def c50, 0, 0.5,1,2 def c11, 0,0,1,0 def c12, 0.2,0.5,0.7, 0.1 dcl_position v0 dcl_normal v1 m4x3 r0.xyz, v0, c8 ; to camera space m3x3 r3.xyz, v1, c8 mov r0.w, c50.z m4x4 oPos, r0, c0 ; camera to clip dp3 r1.w, r0, r0 rsq r1, r1.w mul r1, r1.w, r0 ; r1= view vector. dp3 r2, r3, -r1 ; view dot normal max r2, r2, c50.x add r3, c50.z, -r2 mul oD0.xyz, r3, c12 mov oD0.w, r2 endShaderSource end stage textureBlend select(diffuse) select(diffuse) end end end enddef # ============================================================================== # The layer ID for this should be lower than "waterLayer" Id because we want the farther side of the water box should be # drawn as well. # the layer ID of any under-water objects (so define NeighborhoodWaterEdgeSWS() pass alphaBlend srcFactor(one) add dstFactor(zero) cullmode none # we want to render the father side of the water edge also stage texture $waterEdgeTexture textureAddressing tile tile #ffTextureMatrix -scalev (1/$waterEdgeTextureScale, 1/$waterEdgeTextureScale) #ffTextureCoordsSource 0 textureBlend select(texture) select(diffuse) end end enddef # ============================================================================== # a terrain edge is a 'slice' or 'cover plate' for the terrain when viewed edge-on, since the terrain is not infinite in all directions. define NeighborhoodTerrainEdgeSWVS() pass alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) stage texture $terrainEdgeTexture textureAddressing tile tile #ffTextureMatrix -scalev (1/$terrainEdgeTextureScale, 1/$terrainEdgeTextureScale) #ffTextureCoordsSource 0 textureBlend multiply(texture diffuse) select(texture) end end enddef #============================================================================== # the last pass that applies the terrain lightmap across the neighborhood, but not underwater define NeighborhoodTerrainLightingSWVS() pass shaderProgram -target vertexProgram -method assemble create BindsForSoftwareVSTransforms(false false) setf textureScale (1.0/($waterHeight)) setv4 texgenData ($textureScale, 1, $waterHeight, -0.5) bindConstants 11 -bindingID immediateData -data $texgenData shaderSource vs_1_1 def c12,0, 0.5 ,1,2 def c13, 0.0078125, 0.00078125, 0, 0 dcl_position v0 endShaderSource if (not $isImposter) shaderSource "dcl_texcoord v1" endif shaderSource m4x4 oPos, v0, c4 mad r0.xyz, v0.zzz, -c11.xxx, c11.yy ; normalize this from 0 to 1. add oT0.xy, r0, -c11.ww ; shift by 0.5, so that the 'clip texture', ends up at the water level. endShaderSource if ($isImposter) shaderSource mul oT1.xy, v0.xy, c13.yy endShaderSource else shaderSource "mul oT1.xy, v1, c13.xx" endif end # setup for SRC * DEST, standard lightmap. alphaBlend srcFactor(destColor) add dstFactor(zero) alphaTest true 128 alphaTestFunction acceptIfGreater fillmode $stdMatFillMode # not really important to do this? depthTest true -enableDepthWrite false depthTestFunction acceptIfEqual colorScalar (1,1,1,1) stage # if below water -- get black from this texture. texture blackWhite textureAddressing clamp clamp textureFilterHint point point textureMIPFilterHint disabled textureBlend select(texture:alphaReplicate) select(texture:invert) end stage texture "nhoodLightMap" textureBlend multiply(texture outRegister:alphaReplicate) select(outRegister) end end enddef # ============================================================================== # for rendering Lots, and when the lot creation tool is being used, this material renders the glowing-gridded rectangles define NeighborhoodTerrainHighlightSWVS() pass shaderProgram -target vertexProgram -method link create BindsForSoftwareVSTransforms(false false) #setv4 texgenData (1, 1, 0.0, 0.0) #bindConstants 11 -bindingID immediateData -data $texgenData shaderFragment TransformPositionRigidNoLighting2_x shaderFragment NoTextureMagic2_x end alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) fillmode $stdMatFillMode colorScalar (1, 1, 1, $highlightAlpha) stage texture $highlightTexture textureAddressing tile tile textureBlend select(texture) multiply(texture colorScalar) end end enddef