X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fenvironmentmap.cpp;h=1cc589143e78da5cc1d47cf456f2f6360613d2ac;hp=c789fe48d0f4c449f628778aac0b1c32f4ecac18;hb=d5c26741ed3952dd54c8a7f43ad42ba79bf2d977;hpb=db2fd517dcd215e9d16345287d413f2a64f5ba03 diff --git a/source/environmentmap.cpp b/source/environmentmap.cpp index c789fe48..1cc58914 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,9 +13,11 @@ EnvironmentMap::EnvironmentMap(unsigned s, Renderable &r, Renderable &e): Effect(r), size(s), environment(e), - rendered(false) + rendered(false), + update_interval(1), + update_delay(0) { - env_tex.storage(RGB, size); + env_tex.storage(RGB, size, 1); env_tex.set_wrap(CLAMP_TO_EDGE); env_tex.set_min_filter(LINEAR); depth_buf.storage(DEPTH_COMPONENT, size, size); @@ -23,25 +28,56 @@ 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::setup_frame() const +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) { if(rendered) return; rendered = true; - renderable.setup_frame(); - environment.setup_frame(); + 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(); - Vector3 position = (*matrix)*Vector3(); - camera.set_position(position); + if(!matrix) + return; + + Renderer::Push push(renderer); + Renderer::Exclude exclude1(renderer, renderable); + Renderer::Exclude exclude2(renderer, *this); + + 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); @@ -49,14 +85,12 @@ void EnvironmentMap::setup_frame() const 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)); - Renderer env_renderer(&camera); - env_renderer.exclude(renderable); - env_renderer.render(environment); + renderer.set_camera(camera); + renderer.render(environment); } - Framebuffer::unbind(); } -void EnvironmentMap::finish_frame() const +void EnvironmentMap::finish_frame() { if(rendered) { @@ -75,26 +109,13 @@ void EnvironmentMap::render(Renderer &renderer, const Tag &tag) const unsigned unit = renderer.allocate_effect_texunit(); shdata.uniform("environment", static_cast(unit)); - env_tex.bind_to(unit); - - const Matrix &view_matrix = renderer.get_camera()->get_matrix(); - // XXX The camera should maybe have store its own object matrix - float env_mdata[9]; - env_mdata[0] = view_matrix[0]; - env_mdata[1] = view_matrix[4]; - env_mdata[2] = view_matrix[8]; - env_mdata[3] = view_matrix[1]; - env_mdata[4] = view_matrix[5]; - env_mdata[5] = view_matrix[9]; - env_mdata[6] = view_matrix[2]; - env_mdata[7] = view_matrix[6]; - env_mdata[8] = view_matrix[10]; - shdata.uniform_matrix3("env_eye_matrix", env_mdata); + Bind _bind_env(env_tex, unit); + + const Matrix &camera_matrix = renderer.get_camera()->get_object_matrix(); + shdata.uniform("env_eye_matrix", camera_matrix.block<3, 3>(0, 0)); renderer.add_shader_data(shdata); renderer.render(renderable, tag); - - env_tex.unbind_from(unit); } } // namespace GL