X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpipeline.cpp;h=29c42324add861d9e7813ba252f4fde9217f20b5;hp=a5d7436aaace7cd48074d6c6c02a9ecefda94948;hb=6a045019fbd68738b77849629e6dfd3dfd9a4d93;hpb=b94d3423de1e61f46c22b421f4b293d2d094b89f diff --git a/source/pipeline.cpp b/source/pipeline.cpp index a5d7436a..29c42324 100644 --- a/source/pipeline.cpp +++ b/source/pipeline.cpp @@ -21,8 +21,7 @@ Pipeline::Pipeline(unsigned w, unsigned h, bool d): height(h), hdr(d), samples(0), - target_ms(0), - in_frame(false) + target_ms(0) { target[0] = 0; target[1] = 0; @@ -82,7 +81,7 @@ Pipeline::Pass &Pipeline::add_pass(const Tag &tag) return passes.back(); } -void Pipeline::add_renderable(const Renderable &r) +void Pipeline::add_renderable(Renderable &r) { for(vector::iterator i=renderables.begin(); i!=renderables.end(); ++i) if(i->renderable==&r) @@ -94,7 +93,7 @@ void Pipeline::add_renderable(const Renderable &r) renderables.push_back(&r); } -void Pipeline::add_renderable_for_pass(const Renderable &r, const Tag &tag) +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) @@ -107,7 +106,7 @@ void Pipeline::add_renderable_for_pass(const Renderable &r, const Tag &tag) renderables.back().passes.insert(tag); } -void Pipeline::remove_renderable(const Renderable &r) +void Pipeline::remove_renderable(Renderable &r) { for(vector::iterator i=renderables.begin(); i!=renderables.end(); ++i) if(i->renderable==&r) @@ -117,7 +116,7 @@ void Pipeline::remove_renderable(const Renderable &r) } } -Pipeline::Pass &Pipeline::add_pass(const Tag &tag, const Renderable &r) +Pipeline::Pass &Pipeline::add_pass(const Tag &tag, Renderable &r) { passes.push_back(Pass(tag, &r)); return passes.back(); @@ -137,33 +136,30 @@ void Pipeline::add_postprocessor(PostProcessor &pp) } } -void Pipeline::setup_frame() const +void Pipeline::setup_frame(Renderer &renderer) { - in_frame = true; for(PassList::const_iterator i=passes.begin(); i!=passes.end(); ++i) - if(const Renderable *renderable = i->get_renderable()) - renderable->setup_frame(); + 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(); + i->renderable->setup_frame(renderer); } -void Pipeline::finish_frame() const +void Pipeline::finish_frame() { - in_frame = false; for(PassList::const_iterator i=passes.begin(); i!=passes.end(); ++i) - if(const Renderable *renderable = i->get_renderable()) + 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(const Tag &tag) const +void Pipeline::render() { - if(tag.id) - return; - Renderer renderer(camera); - render(renderer, tag); + setup_frame(renderer); + render(renderer); + finish_frame(); } void Pipeline::render(Renderer &renderer, const Tag &tag) const @@ -171,10 +167,6 @@ void Pipeline::render(Renderer &renderer, const Tag &tag) const if(tag.id) return; - bool was_in_frame = in_frame; - if(!in_frame) - setup_frame(); - const Framebuffer *out_fbo = Framebuffer::current(); // These is a no-ops but will ensure the related state gets restored BindRestore restore_fbo(out_fbo); @@ -232,9 +224,6 @@ void Pipeline::render(Renderer &renderer, const Tag &tag) const postproc[i]->render(renderer, color, depth); } } - - if(!was_in_frame) - finish_frame(); } void Pipeline::create_targets(unsigned recreate) @@ -267,7 +256,7 @@ void Pipeline::create_targets(unsigned recreate) } -Pipeline::Pass::Pass(const Tag &t, const Renderable *r): +Pipeline::Pass::Pass(const Tag &t, Renderable *r): tag(t), lighting(0), depth_test(0), @@ -297,7 +286,7 @@ void Pipeline::Pass::set_clipping(const Clipping *c) } -Pipeline::Slot::Slot(const Renderable *r): +Pipeline::Slot::Slot(Renderable *r): renderable(r) { }