uniform mat4 mWorldViewProj;\r
uniform mat4 mInvWorld;\r
uniform mat4 mTransWorld;\r
+uniform mat4 mWorld;\r
+\r
uniform float dayNightRatio;\r
uniform float animationTimer;\r
\r
uniform vec3 eyePosition;\r
\r
varying vec3 vPosition;\r
+varying vec3 worldPosition;\r
+\r
varying vec3 eyeVec;\r
+varying vec3 lightVec;\r
+\r
+varying vec3 tsEyeVec;\r
+varying vec3 tsLightVec;\r
+\r
+const float BS = 10.0;\r
\r
void main(void)\r
{\r
+ gl_TexCoord[0] = gl_MultiTexCoord0; \r
+\r
#ifdef ENABLE_WAVING_WATER\r
vec4 pos2 = gl_Vertex;\r
pos2.y -= 2.0;\r
pos2.y -= sin (pos2.z/WATER_WAVE_LENGTH + animationTimer * WATER_WAVE_SPEED * WATER_WAVE_LENGTH) * WATER_WAVE_HEIGHT\r
+ sin ((pos2.z/WATER_WAVE_LENGTH + animationTimer * WATER_WAVE_SPEED * WATER_WAVE_LENGTH) / 7.0) * WATER_WAVE_HEIGHT;\r
gl_Position = mWorldViewProj * pos2;\r
+ vPosition = gl_Position.xyz;\r
#else\r
gl_Position = mWorldViewProj * gl_Vertex;\r
+ vPosition = gl_Position.xyz;\r
#endif\r
\r
+ worldPosition = (mWorld * gl_Vertex).xyz;\r
+ vec3 sunPosition = vec3 (0.0, eyePosition.y * BS + 900.0, 0.0);\r
+\r
+ vec3 normal, tangent, binormal;\r
+ normal = normalize(gl_NormalMatrix * gl_Normal);\r
+ if (gl_Normal.x > 0.5) {\r
+ // 1.0, 0.0, 0.0\r
+ tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, -1.0));\r
+ binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));\r
+ } else if (gl_Normal.x < -0.5) {\r
+ // -1.0, 0.0, 0.0\r
+ tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));\r
+ binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));\r
+ } else if (gl_Normal.y > 0.5) {\r
+ // 0.0, 1.0, 0.0\r
+ tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));\r
+ binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));\r
+ } else if (gl_Normal.y < -0.5) {\r
+ // 0.0, -1.0, 0.0\r
+ tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));\r
+ binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0));\r
+ } else if (gl_Normal.z > 0.5) {\r
+ // 0.0, 0.0, 1.0\r
+ tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0));\r
+ binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));\r
+ } else if (gl_Normal.z < -0.5) {\r
+ // 0.0, 0.0, -1.0\r
+ tangent = normalize(gl_NormalMatrix * vec3(-1.0, 0.0, 0.0));\r
+ binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0));\r
+ }\r
+ mat3 tbnMatrix = mat3( tangent.x, binormal.x, normal.x,\r
+ tangent.y, binormal.y, normal.y,\r
+ tangent.z, binormal.z, normal.z);\r
+\r
+ lightVec = sunPosition - worldPosition;\r
+ tsLightVec = lightVec * tbnMatrix;\r
eyeVec = (gl_ModelViewMatrix * gl_Vertex).xyz;\r
- vPosition = (mWorldViewProj * gl_Vertex).xyz;\r
+ tsEyeVec = eyeVec * tbnMatrix;\r
\r
vec4 color;\r
- //color = vec4(1.0, 1.0, 1.0, 1.0);\r
-\r
float day = gl_Color.r;\r
float night = gl_Color.g;\r
float light_source = gl_Color.b;\r
\r
- /*color.r = mix(night, day, dayNightRatio);\r
- color.g = color.r;\r
- color.b = color.r;*/\r
-\r
float rg = mix(night, day, dayNightRatio);\r
rg += light_source * 2.5; // Make light sources brighter\r
float b = rg;\r
color.r = clamp(rg,0.0,1.0);\r
color.g = clamp(rg,0.0,1.0);\r
color.b = clamp(b,0.0,1.0);\r
+\r
+ // Make sides and bottom darker than the top\r
+ color = color * color; // SRGB -> Linear\r
+ if(gl_Normal.y <= 0.5)\r
+ color *= 0.6;\r
+ color = sqrt(color); // Linear -> SRGB\r
color.a = gl_Color.a;\r
\r
gl_FrontColor = gl_BackColor = color;\r
-\r
- gl_TexCoord[0] = gl_MultiTexCoord0;\r
-\r
}\r