|
|
(17 intermediate revisions by one user not shown) |
Line 1: |
Line 1: |
− | #
| + | define TransparentMirrorReflection() |
− | # Shaders for neighborhood
| + | material |
− | #
| + | if (viewerRenderType = $kRenderTypeShadow) |
− | #
| + | create StandardShaderShadow() |
− | | + | else |
− | # layers
| + | if (viewerRenderType = $kRenderTypeThumbnail) |
− | # normal shadows are layer 2 (after opaques), tree shadows are moved to -2 to make them
| + | create TransparentBlankMirrorMaterial($kRenderTypeThumbnail) |
− | # render to the first buffer. Tree shadows (-2) do not show up on fields (7).
| + | else |
− | seti nhoodWaterLayer 1
| + | if (not $mirrorReflectionsEnabled) |
− | seti nhoodCanvasLayer -8
| + | set currentType (viewerRenderType) |
− | seti nhoodTreeShadowLayer -2
| + | create TransparentBlankMirrorMaterial($currentType) |
− | | + | |
− | setf neighborhoodMaterialScaleU 8.0 # defaults for neighborhood materials without these defined
| + | |
− | setf neighborhoodMaterialScaleV 8.0 # defaults for neighborhood materials without these defined
| + | |
− | | + | |
− | setf nhoodWaterMap1Scale 7.0
| + | |
− | setf nhoodWaterMap1Speed 0.5
| + | |
− | setf nhoodWaterMap2Scale 5.0
| + | |
− | setf nhoodWaterMap2Speed 0.3
| + | |
− | | + | |
− | | + | |
− | setv2 baseTexOffset (0.5, 0.5)
| + | |
− | setv3 nhoodDiffCoef (0.75, 0.93, 0.75)
| + | |
− | | + | |
− | | + | |
− | setf nhoodPaintTextureScale 13 #Repeat distance of neighborhood textures in tiles.
| + | |
− | #NOTE: There is a related parameter called "TextureVariantGridSize" in
| + | |
− | #NeighborhoodTerrain.ini. You would normally (though not necessarily) want it to be
| + | |
− | #the same as this number.
| + | |
− | setf waterEdgeTextureScale 250.0 #Repeat distance in meters
| + | |
− | setf terrainEdgeTextureScale 100.0 #Repeat distance in meters
| + | |
− | | + | |
− | | + | |
− | # Reflective water
| + | |
− | setc nhoodWaterReflColour (0.55, .6, 0.65)
| + | |
− | setc lotSkirtWaterReflColour (0.65, 0.7, 0.85)
| + | |
− | setf nhoodWaterReflStrength 0.75
| + | |
− | setf nhoodWaterReflOffset 0.0020
| + | |
− | | + | |
− | # Standard water
| + | |
− | setf nhoodWaterbumpMapScale 8.0
| + | |
− | setf nhoodWaterAlpha 0.35
| + | |
− | | + | |
− | setb isDay true
| + | |
− | setb isTerrainConcrete false
| + | |
− | | + | |
− | # water clipping plane
| + | |
− | setf waterHeight 312.45
| + | |
− | | + | |
− | # underwater gradient texture
| + | |
− | set waterGradientTexture neighborhood-underwater-gradient
| + | |
− | set waterGradientTextureAdditive neighborhood-underwater-gradient-with-black
| + | |
− | # depth at which the gradient starts to take effect
| + | |
− | setf waterGradientZoneStart 0
| + | |
− | # how far down the gradient goes from that point.
| + | |
− | setf waterGradientZoneSize 40
| + | |
− | | + | |
− | set skyboxCubeMap neighborhood-sky2-envcube
| + | |
− | | + | |
− | # bump mapping
| + | |
− | setv3 nhoodSunDir (-0.5, 1, 0.5) # default -- should be set by code from the lighting.txt value
| + | |
− | # overall kind-of brightness booster for bump map.
| + | |
− | setf bumpMapBoost 1.5
| + | |
− | | + | |
− | # ==============================================================================
| + | |
− | # derived bump map quantities
| + | |
− | define BiasedNormal(n bn) | + | |
− | setf nLen (sqrt(sqr($&{n}.x) + sqr($&{n}.y) + sqr($&{n}.z))) | + | |
− | setv3 &{bn} ((0.5,0.5,0.5) * (($&{n} / $nLen.xxx) + (1,1,1)))
| + | |
− | enddef
| + | |
− | | + | |
− | create BiasedNormal(nhoodSunDir nhoodSunDirBiased)
| + | |
− | setv3 nhoodSunDirBiased ($nhoodSunDirBiased * $bumpMapBoost.xxx)
| + | |
− | | + | |
− | set terrainType "unset"
| + | |
− | | + | |
− | # defaults off, can be turned on at startup.
| + | |
− | setb simpleTerrain false
| + | |
− | setb isImposter false
| + | |
− | | + | |
− | include neighborhoodSWVS.matShad
| + | |
− | | + | |
− | # ==============================================================================
| + | |
− | | + | |
− | define NeighborhoodCanvas()
| + | |
− | | + | |
− | # this material does nothing but prep the z-buffer, and render black.
| + | |
− | | + | |
− | material
| + | |
− | if ($simpleTerrain) | + | |
− | shader | + | |
− | end
| + | |
− | endif
| + | |
− | | + | |
− | shader -layer (($nhoodCanvasLayer) * 8)
| + | |
− |
| + | |
− | validateRenderShaderContext -vertexFormat position 0 required
| + | |
− | validateRenderShaderContext -vertexFormat normal 0 required
| + | |
− |
| + | |
− | if (not $isImposter) | + | |
− | validateRenderShaderContext -vertexFormat texcoord 0 required | + | |
− | endif
| + | |
− | viewerRenderTypePred viewerRenderType
| + | |
− |
| + | |
− | create DetermineHardwareSupport()
| + | |
− | | + | |
− | if (strcmp("Concrete", "${terrainType}") = 0)
| + | |
− | setb isTerrainConcrete true | + | |
− | endif
| + | |
− | | + | |
− | if (not $isUnderWater or viewerRenderType != $kRenderTypeReflection)
| + | |
− | if ($useSWVertexShaderPath)
| + | |
− | create NeighborhoodTerrainPrepWorkSWVS() | + | |
| else | | else |
− | pass -fixedFunction | + | create TransparentMirrorReflectionMaterial() |
− | create LightingStatesNoStdLights()
| + | endif |
− |
| + | endif |
− | cullmode none # so that reflections don't "creep under" edge of terrain
| + | |
− | colorScalar (0.0, 0.0, 0.0, 1.0)
| + | |
− |
| + | |
− | if ($isImposter and $isTerrainConcrete)
| + | |
− | ffDepthOffset -1
| + | |
− | endif
| + | |
− | | + | |
− | stage
| + | |
− | if (not $isImposter)
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | endif
| + | |
− | textureBlend select(colorScalar) select(outRegister)
| + | |
− | end
| + | |
− | end
| + | |
− | endif | + | |
− |
| + | |
− | endif | + | |
− |
| + | |
− | end
| + | |
− | end
| + | |
− | enddef
| + | |
− | | + | |
− | | + | |
− | # ==============================================================================
| + | |
− | # Used for those triangles in the canvas which are partially under water.
| + | |
− | #
| + | |
− | define NeighborhoodCanvasStraddle()
| + | |
− | material
| + | |
− | | + | |
− | if ($simpleTerrain)
| + | |
− | shader
| + | |
− | end
| + | |
| endif | | endif |
− |
| |
− | # material for reflection camera
| |
− |
| |
− | shader -layer (($nhoodCanvasLayer) * 8)
| |
− |
| |
− | validateRenderShaderContext -vertexFormat position 0 required
| |
− | validateRenderShaderContext -vertexFormat normal 0 required
| |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| |
− | viewerRenderTypePred $kRenderTypeReflection
| |
− |
| |
− | #Render the portion that is above water only
| |
− |
| |
− | create DetermineHardwareSupport()
| |
− |
| |
− | if ($useSWVertexShaderPath)
| |
− |
| |
− | create NeighborhoodWaterlineStraddleSWVS()
| |
− |
| |
− | else
| |
− |
| |
− | pass -fixedFunction
| |
− | create LightingStatesNoStdLights()
| |
− | 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)
| |
− |
| |
− | alphaTest true 128
| |
− | alphaTestFunction acceptIfGreater
| |
− |
| |
− | stage
| |
− | # above water -- clip by using depth-based 0/1 texture.
| |
− | texture blackWhite
| |
− | textureAddressing clamp clamp
| |
− | textureFilterHint point point
| |
− | textureMIPFilterHint disabled
| |
− |
| |
− | ffTextureMatrix -cameraToGlobal -order zzzw -trans ($waterHeight - 0.5, 0) -invert
| |
− | ffTextureCoordsSource fromPosition
| |
− | textureBlend select(colorScalar) select(texture)
| |
− | end
| |
− | end
| |
− | endif
| |
− |
| |
− | end
| |
− |
| |
− |
| |
− |
| |
− | #material for standard camera
| |
− | #shader -layer (-128)
| |
− | shader -layer (-128)
| |
− |
| |
− | validateRenderShaderContext -vertexFormat position 0 required
| |
− | validateRenderShaderContext -vertexFormat normal 0 required
| |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| |
− | viewerRenderTypePred $kRenderTypeNormal
| |
− |
| |
− | create DetermineHardwareSupport()
| |
− |
| |
− | if ($useSWVertexShaderPath)
| |
− | create NeighborhoodWaterlineStraddleStandardCameraSWVS()
| |
− | else
| |
− |
| |
− | #Render the portion that is above water only
| |
− | pass -fixedFunction
| |
− | create LightingStatesNoStdLights()
| |
− | 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(outRegister)
| |
− | end
| |
− | end
| |
− | endif
| |
− |
| |
− | end
| |
− |
| |
− | end
| |
− | enddef
| |
− |
| |
− | # ==============================================================================
| |
− | # Material for terrain geometry that is partially or completely under water.
| |
− | define NeighborhoodWaterTerrain()
| |
− | material
| |
− |
| |
− | if ($simpleTerrain)
| |
− | shader
| |
− | end
| |
− | endif
| |
− |
| |
− | shader -layer (($nhoodCanvasLayer + 2) * 8)
| |
− | validateRenderShaderContext -vertexFormat position 0 required
| |
− | validateRenderShaderContext -vertexFormat normal 0 required
| |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| |
− | viewerRenderTypePred viewerRenderType
| |
− |
| |
− |
| |
− | create DetermineHardwareSupport()
| |
− |
| |
− | if (viewerRenderType != $kRenderTypeReflection)
| |
− |
| |
− | if ($useSWVertexShaderPath)
| |
− | create NeighborhoodUnderWaterTerrainSWVS()
| |
− |
| |
− | else
| |
− |
| |
− | pass -fixedFunction
| |
− |
| |
− |
| |
− | create LightingStatesNoStdLights()
| |
− |
| |
− | alphaBlend srcFactor(destColor) add dstFactor(zero)
| |
− | cullmode none # so that reflections don't "creep under" edge of terrain
| |
− | # apply depth-based gradient texture to terrain that is under water.
| |
− | stage
| |
− | texture $waterGradientTexture
| |
− |
| |
− | if ($cubeMapSupport)
| |
− | textureAddressing tile clamp
| |
− | else
| |
− | textureAddressing clamp clamp
| |
− | endif
| |
− |
| |
− | set d ($waterHeight - $waterGradientZoneStart)
| |
− | set s (-$waterGradientZoneSize)
| |
− | ffTextureMatrix -cameraToGlobal -order xzyw -scale $s -trans (0, $d) -invert
| |
− | ffTextureCoordsSource fromPosition
| |
− | textureBlend select(texture) select(outRegister)
| |
− | end
| |
− | end
| |
− |
| |
− | endif
| |
− |
| |
− | endif
| |
− |
| |
− | end
| |
− | end
| |
− | enddef
| |
− |
| |
− | # ==============================================================================
| |
− |
| |
− | define NeighborhoodTerrainPaintShader()
| |
− | shader -layer (($nhoodCanvasLayer + 1) * 8)
| |
− | validateRenderShaderContext -vertexFormat position 0 required
| |
− | validateRenderShaderContext -vertexFormat normal 0 required
| |
− |
| |
− | if (not $isImposter)
| |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| |
− | endif
| |
− |
| |
− | create DetermineHardwareSupport()
| |
− |
| |
− | if (strcmp("Concrete", "${terrainType}") = 0)
| |
− | setb isTerrainConcrete true
| |
− | endif
| |
− |
| |
− | if ($useSWVertexShaderPath)
| |
− | create NeighborhoodMainTerrainShaderSWVS()
| |
− |
| |
− | else
| |
− |
| |
− | pass -fixedFunction
| |
− |
| |
− | create LightingStatesNoStdLights()
| |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(one)
| |
− | cullmode none # so that reflections don't "creep under" edge of terrain
| |
− |
| |
− | if ($isImposter and $isTerrainConcrete)
| |
− | ffDepthOffset -1
| |
− | endif
| |
− |
| |
− | colorScalar $nhoodSunDirBiased
| |
− |
| |
− | depthTest true -enableDepthWrite false
| |
− | depthTestFunction acceptIfEqual
| |
− |
| |
− | seti snowLevel (tsHasSnow)
| |
− |
| |
− | if ($snowLevel = 1)
| |
− | set weatherSuffix "-LSNOW"
| |
− | elseif ($snowLevel = 2)
| |
− | set weatherSuffix "-HSNOW"
| |
− | else
| |
− | set weatherSuffix ""
| |
− | endif
| |
− |
| |
− | stage
| |
− | texture $alphaMap
| |
− | textureAddressing clamp clamp
| |
− |
| |
− | if ($isImposter)
| |
− | ffTextureMatrix -cameraToGlobal -scalev ((0.1 * $alphaMapScaleU), (0.1 * $alphaMapScaleV))
| |
− | ffTextureCoordsSource fromPosition
| |
− | else
| |
− | ffTextureMatrix -scalev ($alphaMapScaleU, $alphaMapScaleV)
| |
− | ffTextureCoordsSource 0
| |
− | endif
| |
− | textureBlend select(outRegister) select(texture)
| |
− | end
| |
− |
| |
− | stage
| |
− | texture "${paintTexture}${weatherSuffix}"
| |
− | textureAddressing tile tile
| |
− | if ($isImposter)
| |
− | ffTextureMatrix -cameraToGlobal -scalev ((10.0 * $nhoodPaintTextureScale), (10.0 * $nhoodPaintTextureScale)) -invert
| |
− | ffTextureCoordsSource fromPosition
| |
− | else
| |
− | ffTextureMatrix -scalev ($nhoodPaintTextureScale, $nhoodPaintTextureScale) -invert
| |
− | ffTextureCoordsSource 0
| |
− | endif
| |
− | textureBlend select(texture outRegister) select(outRegister)
| |
− | end
| |
− | end
| |
− | endif
| |
− |
| |
− | end
| |
− | enddef
| |
− |
| |
− | define NeighborhoodTerrainPaint()
| |
− | material
| |
− |
| |
− | if ($simpleTerrain)
| |
− | shader
| |
− | end
| |
− | endif
| |
− |
| |
− | create NeighborhoodTerrainPaintShader()
| |
| end | | end |
| enddef | | enddef |
− |
| |
| | | |
− | # ==============================================================================
| + | define TransparentBlankMirrorMaterial(renderType) |
− | | + | shader |
− | set ratioH 1 # default material parameter value
| + | validateRenderShaderContext -viewerRenderType &renderType |
− | set ratioW 1 # default material parameter value
| + | |
− | set useReflection 1 # default material parameter value
| + | pass |
− | define NeighborhoodWater() | + | shaderProgram -target vertexProgram -method assemble |
− | material
| + | bindConstants 0 -bindingID geomToClip -constantCount 4 |
− | # never draw water in its reflection. Already handled by code.
| + | shaderSource |
− | | + | vs_1_1 |
− | if ($simpleTerrain)
| + | dcl_position v0 |
− | shader -layer $nhoodWaterLayer | + | m4x4 oPos, v0, c0 |
− | pass -fixedFunction | + | endShaderSource |
− | colorScalar (0.3, 0.4,0.8) 1.0 | + | |
− | stage | + | |
− | textureBlend select(colorScalar) select(colorScalar) | + | |
− | end | + | |
| end | | end |
− | end
| |
− | endif
| |
− |
| |
− |
| |
− | # First option: reflection mapped water.
| |
− | if ($useReflection)
| |
− |
| |
− | shader -layer $nhoodWaterLayer
| |
− | validateRenderShaderContext -vertexFormat position 0 required
| |
− | validateRenderShaderContext -vertexFormat normal 0 required
| |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| |
− | viewerRenderTypePred viewerRenderType
| |
− |
| |
− | ################################################################################
| |
− | # Three pass/2 texture rippled reflection -- does not run on GeF2 only 2 stages (for GeF4+)
| |
− | pass -fixedFunction -modifiedEachFrameHint
| |
− |
| |
− |
| |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| |
− | colorScalar $nhoodWaterReflColour $nhoodWaterReflStrength
| |
− | depthTest true -enableDepthWrite false
| |
− |
| |
− | stage
| |
− | ffTextureCoordsSource fromPosition
| |
− | ffTextureMatrix -cameraToClip -scalev ((-0.5 * $ratioW), (-0.5 * $ratioH)) -trans (0.5, 0.5)
| |
− | textureAddressing clamp clamp
| |
− | texture "ScreenReflection"
| |
− |
| |
− | textureBlend multiply(texture colorScalar) select(outRegister) tempRegister
| |
− | end
| |
− | stage
| |
− | ffTextureCoordsSource fromPosition
| |
− | ffTextureMatrix -cameraToClip -scalev ((-0.5 * $ratioW), (-0.5 * $ratioH)) -trans (0.5 + $nhoodWaterReflOffset, 0.5 + $nhoodWaterReflOffset)
| |
− | textureAddressing clamp clamp
| |
− |
| |
− | texture "ScreenReflection"
| |
− | textureBlend multiply(texture colorScalar) select(outRegister)
| |
− | end
| |
− | stage
| |
− | texture "neighborhood-water-1"
| |
− | textureAddressing tile tile
| |
− | # -atrans waveformType cycles/sec offset (startU, startV) (endU, endV)
| |
− | textureMatrixAnimation -targetType fixedFunction -atrans sawtooth ($nhoodWaterMap1Speed / $nhoodWaterMap1Scale) 0 (0, 0) ($nhoodWaterMap1Scale, 0) -ascale sawtooth 1 0 ($nhoodWaterMap1Scale, $nhoodWaterMap1Scale)
| |
− | ffTextureCoordsSource 0
| |
− | textureBlend lerpTextureAlpha(tempRegister outRegister) select(colorScalar)
| |
− | end
| |
− | end
| |
− | end
| |
− |
| |
− | shader -layer $nhoodWaterLayer
| |
− | validateRenderShaderContext -vertexFormat position 0 required
| |
− | validateRenderShaderContext -vertexFormat normal 0 required
| |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| |
− | viewerRenderTypePred viewerRenderType
| |
− |
| |
− | ################################################################################
| |
− | # Two stage case since the three stage case above fails on most low end hardware because of its third stage (GF2).
| |
− | pass -fixedFunction -modifiedEachFrameHint
| |
− |
| |
− |
| |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| |
− | colorScalar $nhoodWaterReflColour $nhoodWaterReflStrength
| |
− | depthTest true -enableDepthWrite false
| |
− |
| |
− | stage
| |
− | ffTextureCoordsSource fromPosition
| |
− | ffTextureMatrix -cameraToClip -scalev ((-0.5 * $ratioW), (-0.5 * $ratioH)) -trans (0.5, 0.5)
| |
− | textureAddressing clamp clamp
| |
− | texture "ScreenReflection"
| |
− |
| |
− | textureBlend multiply(texture colorScalar) select(outRegister)
| |
− | end
| |
− |
| |
− | stage
| |
− | texture "neighborhood-water-1"
| |
− | textureAddressing tile tile
| |
− | # -atrans waveformType cycles/sec offset (startU, startV) (endU, endV)
| |
− | #textureMatrixAnimation -targetType fixedFunction -atrans sawtooth ($nhoodWaterMap1Speed / $nhoodWaterMap1Scale) 0 (0, 0) ($nhoodWaterMap1Scale, 0) -ascale sawtooth 1 0 ($nhoodWaterMap1Scale, $nhoodWaterMap1Scale)
| |
− | ffTextureCoordsSource 0
| |
− | textureBlend lerpTextureAlpha(outRegister outRegister) select(colorScalar)
| |
− | end
| |
− |
| |
− | end
| |
− | end
| |
− |
| |
− | endif
| |
− |
| |
− | ################################################################################
| |
− | # fallback: no reflection.
| |
− | shader -layer ($nhoodWaterLayer)
| |
− | viewerRenderTypePred viewerRenderType
| |
− |
| |
− | create DetermineHardwareSupport()
| |
− |
| |
− | pass -fixedFunction
| |
− | # For now, we are diabling the lighting since we simply want to use the vertex colors.
| |
− | create LightingStatesNoStdLightsParam(false true)
| |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| |
− |
| |
− | colorScalar (.4, .6, .9, .6)
| |
| | | |
− | fillmode $stdMatFillMode | + | colorScalar (0,0,0) 0.5 |
| stage | | stage |
− | #texture reflectionoutdoorwater-envcube | + | textureBlend select(colorScalar) select(colorScalar) |
− | if ($cubeMapSupport)
| + | end |
− | texture $skyboxCubeMap
| + | |
− | textureMIPFilterHint disabled
| + | |
− | | + | |
− | ffTextureCoordsSource fromReflectionVector
| + | |
− | ffTextureMatrix -orientCameraToGlobal
| + | |
− | | + | |
− | textureAddressing clamp clamp clamp
| + | |
− | textureBlend multiply(texture colorScalar) select(colorScalar)
| + | |
− | else
| + | |
− | textureBlend select(colorScalar) select(colorScalar)
| + | |
− | endif
| + | |
− | end | + | |
− | end
| + | |
− |
| + | |
− | end
| + | |
− |
| + | |
− |
| + | |
− | ################################################################################
| + | |
− | # Final fallback.
| + | |
− | #<shader -layer ($nhoodWaterLayer)
| + | |
− | viewerRenderTypePred viewerRenderType
| + | |
− |
| + | |
− | pass -fixedFunction
| + | |
− |
| + | |
− | fillmode $stdMatFillMode
| + | |
− | create LightingStatesNoStdLights()
| + | |
− | alphaBlend srcFactor(one) add dstFactor(srcAlpha)
| + | |
− | colorScalar (.2, .3, .5, .05)
| + | |
− | stage
| + | |
− | textureBlend select(colorScalar) select(colorScalar)
| + | |
− | end
| + | |
− | end
| + | |
− |
| + | |
− |
| + | |
− | end#>
| + | |
− |
| + | |
− | create NeighborhoodWaterSWVS()
| + | |
− |
| + | |
− |
| + | |
− | end
| + | |
− |
| + | |
− | enddef
| + | |
− | | + | |
− | | + | |
− | # ==============================================================================
| + | |
− | # The layer ID for this should be lower than "nhoodWaterLayer" 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 NeighborhoodWaterEdge()
| + | |
− | | + | |
− | material
| + | |
− | if ($simpleTerrain)
| + | |
− | shader
| + | |
| end | | end |
− | endif | + | end |
− |
| + | |
− |
| + | |
− | shader -layer (($nhoodWaterLayer - 1) * 8)
| + | |
− | validateRenderShaderContext -vertexFormat position 0 required
| + | |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| + | |
− |
| + | |
− | pass -fixedFunction
| + | |
− | create LightingStates()
| + | |
− | alphaBlend srcFactor(one) add dstFactor(zero)
| + | |
− | cullmode cullCounterClockwise
| + | |
− | | + | |
− | stage
| + | |
− | texture $waterEdgeTexture
| + | |
− | textureAddressing tile tile
| + | |
− | ffTextureMatrix -scalev (1/$waterEdgeTextureScale, 1/$waterEdgeTextureScale)
| + | |
− | ffTextureCoordsSource 0
| + | |
− | textureBlend select(texture) select(diffuse)
| + | |
− | end
| + | |
− | end
| + | |
− |
| + | |
− | end
| + | |
− | end
| + | |
− |
| + | |
| enddef | | enddef |
| | | |
− | # ==============================================================================
| + | define TransparentMirrorReflectionMaterial() |
− | define NeighborhoodTerrainEdge() | + | |
− | material
| + | |
− |
| + | |
− | if ($simpleTerrain)
| + | |
− | shader
| + | |
− | end
| + | |
− | endif
| + | |
| | | |
− | shader -layer (($nhoodCanvasLayer + 13) * 8) | + | shader -layer -9998 # this material must render first |
− | validateRenderShaderContext -vertexFormat position 0 required
| + | validateRenderShaderContext -viewerRenderType $kRenderTypeMirror # reflection render |
− | validateRenderShaderContext -vertexFormat normal 0 required | + | |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| + | |
| | | |
− | pass -fixedFunction | + | pass -renderEachFrame |
− | create LightingStates() | + | renderTarget $reflectionRenderTarget -setViewport viewportFromParentRenderContext |
− | 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
| + | |
− |
| + | |
− | end
| + | |
− | end
| + | |
− | enddef
| + | |
| | | |
− | #==============================================================================
| + | depthTest true -enableDepthWrite true |
− | define NHoodTerrainLighting()
| + | |
| | | |
− | set terrainRepresentativeTexture "lottexture-test-01_detail"
| + | applyStencilStateForOverlappingReflections |
| | | |
− | material
| + | alphaBlend srcFactor(zero) add dstFactor(one) |
− | shader -layer (($nhoodCanvasLayer + 3) * 8)
| + | |
− | validateRenderShaderContext -vertexFormat position 0 required
| + | |
− | validateRenderShaderContext -vertexFormat normal 0 required
| + | |
− |
| + | |
− | if (not $isImposter)
| + | |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| + | |
− | endif
| + | |
− |
| + | |
| | | |
− | if (strcmp("Concrete", "${terrainType}") = 0)
| + | cullmode none |
− | setb isTerrainConcrete true | + | |
− | endif
| + | |
− |
| + | |
− | if ($simpleTerrain)
| + | |
− |
| + | |
− | if (strcmp("Desert", "${terrainType}") = 0)
| + | |
− | set terrainRepresentativeTexture "lottexture-canvas-desert"
| + | |
− | endif
| + | |
− |
| + | |
− | shader
| + | |
− | pass -fixedFunction
| + | |
− | ffDepthOffset -1
| + | |
| | | |
− | stage
| + | shaderProgram -target vertexProgram -method assemble |
− | texture "nhoodLightMap"
| + | bindConstants 0 -bindingID geomToClipFromParentView -constantCount 4 |
− | if ($isImposter)
| + | shaderSource |
− | ffTextureMatrix -cameraToGlobal -scalev (1280, 1280) -invert
| + | vs_1_1 |
− | ffTextureCoordsSource fromPosition
| + | dcl_position v0 |
− | else
| + | def c5, 1,0,0,1 |
− | ffTextureMatrix -scalev (128, 128) -invert
| + | m4x4 r0, v0, c0 |
− | ffTextureCoordsSource 0
| + | mov oPos.x, -r0 |
− | endif
| + | mov oPos.yzw, r0 |
− |
| + | endShaderSource |
− | textureBlend select(texture) select(texture)
| + | |
− | end | + | |
− | | + | |
− | stage | + | |
− | texture $terrainRepresentativeTexture
| + | |
− | if ($isImposter)
| + | |
− | ffTextureMatrix -cameraToGlobal -scalev (160, 160) -invert
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | else
| + | |
− | ffTextureMatrix -scalev (16, 16) -invert
| + | |
− | ffTextureCoordsSource 0
| + | |
− | endif
| + | |
− |
| + | |
− | #textureBlend multiply(texture outRegister) select(outRegister)
| + | |
− | textureBlend select(texture outRegister) select(outRegister)
| + | |
− | end | + | |
− | end | + | |
| end | | end |
− |
| + | end |
− | endif | + | |
− |
| + | |
− | | + | |
− | create DetermineHardwareSupport()
| + | |
− |
| + | |
− | if ($useSWVertexShaderPath)
| + | |
− | create NeighborhoodTerrainLightingSWVS()
| + | |
− | else
| + | |
− | pass -fixedFunction
| + | |
− |
| + | |
− | create LightingStatesNoStdLights()
| + | |
− |
| + | |
− | # standard Lightmap * dest
| + | |
− | alphaBlend srcFactor(destColor) add dstFactor(zero)
| + | |
− |
| + | |
− | # if the outbound 'clip' texture has 0 in it, don't emit those pixels.
| + | |
− | alphaTest true 127
| + | |
− | alphaTestFunction acceptIfGreater
| + | |
− |
| + | |
− |
| + | |
− | fillmode $stdMatFillMode
| + | |
− |
| + | |
− | if ($isImposter and $isTerrainConcrete)
| + | |
− | ffDepthOffset -1
| + | |
− | endif
| + | |
− |
| + | |
− | depthTestFunction acceptIfEqual
| + | |
− | # emit the lightmap
| + | |
− | stage
| + | |
− | texture "nhoodLightMap"
| + | |
− | if ($isImposter)
| + | |
− | ffTextureMatrix -cameraToGlobal -scalev (1280, 1280) -invert
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | else
| + | |
− | ffTextureMatrix -scalev (128, 128) -invert
| + | |
− | ffTextureCoordsSource 0
| + | |
− | endif
| + | |
− |
| + | |
− | if (tsHasSnow >= 1)
| + | |
− | colorScalar (0.3, 0.3, 0.35, 0)
| + | |
− | else
| + | |
− | colorScalar (0, 0, 0, 0)
| + | |
− | endif
| + | |
− |
| + | |
− | textureBlend add(texture colorScalar) select(texture)
| + | |
− | end
| + | |
− |
| + | |
− | # modulate by the 'above water' texture, which is a 2x1 texture with black and white in it.
| + | |
− |
| + | |
− | stage
| + | |
− | # above water -- clip by using depth-based 0/1 texture.
| + | |
− | texture blackWhite
| + | |
− | textureAddressing clamp clamp
| + | |
− | textureFilterHint point point
| + | |
− | textureMIPFilterHint disabled
| + | |
− |
| + | |
− | if ( $isImposter)
| + | |
− | ffTextureMatrix -cameraToGlobal -order zzzw -trans ($waterHeight - 10, 0) -invert
| + | |
− | else
| + | |
− | ffTextureMatrix -cameraToGlobal -order zzzw -trans ($waterHeight - 0.5, 0) -invert
| + | |
− | endif
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | textureBlend multiply(texture:alphaReplicate outRegister) select(texture)
| + | |
− | end
| + | |
− | end
| + | |
− | endif
| + | |
− | end
| + | |
− | end
| + | |
− |
| + | |
− | enddef
| + | |
− | | + | |
− | | + | |
− | # ==============================================================================
| + | |
− | | + | |
− | define NHoodTerrainHighlightMaterial()
| + | |
− | material
| + | |
− | shader -layer (($nhoodCanvasLayer + 9) * 8)
| + | |
− | validateRenderShaderContext -vertexFormat position 0 required
| + | |
− | validateRenderShaderContext -vertexFormat normal 0 required
| + | |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| + | |
− | | + | |
− | create DetermineHardwareSupport()
| + | |
− |
| + | |
− | if ($useSWVertexShaderPath)
| + | |
− | create NeighborhoodTerrainHighlightSWVS()
| + | |
− | else
| + | |
− | pass -fixedFunction
| + | |
− | create LightingStates()
| + | |
− | 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
| + | |
− | endif
| + | |
− |
| + | |
| end | | end |
− | end
| |
− | enddef
| |
| | | |
− | # ==============================================================================
| + | shader -layer 6 |
− | define NHoodTerrainOutlineHighlightMaterial()
| + | validateRenderShaderContext -viewerRenderType $kRenderTypeNormal |
− | material
| + | pass -modifiedEachFrameHint |
− | shader -layer (($nhoodCanvasLayer + 10) * 8) | + | shaderProgram -target vertexProgram -method assemble |
− | validateRenderShaderContext -vertexFormat position 0 required | + | bindConstants 0 -bindingID geomToClip -constantCount 4 |
− | validateRenderShaderContext -vertexFormat normal 0 required | + | bindConstants 4 -bindingID clipToViewTarget -constantCount 4 |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| + | shaderSource |
| + | vs_1_1 |
| + | dcl_position v0 |
| + | def c8, -0.5, -0.5, 1, 1 |
| + | def c9, 0.5, 0.5, 0, 0 |
| + | def c10, 0.25, 0.25, 0, 0 |
| + | m4x4 r0, v0, c0 |
| + | mov oPos, r0 |
| + | mul r2, c9, r0.w |
| + | mad r4, r0, c8, r2 |
| + | rcp r3.x, c4.x |
| + | rcp r3.y, c5.y |
| + | mov r3.zw, c9.zw |
| + | mul r3, r3, c10 |
| + | mad r6, r0, r3, r4 |
| + | mov oT0, r6.xyww |
| + | endShaderSource |
| + | end |
| | | |
− | pass -fixedFunction
| + | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) |
− | create LightingStatesNoStdLights()
| + | depthTest true -enableDepthWrite false |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | colorScalar (0,0,0) 0.25 |
− | fillmode $stdMatFillMode
| + | |
− | depthTest true -enableDepthWrite false
| + | |
− |
| + | |
− | stage
| + | |
− | texture $texture
| + | |
− | textureAddressing clamp clamp
| + | |
− | ffTextureCoordsSource 0
| + | |
− | textureBlend select(texture) select(texture)
| + | |
− | end
| + | |
− | end
| + | |
− |
| + | |
− | end
| + | |
− | end
| + | |
− | enddef
| + | |
| | | |
− | # ==============================================================================
| |
− | setb nhoodIsPartlyUnderwater false
| |
− | define PartiallyUnderWaterMaterial()
| |
− |
| |
− | seti vt viewerRenderType
| |
− |
| |
− | ## prevents the thumbnails of rocks and such from being 'under water', by punting to standard material.
| |
− | # thumbnails are rendered at 0,0,0, but water tends to be above them at 312 ft/yards whatever.
| |
− |
| |
− | if (viewerRenderType = $kRenderTypeThumbnail)
| |
− | create StandardMaterial()
| |
− | else
| |
− | create UnderWaterShadingMaterial()
| |
− | endif
| |
− |
| |
− | enddef
| |
− |
| |
− | define UnderWaterShadingMaterial()
| |
− |
| |
− | material
| |
− | shader -layer (($nhoodCanvasLayer + 4) * 8)
| |
− | validateRenderShaderContext -vertexFormat position 0 required
| |
− | validateRenderShaderContext -vertexFormat normal 0 required
| |
− | validateRenderShaderContext -viewerRenderType viewerRenderType
| |
− |
| |
− | if ($stdMatBaseTextureEnabled)
| |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| |
− | endif
| |
− |
| |
− |
| |
− |
| |
− | pass -fixedFunction
| |
− |
| |
− | ffMatCoef -amb $stdMatDiffCoef -ambAlpha $stdMatAlphaMultiplier -diff $stdMatDiffCoef -diffAlpha $stdMatAlphaMultiplier -emit $stdMatEmissiveCoef -emitAlpha $stdMatAlphaMultiplier -spec $stdMatSpecCoef -specPow $stdMatSpecPower
| |
− |
| |
− | create StandardShaderFBAlphaState($stdMatAlphaBlendMode)
| |
− | fillmode $stdMatFillMode
| |
− | cullmode $stdMatCullMode
| |
− |
| |
− | create LightingStates()
| |
− |
| |
| stage | | stage |
− | create StandardShaderTextureState(Base) | + | textureTransformType vector3 homogeneous |
− | textureBlend multiply(texture outRegister) multiply(texture outRegister) | + | textureAddressing clamp clamp |
| + | texture $reflectionRenderTarget |
| + | textureBlend select(texture) select(colorScalar) |
| end | | end |
− |
| + | |
− | #################################################################
| + | |
− | if ($stdMatIsPartlyUnderwater and tsIsInNeighborhood)
| + | |
− | if (viewerRenderType = $kRenderTypeReflection)
| + | |
− | alphaTest true 128
| + | |
− | alphaTestFunction acceptIfGreater
| + | |
− | stage
| + | |
− | # above water -- clip by using depth-based 0/1 texture.
| + | |
− | texture blackWhite
| + | |
− | textureAddressing clamp clamp
| + | |
− | textureFilterHint point point
| + | |
− | textureMIPFilterHint disabled
| + | |
− |
| + | |
− | ffTextureMatrix -cameraToGlobal -order zzzw -trans ($waterHeight - 0.5, 0) -invert
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | textureBlend multiply(texture outRegister) select(texture)
| + | |
− | end
| + | |
− | else
| + | |
− | stage
| + | |
− | # would we want to source this from somewhere?
| + | |
− | texture $waterGradientTexture
| + | |
− | textureAddressing tile clamp
| + | |
− |
| + | |
− | set d ($waterHeight - $waterGradientZoneStart)
| + | |
− | set s (-$waterGradientZoneSize)
| + | |
− | ffTextureMatrix -cameraToGlobal -order xzyw -scale $s -trans (0, $d) -invert
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | textureBlend multiply(texture outRegister) select(outRegister)
| + | |
− | end
| + | |
− | endif
| + | |
− | else
| + | |
− | # if we are in lot mode and we want to fade this shape
| + | |
− | if (numLightsOfType(${kShapeColorLight}) != 0)
| + | |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | |
− | depthTest true -enableDepthWrite false
| + | |
− | colorScalar (1, 1, 1, 1) -applyShapeColor 0
| + | |
− | stage
| + | |
− | textureBlend select(outRegister) select(colorScalar)
| + | |
− | end
| + | |
− | endif
| + | |
− | endif
| + | |
− | #################################################################
| + | |
| end | | end |
− |
| |
− | seti weatherLightCount (numLightsOfType(${kWeatherLight}))
| |
− |
| |
| end | | end |
| | | |
− | # fallback shader, no darken by depth, since "FromPosition" tends to be totally FUBAR in SWVP.
| + | shader -layer 6 |
− | shader -layer (($nhoodCanvasLayer + 4) * 8) | + | validateRenderShaderContext -viewerRenderType $kRenderTypeNormal |
− |
| + | pass -modifiedEachFrameHint |
− | pass -fixedFunction
| + | shaderProgram -target vertexProgram -method assemble |
− |
| + | bindConstants 0 -bindingID geomToClip -constantCount 4 |
− | ffMatCoef -amb $stdMatDiffCoef -ambAlpha $stdMatAlphaMultiplier -diff $stdMatDiffCoef -diffAlpha $stdMatAlphaMultiplier -emit $stdMatEmissiveCoef -emitAlpha $stdMatAlphaMultiplier -spec $stdMatSpecCoef -specPow $stdMatSpecPower | + | bindConstants 4 -bindingID clipToViewTarget -constantCount 4 |
− | | + | shaderSource |
− | create StandardShaderFBAlphaState($stdMatAlphaBlendMode)
| + | vs_1_1 |
− | fillmode $stdMatFillMode
| + | dcl_position v0 |
− | cullmode $stdMatCullMode
| + | def c8, -0.5, -0.5, 1, 1 |
− |
| + | def c9, 0.5, 0.5, 0, 0 |
− | create LightingStates()
| + | def c10, 0.25, 0.25, 0, 0 |
− |
| + | m4x4 r0, v0, c0 |
− | stage
| + | mov oPos, r0 |
− | create StandardShaderTextureState(Base)
| + | mul r2, c9, r0.w |
− | textureBlend multiply(texture outRegister) multiply(texture outRegister) | + | mad r4, r0, c8, r2 |
| + | rcp r3.x, c4.x |
| + | rcp r3.y, c5.y |
| + | mov r3.zw, c9.zw |
| + | mul r3, r3, c10 |
| + | mad r1, r0, r3, r4 |
| + | rcp r1.w, r1.w |
| + | mul oT0.xy, r1.w, r1.xy |
| + | endShaderSource |
| end | | end |
− |
| |
− | # if we are in lot mode and we want to fade this shape
| |
− | if (not tsIsInNeighborhood and numLightsOfType(${kShapeColorLight}) != 0)
| |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| |
− | depthTest true -enableDepthWrite false
| |
− | colorScalar (1, 1, 1, 1) -applyShapeColor 0
| |
− | stage
| |
− | textureBlend select(outRegister) select(colorScalar)
| |
− | end
| |
− | endif
| |
− |
| |
− | end
| |
− |
| |
− |
| |
− | end
| |
| | | |
− | end
| + | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) |
− |
| + | depthTest true -enableDepthWrite false |
− | enddef
| + | colorScalar (0,0,0) 0.25 |
| | | |
− | | + | stage |
− | | + | textureAddressing clamp clamp |
− | # ===================================================================================
| + | texture $reflectionRenderTarget |
− | define ImposterArrowMaterial()
| + | textureBlend select(texture) select(colorScalar) |
− | material
| + | |
− | shader -layer (($nhoodCanvasLayer + 11) * 8)
| + | |
− |
| + | |
− | validateRenderShaderContext -vertexFormat position 0 required
| + | |
− | validateRenderShaderContext -vertexFormat normal 0 required
| + | |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| + | |
− | | + | |
− | pass -fixedFunction
| + | |
− | create LightingStatesNoStdLights()
| + | |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | |
− | fillmode $stdMatFillMode
| + | |
− | # TODO: change this, cannot turn off depth since that is used for dirty rect | + | |
− | depthTest false -enableDepthWrite false
| + | |
− |
| + | |
− | stage
| + | |
− | texture $texture
| + | |
− | textureAddressing tile tile
| + | |
− | ffTextureCoordsSource 0
| + | |
− | textureBlend select(texture) select(texture)
| + | |
− | end
| + | |
− | end
| + | |
− | end
| + | |
− | end
| + | |
− | enddef
| + | |
− | | + | |
− | # ===================================================================================
| + | |
− | | + | |
− | define NeighborhoodTreeGUOBMaterial()
| + | |
− | | + | |
− | # $stdMatTextureName
| + | |
− | # $stdMatAlphaMulitplier
| + | |
− | | + | |
− | # TODO: fix these so that they are not hardcoded, must be passed through content
| + | |
− | set textureName "genericroundsoftguob-alpha"
| + | |
− | setf alphaMultiplier 0.65
| + | |
− | | + | |
− | # try using vs_2_sw on the trees since sw vs is not as susceptible to state changes
| + | |
− | | + | |
− | # this only handles tree GUOBs in the nhood.
| + | |
− | material
| + | |
− |
| + | |
− | #the engine will try this shader first..
| + | |
− | shader -layer $nhoodTreeShadowLayer
| + | |
− | # shadows can never be seen in reflections (they're on the ground)
| + | |
− | viewerRenderTypePred $kRenderTypeReflection false
| + | |
− |
| + | |
− | pass
| + | |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | |
− | depthTest true -enableDepthWrite false
| + | |
− |
| + | |
− | shaderProgram -target vertexProgram -method assemble
| + | |
− | bindConstants 0 -bindingID geomToClip -constantCount 4
| + | |
− | shaderSource
| + | |
− | vs_1_1
| + | |
− | dcl_position v0
| + | |
− | dcl_texcoord v1
| + | |
− | m4x4 oPos, v0, c0
| + | |
− | mov oT0, v1
| + | |
− |
| + | |
− | endShaderSource
| + | |
− | end
| + | |
− |
| + | |
− | shaderProgram -target pixelProgram -method assemble
| + | |
− | shaderSource
| + | |
− | ps_1_1
| + | |
− | def c0,1,1,1,$alphaMultiplier
| + | |
− | tex t0
| + | |
− | mul r0,t0, c0
| + | |
− | endShaderSource
| + | |
− |
| + | |
| end | | end |
| | | |
− | sampler 0
| + | end |
− | texture $textureName
| + | |
− | textureAddressing clamp clamp clamp
| + | |
− | end
| + | |
− | end
| + | |
| end | | end |
− |
| |
− | # and fall back to this one if it can't render the above.
| |
− | shader -layer $nhoodTreeShadowLayer
| |
− | # shadows can never be seen in reflections (they're on the ground)
| |
− | viewerRenderTypePred $kRenderTypeReflection false
| |
− |
| |
− | pass -fixedFunction
| |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| |
− | depthTest true -enableDepthWrite false
| |
− |
| |
− | colorScalar (1,1,1, $alphaMultiplier)
| |
− |
| |
− | stage
| |
− | texture $textureName
| |
− | textureAddressing clamp clamp clamp
| |
− | textureBlend select(texture) multiply(texture colorScalar)
| |
− | end
| |
− | end
| |
− | end
| |
− |
| |
− | end
| |
− |
| |
| enddef | | enddef |
| | | |
− | #======================================================================================= | + | #---------------------------------------------------------------------------------------------------------------# |
− | define NeighborhoodBuildingMaterial()
| + | |
− | material
| + | |
− | shader -layer 0
| + | |
− | setb isDay tsIsDay
| + | |
− | setb shouldShow (($showOnDay and $isDay) or ((not $showOnDay) and (not $isDay)))
| + | |
− | if ($shouldShow)
| + | |
− | pass -fixedFunction
| + | |
− |
| + | |
− | if (numLightsOfType(${kShapeColorLight}) > 0)
| + | |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | |
− | depthTest true -enableDepthWrite false
| + | |
− | colorScalar (1, 1, 1, 1) -applyShapeColor 0
| + | |
− | else
| + | |
− | colorScalar (1, 1, 1, 1)
| + | |
− | endif
| + | |
− |
| + | |
− |
| + | |
− | if ($isDay) #lighting is only applied at day time
| + | |
− | ffLighting -enable true -localViewer false -normalizeNormals false
| + | |
− | create NonStandardLighting()
| + | |
− | ffMatCoef -amb (0.8,0.8,0.8) -ambAlpha 1.0 -diff (0.8,0.8,0.8) -diffAlpha 1.0 -spec (0,0,0) -specPow 0
| + | |
− |
| + | |
− | stage
| + | |
− | ffTextureCoordsSource 0
| + | |
− | texture $texMaterial
| + | |
− | textureBlend multiply(texture diffuse) multiply(texture colorScalar)
| + | |
− | end
| + | |
− | else
| + | |
− | stage
| + | |
− | ffTextureCoordsSource 0
| + | |
− | texture $texMaterial
| + | |
− | textureBlend select(texture) multiply(texture colorScalar)
| + | |
− | end
| + | |
− | endif
| + | |
− | end
| + | |
− | endif
| + | |
− | end
| + | |
− | end
| + | |
− | enddef
| + | |
− | #============================================================================================
| + | |
− | | + | |
− | # make tree shadows render to an opaque (but blended layer) so they drop into the static layer
| + | |
− | # this overrides the texture name and alpha blend level.
| + | |
− | | + | |
− | materialDefinition neighborhood_roundshadow
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | | + | |
− | # rectangular shadows are used by the car shadows, until can pass the existing texture name onto the material,
| + | |
− | # leave those shadows as transparent layer 7 that will get alpha sorted, etc.
| + | |
− | #materialDefinition neighborhood_rectangularshadow
| + | |
− | # setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | #end
| + | |
− | | + | |
− | # forest
| + | |
− | materialDefinition forest_01_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | materialDefinition forest_02_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | | + | |
− | | + | |
− | # oak
| + | |
− | materialDefinition treeoak01_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | materialDefinition treeoak02_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | materialDefinition treeoak03_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | materialDefinition treeoak04_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | materialDefinition treeoak05_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | materialDefinition treeoak06_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | | + | |
− | # scrub oak
| + | |
− | materialDefinition neighborhoodtreescruboak_shadows_alpha
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | | + | |
− | # birch
| + | |
− | materialDefinition treebirch01_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− |
| + | |
− | end
| + | |
− | materialDefinition treebirch02_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− |
| + | |
− | end
| + | |
− | materialDefinition treebirch03_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | | + | |
− | end
| + | |
− | materialDefinition treebirch04_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | materialDefinition treebirch05_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | materialDefinition treebirch06_shadows
| + | |
− | setDefinition NeighborhoodTreeGUOBMaterial
| + | |
− | end
| + | |
− | | + | |
− | # TODO: need to redefine the tree shaders, at least skip in reflections
| + | |
− | # this is also causing massive batch count for main view (scrolling)
| + | |
− | # all trees should be combined into a single part/texture atlas with their shadows
| + | |
− | # render them after the terrain
| + | |
− | #materialDefinition treeoak01_diffuse
| + | |
− | # setDefinition StandardMaterial
| + | |
− | #end
| + | |
− | | + | |
− | | + | |
− | # ===================================================================================
| + | |
− | | + | |
− | materialDefinition neighborhood-canvas-outOfWater
| + | |
− | setDefinition NeighborhoodCanvas
| + | |
− | addParam isUnderWater false
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition neighborhood-canvas-underwater
| + | |
− | setDefinition NeighborhoodCanvas
| + | |
− | addParam isUnderWater true
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition neighborhood-canvas-straddle
| + | |
− | setDefinition NeighborhoodCanvasStraddle
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition neighborhood-underwater-terrain
| + | |
− | setDefinition NeighborhoodWaterTerrain
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition waterEdgeBoxMaterial
| + | |
− | setDefinition NeighborhoodWaterEdge
| + | |
− | addParam waterEdgeTexture "neighborhood-sides-water"
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition terrainEdgeBoxMaterial
| + | |
− | setDefinition NeighborhoodTerrainEdge
| + | |
− | addParam terrainEdgeTexture "neighborhood-sides-dirt"
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition nhoodTerrainLightingMaterial
| + | |
− | setDefinition NHoodTerrainLighting
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition nhoodTerrainLightingMaterialImposter
| + | |
− | setDefinition NHoodTerrainLighting
| + | |
− | addParam isImposter true
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition nhoodReflectionSkybox
| + | |
− | setDefinition SkyboxCompositionPassMaterial
| + | |
− | addParam skyboxCubeTexture $skyboxCubeMap
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition lotSkirtReflectionSkybox
| + | |
− | setDefinition SkyboxCompositionPassMaterial
| + | |
− | addParam skyboxCubeTexture $skyboxCubeMap
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition lotPlacementArrow
| + | |
− | setDefinition ImposterArrowMaterial
| + | |
− | addParam texture lot-placement-arrow
| + | |
− | end
| + | |
− | | + | |
− | # Material used in highlighting the terrain to depict a house for which no imposter exists yet.
| + | |
− | materialDefinition DefaultResidentialLotImposterMaterial
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lothighlight-residential"
| + | |
− | addParam highlightAlpha 0.5
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition DefaultCommunityLotImposterMaterial
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lothighlight-community"
| + | |
− | addParam highlightAlpha 0.5
| + | |
− | end
| + | |
− | | + | |
− | | + | |
− | # Material used in creating a terrain thumbnail for a lot for which no imposter exists yet.
| + | |
− | materialDefinition DefaultLotThumbnailMaterial
| + | |
− | setDefinition StandardMaterial
| + | |
− | addParam stdMatBaseTextureEnabled "true"
| + | |
− | addParam stdMatBaseTextureName "lotselection-done"
| + | |
− | addParam stdMatLightingEnabled true
| + | |
− | addParam stdMatDiffCoef (1, 1, 1)
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition bridge_sides
| + | |
− | # setDefinition StandardMaterial
| + | |
− | setDefinition PartiallyUnderWaterMaterial
| + | |
− | addParam stdMatAlphaBlendMode none
| + | |
− | addParam stdMatBaseTextureEnabled true
| + | |
− | addParam stdMatBaseTextureName bridge-sides
| + | |
− | addParam stdMatDiffCoef (0.8, 0.8, 0.8)
| + | |
− | addParam stdMatIsPartlyUnderwater true
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition cliff_boulder_material
| + | |
− | # setDefinition StandardMaterial
| + | |
− | setDefinition PartiallyUnderWaterMaterial
| + | |
− | addParam stdMatAlphaBlendMode none
| + | |
− | addParam stdMatBaseTextureEnabled true
| + | |
− | addParam stdMatBaseTextureName nh-test-cliff
| + | |
− | addParam stdMatDiffCoef (0.8, 0.8, 0.8)
| + | |
− | addParam stdMatIsPartlyUnderwater true
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition plesiosaur_skin_material
| + | |
− | # setDefinition StandardMaterial
| + | |
− | setDefinition PartiallyUnderWaterMaterial
| + | |
− | addParam stdMatAlphaBlendMode none
| + | |
− | addParam stdMatBaseTextureEnabled true
| + | |
− | addParam stdMatBaseTextureName plesiosaur-skin
| + | |
− | addParam stdMatDiffCoef (0.8, 0.8, 0.8)
| + | |
− | addParam stdMatIsPartlyUnderwater true
| + | |
− |
| + | |
− | # these are mvoing objects, need to be at or above layer 0
| + | |
− | addParam nhoodCanvasLayer -4
| + | |
− |
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition neighborhood_bouyside_material
| + | |
− | # setDefinition StandardMaterial
| + | |
− | setDefinition PartiallyUnderWaterMaterial
| + | |
− | addParam stdMatAlphaBlendMode none
| + | |
− | addParam stdMatBaseTextureEnabled true
| + | |
− | addParam stdMatBaseTextureName neighborhood_bouyside
| + | |
− | addParam stdMatDiffCoef (0.8, 0.8, 0.8)
| + | |
− | addParam stdMatIsPartlyUnderwater true
| + | |
− |
| + | |
− | # these are mvoing objects, need to be at or above layer 0
| + | |
− | addParam nhoodCanvasLayer -4
| + | |
− | end
| + | |
− | | + | |
− | | + | |
− | materialDefinition RelationshipArchGreen
| + | |
− | setDefinition StandardMaterial
| + | |
− | addParam stdMatSpecPower 20
| + | |
− | addParam stdMatDiffCoef (0.3, 1, 0.3)
| + | |
− | addParam stdMatSpecCoef (1, 1, 1)
| + | |
− | addParam stdMatAlphaMultiplier 0.6
| + | |
− | addParam stdMatAlphaBlendMode blend
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition housePlacementOKHighlight
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lotselection-good"
| + | |
− | addParam highlightAlpha 0.15
| + | |
− | end
| + | |
− |
| + | |
− | materialDefinition housePlacementNotOKHighlight
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lotselection-bad"
| + | |
− | addParam highlightAlpha 0.15
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition roadIndicatorOK
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lothighlight-roadghost-good"
| + | |
− | addParam highlightAlpha 0.75
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition roadIndicatorNotOK
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lothighlight-roadghost-bad"
| + | |
− | addParam highlightAlpha 0.75
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition DefaultLotHighlight
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lotselection-good"
| + | |
− | addParam highlightAlpha 0.25
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition ResidentialLotHighlight
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lothighlight-residential"
| + | |
− | addParam highlightAlpha 0.40
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition CommunityLotHighlight
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lothighlight-community"
| + | |
− | addParam highlightAlpha 0.40
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition DormLotHighlight
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lothighlight-dorm"
| + | |
− | addParam highlightAlpha 0.40
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition NotOKLotHighlight
| + | |
− | setDefinition NHoodTerrainHighlightMaterial
| + | |
− | addParam highlightTexture "lotselection-bad"
| + | |
− | addParam highlightAlpha 0.40
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition neighborhoodbuildingres1_windows_night
| + | |
− | setDefinition NeighborhoodBuildingMaterial
| + | |
− | addParam texMaterial neighborhoodbuildingres1_repeat-surface-night
| + | |
− | addParam showOnDay false
| + | |
− | end
| + | |
− | | + | |
− | materialDefinition neighborhoodbuildingres1_windows_day
| + | |
− | setDefinition NeighborhoodBuildingMaterial
| + | |
− | addParam texMaterial neighborhoodbuildingres1_repeat-surface
| + | |
− | addParam showOnDay true
| + | |
− | end
| + | |
− | | + | |
− | # this is commented out because the UI renders this without use of the material
| + | |
− | #materialDefinition ZoomConePyramid
| + | |
− | # setDefinition ZoomConeMaterial
| + | |
− | # addParam baseColor (1.0, 1.0, 1.0, 0.5)
| + | |
− | #end
| + | |
− | | + | |
− | define LotSkirtPSWater()
| + | |
− | shader -layer ($poolWaterLayer+1)
| + | |
− | validateRenderShaderContext -vertexFormat position 0 required
| + | |
− | pass -clipAlways -modifiedEachFrameHint
| + | |
− | #fillmode wireframe
| + | |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | |
− | seti textureLights (numLightsOfType(environmentCube))
| + | |
− | depthTest true -enableDepthWrite false
| + | |
− |
| + | |
− | shaderProgram -target vertexProgram -method compile -version 1_1
| + | |
− | | + | |
− | bindConstants 0 -bindingID geomToClip -constantCount 4
| + | |
− | bindConstants 4 -bindingID geomToCamera -constantCount 3
| + | |
− | | + | |
− | bindConstants 7 -bindingID frameInfo
| + | |
− | | + | |
− | bindConstants 11 -bindingID immediateData -data ($wmXRepeat, 0, $wmXWaveHeight, $wmXSpeed)
| + | |
− | bindConstants 12 -bindingID immediateData -data (0, $wmYRepeat, $wmYWaveHeight, $wmYSpeed)
| + | |
− | | + | |
− | # pre-evaluate these
| + | |
− | setf xscale (-$wmXRepeat * $wmXWaveHeight)
| + | |
− | setf yscale (-$wmYRepeat * $wmYWaveHeight)
| + | |
− | bindConstants 13 -bindingID immediateData -data ($xscale,$yscale, 1,0)
| + | |
− | bindConstants 14 -bindingID allStandardLightData -constantCount 4 -constantType float
| + | |
− | bindConstants 18 -bindingID cameraToGlobal -constantCount 3
| + | |
− | bindConstants 21 -bindingID cameraToGeom -constantCount 3
| + | |
− |
| + | |
− | if (tsIsDay)
| + | |
− | bindConstants 25 -bindingID immediateData -data (0.75, 0.75, 0.75, 1)
| + | |
− | bindConstants 28 -bindingID immediateData -data (-0.3, 0.1, 0.1, 0.0)
| + | |
− | else
| + | |
− | bindConstants 25 -bindingID immediateData -data (0.2, 0.2, 0.2, 1)
| + | |
− | bindConstants 28 -bindingID immediateData -data (-0.3, -0.2, -0.1, 0.0)
| + | |
− | endif
| + | |
− | | + | |
− | shaderSource
| + | |
− | | + | |
− | float4 frameInfo : register(c7);
| + | |
− | float4 waveDataX : register(c11);
| + | |
− | float4 waveDataY : register(c12);
| + | |
− | float4 waveDataHelper : register(c13);
| + | |
− | float4x4 clipSpaceMatrix : register(c0);
| + | |
− | float4x3 cameraSpaceMatrix : register(c4);
| + | |
− | float4x3 cameraToGlobalMatrix : register(c18);
| + | |
− | float4x3 cameraToGeomMatrix : register(c21);
| + | |
− |
| + | |
− | float4 nightColor: register(c25);
| + | |
− | float4 waterTint: register(c28);
| + | |
− |
| + | |
− | float4 lightDirection : register(c14);
| + | |
− | float4 lightColor : register(c15);
| + | |
− | float4 lightSpecular : register(c16);
| + | |
− |
| + | |
− | const static float4 refractionWeights={1,1,2,0};
| + | |
− | const static float4 layerBlue={1.0, 1.0, 1.0, 1.0};
| + | |
− |
| + | |
− | struct InputVertex
| + | |
− | {
| + | |
− | float3 position: POSITION0;
| + | |
− | float3 normal : NORMAL0;
| + | |
− | float2 alpha : TEXCOORD1;
| + | |
− | };
| + | |
− |
| + | |
− | struct OutputVertex
| + | |
− | {
| + | |
− | float4 clipPosition : POSITION;
| + | |
− | float4 sPos : TEXCOORD0;
| + | |
− | float2 Wave0 : TEXCOORD1;
| + | |
− | float2 Wave1 : TEXCOORD2;
| + | |
− | float2 Wave2 : TEXCOORD3;
| + | |
− | float2 Wave3 : TEXCOORD4;
| + | |
− | float3 Eye : TEXCOORD5;
| + | |
− | float4 specular : COLOR0;
| + | |
− | float4 colorTint : COLOR1;
| + | |
− | };
| + | |
− |
| + | |
− |
| + | |
− |
| + | |
− | OutputVertex VertexMain( InputVertex inputVertex)
| + | |
− | {
| + | |
− | // Do Y-direction waves
| + | |
− | // r0 = (x, y, z, t)
| + | |
− |
| + | |
− | OutputVertex outputVertex;
| + | |
− |
| + | |
− | float4 posAndTime;
| + | |
− | posAndTime.xyz = inputVertex.position;
| + | |
− | posAndTime.w = frameInfo.w;
| + | |
− |
| + | |
− | float temp = dot(posAndTime, waveDataX);
| + | |
− | float z = sin(temp) * waveDataX.z + inputVertex.position.z;
| + | |
− | temp = dot(posAndTime, waveDataY);
| + | |
− | posAndTime.z = z + sin(temp) * waveDataY.z ;//-0.1f; //The -.01 is a fudge factor to remove some of the edge creep associated with moving the height of the wave. -tom
| + | |
− | posAndTime.w = 1.0f;
| + | |
− |
| + | |
− | outputVertex.clipPosition = mul( posAndTime, clipSpaceMatrix);
| + | |
− | outputVertex.sPos = float4(0.5f*(outputVertex.clipPosition.ww - outputVertex.clipPosition.xy), outputVertex.clipPosition.ww);
| + | |
− |
| + | |
− | float3 waveNormal = normalize(inputVertex.normal + float3(cos(temp)*waveDataHelper.xy, 0));
| + | |
− | float3 cameraSpaceNormal = normalize(mul(waveNormal, cameraSpaceMatrix));
| + | |
− | float3 cameraSpacePosition = mul( posAndTime, cameraSpaceMatrix);
| + | |
− | float3 viewVector = normalize(-cameraSpacePosition);
| + | |
− |
| + | |
− | float3 halfVector = normalize(viewVector + lightDirection);
| + | |
− | outputVertex.specular = lightSpecular*pow(dot(cameraSpaceNormal, halfVector), 50)*nightColor*lightColor*0.5;
| + | |
− |
| + | |
− |
| + | |
− | float2 fTranslation=float2(fmod(frameInfo.w, 100)*0.005, fmod(frameInfo.w, 100)*0.005);
| + | |
− | float2 vTexCoords = posAndTime.xy*0.05;
| + | |
− |
| + | |
− | // Output bump layers texture coordinates
| + | |
− | float fSinTranslation=sin(fTranslation*100)*0.005;
| + | |
− | float2 vTranslation0=fTranslation+fSinTranslation;
| + | |
− | float2 vTranslation1=fTranslation-fSinTranslation;
| + | |
− | float2 vTranslation2=fTranslation;
| + | |
− |
| + | |
− | // Scale texture coordinates to get mix of low/high frequency details
| + | |
− | outputVertex.Wave0.xy = vTexCoords.xy*0.01+fTranslation*2.0;
| + | |
− | outputVertex.Wave1.xy = vTexCoords.xy+fTranslation*2.5;
| + | |
− | outputVertex.Wave2.xy = vTexCoords.xy+fTranslation*-2.3;
| + | |
− | outputVertex.Wave3.xy = vTexCoords.xy*0.1+fTranslation*1.5;
| + | |
− |
| + | |
− | // compute binormal
| + | |
− | float3 binormal = normalize(cross(waveNormal, float3(1.0f, 0.0f, 0.0f)));
| + | |
− | float3 tangent = normalize(cross(binormal, waveNormal));
| + | |
− |
| + | |
− | // tangent space matrix
| + | |
− | float3x3 objToTangentSpace = float3x3(tangent, binormal, waveNormal);
| + | |
− |
| + | |
− | float3 viewVectorInObjSpace = mul(viewVector, (float3x3)cameraToGeomMatrix);
| + | |
− |
| + | |
− | outputVertex.Eye.xyz = mul(objToTangentSpace, viewVectorInObjSpace);
| + | |
− | outputVertex.colorTint = waterTint;
| + | |
− | outputVertex.colorTint.a = inputVertex.alpha.xxxx;
| + | |
− | // outputVertex.color = waterTint.xxxx;
| + | |
− |
| + | |
− | return(outputVertex);
| + | |
− | }
| + | |
− |
| + | |
− | endShaderSource
| + | |
− | end # shaderProgram
| + | |
− |
| + | |
− | shaderProgram -target pixelProgram -method compile -version 2_0
| + | |
− | shaderSource
| + | |
− | sampler reflect;
| + | |
− | sampler bump;
| + | |
− | struct cInputPixel
| + | |
− | {
| + | |
− | float4 sPos : TEXCOORD0;
| + | |
− | float2 Wave0 : TEXCOORD1;
| + | |
− | float2 Wave1 : TEXCOORD2;
| + | |
− | float2 Wave2 : TEXCOORD3;
| + | |
− | float2 Wave3 : TEXCOORD4;
| + | |
− | float3 Eye : TEXCOORD5;
| + | |
− | float4 specular : COLOR0;
| + | |
− | float4 colorTint : COLOR1;
| + | |
− | };
| + | |
− |
| + | |
− | float Fresnel(float NdotL, float fresnelBias, float fresnelPow, float facing)
| + | |
− | {
| + | |
− | return max(fresnelBias + (1.0f - fresnelBias)*pow(facing, fresnelPow), 0.0);
| + | |
− | }
| + | |
− |
| + | |
− | float4 PixelMain(cInputPixel pi) : COLOR
| + | |
− | {
| + | |
− | float3 vEye = normalize(pi.Eye);
| + | |
− | | + | |
− | // Get bump layers
| + | |
− | float3 vBumpTexA = tex2D(bump, pi.Wave0.xy).xyz;
| + | |
− | float3 vBumpTexB = tex2D(bump, pi.Wave1.xy).xyz;
| + | |
− | float3 vBumpTexC = tex2D(bump, pi.Wave2.xy).xyz;
| + | |
− | float3 vBumpTexD = tex2D(bump, pi.Wave3.xy).xyz;
| + | |
− |
| + | |
− | // Average bump layers
| + | |
− | float3 vBumpTex=normalize(2.0 * (vBumpTexA.xyz + vBumpTexB.xyz + vBumpTexC.xyz + vBumpTexD.xyz)-4.0);
| + | |
− |
| + | |
− | // Apply individual bump scale for refraction and reflection
| + | |
− | float3 vReflBump = vBumpTex.xyz ;
| + | |
− | float4 vReflection = tex2Dproj(reflect, pi.sPos + float4(vReflBump.xy, 0.0f, 0.0f));//*0.001 + float4(2.0*vBumpTexD-1.0f.xxx, 1);
| + | |
− |
| + | |
− | // Compute Fresnel term
| + | |
− | float NdotL = max(dot(vEye, vReflBump), 0);
| + | |
− | float facing = (1.0 - NdotL);
| + | |
− | float fresnel = Fresnel(NdotL, 0.1, 0.5, facing);
| + | |
− |
| + | |
− | vReflection.a = fresnel * 0.5;
| + | |
− |
| + | |
− | return saturate(vReflection + pi.colorTint);
| + | |
− | }
| + | |
− | endShaderSource
| + | |
− | end
| + | |
− |
| + | |
− | sampler reflect
| + | |
− | texture "OceanReflection"
| + | |
− | textureAddressing clamp clamp
| + | |
− | end
| + | |
− |
| + | |
− | sampler bump
| + | |
− | texture "poolShape-body-bump"
| + | |
− | textureAddressing tile tile
| + | |
− | end
| + | |
− |
| + | |
− | end # end pass
| + | |
− | end
| + | |
− | enddef
| + | |
− | | + | |
− | define LotSkirtWater()
| + | |
− | material
| + | |
− | create DetermineHardwareSupport()
| + | |
− | | + | |
− | if ($useHWShader2Path)
| + | |
− | create LotSkirtPSWater()
| + | |
− | else
| + | |
− |
| + | |
− | shader -layer $nhoodWaterLayer
| + | |
− | validateRenderShaderContext -vertexFormat position 0 required
| + | |
− | validateRenderShaderContext -vertexFormat normal 0 required
| + | |
− | validateRenderShaderContext -vertexFormat texcoord 0 required
| + | |
− | viewerRenderTypePred viewerRenderType
| + | |
− |
| + | |
− | pass -fixedFunction
| + | |
− |
| + | |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | |
− | colorScalar $lotSkirtWaterReflColour 0.50
| + | |
− | depthTest true -enableDepthWrite false
| + | |
− |
| + | |
− | #tring to remove warble I think it may be caused by depth bias.
| + | |
− | #ffDepthOffset -2
| + | |
− |
| + | |
− | stage
| + | |
− | ffTextureCoordsSource fromPosition
| + | |
− | ffTextureMatrix -cameraToClip -scalev ((-0.5 * $ratioW), (-0.5 * $ratioH)) -trans (0.5, 0.5)
| + | |
− | textureAddressing clamp clamp
| + | |
− | texture "ScreenReflection"
| + | |
− |
| + | |
− | textureBlend multiply(texture colorScalar) multiply(diffuse colorScalar)
| + | |
− | end
| + | |
− |
| + | |
− | end
| + | |
− | end
| + | |
− | endif
| + | |
− | end
| + | |
− | enddef
| + | |
− | | + | |
− | define LotSkirtWaterNoReflection()
| + | |
− | material
| + | |
− | # fallback: no reflection.
| + | |
− | shader -layer ($nhoodWaterLayer)
| + | |
− | viewerRenderTypePred viewerRenderType
| + | |
− |
| + | |
− | create DetermineHardwareSupport()
| + | |
− |
| + | |
− | pass -fixedFunction
| + | |
− | # For now, we are diabling the lighting since we simply want to use the vertex colors.
| + | |
− | create LightingStatesNoStdLightsParam(false true)
| + | |
− | alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha)
| + | |
− |
| + | |
− | colorScalar (.4, .6, .9, .4)
| + | |
− |
| + | |
− | #tring to remove warble I think it may be caused by depth bias.
| + | |
− | #ffDepthOffset -2
| + | |
− |
| + | |
− | fillmode $stdMatFillMode
| + | |
− | stage
| + | |
− | #texture reflectionoutdoorwater-envcube
| + | |
− | if ($cubeMapSupport)
| + | |
− | texture $skyboxCubeMap
| + | |
− | textureMIPFilterHint disabled
| + | |
− | | + | |
− | ffTextureCoordsSource fromReflectionVector
| + | |
− | ffTextureMatrix -orientCameraToGlobal
| + | |
− | | + | |
− | textureAddressing clamp clamp clamp
| + | |
− | textureBlend multiply(texture colorScalar) select(colorScalar)
| + | |
− | else
| + | |
− | textureBlend select(colorScalar) multiply(diffuse colorScalar)
| + | |
− | endif
| + | |
− | end
| + | |
− | end
| + | |
− | end
| + | |
− | end
| + | |
− | enddef
| + | |
− | | + | |
− | materialDefinition lotSkirtSea
| + | |
− | setDefinition LotSkirtWater
| + | |
− | addParam stdMatLightingEnabled false
| + | |
− | addParam stdMatLayer 0
| + | |
− |
| + | |
− | addParam stdMatDiffCoef (1, 1, 1)
| + | |
− | | + | |
− | addParam wmReflectionTexture swimming_pool-envcube
| + | |
− | | + | |
− | addParam wmTransparency 0.4
| + | |
− | | + | |
− | addParam wmXSpeed 3
| + | |
− | addParam wmXRepeat 5
| + | |
− | addParam wmXWaveHeight 0.001
| + | |
− |
| + | |
− | addParam wmYSpeed 3
| + | |
− | addParam wmYRepeat 6
| + | |
− | addParam wmYWaveHeight 0.001
| + | |
− |
| + | |
− | end
| + | |
| | | |
− | materialDefinition lotSkirtSeaNoReflection | + | materialDefinition transparent_mirror_reflection |
− | setDefinition LotSkirtWaterNoReflection | + | setDefinition TransparentMirrorReflection |
| end | | end |