FrameData *CObjectModel::getFrameDataFromPrevFrame(QModelIndex index, int frame, bool bRepeat) { if ( !isLayer(index) ) { return NULL ; } ObjectItem *p = getItemFromIndex(index) ; return getFrameDataFromPrevFrame(p, frame, bRepeat) ; }
FrameData ObjectItem::getDisplayFrameData(int frame, bool *bValid) { FrameData d ; FrameData *pPrev = getFrameDataFromPrevFrame(frame+1) ; if ( pPrev ) { FrameData *pNext = getFrameDataFromNextFrame(frame) ; d = pPrev->getInterpolation(pNext, frame) ; d.frame = frame ; if ( bValid ) { *bValid = true ; } } else { if ( bValid ) { *bValid = false ; } } return d ; }
QPointF ObjectItem::getBezierPos(int frame, bool *pValid) { FrameData *pPrev = getFrameDataFromPrevFrame(frame+1) ; FrameData *pNext = getFrameDataFromNextFrame(frame) ; QMatrix4x4 m0, m1 ; QList<QPointF> list ; bool valid ; float t ; if ( !pPrev || !pNext || (!pPrev->path[0].bValid && !pNext->path[1].bValid) ) { goto __FAILED ; } if ( pNext->frame-pPrev->frame == 0 ) { qDebug() << "Error same frame" ; goto __FAILED ; } m0 = getDisplayMatrix(pPrev->frame, &valid) ; if ( !valid ) { goto __FAILED ; } if ( frame == pPrev->frame ) { if ( pValid ) { *pValid = true ; } return QPointF(m0.column(3).x(), m0.column(3).y()) ; } m1 = getDisplayMatrix(pNext->frame, &valid) ; if ( !valid ) { goto __FAILED ; } if ( frame == pNext->frame ) { if ( pValid ) { *pValid = true ; } return QPointF(m0.column(3).x(), m0.column(3).y()) ; } list << QPointF(m0.column(3).x(), m0.column(3).y()) ; list << QPointF(m0.column(3).x() + pPrev->path[0].v.x(), m0.column(3).y() + pPrev->path[0].v.y()) ; list << QPointF(m1.column(3).x() + pNext->path[1].v.x(), m1.column(3).y() + pNext->path[1].v.y()) ; list << QPointF(m1.column(3).x(), m1.column(3).y()) ; t = (frame-pPrev->frame) / (float)(pNext->frame-pPrev->frame) ; if ( pValid ) { *pValid = true ; } return util::getBezierPoint(list, t) ; __FAILED: if ( pValid ) { *pValid = false ; } return QPointF(0, 0) ; }