X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpipeline.cpp;h=fa06fc5c0a985021a20353b1752cb849664e2a59;hp=9e2976ab69e5dc4e383c413be18c9239ac786a94;hb=HEAD;hpb=6109322ffc5dec1a777807fcbefacafe94d1d5eb diff --git a/source/pipeline.cpp b/source/pipeline.cpp deleted file mode 100644 index 9e2976ab..00000000 --- a/source/pipeline.cpp +++ /dev/null @@ -1,306 +0,0 @@ -#include -#include "blend.h" -#include "camera.h" -#include "framebuffer.h" -#include "lighting.h" -#include "pipeline.h" -#include "postprocessor.h" -#include "renderbuffer.h" -#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) -{ - init(w, h); - hdr = d; -} - -Pipeline::Pipeline(const View &view) -{ - init(view.get_width(), view.get_height()); -} - -void Pipeline::init(unsigned w, unsigned h) -{ - camera = 0; - width = w; - height = h; - hdr = false; - samples = 0; - target_ms = 0; - target[0] = 0; - target[1] = 0; -} - -Pipeline::~Pipeline() -{ - delete target[0]; - delete target[1]; - delete target_ms; -} - -void Pipeline::set_hdr(bool h) -{ - if(h==hdr) - return; - - bool old_hdr= hdr; - hdr = h; - try - { - create_targets(2); - } - catch(...) - { - hdr = old_hdr; - throw; - } -} - -void Pipeline::set_multisample(unsigned s) -{ - if(s==samples) - return; - - unsigned old_samples = samples; - samples = s; - try - { - create_targets(1); - } - catch(...) - { - samples = old_samples; - throw; - } -} - -void Pipeline::set_camera(const Camera *c) -{ - camera = c; -} - -Pipeline::Pass &Pipeline::add_pass(const Tag &tag) -{ - passes.push_back(Pass(tag, 0)); - return passes.back(); -} - -void Pipeline::add_renderable(Renderable &r) -{ - for(vector::iterator i=renderables.begin(); i!=renderables.end(); ++i) - if(i->renderable==&r) - { - i->passes.clear(); - return; - } - - renderables.push_back(&r); -} - -void Pipeline::add_renderable_for_pass(Renderable &r, const Tag &tag) -{ - for(vector::iterator i=renderables.begin(); i!=renderables.end(); ++i) - if(i->renderable==&r) - { - i->passes.insert(tag); - return; - } - - renderables.push_back(&r); - renderables.back().passes.insert(tag); -} - -void Pipeline::remove_renderable(Renderable &r) -{ - for(vector::iterator i=renderables.begin(); i!=renderables.end(); ++i) - if(i->renderable==&r) - { - renderables.erase(i); - return; - } -} - -Pipeline::Pass &Pipeline::add_pass(const Tag &tag, Renderable &r) -{ - passes.push_back(Pass(tag, &r)); - return passes.back(); -} - -void Pipeline::add_postprocessor(PostProcessor &pp) -{ - postproc.push_back(&pp); - try - { - create_targets(0); - } - catch(...) - { - postproc.pop_back(); - throw; - } -} - -void Pipeline::setup_frame(Renderer &renderer) -{ - for(PassList::const_iterator i=passes.begin(); i!=passes.end(); ++i) - if(Renderable *renderable = i->get_renderable()) - renderable->setup_frame(renderer); - for(vector::const_iterator i=renderables.begin(); i!=renderables.end(); ++i) - i->renderable->setup_frame(renderer); -} - -void Pipeline::finish_frame() -{ - for(PassList::const_iterator i=passes.begin(); i!=passes.end(); ++i) - if(Renderable *renderable = i->get_renderable()) - renderable->finish_frame(); - for(vector::const_iterator i=renderables.begin(); i!=renderables.end(); ++i) - i->renderable->finish_frame(); -} - -void Pipeline::render() -{ - Renderer renderer(camera); - setup_frame(renderer); - render(renderer); - finish_frame(); -} - -void Pipeline::render(Renderer &renderer, const Tag &tag) const -{ - if(tag.id) - return; - - const Framebuffer *out_fbo = Framebuffer::current(); - // These is a 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()); - - if(target[0]) - { - Framebuffer &fbo = (samples ? target_ms : target[0])->get_framebuffer(); - fbo.bind(); - 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()) - dt->bind(); - else - DepthTest::unbind(); - - if(const Blend *b = i->get_blend()) - b->bind(); - else - Blend::unbind(); - - renderer.set_lighting(i->get_lighting()); - renderer.set_clipping(i->get_clipping()); - - if(const Renderable *renderable = i->get_renderable()) - renderer.render(*renderable, i->get_tag()); - - for(vector::const_iterator j=renderables.begin(); j!=renderables.end(); ++j) - if(j->passes.empty() || j->passes.count(i->get_tag())) - renderer.render(*j->renderable, i->get_tag()); - } - - if(target[0]) - { - DepthTest::unbind(); - Blend::unbind(); - - if(samples) - target[0]->blit_from(*target_ms); - - for(unsigned i=0; iget_framebuffer().bind(); - else - out_fbo->bind(); - const Texture2D &color = target[j]->get_target_texture(RENDER_COLOR); - const Texture2D &depth = target[j]->get_target_texture(RENDER_DEPTH); - postproc[i]->render(renderer, color, depth); - } - } -} - -void Pipeline::create_targets(unsigned recreate) -{ - if(recreate>=2) - { - delete target[0]; - delete target[1]; - target[0] = 0; - target[1] = 0; - } - if(recreate>=1) - { - delete target_ms; - target_ms = 0; - } - - PixelFormat color_pf = (hdr ? RGB16F : RGB); - RenderTargetFormat fmt = (RENDER_COLOR,color_pf, RENDER_DEPTH); - if(!postproc.empty() || samples) - { - if(!target[0]) - target[0] = new RenderTarget(width, height, fmt); - if(!target[1] && postproc.size()>1) - target[1] = new RenderTarget(width, height, fmt); - } - - if(!target_ms && samples) - target_ms = new RenderTarget(width, height, samples, fmt); -} - - -Pipeline::Pass::Pass(const Tag &t, Renderable *r): - tag(t), - lighting(0), - depth_test(0), - blend(0), - clipping(0), - renderable(r) -{ } - -void Pipeline::Pass::set_lighting(const Lighting *l) -{ - lighting = l; -} - -void Pipeline::Pass::set_depth_test(const DepthTest *d) -{ - depth_test = d; -} - -void Pipeline::Pass::set_blend(const Blend *b) -{ - blend = b; -} - -void Pipeline::Pass::set_clipping(const Clipping *c) -{ - clipping =c; -} - - -Pipeline::Slot::Slot(Renderable *r): - renderable(r) -{ } - -} // namespace GL -} // namespace Msp