1uniform mat4 mWorldViewProj; 2uniform mat4 mInvWorld; 3uniform mat4 mTransWorld; 4uniform mat4 mWorld; 5 6uniform float dayNightRatio; 7uniform vec3 eyePosition; 8uniform float animationTimer; 9 10varying vec3 vPosition; 11varying vec3 worldPosition; 12 13varying vec3 eyeVec; 14varying vec3 lightVec; 15varying vec3 tsEyeVec; 16varying vec3 tsLightVec; 17 18const float e = 2.718281828459; 19const float BS = 10.0; 20 21float smoothCurve( float x ) { 22 return x * x *( 3.0 - 2.0 * x ); 23} 24float triangleWave( float x ) { 25 return abs( fract( x + 0.5 ) * 2.0 - 1.0 ); 26} 27float smoothTriangleWave( float x ) { 28 return smoothCurve( triangleWave( x ) ) * 2.0 - 1.0; 29} 30 31void main(void) 32{ 33 gl_TexCoord[0] = gl_MultiTexCoord0; 34 35#if (MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE) && ENABLE_WAVING_WATER 36 vec4 pos = gl_Vertex; 37 pos.y -= 2.0; 38 pos.y -= sin (pos.z/WATER_WAVE_LENGTH + animationTimer * WATER_WAVE_SPEED * WATER_WAVE_LENGTH) * WATER_WAVE_HEIGHT 39 + sin ((pos.z/WATER_WAVE_LENGTH + animationTimer * WATER_WAVE_SPEED * WATER_WAVE_LENGTH) / 7.0) * WATER_WAVE_HEIGHT; 40 gl_Position = mWorldViewProj * pos; 41#elif MATERIAL_TYPE == TILE_MATERIAL_WAVING_LEAVES && ENABLE_WAVING_LEAVES 42 vec4 pos = gl_Vertex; 43 vec4 pos2 = mWorld * gl_Vertex; 44 pos.x += (smoothTriangleWave(animationTimer*10.0 + pos2.x * 0.01 + pos2.z * 0.01) * 2.0 - 1.0) * 0.4; 45 pos.y += (smoothTriangleWave(animationTimer*15.0 + pos2.x * -0.01 + pos2.z * -0.01) * 2.0 - 1.0) * 0.2; 46 pos.z += (smoothTriangleWave(animationTimer*10.0 + pos2.x * -0.01 + pos2.z * -0.01) * 2.0 - 1.0) * 0.4; 47 gl_Position = mWorldViewProj * pos; 48#elif MATERIAL_TYPE == TILE_MATERIAL_WAVING_PLANTS && ENABLE_WAVING_PLANTS 49 vec4 pos = gl_Vertex; 50 vec4 pos2 = mWorld * gl_Vertex; 51 if (gl_TexCoord[0].y < 0.05) { 52 pos.x += (smoothTriangleWave(animationTimer * 20.0 + pos2.x * 0.1 + pos2.z * 0.1) * 2.0 - 1.0) * 0.8; 53 pos.y -= (smoothTriangleWave(animationTimer * 10.0 + pos2.x * -0.5 + pos2.z * -0.5) * 2.0 - 1.0) * 0.4; 54 } 55 gl_Position = mWorldViewProj * pos; 56#else 57 gl_Position = mWorldViewProj * gl_Vertex; 58#endif 59 60 vPosition = gl_Position.xyz; 61 worldPosition = (mWorld * gl_Vertex).xyz; 62 vec3 sunPosition = vec3 (0.0, eyePosition.y * BS + 900.0, 0.0); 63 64 vec3 normal, tangent, binormal; 65 normal = normalize(gl_NormalMatrix * gl_Normal); 66 if (gl_Normal.x > 0.5) { 67 // 1.0, 0.0, 0.0 68 tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, -1.0)); 69 binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); 70 } else if (gl_Normal.x < -0.5) { 71 // -1.0, 0.0, 0.0 72 tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0)); 73 binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); 74 } else if (gl_Normal.y > 0.5) { 75 // 0.0, 1.0, 0.0 76 tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0)); 77 binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0)); 78 } else if (gl_Normal.y < -0.5) { 79 // 0.0, -1.0, 0.0 80 tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0)); 81 binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0)); 82 } else if (gl_Normal.z > 0.5) { 83 // 0.0, 0.0, 1.0 84 tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0)); 85 binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); 86 } else if (gl_Normal.z < -0.5) { 87 // 0.0, 0.0, -1.0 88 tangent = normalize(gl_NormalMatrix * vec3(-1.0, 0.0, 0.0)); 89 binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); 90 } 91 mat3 tbnMatrix = mat3( tangent.x, binormal.x, normal.x, 92 tangent.y, binormal.y, normal.y, 93 tangent.z, binormal.z, normal.z); 94 95 lightVec = sunPosition - worldPosition; 96 tsLightVec = lightVec * tbnMatrix; 97 eyeVec = (gl_ModelViewMatrix * gl_Vertex).xyz; 98 tsEyeVec = eyeVec * tbnMatrix; 99 100 gl_FrontColor = gl_BackColor = gl_Color; 101} 102