]> git.tdb.fi Git - libs/gl.git/commitdiff
Associate camera and setup/finish_frame calls with View
authorMikko Rasa <tdb@tdb.fi>
Mon, 5 Dec 2016 14:15:27 +0000 (16:15 +0200)
committerMikko Rasa <tdb@tdb.fi>
Mon, 5 Dec 2016 15:14:13 +0000 (17:14 +0200)
... 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.

source/pipeline.cpp
source/pipeline.h
source/view.cpp
source/view.h

index a5d7436aaace7cd48074d6c6c02a9ecefda94948..4c4007233d2b9fd82cc82f9bf7cccdf0cc56f3e4 100644 (file)
@@ -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)
index e3f95994defff957a831987716901620aab94ad1..9272f5875add3d1605fc6cd33657997552d95fd9 100644 (file)
@@ -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 &);
index 47411998f8359b6ca12fe4b93f58f99c032438fb..6548c7f1e98fd9d38168de8579ad5f5ade983b86 100644 (file)
@@ -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<float>(w)/h;
+       if(camera)
+               camera->set_aspect(aspect);
        for(list<Camera *>::iterator i=synced_cameras.begin(); i!=synced_cameras.end(); ++i)
                (*i)->set_aspect(aspect);
 }
index acd5a65cfec98a1753642dfcb75c4393e879ed31..bd39e8ff7f11c6835b07a62a233b858b60472735 100644 (file)
@@ -22,6 +22,7 @@ private:
        Graphics::Window &window;
        Graphics::GLContext &context;
        Framebuffer &target;
+       Camera *camera;
        const Renderable *content;
        std::list<Camera *> synced_cameras;
 
@@ -34,7 +35,10 @@ public:
        unsigned get_height() const { return window.get_height(); }
        float get_aspect() const { return static_cast<float>(get_width())/get_height(); }
 
+       void set_camera(Camera *);
        void set_content(const Renderable *);
+
+       // Deprecated
        void synchronize_camera_aspect(Camera &);
 
        void render();