ShaderLotskirt
From SimsWiki
EP6-BV 0xCD7FE87A 0x1C0532FA 0x0C50FBBF 0xFF439C10 # lotskirt # # Shaders for lot skirt # # seti lotSkirtLayer -6 seti kSpring 0 seti kSummer 1 seti kFall 2 seti kWinter 3 set weatherSuffix "" # ============================================================================== define LotSkirtMaterialDefinition() create DetermineHardwareSupport() seti snowLevel (tsHasSnow) if (($useHWShader2Path or $useHWShader1Path) and $snowLevel > 1) create LotSkirtMaterialDefinitionVSPS1() else create LotSkirtMaterialDefinitionFF() endif enddef define LotSkirtMaterialDefinitionFF() setb hasColor false seti totalLights 0 material setc stdMatDiffCoef $terrainMatDiffCoef shader -layer ($lotSkirtLayer * 8) validateRenderShaderContext -vertexFormat position 0 required validateRenderShaderContext -vertexFormat normal 0 required validateRenderShaderContext -vertexFormat texcoord 0 required # not all lots seem to have this data, causing validation errors, making this a dynamic predicate solves this problem. setb hasColor (hasVertexFormat(color,0)) if ($hasColor) validateRenderShaderContext -vertexFormat color 0 required endif pass -fixedFunction create LightingStates() depthTestFunction acceptIfLessOrEqual ffDepthOffset -1 create AttenuatedMatCoef(1.0) alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) fillmode $stdMatFillMode seti currSeason 4 if (tsIsDay) seti currSeason (tsSeasonEnum) colorScalar (0.965,0.965,1,1) else colorScalar (0.96,0.96,0.96,1) endif if (not tsIsCloudy) if ($currSeason = $kFall) colorScalar (1,0.95,0.95,1) elseif ($currSeason = $kSpring) colorScalar (1,1,0.98,1) elseif ($currSeason = $kWinter) colorScalar (0.965,0.965,1,1) elseif ($currSeason = $kSummer) colorScalar (1,1,1,1) #summer else colorScalar (0.96,0.96,0.96,1) endif endif stage texture $surfaceTexture textureAddressing tile tile textureBlend multiply(texture diffuse) select(diffuse) end stage textureBlend multiply(colorScalar outRegister) select(outRegister) end end seti snowLevel (tsHasSnow) seti hailLevel (tsHasHail) if ($snowLevel >= 1 or $hailLevel >= 1) pass -fixedFunction alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) create LightingStates() create AttenuatedMatCoef(1.0) fillmode $stdMatFillMode ffDepthOffset 1 depthTest true -enableDepthWrite false depthTestFunction acceptIfLessOrEqual setv2 scaleStage1 (23, 23) if (tsIsDay) colorScalar (0.5, 0.5, 0.52, 1) else colorScalar (0.15, 0.15, 0.375, 1) endif stage if ($snowLevel = 1) texture "snow-light-pass2" textureAddressing tile tile ffTextureCoordsSource fromPosition ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert textureBlend select(texture) select(texture) elseif ($hailLevel = 1) texture "hail-ground-surface" setv2 scaleStage1 (4, 4) textureAddressing tile tile ffTextureCoordsSource fromPosition ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert textureBlend select(texture) select(texture) else texture "snow-ground-diffuse" setv2 scaleStage1 (2, 2) textureAddressing tile tile ffTextureCoordsSource fromPosition ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert textureBlend multiply(texture colorScalar) select(colorScalar) endif end if ($snowLevel = 1) stage texture "snow-light-pass1" textureAddressing tile tile ffTextureMatrix -cameraToGlobal -scalev (17, 17) -invert ffTextureCoordsSource fromPosition textureBlend add(texture outRegister) add(texture outRegister) end endif if ($hailLevel = 1) stage texture "hail-ground-surface" textureAddressing tile tile ffTextureMatrix -cameraToGlobal -scalev (3, 3) -invert ffTextureCoordsSource fromPosition textureBlend add(texture outRegister) add(texture outRegister) end endif if ($snowLevel = 1) if (not tsIsDay) stage textureBlend multiply(diffuse outRegister) select(outRegister) end else stage textureBlend select(outRegister) multiply(outRegister diffuse) end endif elseif ($snowLevel = 2) stage texture "snow-ground-diffuse" textureAddressing tile tile ffTextureCoordsSource fromPosition ffTextureMatrix -cameraToGlobal -scalev (13, 13) -invert textureBlend multiplyAdd(texture colorScalar outRegister) select(diffuse) end else stage textureBlend multiply(diffuse outRegister) multiply(diffuse outRegister) end endif end endif create DetermineHardwareSupport() if ($useHWShader2Path or $useHWShader1Path) pass -fixedFunction alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) create LightingStates() create AttenuatedMatCoef(1.0) fillmode $stdMatFillMode ffDepthOffset 1 depthTest true -enableDepthWrite false depthTestFunction acceptIfLessOrEqual stage texture "alphaRamp" # texture name textureAddressing clamp clamp ffTextureCoordsSource 1 textureBlend select(texture) select(texture) end if (tsIsDay) colorScalar (0.965,0.965,1,1) else colorScalar (0.3, 0.3, 0.7, 1) endif stage texture "lot-sand-02" textureAddressing tile tile ffTextureCoordsSource 0 textureBlend select(texture) multiply(outRegister diffuse) end stage textureBlend multiply(colorScalar outRegister) select(outRegister) end end endif if ($useHWShader2Path or $useHWShader1Path) pass -fixedFunction alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) create LightingStates() create AttenuatedMatCoef(1.0) fillmode $stdMatFillMode ffDepthOffset 1 depthTest true -enableDepthWrite false depthTestFunction acceptIfLessOrEqual stage texture "alphaRamp" # texture name textureAddressing clamp clamp ffTextureCoordsSource 2 textureBlend select(texture) select(texture) end if (tsIsDay) colorScalar (0.965,0.965,1,1) else colorScalar (0.4,0.4,0.4,1) endif stage texture "terrain-deepwatersand" textureAddressing tile tile ffTextureCoordsSource 0 textureBlend select(texture) multiply(outRegister diffuse) end stage textureBlend multiply(colorScalar outRegister) select(outRegister) end end endif end #end shader end #end material enddef define LotSkirtMaterialDefinitionVSPS1() material shader -layer ($lotSkirtLayer * 8) validateRenderShaderContext -vertexFormat position 0 required validateRenderShaderContext -vertexFormat normal 0 required validateRenderShaderContext -vertexFormat texcoord 0 required create DetermineHardwareSupport() pass alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) shaderProgram -target vertexProgram -method compile -version 1_1 bindConstants 0 -bindingID geomToClip -constantCount 4 bindConstants 4 -bindingID geomToCamera -constantCount 3 bindConstants 7 -bindingID cameraToGeom -constantCount 3 bindConstants 15 -bindingID ambientLight -constantCount 1 -constantType float bindConstants 18 -bindingID allStandardLightData -constantCount 4 -constantType float if (tsIsDay) bindConstants 10 -bindingID immediateData -data (1, 1, 1, 1) else bindConstants 10 -bindingID immediateData -data (0.46, 0.46, 0.91, 1) endif bindConstants 12 -bindingID geomToGlobal -constantCount 3 bindConstants 22 -bindingID cameraToClipWithDepthOffset -constantCount 4 -data(0.5, 0.5, 0.5, 0.5) shaderSource float4x4 modelviewproj : register(c0); float4x3 modelview : register(c4); float4x3 modelviewInv : register(c7); // light direction float4 lightDir0 : register(c18); float4x4 cameraToClipWithDOMatrix : register(c22); float4 ambient : register(c15); float4x3 modelToWorld : register(c12); struct a2v { float4 pos : POSITION; float3 normal : NORMAL; float4 color : COLOR0; }; struct v2f { float4 hpos : POSITION; float4 color : COLOR0; float3 worldPos : TEXCOORD0; float2 bumpCoords : TEXCOORD1; float3 tanLightDir : TEXCOORD2; float2 bumpCoords2 : TEXCOORD3; }; v2f VertexMain(a2v IN) { v2f OUT; // vertex position in object space float4 pos = float4(IN.pos.x,IN.pos.y,IN.pos.z,1.0); float3 tangent = float3(1, 0, 0); // compute binormal float3 binormal = normalize(cross(IN.normal, tangent)); // tangent space matrix float3x3 tbn = float3x3(tangent, binormal, IN.normal); // light direction in object space float3 lt0 = mul(lightDir0, (float3x3)modelviewInv); // light 0 direction in tangent space OUT.tanLightDir = normalize(mul(tbn, lt0)); float3 worldPos = mul(float4(IN.pos.xyz, 1.0f), modelToWorld); OUT.bumpCoords = float2(worldPos.x, worldPos.y); OUT.bumpCoords2 = float2(worldPos.x, worldPos.y)*0.4f; // compute tangent space view vector // object space view point float3 viewPoint = mul(float4(0, 0, 0, 1), modelviewInv).xyz; float3 viewVecObj = normalize(viewPoint - IN.pos.xyz); // object space light float3 lightDirObj = normalize(mul(lightDir0, (float3x3)modelviewInv)); // half angle vector in object space float3 halfWayVector = normalize(lightDirObj + viewVecObj); // transform half angle vector to tangent space //OUT.tanHalfAngle.xyz = normalize(mul(tbn, halfWayVector)); // specular shadowing term //OUT.tanHalfAngle.w = max(dot(halfWayVector, IN.normal), 0); // vertex position in clip space float3 hposView = mul(pos, modelview); OUT.hpos = mul(float4(hposView, 1), cameraToClipWithDOMatrix); // vertex position in world space OUT.worldPos = mul(pos, modelToWorld)/64.0f; OUT.color.xyz = ambient.xyz*0.3f; OUT.color.w = IN.color.a; return OUT; } endShaderSource end # end shader program if ($useHWShader1Path) shaderProgram -target pixelProgram -method compile -version 1_1 # -disassemble "c:\sims2ep5\hlslPS1_1.txt" else shaderProgram -target pixelProgram -method compile -version ${psVersion}_0 endif if (tsIsDay) bindConstants 0 -bindingID immediateData -data (1.1, 1.1, 1.175, 1) else bindConstants 0 -bindingID immediateData -data (0.35, 0.35, 1.0, 1) endif shaderSource float4 colorFactor : register(c0); sampler normmap; sampler normmap2; struct v2f { float4 hpos : POSITION; float4 color : COLOR0; float3 worldPos : TEXCOORD0; float2 bumpCoords : TEXCOORD1; float3 tanLightDir : TEXCOORD2; float2 bumpCoords2 : TEXCOORD3; }; float4 PixelMain(v2f pi) : COLOR { float4 normal0 = 2.0f * (tex2D(normmap, pi.bumpCoords) - 0.5f); float4 normal1 = 2.0f * (tex2D(normmap2, pi.bumpCoords2) - 0.5f); float4 normal = 0.5f*(normal0+normal1); float3 diffuse = saturate(dot(pi.tanLightDir, normal.xyz))*colorFactor.xyz; return float4(float3(diffuse.xyz+ pi.color.xyz), pi.color.a); } endShaderSource end sampler normmap texture "snow-ground-bump" textureAddressing tile tile end sampler normmap2 texture "snow-ground-bump" textureAddressing tile tile end end # end pass end #end shader end # end material enddef define LotSkirtRoadMaterialDefinition() setb hasColor false seti totalLights 0 material shader -layer ($lotSkirtLayer * 8) validateRenderShaderContext -vertexFormat position 0 required validateRenderShaderContext -vertexFormat normal 0 required validateRenderShaderContext -vertexFormat texcoord 0 required setb hasColor (hasVertexFormat(color,0)) if ($hasColor) validateRenderShaderContext -vertexFormat color 0 required endif pass -fixedFunction create LightingStates() #create LightingStatesNoStdLights() create AttenuatedMatCoef(1.0) alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) fillmode $stdMatFillMode seti currSeason 4 if (tsIsDay) seti currSeason (tsSeasonEnum) colorScalar (0.81,0.85,1,1) else colorScalar (0.83,0.83,0.94,1) endif if (not tsIsCloudy) if ($currSeason = $kFall) colorScalar (0.975,0.82,0.9,1) elseif ($currSeason = $kSpring) colorScalar (0.99,1,0.94,1) elseif ($currSeason = $kWinter) colorScalar (0.81,0.85,1,1) elseif ($currSeason = $kSummer) colorScalar (1,1,1,1) #summer else colorScalar (0.83,0.83,0.94,1) endif endif set weatherSuffix "" seti snowLevel (tsHasSnow) if (strstr("$surfaceTexture", "f04") != 0 or strstr("$surfaceTexture", "304") != 0) if ($snowLevel > 1) set weatherSuffix "_HSNOW" endif if ($snowLevel > 0 and $snowLevel < 2) set weatherSuffix "_LSNOW" endif endif stage texture "${surfaceTexture}${weatherSuffix}" textureAddressing clamp clamp textureBlend multiply(texture diffuse) multiply(texture diffuse) end stage textureBlend multiply(colorScalar outRegister) select(outRegister) end end seti hailLevel (tsHasHail) if (tsHasSnow >= 1 or $hailLevel >= 1) pass -fixedFunction alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) fillmode $stdMatFillMode depthTest true -enableDepthWrite false depthTestFunction acceptIfLessOrEqual if (tsIsDay) colorScalar (1.0, 1.0, 1.0, 1.0) -applyTextureLightColor 0 0 else colorScalar (0.485, 0.485, 0.6, 1) -applyTextureLightColor 0 0 endif setv2 scaleStage1 (23, 23) stage if ($hailLevel) texture "hail-ground-surface" setv2 scaleStage1 (4, 4) else texture "snow-light-pass2" endif textureAddressing tile tile ffTextureCoordsSource fromPosition ffTextureMatrix -cameraToGlobal -scalev $scaleStage1 -invert if (not tsIsDay) textureBlend multiply(texture diffuse) multiply(texture diffuse) else textureBlend select(texture) multiply(texture diffuse) endif end end endif end end enddef define LotSkirtRoadMaterialInstance(materialName textureName) materialDefinition &materialName setDefinition LotSkirtRoadMaterialDefinition addParam surfaceTexture &textureName end enddef define LotSkirtBoundaryClipMaterial() material shader -layer (($lotSkirtLayer - 1) * 8) pass -fixedFunction -clipAlways colorScalar (1, 1, 1, 1) depthTest true -enableDepthWrite true alphaBlend srcFactor(destColor) add dstFactor(zero) depthTestFunction acceptIfLess cullmode cullCounterClockwise stage textureBlend select(colorScalar) select(colorScalar) end end end end enddef materialDefinition lotSkirtBoundaryClip setDefinition LotSkirtBoundaryClipMaterial end # ============================================================================== create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00005700 lotskirtroad_desert_00005704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00020700 lotskirtroad_desert_00020704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00000f00 lotskirtroad_desert_00000f04) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00000300 lotskirtroad_desert_00000304) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Desert_00004b00 lotskirtroad_desert_00004b04) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00005700 lotskirtroad_temperate_00005704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00020700 lotskirtroad_temperate_00020704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00000f00 lotskirtroad_temperate_00000f04) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00000300 lotskirtroad_temperate_00000304) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Temperate_00004b00 lotskirtroad_temperate_00004b04) create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00005700 lotskirtroad_european_00005704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00020700 lotskirtroad_european_00020704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00000f00 lotskirtroad_european_00000f04) create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00000300 lotskirtroad_european_00000304) create LotSkirtRoadMaterialInstance(lotSkirtRoad_European_00004b00 lotskirtroad_european_00004b04) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00005700 lotskirtroad_dirt_00005704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00020700 lotskirtroad_dirt_00020704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00000f00 lotskirtroad_dirt_00000f04) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00000300 lotskirtroad_dirt_00000304) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Dirt_00004b00 lotskirtroad_dirt_00004b04) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00005700 lotskirtroad_concrete_00005704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00020700 lotskirtroad_concrete_00020704) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00000f00 lotskirtroad_concrete_00000f04) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00000300 lotskirtroad_concrete_00000304) create LotSkirtRoadMaterialInstance(lotSkirtRoad_Concrete_00004b00 lotskirtroad_concrete_00004b04)