]> 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),
        height(h),
        hdr(d),
        samples(0),
-       target_ms(0),
-       in_frame(false)
+       target_ms(0)
 {
        target[0] = 0;
        target[1] = 0;
 {
        target[0] = 0;
        target[1] = 0;
@@ -139,7 +138,6 @@ void Pipeline::add_postprocessor(PostProcessor &pp)
 
 void Pipeline::setup_frame() const
 {
 
 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();
        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
 {
 
 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();
        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);
                return;
 
        Renderer renderer(camera);
+       setup_frame();
        render(renderer, tag);
        render(renderer, tag);
+       finish_frame();
 }
 
 void Pipeline::render(Renderer &renderer, const Tag &tag) const
 }
 
 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;
 
        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);
        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);
                }
        }
                        postproc[i]->render(renderer, color, depth);
                }
        }
-
-       if(!was_in_frame)
-               finish_frame();
 }
 
 void Pipeline::create_targets(unsigned recreate)
 }
 
 void Pipeline::create_targets(unsigned recreate)
index e3f95994defff957a831987716901620aab94ad1..9272f5875add3d1605fc6cd33657997552d95fd9 100644 (file)
@@ -20,21 +20,12 @@ class Lighting;
 class PostProcessor;
 
 /**
 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
 
 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
 
 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;
        unsigned samples;
        RenderTarget *target[2];
        RenderTarget *target_ms;
-       mutable bool in_frame;
 
 public:
        Pipeline(unsigned, unsigned, bool = false);
 
 public:
        Pipeline(unsigned, unsigned, bool = false);
@@ -99,9 +89,9 @@ public:
 
        void set_hdr(bool);
        void set_multisample(unsigned);
 
        void set_hdr(bool);
        void set_multisample(unsigned);
-       void set_camera(const Camera *);
 
        // Deprecated
 
        // 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 &);
        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 "camera.h"
 #include "framebuffer.h"
 #include "renderable.h"
+#include "renderer.h"
 #include "view.h"
 
 using namespace std;
 #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));
 }
 
        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;
 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)
 {
        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();
 }
 
        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;
 {
        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);
 }
        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;
        Graphics::Window &window;
        Graphics::GLContext &context;
        Framebuffer &target;
+       Camera *camera;
        const Renderable *content;
        std::list<Camera *> synced_cameras;
 
        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(); }
 
        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 *);
        void set_content(const Renderable *);
+
+       // Deprecated
        void synchronize_camera_aspect(Camera &);
 
        void render();
        void synchronize_camera_aspect(Camera &);
 
        void render();