]> git.tdb.fi Git - libs/gl.git/blobdiff - source/effects/sky.cpp
Use pipeline keys for objects and effects
[libs/gl.git] / source / effects / sky.cpp
index ab322f230e34365e6363c3ea9c867b2be251d79c..eef6a58c4ccdedb622541fb828e2f925a3c17145 100644 (file)
@@ -13,13 +13,13 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-Sky::Sky(Renderable &r, DirectionalLight &s):
-       Effect(r),
+Sky::Sky(Renderable &c, DirectionalLight &s):
+       Effect(c),
        sun(s),
-       transmittance_lookup(128, 64, (COLOR_ATTACHMENT,RGB16F)),
+       transmittance_lookup(128, 64, (COLOR_ATTACHMENT,RGBA16F)),
        transmittance_shprog(Resources::get_global().get<Program>("_sky_transmittance.glsl.shader")),
        transmittance_lookup_dirty(true),
-       distant(256, 128, (COLOR_ATTACHMENT,RGB16F)),
+       distant(256, 128, (COLOR_ATTACHMENT,RGBA16F)),
        distant_shprog(Resources::get_global().get<Program>("_sky_distant.glsl.shader")),
        fullscreen_mesh(Resources::get_global().get<Mesh>("_fullscreen_quad.mesh")),
        backdrop_shprog(Resources::get_global().get<Program>("_sky_backdrop.glsl.shader")),
@@ -101,22 +101,28 @@ void Sky::setup_frame(Renderer &renderer)
        shdata.uniform("light_dir", -sun.get_direction());
        sun.set_transmittance(get_transmittance(-sun.get_direction()));
 
-       Renderer::Push push(renderer);
-
-       if(transmittance_lookup_dirty)
        {
-               transmittance_lookup_dirty = false;
-               renderer.set_framebuffer(&transmittance_lookup.get_framebuffer());
-               renderer.set_shader_program(&transmittance_shprog, &shdata);
+               Renderer::Push push(renderer);
+
+               renderer.add_shader_data(shdata);
+
+               if(transmittance_lookup_dirty)
+               {
+                       transmittance_lookup_dirty = false;
+                       renderer.set_pipeline_key(this);
+                       renderer.set_framebuffer(&transmittance_lookup.get_framebuffer());
+                       renderer.set_shader_program(&transmittance_shprog);
+                       fullscreen_mesh.draw(renderer);
+               }
+
+               renderer.set_pipeline_key(this, 1);
+               renderer.set_framebuffer(&distant.get_framebuffer());
+               renderer.set_shader_program(&distant_shprog);
+               renderer.set_texture("transmittance_lookup", &transmittance_lookup.get_target_texture(0), &sampler);
                fullscreen_mesh.draw(renderer);
        }
 
-       renderer.set_framebuffer(&distant.get_framebuffer());
-       renderer.set_shader_program(&distant_shprog, &shdata);
-       renderer.set_texture("transmittance_lookup", &transmittance_lookup.get_target_texture(0), &sampler);
-       fullscreen_mesh.draw(renderer);
-
-       renderable.setup_frame(renderer);
+       content.setup_frame(renderer);
 }
 
 void Sky::finish_frame()
@@ -124,19 +130,20 @@ void Sky::finish_frame()
        if(rendered)
        {
                rendered = false;
-               renderable.finish_frame();
+               content.finish_frame();
        }
 }
 
 void Sky::render(Renderer &renderer, Tag tag) const
 {
-       renderable.render(renderer, tag);
+       content.render(renderer, tag);
 
-       if(!enabled_methods.count(tag))
+       if(!is_enabled_for_method(tag))
                return;
 
        Renderer::Push push(renderer);
 
+       renderer.set_pipeline_key(this, 2);
        renderer.set_shader_program(&backdrop_shprog, &shdata);
        renderer.set_texture("distant", &distant.get_target_texture(0), &wrap_sampler);
        fullscreen_mesh.draw(renderer);