コード例 #1
0
ファイル: ViewerNode.cpp プロジェクト: ebrayton/Natron
void
ViewerNode::refreshInputFromChoiceMenu(int internalInputIdx)
{
    assert(internalInputIdx == 0 || internalInputIdx == 1);

    // Get the "Input" nodes
    std::vector<NodePtr> groupInputNodes;
    getInputs(&groupInputNodes);

    KnobChoicePtr knob = internalInputIdx == 0 ? _imp->aInputNodeChoiceKnob.lock() : _imp->bInputNodeChoiceKnob.lock();

    // Read from the choice menu the current selected node
    ChoiceOption curLabel = internalInputIdx == 0 ? _imp->aInputNodeChoiceKnob.lock()->getCurrentEntry() : _imp->bInputNodeChoiceKnob.lock()->getCurrentEntry();

    // Find recursively the node that we should connect to the "Input" node
    NodePtr nodeToConnect = _imp->getInputRecursive(internalInputIdx);
    if (curLabel.id == "-") {
        if (nodeToConnect->getEffectInstance().get() == this) {
            nodeToConnect->disconnectInput(internalInputIdx);
        } else {
            int prefInput = nodeToConnect->getPreferredInput();
            if (prefInput != -1) {
                nodeToConnect->disconnectInput(prefInput);
            }
        }

    } else {

        int groupInputIndex = QString::fromUtf8(curLabel.id.c_str()).toInt();
        if (groupInputIndex < (int)groupInputNodes.size() && groupInputIndex >= 0) {

            if (nodeToConnect == _imp->internalViewerProcessNode[internalInputIdx].lock()) {
                nodeToConnect->swapInput(groupInputNodes[groupInputIndex], 0);
            } else {
                int prefInput = nodeToConnect->getPreferredInputForConnection();
                if (prefInput != -1) {
                    nodeToConnect->swapInput(groupInputNodes[groupInputIndex], prefInput);
                }
            }
        }
    }
} // refreshInputFromChoiceMenu
コード例 #2
0
ファイル: ViewerNode.cpp プロジェクト: ebrayton/Natron
void
ViewerNode::connectInputToIndex(int groupInputIndex, int internalInputIndex)
{

    // We want to connect the node upstream of the internal viewer process node (or this node if there's nothing else upstream)
    // to the appropriate GroupInput node inside the group
    NodePtr internalNodeToConnect = _imp->getInputRecursive(internalInputIndex);
    assert(internalNodeToConnect);

    std::vector<NodePtr> inputNodes;
    getInputs(&inputNodes);
    if (groupInputIndex >= (int)inputNodes.size() || groupInputIndex < 0) {
        // Invalid input index
        return;
    }

    // This is the GroupInput node inside the group to connect to
    NodePtr groupInput = inputNodes[groupInputIndex];

    // Update the input choice
    _imp->refreshInputChoiceMenu(internalInputIndex, groupInputIndex);


    // Connect the node recursive upstream of the internal viewer process to the corresponding GroupInput node
    if (internalNodeToConnect == _imp->internalViewerProcessNode[internalInputIndex].lock()) {
        internalNodeToConnect->disconnectInput(0);
        internalNodeToConnect->connectInput(groupInput, 0);
    } else {
        int prefInput = internalNodeToConnect->getPreferredInputForConnection();
        if (prefInput == -1) {
            // Preferred input might be connected, disconnect it first
            prefInput = internalNodeToConnect->getPreferredInput();
            if (prefInput != -1) {
                internalNodeToConnect->disconnectInput(prefInput);
            }
            internalNodeToConnect->connectInput(groupInput, prefInput);
        }
    }
}
コード例 #3
0
ファイル: JoinViewsNode.cpp プロジェクト: MrKepzie/Natron
void
JoinViewsNode::onMetadataChanged(const NodeMetadata& metadata)
{
    NodePtr node = getNode();

    std::size_t nInputs, oldNInputs;

    const std::vector<std::string>& views = getApp()->getProject()->getProjectViewNames();

    //Reverse names
    oldNInputs = getNInputs();
    nInputs = views.size();
    std::vector<NodePtr> inputs(oldNInputs);
    for (std::size_t i = 0; i < oldNInputs; ++i) {
        inputs[i] = node->getInput(i);
    }
    node->beginInputEdition();
    node->removeAllInputs();
    for (std::size_t i = 0; i < nInputs; ++i) {
        const std::string& inputName = views[nInputs - 1 - i];
        InputDescriptionPtr desc = InputDescription::create(inputName, inputName, "", false, false, std::bitset<4>(std::string("1111")));
        node->addInput(desc);
    }


    //Reconnect the inputs
    int index = oldNInputs - 1;
    if (index >= 0) {


        for (int i = (int)nInputs - 1; i  >= 0; --i, --index) {
            node->disconnectInput(i);
            if (index >= 0) {
                if (inputs[index]) {
                    node->connectInput(inputs[index], i);
                }
            }
        }
    }
    node->endInputEdition(true);

    EffectInstance::onMetadataChanged(metadata);
}