Esempio n. 1
0
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);
		}
	}
}
Esempio n. 2
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);
		}
	}
}
Esempio n. 3
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);
        }


    }
Esempio n. 4
0
void LayerCamera::loadImageAtFrame(int frameNumber, QMatrix view)
{
    if ( hasKeyFrameAtPosition( frameNumber ) )
    {
        removeKeyFrame( frameNumber );
    }
    Camera* camera = new Camera( view );
    camera->setPos( frameNumber );
    addKeyFrame( frameNumber, camera );
}
Esempio n. 5
0
void LayerCamera::loadImageAtFrame( int frameNumber, QTransform view )
{
    if ( keyExists( frameNumber ) )
    {
        removeKeyFrame( frameNumber );
    }
    Camera* camera = new Camera( view );
    camera->setPos( frameNumber );
    addKeyFrame( frameNumber, camera );
}
Esempio n. 6
0
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);
}
Esempio n. 7
0
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 );
}
Esempio n. 8
0
void Curve::removeKeyFrameWithIndex(int index)
{
    QWriteLocker l(&_imp->_lock);
    removeKeyFrame(atIndex(index));
}