本文整理汇总了C++中KeyFrameSet::empty方法的典型用法代码示例。如果您正苦于以下问题:C++ KeyFrameSet::empty方法的具体用法?C++ KeyFrameSet::empty怎么用?C++ KeyFrameSet::empty使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类KeyFrameSet
的用法示例。
在下文中一共展示了KeyFrameSet::empty方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: assert
void
AnimationModuleViewPrivate::keyFramesWithinRect(const RectD& canonicalRect, AnimItemDimViewKeyFramesMap* keys) const
{
// always running in the main thread
assert( qApp && qApp->thread() == QThread::currentThread() );
if (canonicalRect.isNull()) {
return;
}
std::vector<CurveGuiPtr> curves = getVisibleCurves();
for (std::vector<CurveGuiPtr>::const_iterator it = curves.begin(); it != curves.end(); ++it) {
KeyFrameSet set = (*it)->getKeyFrames();
if ( set.empty() ) {
continue;
}
AnimItemDimViewIndexID curveID = (*it)->getCurveID();
StringAnimationManagerPtr stringAnim = curveID.item->getInternalAnimItem()->getStringAnimation();
KeyFrameWithStringSet outKeys;
for ( KeyFrameSet::const_iterator it2 = set.begin(); it2 != set.end(); ++it2) {
double y = it2->getValue();
double x = it2->getTime();
if ( (x <= canonicalRect.x2) && (x >= canonicalRect.x1) && (y <= canonicalRect.y2) && (y >= canonicalRect.y1) ) {
//KeyPtr newSelectedKey( new SelectedKey(*it, *it2, hasPrev, prevKey, hasNext, nextKey) );
KeyFrameWithString k;
k.key = *it2;
if (stringAnim) {
stringAnim->stringFromInterpolatedIndex(it2->getValue(), curveID.view, &k.string);
}
outKeys.insert(k);
}
}
if (!outKeys.empty()) {
(*keys)[curveID] = outKeys;
}
}
} // CurveWidgetPrivate::keyFramesWithinRect
示例2: m
void
CurveGui::drawCurve(int curveIndex,
int curvesCount)
{
// always running in the main thread
assert( qApp && qApp->thread() == QThread::currentThread() );
AnimItemBasePtr item = _imp->item.lock();
if (!item) {
return;
}
std::vector<float> vertices, exprVertices;
const double widgetWidth = _imp->curveWidget->width();
KeyFrameSet keyframes;
bool hasDrawnExpr = false;
if (item->hasExpression(_imp->dimension, _imp->view)) {
//we have no choice but to evaluate the expression at each time
for (int i = 0; i < widgetWidth; ++i) {
double x = _imp->curveWidget->toZoomCoordinates(i, 0).x();
double y = evaluate(true /*useExpr*/, x);
exprVertices.push_back(x);
exprVertices.push_back(y);
}
hasDrawnExpr = true;
}
QPointF btmLeft = _imp->curveWidget->toZoomCoordinates(0, _imp->curveWidget->height() - 1);
QPointF topRight = _imp->curveWidget->toZoomCoordinates(_imp->curveWidget->width() - 1, 0);
bool isPeriodic = false;
std::pair<double,double> parametricRange = std::make_pair(-std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity());
keyframes = getInternalCurve()->getKeyFrames_mt_safe();
isPeriodic = getInternalCurve()->isCurvePeriodic();
parametricRange = getInternalCurve()->getXRange();
if ( keyframes.empty() ) {
// Add a horizontal line for constant knobs, except string knobs.
KnobIPtr isKnob = boost::dynamic_pointer_cast<KnobI>(item->getInternalAnimItem());
if (isKnob) {
KnobStringBasePtr isString = boost::dynamic_pointer_cast<KnobStringBase>(isKnob);
if (!isString) {
double value = evaluate(false, 0);
vertices.push_back(btmLeft.x() + 1);
vertices.push_back(value);
vertices.push_back(topRight.x() - 1);
vertices.push_back(value);
}
}
} else {
try {
double x1 = 0;
double x2;
bool isX1AKey = false;
KeyFrame x1Key;
KeyFrameSet::const_iterator lastUpperIt = keyframes.end();
while ( x1 < (widgetWidth - 1) ) {
double x, y;
if (!isX1AKey) {
x = _imp->curveWidget->toZoomCoordinates(x1, 0).x();
y = evaluate(false, x);
} else {
x = x1Key.getTime();
y = x1Key.getValue();
}
vertices.push_back( (float)x );
vertices.push_back( (float)y );
nextPointForSegment(x, keyframes, isPeriodic, parametricRange.first, parametricRange.second, &lastUpperIt, &x2, &x1Key, &isX1AKey);
x1 = x2;
}
//also add the last point
{
double x = _imp->curveWidget->toZoomCoordinates(x1, 0).x();
double y = evaluate(false, x);
vertices.push_back( (float)x );
vertices.push_back( (float)y );
}
} catch (...) {
}
}
// No Expr curve or no vertices for the curve, don't draw anything else
if (exprVertices.empty() && vertices.empty()) {
return;
}
AnimationModuleSelectionModelPtr selectionModel = item->getModel()->getSelectionModel();
assert(selectionModel);
const AnimItemDimViewKeyFramesMap& selectedKeys = selectionModel->getCurrentKeyFramesSelection();
//.........这里部分代码省略.........
示例3: assert
void
CurveGui::nextPointForSegment(const double x, // < in curve coordinates
const KeyFrameSet & keys,
const bool isPeriodic,
const double parametricXMin,
const double parametricXMax,
KeyFrameSet::const_iterator* lastUpperIt,
double* x2WidgetCoords,
KeyFrame* x1Key,
bool* isx1Key)
{
// always running in the main thread
assert( qApp && qApp->thread() == QThread::currentThread() );
assert( !keys.empty() );
*isx1Key = false;
// If non periodic and out of curve range, draw straight lines from widget border to
// the keyframe on the side
if (!isPeriodic && x < keys.begin()->getTime()) {
*x2WidgetCoords = keys.begin()->getTime();
double y;
_imp->curveWidget->toWidgetCoordinates(x2WidgetCoords, &y);
*x1Key = *keys.begin();
*isx1Key = true;
return;
} else if (!isPeriodic && x >= keys.rbegin()->getTime()) {
*x2WidgetCoords = _imp->curveWidget->width() - 1;
return;
}
// We're between 2 keyframes or the curve is periodic, get the upper and lower keyframes widget coordinates
// Points to the first keyframe with a greater time (in widget coords) than x1
KeyFrameSet::const_iterator upperIt = keys.end();
// If periodic, bring back x in the period range (in widget coordinates)
double xClamped = x;
double period = parametricXMax - parametricXMin;
{
//KeyFrameSet::const_iterator start = keys.begin();
const double xMin = parametricXMin;// + start->getTime();
const double xMax = parametricXMax;// + start->getTime();
if ((x < xMin || x > xMax) && isPeriodic) {
xClamped = std::fmod(x - xMin, period) + parametricXMin;
if (xClamped < xMin) {
xClamped += period;
}
assert(xClamped >= xMin && xClamped <= xMax);
}
}
{
KeyFrameSet::const_iterator itKeys = keys.begin();
if ( *lastUpperIt != keys.end() ) {
// If we already have called this function before, start from the previously
// computed iterator to avoid n square complexity
itKeys = *lastUpperIt;
} else {
// Otherwise start from the begining
itKeys = keys.begin();
}
*lastUpperIt = keys.end();
for (; itKeys != keys.end(); ++itKeys) {
if (itKeys->getTime() > xClamped) {
upperIt = itKeys;
*lastUpperIt = upperIt;
break;
}
}
}
double tprev, vprev, vprevDerivRight, tnext, vnext, vnextDerivLeft;
if ( upperIt == keys.end() ) {
// We are in a periodic curve: we are in-between the last keyframe and the parametric xMax
// If the curve is non periodic, it should have been handled in the 2 cases above: we only draw a straightline
// from the widget border to the first/last keyframe
assert(isPeriodic);
KeyFrameSet::const_iterator start = keys.begin();
KeyFrameSet::const_reverse_iterator last = keys.rbegin();
tprev = last->getTime();
vprev = last->getValue();
vprevDerivRight = last->getRightDerivative();
tnext = std::fmod(last->getTime() - start->getTime(), period) + tprev;
//xClamped += period;
vnext = start->getValue();
vnextDerivLeft = start->getLeftDerivative();
} else if ( upperIt == keys.begin() ) {
// We are in a periodic curve: we are in-between the parametric xMin and the first keyframe
// If the curve is non periodic, it should have been handled in the 2 cases above: we only draw a straightline
// from the widget border to the first/last keyframe
assert(isPeriodic);
KeyFrameSet::const_reverse_iterator last = keys.rbegin();
tprev = last->getTime();
//xClamped -= period;
//.........这里部分代码省略.........