ShaderNeighborhoodswvs

From SimsWiki
Jump to: navigation, search

EP6-BV
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) * 18 + 17)
	
		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

Personal tools
Namespaces

Variants
Actions
Navigation
game select
Toolbox