#include <msp/geometry/hypersphere.h>
#include <msp/geometry/ray.h>
-#include "light.h"
+#include "directionallight.h"
+#include "error.h"
#include "mesh.h"
#include "renderer.h"
#include "resources.h"
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, (COLOR_ATTACHMENT,RGB16F)),
transmittance_shprog(Resources::get_global().get<Program>("_sky_transmittance.glsl.shader")),
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);
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()
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);
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()
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