void TimeLine::onDragDrop (ATOM_WidgetDragDropEvent *event) { if (event->dragSource->getProperty("Type") == "KM") { unsigned numSlices = _duration / _timeSlice; unsigned width = _timeLine->getClientRect().size.w; unsigned sliceWidth = (width - numSlices - 1) / numSlices; unsigned space = (width - numSlices * (sliceWidth + 1) - 1) / 2; int x = event->x - space; int n = x / (1 + sliceWidth); if ( n < numSlices && !isKeyFrame (n)) { int source = event->dragSource->getProperty("SourceFrame").getI(); ATOM_AUTOPTR(ATOM_CompositionKeyFrameValue) keyFrameValue = _actor->createKeyFrameValue (); _actor->evalKeyFrameValue (sliceIndexToTime (source), keyFrameValue.get()); if ((event->keymod & KEYMOD_SHIFT) == 0) { removeKeyFrame (source); } addKeyFrame (n, keyFrameValue.get()); setCurrentSlice (n, 0); } } }
void TimeLine::onLButtonDown (ATOM_WidgetLButtonDownEvent *event) { unsigned numSlices = _duration / _timeSlice; unsigned width = _timeLine->getClientRect().size.w; unsigned sliceWidth = (width - numSlices - 1) / numSlices; unsigned space = (width - numSlices * (sliceWidth + 1) - 1) / 2; int x = event->x - space; int n = x / (1 + sliceWidth); if ( n < numSlices) { if (event->shiftState & KEYMOD_CTRL) { if (isKeyFrame (n)) { removeKeyFrame (n); } else { addKeyFrame (n); } } else { setCurrentSlice (n, 0); } } }
//--------------------------------------------------------------------- void NodeAnimationTrack::optimise(void) { // Eliminate duplicate keyframes from 2nd to penultimate keyframe // NB only eliminate middle keys from sequences of 5+ identical keyframes // since we need to preserve the boundary keys in place, and we need // 2 at each end to preserve tangents for spline interpolation Vector3 lasttrans = Vector3::ZERO; Vector3 lastscale = Vector3::ZERO; Quaternion lastorientation; KeyFrameList::iterator i = mKeyFrames.begin(); Radian quatTolerance(1e-3f); std::list<unsigned short> removeList; unsigned short k = 0; ushort dupKfCount = 0; for (; i != mKeyFrames.end(); ++i, ++k) { TransformKeyFrame* kf = static_cast<TransformKeyFrame*>(*i); Vector3 newtrans = kf->getTranslate(); Vector3 newscale = kf->getScale(); Quaternion neworientation = kf->getRotation(); // Ignore first keyframe; now include the last keyframe as we eliminate // only k-2 in a group of 5 to ensure we only eliminate middle keys if (i != mKeyFrames.begin() && newtrans.positionEquals(lasttrans) && newscale.positionEquals(lastscale) && neworientation.equals(lastorientation, quatTolerance)) { ++dupKfCount; // 4 indicates this is the 5th duplicate keyframe if (dupKfCount == 4) { // remove the 'middle' keyframe removeList.push_back(k-2); --dupKfCount; } } else { // reset dupKfCount = 0; lasttrans = newtrans; lastscale = newscale; lastorientation = neworientation; } } // Now remove keyframes, in reverse order to avoid index revocation std::list<unsigned short>::reverse_iterator r = removeList.rbegin(); for (; r!= removeList.rend(); ++r) { removeKeyFrame(*r); } }
void LayerCamera::loadImageAtFrame(int frameNumber, QMatrix view) { if ( hasKeyFrameAtPosition( frameNumber ) ) { removeKeyFrame( frameNumber ); } Camera* camera = new Camera( view ); camera->setPos( frameNumber ); addKeyFrame( frameNumber, camera ); }
void LayerCamera::loadImageAtFrame( int frameNumber, QTransform view ) { if ( keyExists( frameNumber ) ) { removeKeyFrame( frameNumber ); } Camera* camera = new Camera( view ); camera->setPos( frameNumber ); addKeyFrame( frameNumber, camera ); }
void Curve::removeKeyFrameWithTime(double time) { QWriteLocker l(&_imp->_lock); KeyFrameSet::iterator it = find(time); if (it == _imp->keyFrames.end()) { throw std::out_of_range("Curve::removeKeyFrameWithTime: non-existent keyframe"); } removeKeyFrame(it); }
void LayerVector::loadImageAtFrame(QString path, int frameNumber) { if ( keyExists( frameNumber ) ) { removeKeyFrame( frameNumber, false ); } VectorImage* vecImg = new VectorImage; vecImg->setPos( frameNumber ); vecImg->setObject( object() ); vecImg->read( path ); addKeyFrame( frameNumber, vecImg ); }
void Curve::removeKeyFrameWithIndex(int index) { QWriteLocker l(&_imp->_lock); removeKeyFrame(atIndex(index)); }