X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpipeline.cpp;h=fa06fc5c0a985021a20353b1752cb849664e2a59;hp=29c42324add861d9e7813ba252f4fde9217f20b5;hb=39488946c441f4007396e438f522609a8b2943ce;hpb=d386eadfd08b556ecb05627a7ceca14652e8b1e5 diff --git a/source/pipeline.cpp b/source/pipeline.cpp index 29c42324..fa06fc5c 100644 --- a/source/pipeline.cpp +++ b/source/pipeline.cpp @@ -9,20 +9,38 @@ #include "renderer.h" #include "tests.h" #include "texture2d.h" +#include "view.h" using namespace std; namespace Msp { namespace GL { -Pipeline::Pipeline(unsigned w, unsigned h, bool d): - camera(0), - width(w), - height(h), - hdr(d), - samples(0), - target_ms(0) +Pipeline::Pipeline(unsigned w, unsigned h, bool d) { + init(w, h); + hdr = d; +} + +Pipeline::Pipeline(const View &view) +{ + init(view.get_width(), view.get_height()); +} + +Pipeline::Pipeline(const Framebuffer &fbo) +{ + init(fbo.get_width(), fbo.get_height()); +} + +void Pipeline::init(unsigned w, unsigned h) +{ + camera = 0; + width = w; + height = h; + hdr = false; + alpha = false; + samples = 0; + target_ms = 0; target[0] = 0; target[1] = 0; } @@ -52,6 +70,24 @@ void Pipeline::set_hdr(bool h) } } +void Pipeline::set_alpha(bool a) +{ + if(a==alpha) + return; + + bool old_alpha = alpha; + alpha = a; + try + { + create_targets(2); + } + catch(...) + { + alpha = old_alpha; + throw; + } +} + void Pipeline::set_multisample(unsigned s) { if(s==samples) @@ -124,7 +160,19 @@ Pipeline::Pass &Pipeline::add_pass(const Tag &tag, Renderable &r) void Pipeline::add_postprocessor(PostProcessor &pp) { - postproc.push_back(&pp); + add_postprocessor(&pp, true); +} + +void Pipeline::add_postprocessor_owned(PostProcessor *pp) +{ + add_postprocessor(pp, false); +} + +void Pipeline::add_postprocessor(PostProcessor *pp, bool keep) +{ + postproc.push_back(pp); + if(keep) + postproc.back().keep(); try { create_targets(0); @@ -168,7 +216,7 @@ void Pipeline::render(Renderer &renderer, const Tag &tag) const return; const Framebuffer *out_fbo = Framebuffer::current(); - // These is a no-ops but will ensure the related state gets restored + // These are no-ops but will ensure the related state gets restored BindRestore restore_fbo(out_fbo); BindRestore restore_depth_test(DepthTest::current()); BindRestore restore_blend(Blend::current()); @@ -180,7 +228,6 @@ void Pipeline::render(Renderer &renderer, const Tag &tag) const fbo.clear(COLOR_BUFFER_BIT|DEPTH_BUFFER_BIT); } - for(PassList::const_iterator i=passes.begin(); i!=passes.end(); ++i) { if(const DepthTest *dt = i->get_depth_test()) @@ -241,7 +288,7 @@ void Pipeline::create_targets(unsigned recreate) target_ms = 0; } - PixelFormat color_pf = (hdr ? RGB16F : RGB); + PixelFormat color_pf = (hdr ? (alpha ? RGBA16F : RGB16F) : (alpha ? RGBA : RGB)); RenderTargetFormat fmt = (RENDER_COLOR,color_pf, RENDER_DEPTH); if(!postproc.empty() || samples) {