When using border rendering, use the same border for compositor
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 20 Mar 2013 18:01:41 +0000 (18:01 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 20 Mar 2013 18:01:41 +0000 (18:01 +0000)
This makes compositing as fast as it's possible in this case.

The only thing is border render+crop will still give funcy
results. This is the next thing to be solved in compositor.

source/blender/compositor/intern/COM_ExecutionGroup.cpp
source/blender/compositor/intern/COM_ExecutionGroup.h
source/blender/compositor/intern/COM_ExecutionSystem.cpp

index 14fd7e0b6cf77e15f7b1d8b4aa98dc5033a6e2ec..82d1c7883e170bb78cfd2fc56503870f4badd5ff 100644 (file)
@@ -633,3 +633,13 @@ void ExecutionGroup::setViewerBorder(float xmin, float xmax, float ymin, float y
                              ymin * this->m_height, ymax * this->m_height);
        }
 }
+
+void ExecutionGroup::setRenderBorder(float xmin, float xmax, float ymin, float ymax)
+{
+       NodeOperation *operation = this->getOutputNodeOperation();
+
+       if (operation->isOutputOperation(true) && !(operation->isViewerOperation() || operation->isPreviewOperation())) {
+               BLI_rcti_init(&this->m_viewerBorder, xmin * this->m_width, xmax * this->m_width,
+                             ymin * this->m_height, ymax * this->m_height);
+       }
+}
index b5f02e05be11631a58e81cdc3218060b5d4a9e57..537dcb5974a28f79d8bd617be2ae78ba62db784d 100644 (file)
@@ -417,6 +417,8 @@ public:
         */
        void setViewerBorder(float xmin, float xmax, float ymin, float ymax);
 
+       void setRenderBorder(float xmin, float xmax, float ymin, float ymax);
+
 #ifdef WITH_CXX_GUARDEDALLOC
        MEM_CXX_CLASS_ALLOC_FUNCS("COM:ExecutionGroup")
 #endif
index 2d87845d25413fd71e3acb1645024d81ad0ffcc8..7638126157622e4f29acdd21ab18f19d3ac54b11 100644 (file)
@@ -95,6 +95,18 @@ ExecutionSystem::ExecutionSystem(RenderData *rd, bNodeTree *editingtree, bool re
                ExecutionGroup *executionGroup = this->m_groups[index];
                executionGroup->determineResolution(resolution);
 
+               if (rendering) {
+                       /* TODO: would be nice to support cropping as well, but for now
+                        *       don't use border for compo when crop is enabled,
+                        *       otherwise area of interest will be a way off from rendered
+                        *       stuff
+                        */
+                       if ((rd->mode & R_BORDER) && !(rd->mode & R_CROP)) {
+                               executionGroup->setRenderBorder(rd->border.xmin, rd->border.xmax,
+                                                               rd->border.ymin, rd->border.ymax);
+                       }
+               }
+
                if (use_viewer_border) {
                        executionGroup->setViewerBorder(viewer_border->xmin, viewer_border->xmax,
                                                        viewer_border->ymin, viewer_border->ymax);