+#include <algorithm>
#include <cmath>
#include "environmentmap.h"
#include "renderer.h"
#include "texunit.h"
+using namespace std;
+
namespace Msp {
namespace GL {
Effect(r),
size(s),
environment(e),
- rendered(false)
+ rendered(false),
+ update_interval(1),
+ update_delay(0)
{
- env_tex.storage(RGB, size);
- env_tex.set_wrap(CLAMP_TO_EDGE);
- env_tex.set_min_filter(LINEAR);
- depth_buf.storage(DEPTH_COMPONENT, size, size);
+ env_tex.storage(RGB8, size, 1);
+ Sampler &env_samp = env_tex.get_default_sampler();
+ env_samp.set_wrap(CLAMP_TO_EDGE);
+ env_samp.set_min_filter(LINEAR);
+ depth_buf.storage(DEPTH_COMPONENT32F, size, size);
for(unsigned i=0; i<6; ++i)
{
fbo[i].attach(COLOR_ATTACHMENT0, env_tex, TextureCube::enumerate_faces(i), 0);
fbo[i].require_complete();
}
- // XXX Make the depth range configurable
camera.set_field_of_view(Geometry::Angle<float>::right());
- camera.set_aspect(1);
+ camera.set_aspect_ratio(1);
camera.set_depth_clip(0.1, 100);
+}
+void EnvironmentMap::set_depth_clip(float n, float f)
+{
+ camera.set_depth_clip(n, f);
+}
+
+void EnvironmentMap::set_update_interval(unsigned i)
+{
+ update_interval = i;
+ update_delay = min(update_delay, update_interval-1);
+}
+
+void EnvironmentMap::queue_update()
+{
+ update_delay = 0;
}
void EnvironmentMap::setup_frame(Renderer &renderer)
rendered = true;
renderable.setup_frame(renderer);
+
+ if(update_delay)
+ {
+ if(update_interval)
+ --update_delay;
+ return;
+ }
+ update_delay = update_interval-1;
environment.setup_frame(renderer);
const Matrix *matrix = renderable.get_matrix();
{
TextureCubeFace face = TextureCube::enumerate_faces(i);
fbo[i].bind();
- fbo[i].clear(COLOR_BUFFER_BIT|DEPTH_BUFFER_BIT);
- camera.set_look_direction(env_tex.get_face_direction(face));
- camera.set_up_direction(env_tex.get_t_direction(face));
+ fbo[i].clear();
+ camera.set_look_direction(TextureCube::get_face_direction(face));
+ camera.set_up_direction(TextureCube::get_t_direction(face));
renderer.set_camera(camera);
renderer.render(environment);
}