#include "Uniforms.hlsl" #include "Samplers.hlsl" #include "Transform.hlsl" #include "ScreenPos.hlsl" #include "Lighting.hlsl" #include "Fog.hlsl" uniform float cWindHeightFactor; uniform float cWindHeightPivot; uniform float cWindPeriod; uniform float2 cWindWorldSpacing; void VS(float4 iPos : POSITION, float3 iNormal : NORMAL, float2 iTexCoord : TEXCOORD0, #if defined(LIGHTMAP) || defined(AO) float2 iTexCoord2 : TEXCOORD1, #endif #ifdef NORMALMAP float4 iTangent : TANGENT, #endif #ifdef SKINNED float4 iBlendWeights : BLENDWEIGHT, int4 iBlendIndices : BLENDINDICES, #endif #ifdef INSTANCED float4x3 iModelInstance : TEXCOORD2, #endif #ifdef BILLBOARD 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 out float4 oPos : POSITION) { float4x3 modelMatrix = iModelMatrix; float3 worldPos = GetWorldPos(modelMatrix); float height = worldPos.y - cModel._m31; float windStrength = max(height - 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)); #ifdef NORMALMAP float3 tangent = GetWorldTangent(modelMatrix); float3 bitangent = cross(tangent, oNormal) * iTangent.w; oTexCoord = float4(GetTexCoord(iTexCoord), bitangent.xy); oTangent = float4(tangent, 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, oShadowPos); #endif #ifdef SPOTLIGHT // Spotlight projection: transform from world space to projector texture coordinates oSpotPos = mul(projWorldPos, cLightMatrices[0]); #endif #ifdef POINTLIGHT oCubeMaskVec = mul(cLightPos.xyz - worldPos, (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 }