MCPcopy Create free account
hub / github.com/NatronGitHub/Natron / refreshRotoPaintTree

Method refreshRotoPaintTree

Engine/RotoContext.cpp:4711–4774  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4709} // RotoContext::getOrCreateGlobalMergeNode
4710
4711void
4712RotoContext::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) );

Callers 6

addItemMethod · 0.80
insertItemMethod · 0.80
removeItemMethod · 0.80
rotoKnobChangedMethod · 0.80
undoMethod · 0.80
redoMethod · 0.80

Calls 12

getEffectNodeMethod · 0.80
getNodeFunction · 0.70
beginMethod · 0.45
endMethod · 0.45
getNInputsMethod · 0.45
disconnectInputMethod · 0.45
getInputMethod · 0.45
connectInputMethod · 0.45
getKnobByNameMethod · 0.45
getMethod · 0.45
setValueMethod · 0.45

Tested by

no test coverage detected