X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Feffects%2Fsky.cpp;h=be4896fbbd9e725632d5d1dfd8f3fdf0fd9df140;hp=fc6d49fd37385e908ca57e4480b1ec61f6190e8f;hb=HEAD;hpb=6f8ee3cae41804ddc9d8f2493b71d0ad37c1d413 diff --git a/source/effects/sky.cpp b/source/effects/sky.cpp index fc6d49fd..be4896fb 100644 --- a/source/effects/sky.cpp +++ b/source/effects/sky.cpp @@ -25,6 +25,7 @@ Sky::Sky(Renderable &c, DirectionalLight &s): backdrop_shprog(Resources::get_global().get("_sky_backdrop.glsl.shader")), sampler(Resources::get_global().get("_linear_clamp.samp")), wrap_sampler(Resources::get_global().get("_linear_clamp_v.samp")), + dummy_texture(Resources::get_global().get("_placeholder.png")), rendered(false) { shdata.uniform("n_steps", 50); @@ -101,21 +102,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); + renderer.set_texture("transmittance_lookup", &dummy_texture, &sampler); + 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); - content.setup_frame(renderer); } @@ -137,6 +145,7 @@ void Sky::render(Renderer &renderer, Tag tag) const 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); @@ -190,7 +199,11 @@ Sky *Sky::Template::create(const map &renderables) const Renderable *content = get_item(renderables, content_name); if(!content || !sun) throw invalid_operation("Sky::Template::create"); - return new Sky(*content, *sun); + + RefPtr sky = new Sky(*content, *sun); + create_base(*sky); + + return sky.release(); }