X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fenvironmentmap.cpp;h=3902eb8c95b240434036bdd0915e9433cd373149;hp=9ca4d45253580134e59a060a7936a9f04c6fbbf2;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hpb=0991ffd3091d4002fe6e2811219f3a4dae2c41d1 diff --git a/source/environmentmap.cpp b/source/environmentmap.cpp index 9ca4d452..3902eb8c 100644 --- a/source/environmentmap.cpp +++ b/source/environmentmap.cpp @@ -1,8 +1,11 @@ +#include #include #include "environmentmap.h" #include "renderer.h" #include "texunit.h" +using namespace std; + namespace Msp { namespace GL { @@ -10,12 +13,13 @@ EnvironmentMap::EnvironmentMap(unsigned s, Renderable &r, Renderable &e): Effect(r), size(s), environment(e), - rendered(false) + sampler(get_linear_sampler()), + 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); + 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); @@ -23,11 +27,25 @@ EnvironmentMap::EnvironmentMap(unsigned s, Renderable &r, Renderable &e): fbo[i].require_complete(); } - // XXX Make the depth range configurable camera.set_field_of_view(Geometry::Angle::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) @@ -37,6 +55,14 @@ 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(); @@ -47,16 +73,16 @@ void EnvironmentMap::setup_frame(Renderer &renderer) Renderer::Exclude exclude1(renderer, renderable); Renderer::Exclude exclude2(renderer, *this); - camera.set_position(*matrix*Vector3()); + camera.set_position(matrix->column(3).slice<3>(0)); BindRestore bind_fbo(fbo[0]); for(unsigned i=0; i<6; ++i) { 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); } @@ -81,6 +107,7 @@ void EnvironmentMap::render(Renderer &renderer, const Tag &tag) const unsigned unit = renderer.allocate_effect_texunit(); shdata.uniform("environment", static_cast(unit)); + Bind _bind_sampler(*sampler, unit); Bind _bind_env(env_tex, unit); const Matrix &camera_matrix = renderer.get_camera()->get_object_matrix();