#include "Uniforms.hlsl" #include "Samplers.hlsl" #include "Transform.hlsl" #include "ScreenPos.hlsl" #include "Lighting.hlsl" #include "Fog.hlsl" #ifndef D3D11 // D3D9 uniforms uniform float cWindHeightFactor; uniform float cWindHeightPivot; uniform float cWindPeriod; uniform float2 cWindWorldSpacing; #ifdef WINDSTEMAXIS uniform float3 cWindStemAxis; #endif #else // D3D11 constant buffer cbuffer CustomVS : register(b6) { float cWindHeightFactor; float cWindHeightPivot; float cWindPeriod; float2 cWindWorldSpacing; #ifdef WINDSTEMAXIS float3 cWindStemAxis; #endif } #endif void VS(float4 iPos : POSITION, #if !defined(BILLBOARD) && !defined(TRAILFACECAM) float3 iNormal : NORMAL, #endif #ifndef NOUV float2 iTexCoord : TEXCOORD0, #endif #ifdef VERTEXCOLOR float4 iColor : COLOR0, #endif #if defined(LIGHTMAP) || defined(AO) float2 iTexCoord2 : TEXCOORD1, #endif #if (defined(NORMALMAP) || defined(TRAILFACECAM) || defined(TRAILBONE)) && !defined(BILLBOARD) && !defined(DIRBILLBOARD) float4 iTangent : TANGENT, #endif #ifdef SKINNED float4 iBlendWeights : BLENDWEIGHT, int4 iBlendIndices : BLENDINDICES, #endif #ifdef INSTANCED float4x3 iModelInstance : TEXCOORD4, #endif #if defined(BILLBOARD) || defined(DIRBILLBOARD) float2 iSize : TEXCOORD1, #endif #ifndef NORMALMAP out float2 oTexCoord : TEXCOORD0, #else out float4 oTexCoord : TEXCOORD0, out float4 oTangent : TEXCOORD3, #endif out float3 oNormal : TEXCOORD1, out float4 oWorldPos : TEXCOORD2, #ifdef PERPIXEL #ifdef SHADOW out float4 oShadowPos[NUMCASCADES] : TEXCOORD4, #endif #ifdef SPOTLIGHT out float4 oSpotPos : TEXCOORD5, #endif #ifdef POINTLIGHT out float3 oCubeMaskVec : TEXCOORD5, #endif #else out float3 oVertexLight : TEXCOORD4, out float4 oScreenPos : TEXCOORD5, #ifdef ENVCUBEMAP out float3 oReflectionVec : TEXCOORD6, #endif #if defined(LIGHTMAP) || defined(AO) out float2 oTexCoord2 : TEXCOORD7, #endif #endif #ifdef VERTEXCOLOR out float4 oColor : COLOR0, #endif #if defined(D3D11) && defined(CLIPPLANE) out float oClip : SV_CLIPDISTANCE0, #endif out float4 oPos : OUTPOSITION) { // Define a 0,0 UV coord if not expected from the vertex data #ifdef NOUV float2 iTexCoord = float2(0.0, 0.0); #endif float4x3 modelMatrix = iModelMatrix; float3 worldPos = GetWorldPos(modelMatrix); #ifdef WINDSTEMAXIS float stemDistance = dot(iPos, cWindStemAxis); #else float stemDistance = iPos.y; #endif float windStrength = max(stemDistance - cWindHeightPivot, 0.0) * cWindHeightFactor; float windPeriod = cElapsedTime * cWindPeriod + dot(worldPos.xz, cWindWorldSpacing); worldPos.x += windStrength * sin(windPeriod); worldPos.z -= windStrength * cos(windPeriod); oPos = GetClipPos(worldPos); oNormal = GetWorldNormal(modelMatrix); oWorldPos = float4(worldPos, GetDepth(oPos)); #if defined(D3D11) && defined(CLIPPLANE) oClip = dot(oPos, cClipPlane); #endif #ifdef VERTEXCOLOR oColor = iColor; #endif #ifdef NORMALMAP float4 tangent = GetWorldTangent(modelMatrix); float3 bitangent = cross(tangent.xyz, oNormal) * tangent.w; oTexCoord = float4(GetTexCoord(iTexCoord), bitangent.xy); oTangent = float4(tangent.xyz, bitangent.z); #else oTexCoord = GetTexCoord(iTexCoord); #endif #ifdef PERPIXEL // Per-pixel forward lighting float4 projWorldPos = float4(worldPos.xyz, 1.0); #ifdef SHADOW // Shadow projection: transform from world space to shadow space GetShadowPos(projWorldPos, oNormal, oShadowPos); #endif #ifdef SPOTLIGHT // Spotlight projection: transform from world space to projector texture coordinates oSpotPos = mul(projWorldPos, cLightMatrices[0]); #endif #ifdef POINTLIGHT oCubeMaskVec = mul(worldPos - cLightPos.xyz, (float3x3)cLightMatrices[0]); #endif #else // Ambient & per-vertex lighting #if defined(LIGHTMAP) || defined(AO) // If using lightmap, disregard zone ambient light // If using AO, calculate ambient in the PS oVertexLight = float3(0.0, 0.0, 0.0); oTexCoord2 = iTexCoord2; #else oVertexLight = GetAmbient(GetZonePos(worldPos)); #endif #ifdef NUMVERTEXLIGHTS for (int i = 0; i < NUMVERTEXLIGHTS; ++i) oVertexLight += GetVertexLight(i, worldPos, oNormal) * cVertexLights[i * 3].rgb; #endif oScreenPos = GetScreenPos(oPos); #ifdef ENVCUBEMAP oReflectionVec = worldPos - cCameraPos; #endif #endif }