Revision: 53310
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53310
Author:   nazgul
Date:     2012-12-24 13:33:47 +0000 (Mon, 24 Dec 2012)
Log Message:
-----------
Fix #33650: Compositor locks up when input is an unrendered render layer.

Issue was caused by resolution detecting which assumed zero resolution is
undefined one and should be re-evaluated. It doesn't work in cases when
there's a missing input, causing lots of unneeded resolution re-calculation.

It wasn't so much issue in average sized node trees, but it was a real
problem in generated tree from the report.

Currently used pretty simple solution which added a boolean flag to the
node operation which signal whether resolution was ever set or not.

There're probably smarter solutions here but can not think about them.

Modified Paths:
--------------
    trunk/blender/source/blender/compositor/intern/COM_NodeOperation.cpp
    trunk/blender/source/blender/compositor/intern/COM_NodeOperation.h

Modified: trunk/blender/source/blender/compositor/intern/COM_NodeOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_NodeOperation.cpp        
2012-12-24 08:34:03 UTC (rev 53309)
+++ trunk/blender/source/blender/compositor/intern/COM_NodeOperation.cpp        
2012-12-24 13:33:47 UTC (rev 53310)
@@ -34,6 +34,7 @@
        this->m_complex = false;
        this->m_width = 0;
        this->m_height = 0;
+       this->m_isResolutionSet = false;
        this->m_openCL = false;
        this->m_btree = NULL;
 }

Modified: trunk/blender/source/blender/compositor/intern/COM_NodeOperation.h
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_NodeOperation.h  
2012-12-24 08:34:03 UTC (rev 53309)
+++ trunk/blender/source/blender/compositor/intern/COM_NodeOperation.h  
2012-12-24 13:33:47 UTC (rev 53310)
@@ -81,6 +81,7 @@
         */
        const bNodeTree *m_btree;
 
+       bool m_isResolutionSet;
 public:
        /**
         * @brief is this node an operation?
@@ -170,7 +171,7 @@
        virtual void deinitExecution();
 
        bool isResolutionSet() {
-               return this->m_width != 0 && this->m_height != 0;
+               return this->m_isResolutionSet;
        }
 
        /**
@@ -181,6 +182,7 @@
                if (!isResolutionSet()) {
                        this->m_width = resolution[0];
                        this->m_height = resolution[1];
+                       this->m_isResolutionSet = true;
                }
        }
        
@@ -254,8 +256,8 @@
 protected:
        NodeOperation();
 
-       void setWidth(unsigned int width) { this->m_width = width; }
-       void setHeight(unsigned int height) { this->m_height = height; }
+       void setWidth(unsigned int width) { this->m_width = width; 
this->m_isResolutionSet = true; }
+       void setHeight(unsigned int height) { this->m_height = height; 
this->m_isResolutionSet = true; }
        SocketReader *getInputSocketReader(unsigned int inputSocketindex);
        NodeOperation *getInputOperation(unsigned int inputSocketindex);
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to