diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2014-07-08 14:48:41 +0400 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2014-07-08 14:51:35 +0400 |
commit | a5902fb276933278bd8db86a9b1938fe649662d8 (patch) | |
tree | 95d9d8999427ec2b52d59975c5ac8e171c628d8b /source/blender/compositor/intern/COM_NodeOperationBuilder.cpp | |
parent | bd7fbd43273b63655886b60b7bba7c36e6a9755a (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.cpp | 23 |
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 **** ****************************/ |