X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fenvironmentmap.cpp;h=cbb097eaa6370e3b944a73124639b9ca72d5d42c;hb=d386eadfd08b556ecb05627a7ceca14652e8b1e5;hp=8cda8cbae63b7e7505dd26a1c73d17dfc4ee4db0;hpb=44d6110bb0f1bf92c6d749c2fb5345141d681c03;p=libs%2Fgl.git diff --git a/source/environmentmap.cpp b/source/environmentmap.cpp index 8cda8cba..cbb097ea 100644 --- a/source/environmentmap.cpp +++ b/source/environmentmap.cpp @@ -20,25 +20,26 @@ EnvironmentMap::EnvironmentMap(unsigned s, Renderable &r, Renderable &e): { fbo[i].attach(COLOR_ATTACHMENT0, env_tex, TextureCube::enumerate_faces(i), 0); fbo[i].attach(DEPTH_ATTACHMENT, depth_buf); + fbo[i].require_complete(); } // XXX Make the depth range configurable - camera.set_field_of_view(M_PI/2); + camera.set_field_of_view(Geometry::Angle::right()); camera.set_aspect(1); camera.set_depth_clip(0.1, 100); - shdata.uniform("environment", 4); } -void EnvironmentMap::setup_frame() const +void EnvironmentMap::setup_frame(Renderer &renderer) { if(rendered) return; rendered = true; - renderable.setup_frame(); - environment.setup_frame(); + renderable.setup_frame(renderer); + environment.setup_frame(renderer); + Renderer env_renderer(0); const Matrix *matrix = renderable.get_matrix(); Vector3 position = (*matrix)*Vector3(); camera.set_position(position); @@ -49,14 +50,15 @@ 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.begin(&camera); env_renderer.exclude(renderable); + env_renderer.exclude(*this); env_renderer.render(environment); } Framebuffer::unbind(); } -void EnvironmentMap::finish_frame() const +void EnvironmentMap::finish_frame() { if(rendered) { @@ -71,29 +73,17 @@ void EnvironmentMap::render(Renderer &renderer, const Tag &tag) const if(!enabled_passes.count(tag)) return renderer.render(renderable, tag); - 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); + Renderer::Push _push_rend(renderer); - env_tex.bind_to(4); - TexUnit::activate(0); + unsigned unit = renderer.allocate_effect_texunit(); + shdata.uniform("environment", static_cast(unit)); + 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::Push _push_rend(renderer); renderer.add_shader_data(shdata); renderer.render(renderable, tag); - - env_tex.unbind_from(4); - TexUnit::activate(0); } } // namespace GL