2 #include "mof/stream/Manipulator.hpp"
5 #include <boost/function/function2.hpp>
6 #include "mof/Interpolation.hpp"
11 class KeyFrameAnimation : public Manipulator< T >
14 typedef std::shared_ptr<KeyFrameAnimation<T>> Handler;
15 typedef std::pair< FrameNumber , T > KeyFrame;
16 typedef typename std::map< FrameNumber , T> KeyMap;
18 virtual ~KeyFrameAnimation(){}
20 virtual T value( mof::FrameNumber frame) const
22 return m_interpolator(m_map , frame);
25 mof::FrameNumber getFinalKeyFrameNumber()
27 return m_maxKeyFrameNumber;
32 FrameNumber m_maxKeyFrameNumber;
33 boost::function2<T , const KeyMap& , mof::FrameNumber> m_interpolator;
37 const KeyFrame& front ,
38 const KeyFrame& back ,
39 const boost::function2< T , const KeyMap& , FrameNumber > & interpolator
41 : m_interpolator(interpolator)
43 int length = &back - &front + 1;
44 if(length < 1)throw std::invalid_argument("length < 1");
45 m_maxKeyFrameNumber = 0;
46 for(int i = 0 ; i < length ; i++)
48 if((&front)[i].first > m_maxKeyFrameNumber)m_maxKeyFrameNumber = (&front)[i].first;
49 m_map.insert( std::make_pair((&front)[i].first , (&front)[i].second ) );
55 const KeyFrame& front , const KeyFrame& back
57 : m_interpolator(&mof::linerInterpolate<T>)
59 int length = &back - &front + 1;
60 if(length < 1)throw std::invalid_argument("length < 1");
61 m_maxKeyFrameNumber = 0;
62 for(int i = 0 ; i < length ; i++)
64 if((&front)[i].first > m_maxKeyFrameNumber)m_maxKeyFrameNumber = (&front)[i].first;
65 m_map.insert( std::make_pair((&front)[i].first , (&front)[i].second ) );
69 template< typename T > friend
70 typename KeyFrameAnimation< T >::KeyFrame
71 makeKeyFrame( mof::FrameNumber frame , const T & obj );
73 template< typename T > friend
74 typename KeyFrameAnimation< T >::Handler
75 makeKeyFrameAnimationHandler
77 const std::pair< FrameNumber , T >& front ,
78 const std::pair< FrameNumber , T >& back ,
79 const boost::function2< T , const std::map< FrameNumber , T >& , FrameNumber> & interpolator
82 template< typename T > friend
83 typename KeyFrameAnimation< T >::Handler
84 makeKeyFrameAnimationHandler
86 const std::pair< FrameNumber , T >& front ,
87 const std::pair< FrameNumber , T >& back
92 template< typename T >
93 typename KeyFrameAnimation< T >::KeyFrame
94 makeKeyFrame( mof::FrameNumber frame , const T & obj )
96 return std::make_pair< FrameNumber , T>(frame , obj);
99 template< typename T >
100 typename KeyFrameAnimation< T >::Handler
101 makeKeyFrameAnimationHandler
103 const std::pair< FrameNumber , T >& front ,
104 const std::pair< FrameNumber , T >& back ,
105 const boost::function2< T , const std::map< FrameNumber , T >& , FrameNumber> & interpolator
108 return KeyFrameAnimation< T >::Handler
110 new KeyFrameAnimation< T >( front , back , interpolator )
114 template< typename T >
115 typename KeyFrameAnimation< T >::Handler
116 makeKeyFrameAnimationHandler
118 const std::pair< FrameNumber, T>& front,
119 const std::pair< FrameNumber, T>& back
122 return KeyFrameAnimation< T >::Handler
124 new KeyFrameAnimation< T >( front , back )
128 template< typename T >
129 typename std::shared_ptr<KeyFrameAnimation<T>>
130 makeKeyFrameAnimationHandler
132 FrameNumber fn1 , const T& v1 ,
133 FrameNumber fn2 , const T& v2
136 KeyFrameAnimation<T>::KeyFrame keyFrames[] =
138 makeKeyFrame(fn1 , v1) ,
139 makeKeyFrame(fn2 , v2)
141 return makeKeyFrameAnimationHandler(keyFrames[0] , lastOf(keyFrames));
144 template< typename T >
145 typename std::shared_ptr<KeyFrameAnimation< T >>
146 makeKeyFrameAnimationHandler
148 FrameNumber fn1 , const T& v1 ,
149 FrameNumber fn2 , const T& v2 ,
150 const boost::function2< T , const std::map< FrameNumber , T >& , FrameNumber> & interpolator
153 KeyFrameAnimation<T>::KeyFrame keyFrames[] =
155 makeKeyFrame(fn1 , v1) ,
156 makeKeyFrame(fn2 , v2)
158 return makeKeyFrameAnimationHandler(keyFrames[0] , lastOf(keyFrames) , interpolator);