X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Feffects%2Fsky.cpp;h=be4896fbbd9e725632d5d1dfd8f3fdf0fd9df140;hp=23819db36c006cb1f8cb8d53f67cb922686810f1;hb=HEAD;hpb=cd5f37b066352119cf92d53d0001af7ff99be437 diff --git a/source/effects/sky.cpp b/source/effects/sky.cpp index 23819db3..be4896fb 100644 --- a/source/effects/sky.cpp +++ b/source/effects/sky.cpp @@ -1,6 +1,7 @@ #include #include -#include "light.h" +#include "directionallight.h" +#include "error.h" #include "mesh.h" #include "renderer.h" #include "resources.h" @@ -12,18 +13,19 @@ using namespace std; namespace Msp { namespace GL { -Sky::Sky(Renderable &r, Light &s): - Effect(r), +Sky::Sky(Renderable &c, DirectionalLight &s): + Effect(c), sun(s), - transmittance_lookup(128, 64, (RENDER_COLOR, RGB16F)), + transmittance_lookup(128, 64, (COLOR_ATTACHMENT,RGBA16F)), transmittance_shprog(Resources::get_global().get("_sky_transmittance.glsl.shader")), transmittance_lookup_dirty(true), - distant(256, 128, (RENDER_COLOR, RGB16F)), + distant(256, 128, (COLOR_ATTACHMENT,RGBA16F)), distant_shprog(Resources::get_global().get("_sky_distant.glsl.shader")), fullscreen_mesh(Resources::get_global().get("_fullscreen_quad.mesh")), 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); @@ -97,25 +99,32 @@ void Sky::setup_frame(Renderer &renderer) rendered = true; shdata.uniform("light_color", sun.get_color()); - shdata.uniform("light_dir", sun.get_position().slice<3>(0)); - sun.set_transmittance(get_transmittance(normalize(sun.get_position().slice<3>(0)))); + 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); - - renderable.setup_frame(renderer); + content.setup_frame(renderer); } void Sky::finish_frame() @@ -123,16 +132,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(!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); @@ -160,7 +173,8 @@ Sky::Planet::Planet(): ozone_band_center(1e4f), ozone_band_extent(1e2f), atmosphere_thickness(2e4f), - planet_radius(1e6f) + planet_radius(1e6f), + ground_albedo(0.2f) { } Sky::Planet Sky::Planet::earth() @@ -179,5 +193,33 @@ Sky::Planet Sky::Planet::earth() return planet; } + +Sky *Sky::Template::create(const map &renderables) const +{ + Renderable *content = get_item(renderables, content_name); + if(!content || !sun) + throw invalid_operation("Sky::Template::create"); + + RefPtr sky = new Sky(*content, *sun); + create_base(*sky); + + return sky.release(); +} + + +DataFile::Loader::ActionMap Sky::Template::Loader::shared_actions; + +Sky::Template::Loader::Loader(Template &t, Collection &c): + DerivedObjectLoader(t, c) +{ + set_actions(shared_actions); +} + +void Sky::Template::Loader::init_actions() +{ + Effect::Template::Loader::init_actions(); + add("sun", &Template::sun); +} + } // namespace GL } // namespace Msp