#include "Uniforms.glsl" #include "Transform.glsl" #include "ScreenPos.glsl" #include "Lighting.glsl" uniform float cWindHeightFactor; uniform float cWindHeightPivot; uniform float cWindPeriod; uniform vec2 cWindWorldSpacing; #ifdef NORMALMAP varying vec4 vTexCoord; varying vec4 vTangent; #else varying vec2 vTexCoord; #endif varying vec3 vNormal; varying vec4 vWorldPos; #ifdef PERPIXEL #ifdef SHADOW varying vec4 vShadowPos[NUMCASCADES]; #endif #ifdef SPOTLIGHT varying vec4 vSpotPos; #endif #ifdef POINTLIGHT varying vec3 vCubeMaskVec; #endif #else varying vec3 vVertexLight; varying vec4 vScreenPos; #ifdef ENVCUBEMAP varying vec3 vReflectionVec; #endif #if defined(LIGHTMAP) || defined(AO) varying vec2 vTexCoord2; #endif #endif void VS() { mat4 modelMatrix = iModelMatrix; vec3 worldPos = GetWorldPos(modelMatrix); float height = worldPos.y - cModel[3][1]; 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); gl_Position = GetClipPos(worldPos); vNormal = GetWorldNormal(modelMatrix); vWorldPos = vec4(worldPos, GetDepth(gl_Position)); #ifdef NORMALMAP vec3 tangent = GetWorldTangent(modelMatrix); vec3 bitangent = cross(tangent, vNormal) * iTangent.w; vTexCoord = vec4(GetTexCoord(iTexCoord), bitangent.xy); vTangent = vec4(tangent, bitangent.z); #else vTexCoord = GetTexCoord(iTexCoord); #endif #ifdef PERPIXEL // Per-pixel forward lighting vec4 projWorldPos = vec4(worldPos, 1.0); #ifdef SHADOW // Shadow projection: transform from world space to shadow space for (int i = 0; i < NUMCASCADES; i++) vShadowPos[i] = GetShadowPos(i, projWorldPos); #endif #ifdef SPOTLIGHT // Spotlight projection: transform from world space to projector texture coordinates vSpotPos = cLightMatrices[0] * projWorldPos; #endif #ifdef POINTLIGHT vCubeMaskVec = mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz) * (worldPos - cLightPos.xyz); #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 vVertexLight = vec3(0.0, 0.0, 0.0); vTexCoord2 = iTexCoord2; #else vVertexLight = GetAmbient(GetZonePos(worldPos)); #endif #ifdef NUMVERTEXLIGHTS for (int i = 0; i < NUMVERTEXLIGHTS; ++i) vVertexLight += GetVertexLight(i, worldPos, vNormal) * cVertexLights[i * 3].rgb; #endif vScreenPos = GetScreenPos(gl_Position); #ifdef ENVCUBEMAP vReflectionVec = worldPos - cCameraPos; #endif #endif }