Tie compositor will now update render result when changing node setup
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 1 Aug 2012 13:59:08 +0000 (13:59 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 1 Aug 2012 13:59:08 +0000 (13:59 +0000)
Issue was caused by the way how render result was acquiring -- pointer
to render data was used to find needed render descriptor. It's not
reliable since render contains copy of scene's render data, not pointer
to this data.

Use node scene's id name for render result acquiring, the same way
as it was done in old compositor system.

source/blender/compositor/nodes/COM_CompositorNode.cpp
source/blender/compositor/operations/COM_CompositorOperation.cpp
source/blender/compositor/operations/COM_CompositorOperation.h
source/blender/render/extern/include/RE_pipeline.h
source/blender/render/intern/source/pipeline.c

index 8a84908f478c8c8f49943f3b8e87218838d41925..338741ebe79e417917ea9833054ef92117118541 100644 (file)
@@ -31,11 +31,14 @@ CompositorNode::CompositorNode(bNode *editorNode) : Node(editorNode)
 
 void CompositorNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context)
 {
+       bNode *editorNode = this->getbNode();
+
        InputSocket *imageSocket = this->getInputSocket(0);
        InputSocket *alphaSocket = this->getInputSocket(1);
        InputSocket *depthSocket = this->getInputSocket(2);
 
        CompositorOperation *compositorOperation = new CompositorOperation();
+       compositorOperation->setScene((Scene *) editorNode->id);
        compositorOperation->setRenderData(context->getRenderData());
        compositorOperation->setbNodeTree(context->getbNodeTree());
        imageSocket->relinkConnections(compositorOperation->getInputSocket(0), 0, graph);
index 57a4639ecba826bdecc1750cfa6d8575319780f3..600ee5e1d7e75e4c62212b209e0598f601cedacf 100644 (file)
@@ -68,8 +68,7 @@ void CompositorOperation::initExecution()
 void CompositorOperation::deinitExecution()
 {
        if (!isBreaked()) {
-               const RenderData *rd = this->m_rd;
-               Render *re = RE_GetRender_FromData(rd);
+               Render *re = RE_GetRender(this->m_scene->id.name);
                RenderResult *rr = RE_AcquireResultWrite(re);
 
                if (rr) {
@@ -165,7 +164,7 @@ void CompositorOperation::determineResolution(unsigned int resolution[], unsigne
 
        // check actual render resolution with cropping it may differ with cropped border.rendering
        // FIX for: [31777] Border Crop gives black (easy)
-       Render *re = RE_GetRender_FromData(this->m_rd);
+       Render *re = RE_GetRender(this->m_scene->id.name);
        if (re) {
                RenderResult *rr = RE_AcquireResultRead(re);
                if (rr) {
index 491fe3eb4e4a48307be397d8ac7691eac7901656..51a31105d5c016b6e31cfbb7e743bdd94947846d 100644 (file)
@@ -31,6 +31,8 @@
  */
 class CompositorOperation : public NodeOperation {
 private:
+       const Scene *m_scene;
+
        /**
         * @brief local reference to the scene
         */
@@ -63,6 +65,7 @@ private:
 public:
        CompositorOperation();
        void executeRegion(rcti *rect, unsigned int tileNumber);
+       void setScene(const Scene *scene) { this->m_scene = scene; }
        void setRenderData(const RenderData *rd) { this->m_rd = rd; }
        bool isOutputOperation(bool rendering) const { return true; }
        void initExecution();
index 8ca229c1a1b2edecd538c93499a576789be5c4af..d474dc14df82949bf94a681c20ea8ee7e924c5e1 100644 (file)
@@ -153,7 +153,6 @@ typedef struct RenderStats {
 /* calling a new render with same name, frees automatic existing render */
 struct Render *RE_NewRender (const char *name);
 struct Render *RE_GetRender(const char *name);
-struct Render *RE_GetRender_FromData(const struct RenderData *rd);
 
 /* returns 1 while render is working (or renders called from within render) */
 int RE_RenderInProgress(struct Render *re);
index 77f75caa36a91725b1299fad6aeef15be5d9b8d3..ac4788465e564a5704240d6382057d5ece20185c 100644 (file)
@@ -245,18 +245,6 @@ Render *RE_GetRender(const char *name)
        return re;
 }
 
-Render *RE_GetRender_FromData(const RenderData *rd)
-{
-       Render *re;
-
-       /* search for existing renders */
-       for (re = RenderGlobal.renderlist.first; re; re = re->next)
-               if (&re->r == rd)
-                       break;
-
-       return re;
-}
-
 /* if you want to know exactly what has been done */
 RenderResult *RE_AcquireResultRead(Render *re)
 {