X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2F3d%2Fview.cpp;h=40a168f86fc7e5986dd14db78de668b0680c3900;hb=dfe3dd563981883f3b7c826102fed33c7ff0d12d;hp=8c35245b4d97dd1b6d6c27147fc9494d6827ebd8;hpb=d5d6db275a87c77fb6ac594ac3dc555fd2b903ea;p=r2c2.git diff --git a/source/3d/view.cpp b/source/3d/view.cpp index 8c35245..40a168f 100644 --- a/source/3d/view.cpp +++ b/source/3d/view.cpp @@ -15,8 +15,7 @@ View3D::View3D(Layout3D &l, unsigned w, unsigned h): height(h), pipeline(w, h), sky(layout.get_catalogue()), - shadow(4096, layout.get_scene(), layout.get_sun()), - ambient_occlusion(w, h, 100) + shadow(4096, layout.get_scene(), layout.get_sun()) { pipeline.set_hdr(true); pipeline.set_camera(&camera); @@ -36,9 +35,28 @@ View3D::View3D(Layout3D &l, unsigned w, unsigned h): pass->set_depth_test(&GL::DepthTest::lequal()); pass->set_blend(&GL::Blend::alpha()); - pipeline.add_postprocessor(ambient_occlusion); - colorcurve.set_srgb(); - pipeline.add_postprocessor(colorcurve); + try + { + ambient_occlusion = new GL::AmbientOcclusion(w, h, 100); + pipeline.add_postprocessor(*ambient_occlusion); + } + catch(...) + { + delete ambient_occlusion; + ambient_occlusion = 0; + } + + try + { + colorcurve = new GL::ColorCurve; + colorcurve->set_srgb(); + pipeline.add_postprocessor(*colorcurve); + } + catch(...) + { + delete colorcurve; + colorcurve = 0; + } update_shadow_area(); layout.get_layout().signal_object_added.connect(sigc::hide(sigc::mem_fun(this, &View3D::update_shadow_area))); @@ -51,6 +69,12 @@ View3D::View3D(Layout3D &l, unsigned w, unsigned h): view_all(); } +View3D::~View3D() +{ + delete colorcurve; + delete ambient_occlusion; +} + Ray View3D::create_ray(int x, int y) const { return create_ray(x*2.0f/width-1.0f, y*2.0f/height-1.0f); @@ -60,7 +84,7 @@ Ray View3D::create_ray(float x, float y) const { const GL::Vector3 &start = camera.get_position(); GL::Vector4 ray = camera.unproject(GL::Vector4(x, y, 0, 0)); - return Ray(start, Vector(ray)); + return Ray(start, ray.slice<3>(0)); } void View3D::compute_bounds(Vector &minp, Vector &maxp) @@ -99,7 +123,7 @@ void View3D::update_shadow_area() { Vector minp, maxp; compute_bounds(minp, maxp); - shadow.set_target((minp+maxp)/2.0f, (maxp-minp).norm()/2.0f); + shadow.set_target((minp+maxp)/2.0f, max((maxp-minp).norm()/2.0f, 0.1f)); } } // namespace R2C2