]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programbuilder.cpp
Support fog in lighting and shaders
[libs/gl.git] / source / programbuilder.cpp
index de1fb1604db2ea5dcd77c20a2fbf036f18fe3894..18255b95839e99180a6c3905c51ad76e63f1c5b5 100644 (file)
@@ -45,9 +45,13 @@ anything that might need them. */
 const ProgramBuilder::VariableDefinition ProgramBuilder::standard_variables[] =
 {
        { FRAGMENT, "gl_FragColor", "vec4", "frag_color", 0 },
-       { FRAGMENT, "frag_color", "vec4", "basic_color", "!e!l" },
-       { FRAGMENT, "frag_color", "vec4", "vec4(rgb_surface, surface_alpha)", "!el" },
-       { FRAGMENT, "frag_color", "vec4", "vec4(rgb_surface+rgb_reflection, surface_alpha)", "e" },
+       { FRAGMENT, "frag_color", "vec4", "incoming_color", "!f" },
+       { FRAGMENT, "frag_color", "vec4", "vec4(mix(fog_color.rgb, incoming_color.rgb, fog_value), incoming_color.a)", "f" },
+       { FRAGMENT, "fog_value", "float", "exp(-fog_coord*fog_density)", 0 },
+
+       { FRAGMENT, "incoming_color", "vec4", "basic_color", "!e!l" },
+       { FRAGMENT, "incoming_color", "vec4", "vec4(rgb_surface, surface_alpha)", "!el" },
+       { FRAGMENT, "incoming_color", "vec4", "vec4(rgb_surface+rgb_reflection, surface_alpha)", "e" },
 
        { FRAGMENT, "rgb_reflection", "vec3", "reflect_sample.rgb*reflectivity", 0 },
        { FRAGMENT, "reflect_sample", "vec4", "textureCube(environment, env_reflect_dir)", 0 },
@@ -106,6 +110,7 @@ const ProgramBuilder::VariableDefinition ProgramBuilder::standard_variables[] =
        { FRAGMENT, "diffuse_sample", "vec4", "texture2D(diffusemap, texture_coord)", 0 },
 
        { VERTEX, "gl_Position", "vec4", "projection_matrix*eye_vertex", 0 },
+       { VERTEX, "fog_coord", "float", "-eye_vertex.z", 0 },
        { VERTEX, "shd_vertex", "vec3", "(shd_eye_matrix*eye_vertex).xyz", 0 },
        { VERTEX, "tbn_sky_dir", "vec3", "eye_sky_dir*eye_tbn_matrix", "n" },
        { VERTEX, "tbn_light_dir[i]", "vec3", "eye_light_dir[i]*eye_tbn_matrix", 0 },
@@ -143,6 +148,8 @@ const ProgramBuilder::VariableDefinition ProgramBuilder::standard_variables[] =
        { UNIFORM, "Lighting::sky_color", "vec4", 0, 0 },
        { UNIFORM, "Lighting::eye_sky_dir", "vec3", 0, 0 },
        { UNIFORM, "Lighting::horizon_limit", "float", 0, 0 },
+       { UNIFORM, "Lighting::fog_color", "vec4", "gl_Fog.color", 0 },
+       { UNIFORM, "Lighting::fog_density", "float", "gl_Fog.density", 0 },
        { UNIFORM, "Material::material", "MaterialParameters", "gl_FrontMaterial", 0 },
 
        { TYPE, "LightSourceParameters", "struct { vec4 position; vec4 diffuse; vec4 specular; }", "gl_LightSourceParameters", 0 },
@@ -748,6 +755,8 @@ string ProgramBuilder::StandardFeatures::create_flags() const
                if(normalmap)
                        flags += 'n';
        }
+       if(fog)
+               flags += 'f';
        if(shadow)
                flags += 's';
        if(reflection)
@@ -1078,6 +1087,7 @@ ProgramBuilder::StandardFeatures::Loader::Loader(StandardFeatures &f):
        DataFile::ObjectLoader<StandardFeatures>(f)
 {
        add("custom",    &StandardFeatures::custom);
+       add("fog",       &StandardFeatures::fog);
        add("lighting",  &StandardFeatures::lighting);
        add("material",  &StandardFeatures::material);
        add("max_lights", &StandardFeatures::max_lights);