]> git.tdb.fi Git - r2c2.git/blobdiff - data/r2c2/sky.shader
Don't crash if a train has no router
[r2c2.git] / data / r2c2 / sky.shader
index 66dd8ec0e9e308a2d4ec805443e4936e961175f5..529050e93f9fd50a68c2f073d0d17b4173ca4559 100644 (file)
@@ -2,7 +2,7 @@ vertex_shader "
        varying vec3 eye_look_dir;
        void main()
        {
-               vec4 eye_pos = vec4(mat3(gl_ModelViewMatrix)*gl_Vertex.xyz, 1);
+               vec4 eye_pos = vec4((gl_ModelViewMatrix*vec4(gl_Vertex.xyz, 0.0)).xyz, 1.0);
                gl_Position = gl_ProjectionMatrix*eye_pos;
                eye_look_dir = eye_pos.xyz;
        }";
@@ -13,6 +13,7 @@ fragment_shader "
        uniform float scatter_constant;
        uniform float sun_intensity;
        uniform float sun_size;
+       uniform bool srgb_output;
        varying vec3 eye_look_dir;
        float thickness(float c, float r)
        {
@@ -24,14 +25,14 @@ fragment_shader "
                if(c<0.0031308)
                        return 12.92*c;
                else
-                       return (1.055)*pow(c, 1.0/2.4)-0.055;
+                       return 1.055*pow(c, 1.0/2.4)-0.055;
        }
        void main()
        {
                vec3 n_eye_look_dir = normalize(eye_look_dir);
                vec3 n_eye_sun_dir = normalize(gl_LightSource[0].position.xyz);
 
-               if(dot(n_eye_look_dir, eye_sky_dir)>0)
+               if(dot(n_eye_look_dir, eye_sky_dir)>0.0)
                {
                        float look_scale = thickness(dot(n_eye_look_dir, eye_sky_dir), 635.0);
                        float sun_scale = thickness(dot(n_eye_sun_dir, eye_sky_dir), 635.0);
@@ -47,7 +48,10 @@ fragment_shader "
                                color = sun_intensity*scatter_strength*(exp(-scatter_factor*sun_scale)-exp(-scatter_factor*look_scale))/(1.0-sun_scale/look_scale);
                        if(dot(n_eye_look_dir, n_eye_sun_dir)>cos(sun_size))
                                color += exp(-scatter_factor*look_scale)*sun_intensity;
-                       gl_FragColor = vec4(srgb(color.r), srgb(color.g), srgb(color.b), 1.0);
+                       if(srgb_output)
+                               gl_FragColor = vec4(srgb(color.r), srgb(color.g), srgb(color.b), 1.0);
+                       else
+                               gl_FragColor = vec4(color, 1.0);
                }
                else
                        gl_FragColor = vec4(vec3(0.0), 1.0);