| 4709 | } // RotoContext::getOrCreateGlobalMergeNode |
| 4710 | |
| 4711 | void |
| 4712 | RotoContext::refreshRotoPaintTree() |
| 4713 | { |
| 4714 | if (_imp->isCurrentlyLoading) { |
| 4715 | return; |
| 4716 | } |
| 4717 | |
| 4718 | // Do not use only activated items when defining the shape of the RotoPaint tree otherwise we would have to adjust the tree at each frame. |
| 4719 | std::list<RotoDrawableItemPtr> items = getCurvesByRenderOrder(false /*onlyActivatedItems*/); |
| 4720 | int blendingOperator; |
| 4721 | bool canConcatenate = isRotoPaintTreeConcatenatableInternal(items, &blendingOperator); |
| 4722 | NodePtr globalMerge; |
| 4723 | int globalMergeIndex = -1; |
| 4724 | NodesList mergeNodes; |
| 4725 | { |
| 4726 | QMutexLocker k(&_imp->rotoContextMutex); |
| 4727 | mergeNodes = _imp->globalMergeNodes; |
| 4728 | } |
| 4729 | //ensure that all global merge nodes are disconnected |
| 4730 | for (NodesList::iterator it = mergeNodes.begin(); it != mergeNodes.end(); ++it) { |
| 4731 | int maxInputs = (*it)->getNInputs(); |
| 4732 | for (int i = 0; i < maxInputs; ++i) { |
| 4733 | (*it)->disconnectInput(i); |
| 4734 | } |
| 4735 | } |
| 4736 | if (canConcatenate) { |
| 4737 | globalMerge = getOrCreateGlobalMergeNode(&globalMergeIndex); |
| 4738 | } |
| 4739 | if (globalMerge) { |
| 4740 | NodePtr rotopaintNodeInput = getNode()->getInput(0); |
| 4741 | //Connect the rotopaint node input to the B input of the Merge |
| 4742 | if (rotopaintNodeInput) { |
| 4743 | globalMerge->connectInput(rotopaintNodeInput, 0); |
| 4744 | } |
| 4745 | } |
| 4746 | |
| 4747 | for (std::list<RotoDrawableItemPtr>::const_iterator it = items.begin(); it != items.end(); ++it) { |
| 4748 | (*it)->refreshNodesConnections(); |
| 4749 | |
| 4750 | if (globalMerge) { |
| 4751 | { |
| 4752 | KnobIPtr mergeOperatorKnob = globalMerge->getKnobByName(kMergeOFXParamOperation); |
| 4753 | KnobChoice* mergeOp = dynamic_cast<KnobChoice*>( mergeOperatorKnob.get() ); |
| 4754 | if (mergeOp) { |
| 4755 | mergeOp->setValue(blendingOperator); |
| 4756 | } |
| 4757 | } |
| 4758 | |
| 4759 | NodePtr effectNode = (*it)->getEffectNode(); |
| 4760 | assert(effectNode); |
| 4761 | //qDebug() << "Connecting" << (*it)->getScriptName().c_str() << "to input" << globalMergeIndex << |
| 4762 | //"(" << globalMerge->getInputLabel(globalMergeIndex).c_str() << ")" << "of" << globalMerge->getScriptName().c_str(); |
| 4763 | globalMerge->connectInput(effectNode, globalMergeIndex); |
| 4764 | |
| 4765 | ///Refresh for next node |
| 4766 | NodePtr nextMerge = getOrCreateGlobalMergeNode(&globalMergeIndex); |
| 4767 | if (nextMerge != globalMerge) { |
| 4768 | assert( !nextMerge->getInput(0) ); |
no test coverage detected