]> git.tdb.fi Git - libs/gl.git/blobdiff - source/effects/sky.cpp
Use RGBA as the default format for effect render targets
[libs/gl.git] / source / effects / sky.cpp
index 158606f845305dcbef7f206fc706328faf01bfe9..fc6d49fd37385e908ca57e4480b1ec61f6190e8f 100644 (file)
@@ -1,6 +1,7 @@
 #include <msp/geometry/hypersphere.h>
 #include <msp/geometry/ray.h>
 #include "directionallight.h"
+#include "error.h"
 #include "mesh.h"
 #include "renderer.h"
 #include "resources.h"
@@ -12,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")),
@@ -115,7 +116,7 @@ void Sky::setup_frame(Renderer &renderer)
        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,15 +124,15 @@ 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);
@@ -163,7 +164,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()
@@ -182,5 +184,29 @@ Sky::Planet Sky::Planet::earth()
        return planet;
 }
 
+
+Sky *Sky::Template::create(const map<string, Renderable *> &renderables) const
+{
+       Renderable *content = get_item(renderables, content_name);
+       if(!content || !sun)
+               throw invalid_operation("Sky::Template::create");
+       return new Sky(*content, *sun);
+}
+
+
+DataFile::Loader::ActionMap Sky::Template::Loader::shared_actions;
+
+Sky::Template::Loader::Loader(Template &t, Collection &c):
+       DerivedObjectLoader<Template, Effect::Template::Loader>(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