backdrop_shprog(Resources::get_global().get<Program>("_sky_backdrop.glsl.shader")),
sampler(Resources::get_global().get<Sampler>("_linear_clamp.samp")),
wrap_sampler(Resources::get_global().get<Sampler>("_linear_clamp_v.samp")),
+ dummy_texture(Resources::get_global().get<Texture>("_placeholder.png")),
rendered(false)
{
shdata.uniform("n_steps", 50);
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);
}
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);
Renderable *content = get_item(renderables, content_name);
if(!content || !sun)
throw invalid_operation("Sky::Template::create");
- return new Sky(*content, *sun);
+
+ RefPtr<Sky> sky = new Sky(*content, *sun);
+ create_base(*sky);
+
+ return sky.release();
}