]> git.lizzy.rs Git - dragonfireclient.git/blob - client/shaders/plants_shader/opengl_vertex.glsl
7987fc16d5b011862227fc88faa9fddb89c2c437
[dragonfireclient.git] / client / shaders / plants_shader / opengl_vertex.glsl
1 uniform mat4 mWorldViewProj;\r
2 uniform mat4 mInvWorld;\r
3 uniform mat4 mTransWorld;\r
4 uniform float dayNightRatio;\r
5 uniform float animationTimer;\r
6 \r
7 uniform vec3 eyePosition;\r
8 \r
9 varying vec3 vPosition;\r
10 varying vec3 eyeVec;\r
11 \r
12 #ifdef ENABLE_WAVING_PLANTS\r
13 float smoothCurve( float x ) {\r
14   return x * x *( 3.0 - 2.0 * x );\r
15 }\r
16 float triangleWave( float x ) {\r
17   return abs( fract( x + 0.5 ) * 2.0 - 1.0 );\r
18 }\r
19 float smoothTriangleWave( float x ) {\r
20   return smoothCurve( triangleWave( x ) ) * 2.0 - 1.0;\r
21 }\r
22 #endif\r
23 \r
24 void main(void)\r
25 {\r
26 \r
27         gl_TexCoord[0] = gl_MultiTexCoord0;\r
28 \r
29 #ifdef ENABLE_WAVING_PLANTS\r
30         vec4 pos = gl_Vertex;\r
31         vec4 pos2 = mTransWorld * gl_Vertex;\r
32         if (gl_TexCoord[0].y < 0.05) {\r
33                 pos.x += (smoothTriangleWave(animationTimer * 20.0 + pos2.x * 0.1 + pos2.z * 0.1) * 2.0 - 1.0) * 0.8;\r
34                 pos.y -= (smoothTriangleWave(animationTimer * 10.0 + pos2.x * -0.5 + pos2.z * -0.5) * 2.0 - 1.0) * 0.4;\r
35         }\r
36         gl_Position = mWorldViewProj * pos;\r
37 #else\r
38         gl_Position = mWorldViewProj * gl_Vertex;\r
39 #endif\r
40 \r
41         vPosition = (mWorldViewProj * gl_Vertex).xyz;\r
42         eyeVec = (gl_ModelViewMatrix * gl_Vertex).xyz;\r
43 \r
44         vec4 color;\r
45         //color = vec4(1.0, 1.0, 1.0, 1.0);\r
46 \r
47         float day = gl_Color.r;\r
48         float night = gl_Color.g;\r
49         float light_source = gl_Color.b;\r
50 \r
51         /*color.r = mix(night, day, dayNightRatio);\r
52         color.g = color.r;\r
53         color.b = color.r;*/\r
54 \r
55         float rg = mix(night, day, dayNightRatio);\r
56         rg += light_source * 2.5; // Make light sources brighter\r
57         float b = rg;\r
58 \r
59         // Moonlight is blue\r
60         b += (day - night) / 13.0;\r
61         rg -= (day - night) / 13.0;\r
62 \r
63         // Emphase blue a bit in darker places\r
64         // See C++ implementation in mapblock_mesh.cpp finalColorBlend()\r
65         b += max(0.0, (1.0 - abs(b - 0.13)/0.17) * 0.025);\r
66 \r
67         // Artificial light is yellow-ish\r
68         // See C++ implementation in mapblock_mesh.cpp finalColorBlend()\r
69         rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);\r
70 \r
71         color.r = clamp(rg,0.0,1.0);\r
72         color.g = clamp(rg,0.0,1.0);\r
73         color.b = clamp(b,0.0,1.0);\r
74 \r
75         // Make sides and bottom darker than the top\r
76         color = color * color; // SRGB -> Linear\r
77         if(gl_Normal.y <= 0.5)\r
78                 color *= 0.6;\r
79                 //color *= 0.7;\r
80         color = sqrt(color); // Linear -> SRGB\r
81 \r
82         color.a = gl_Color.a;\r
83 \r
84         gl_FrontColor = gl_BackColor = color;\r
85 \r
86 }\r