Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2014-07-08 14:48:41 +0400
committerLukas Tönne <lukas.toenne@gmail.com>2014-07-08 14:51:35 +0400
commita5902fb276933278bd8db86a9b1938fe649662d8 (patch)
tree95d9d8999427ec2b52d59975c5ac8e171c628d8b /source/blender/compositor/intern/COM_NodeOperationBuilder.cpp
parentbd7fbd43273b63655886b60b7bba7c36e6a9755a (diff)
Fix T40986: crash on using the viewer node inside of group nodes.
Viewers were activated both inside the active group as well as the top level tree (the latter being a quick fix for getting a fallback viewer). This caused a race condition on the shared viewer image. Now the active viewer is defined at node conversion time in the converter so that only one can be active at a time without each node having to follow complicated rules for exclusion.
Diffstat (limited to 'source/blender/compositor/intern/COM_NodeOperationBuilder.cpp')
-rw-r--r--source/blender/compositor/intern/COM_NodeOperationBuilder.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/source/blender/compositor/intern/COM_NodeOperationBuilder.cpp b/source/blender/compositor/intern/COM_NodeOperationBuilder.cpp
index a90bac847c0..6554926991c 100644
--- a/source/blender/compositor/intern/COM_NodeOperationBuilder.cpp
+++ b/source/blender/compositor/intern/COM_NodeOperationBuilder.cpp
@@ -38,12 +38,14 @@ extern "C" {
#include "COM_SocketProxyOperation.h"
#include "COM_ReadBufferOperation.h"
#include "COM_WriteBufferOperation.h"
+#include "COM_ViewerOperation.h"
#include "COM_NodeOperationBuilder.h" /* own include */
NodeOperationBuilder::NodeOperationBuilder(const CompositorContext *context, bNodeTree *b_nodetree) :
m_context(context),
- m_current_node(NULL)
+ m_current_node(NULL),
+ m_active_viewer(NULL)
{
m_graph.from_bNodeTree(*context, b_nodetree);
}
@@ -239,6 +241,25 @@ void NodeOperationBuilder::addNodeInputPreview(NodeInput *input)
}
}
+void NodeOperationBuilder::registerViewer(ViewerOperation *viewer)
+{
+ if (m_active_viewer) {
+ if (m_current_node->isInActiveGroup()) {
+ /* deactivate previous viewer */
+ m_active_viewer->setActive(false);
+
+ m_active_viewer = viewer;
+ viewer->setActive(true);
+ }
+ }
+ else {
+ if (m_current_node->getbNodeTree() == m_context->getbNodeTree()) {
+ m_active_viewer = viewer;
+ viewer->setActive(true);
+ }
+ }
+}
+
/****************************
**** Optimization Steps ****
****************************/