From: Mikko Rasa Date: Mon, 5 Dec 2016 14:15:27 +0000 (+0200) Subject: Associate camera and setup/finish_frame calls with View X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=7791ca3eac17e355d1de508b1730dc854ed7712d Associate camera and setup/finish_frame calls with View ... instead of Pipeline. Having a Camera in the Pipeline but using the Renderer's camera to override it for some things feels like a hack. Pipeline gets to keep it's top-level render function for now. --- diff --git a/source/pipeline.cpp b/source/pipeline.cpp index a5d7436a..4c400723 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; @@ -139,7 +138,6 @@ void Pipeline::add_postprocessor(PostProcessor &pp) void Pipeline::setup_frame() const { - in_frame = true; for(PassList::const_iterator i=passes.begin(); i!=passes.end(); ++i) if(const Renderable *renderable = i->get_renderable()) renderable->setup_frame(); @@ -149,7 +147,6 @@ void Pipeline::setup_frame() const void Pipeline::finish_frame() const { - in_frame = false; for(PassList::const_iterator i=passes.begin(); i!=passes.end(); ++i) if(const Renderable *renderable = i->get_renderable()) renderable->finish_frame(); @@ -163,7 +160,9 @@ void Pipeline::render(const Tag &tag) const return; Renderer renderer(camera); + setup_frame(); render(renderer, tag); + finish_frame(); } void Pipeline::render(Renderer &renderer, const Tag &tag) const @@ -171,10 +170,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 +227,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) diff --git a/source/pipeline.h b/source/pipeline.h index e3f95994..9272f587 100644 --- a/source/pipeline.h +++ b/source/pipeline.h @@ -20,21 +20,12 @@ class Lighting; class PostProcessor; /** -Encapsulates all of the information used to produce a complete image in the -framebuffer. This is the highest level rendering class. +Top-level content class. Typically a Pipeline is used as the content +Renderable for a View or effects such as ShadowMap or EnvironmentMap. A Pipeline contains a sequence of passes. Each pass has a Renderable along with Lighting, Clipping, DepthTest and Blend states. Scenes can be used to -organize Renderables within a pass. A Camera can be specified for the entire -Pipeline. - -A Pipeline is also a Renderable itself. It will only respond to the default -pass. The Renderables within the Pipeline will be invoked with whatever tags -were specified when adding them. - -A Pipeline's render method should normally be called without a Renderer; it -will create one itself, using the camera specified for the Pipeline. If a -Renderer is passed, its camera will be used instead. +organize Renderables within a pass. PostProcessors can be applied after all of the passes in the Pipeline have been rendered. Framebuffer objects are automatically used to pass render results to @@ -91,7 +82,6 @@ private: unsigned samples; RenderTarget *target[2]; RenderTarget *target_ms; - mutable bool in_frame; public: Pipeline(unsigned, unsigned, bool = false); @@ -99,9 +89,9 @@ public: void set_hdr(bool); void set_multisample(unsigned); - void set_camera(const Camera *); // Deprecated + void set_camera(const Camera *); Pass &add_pass(const Tag &tag); void add_renderable(const Renderable &); void add_renderable_for_pass(const Renderable &, const Tag &); diff --git a/source/view.cpp b/source/view.cpp index 47411998..6548c7f1 100644 --- a/source/view.cpp +++ b/source/view.cpp @@ -1,6 +1,7 @@ #include "camera.h" #include "framebuffer.h" #include "renderable.h" +#include "renderer.h" #include "view.h" using namespace std; @@ -17,6 +18,11 @@ View::View(Graphics::Window &w, Graphics::GLContext &c): window.signal_resize.connect(sigc::mem_fun(this, &View::window_resized)); } +void View::set_camera(Camera *c) +{ + camera = c; +} + void View::set_content(const Renderable *r) { content = r; @@ -32,7 +38,12 @@ void View::render() { target.clear(COLOR_BUFFER_BIT|DEPTH_BUFFER_BIT); if(content) - content->render(); + { + Renderer renderer(camera); + content->setup_frame(); + content->render(renderer); + content->finish_frame(); + } context.swap_buffers(); } @@ -40,6 +51,8 @@ void View::window_resized(unsigned w, unsigned h) { target.viewport(0, 0, w, h); float aspect = static_cast(w)/h; + if(camera) + camera->set_aspect(aspect); for(list::iterator i=synced_cameras.begin(); i!=synced_cameras.end(); ++i) (*i)->set_aspect(aspect); } diff --git a/source/view.h b/source/view.h index acd5a65c..bd39e8ff 100644 --- a/source/view.h +++ b/source/view.h @@ -22,6 +22,7 @@ private: Graphics::Window &window; Graphics::GLContext &context; Framebuffer ⌖ + Camera *camera; const Renderable *content; std::list synced_cameras; @@ -34,7 +35,10 @@ public: unsigned get_height() const { return window.get_height(); } float get_aspect() const { return static_cast(get_width())/get_height(); } + void set_camera(Camera *); void set_content(const Renderable *); + + // Deprecated void synchronize_camera_aspect(Camera &); void render();