]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - client/shaders/liquids_shader/opengl_vertex.glsl
Normal maps generation on the fly.
[dragonfireclient.git] / client / shaders / liquids_shader / opengl_vertex.glsl
index e8f1858255b6f833e6ac12e762b1cc183ae37ad6..9d64ce4e30c8ac04ef495a0b1cca3f7c3cea8e3b 100644 (file)
@@ -1,40 +1,84 @@
 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
@@ -54,10 +98,13 @@ void main(void)
        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