void NodeAnimPrivate::refreshParentContainerRange() { NodeGuiPtr nodeUI = nodeGui.lock(); NodePtr node = nodeUI->getNode(); if (!node) { return; } AnimationModulePtr isAnimModule = toAnimationModule(model.lock()); assert(isAnimModule); // If inside a group, refresh the group { NodeGroupPtr parentGroup = toNodeGroup( node->getGroup() ); NodeAnimPtr parentGroupNodeAnim; if (parentGroup) { parentGroupNodeAnim = isAnimModule->findNodeAnim( parentGroup->getNode() ); } if (parentGroupNodeAnim) { parentGroupNodeAnim->refreshFrameRange(); } } // if modified by a time node, refresh its frame range as well { NodeAnimPtr isConnectedToTimeNode = isAnimModule->getNearestTimeNodeFromOutputsInternal(node); if (isConnectedToTimeNode) { isConnectedToTimeNode->refreshFrameRange(); } } } // refreshParentContainerRange
void NodeAnimPrivate::computeTimeOffsetRange() { NodeGuiPtr nodeUI = nodeGui.lock(); NodePtr node = nodeUI->getNode(); if (!node) { return; } // Retrieve nearest reader useful values { AnimationModulePtr isAnimModel = toAnimationModule(model.lock()); NodeAnimPtr nearestReader = isAnimModel->getNearestReaderInternal(node); if (nearestReader) { // Retrieve the time offset values KnobIntBasePtr timeOffsetKnob = toKnobIntBase(node->getKnobByName(kReaderParamNameTimeOffset)); assert(timeOffsetKnob); int timeOffsetValue = timeOffsetKnob->getValue(); frameRange = nearestReader->getFrameRange(); frameRange.min += timeOffsetValue; frameRange.max += timeOffsetValue; } } } // computeTimeOffsetRange
void NodeAnimPrivate::removeItem(const KnobTableItemPtr& item, TableChangeReasonEnum /*reason*/) { TableItemAnimPtr found; for (std::vector<TableItemAnimPtr>::iterator it = topLevelTableItems.begin(); it!=topLevelTableItems.end(); ++it) { if ((*it)->getInternalItem() == item) { found = *it; topLevelTableItems.erase(it); model.lock()->getSelectionModel()->removeAnyReferenceFromSelection(found); break; } else { TableItemAnimPtr found = (*it)->removeItem(item); if (found) { break; } } } }
void NodeAnimPrivate::computeGroupRange() { NodeGuiPtr nodeUI = nodeGui.lock(); NodePtr node = nodeUI->getNode(); if (!node) { return; } AnimationModulePtr isAnimModel = toAnimationModule(model.lock()); if (!isAnimModel) { return; } NodeGroupPtr nodegroup = node->isEffectNodeGroup(); assert(nodegroup); if (!nodegroup) { return; } AnimationModuleTreeView* treeView = isAnimModel->getEditor()->getTreeView(); NodesList nodes = nodegroup->getNodes(); std::set<double> times; for (NodesList::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { NodeAnimPtr childAnim = isAnimModel->findNodeAnim(*it); if (!childAnim) { continue; } if (!treeView->isItemVisibleRecursive(childAnim->getTreeItem())) { continue; } childAnim->refreshFrameRange(); RangeD childRange = childAnim->getFrameRange(); times.insert(childRange.min); times.insert(childRange.max); // Also check the child knobs keyframes NodeGuiPtr childGui = childAnim->getNodeGui(); const KnobsVec &knobs = childGui->getNode()->getKnobs(); for (KnobsVec::const_iterator it2 = knobs.begin(); it2 != knobs.end(); ++it2) { if ( !(*it2)->isAnimationEnabled() || !(*it2)->hasAnimation() ) { continue; } else { // For each dimension and for each split view get the first/last keyframe (if any) int nDims = (*it2)->getNDimensions(); std::list<ViewIdx> views = (*it2)->getViewsList(); for (std::list<ViewIdx>::const_iterator it3 = views.begin(); it3 != views.end(); ++it3) { for (int i = 0; i < nDims; ++i) { CurvePtr curve = (*it2)->getCurve(*it3, DimIdx(i)); if (!curve) { continue; } int nKeys = curve->getKeyFramesCount(); if (nKeys > 0) { KeyFrame k; if (curve->getKeyFrameWithIndex(0, &k)) { times.insert( k.getTime() ); } if (curve->getKeyFrameWithIndex(nKeys - 1, &k)) { times.insert( k.getTime() ); } } } } } } // for all knobs } // for all children nodes if (times.size() <= 1) { frameRange.min = 0; frameRange.max = 0; } else { frameRange.min = *times.begin(); frameRange.max = *times.rbegin(); } } // computeGroupRange