OSDN Git Service

fix build system ofmoflib1 and saisei1
[moflib/moflib.git] / moflib-1.0 / src / mof / stream / KeyFrameAnimation.hpp
1 #pragma once
2 #include "mof/stream/Manipulator.hpp"
3 #include <map>
4 #include <stdexcept>
5 #include <boost/function/function2.hpp>
6 #include "mof/Interpolation.hpp"
7
8 namespace mof{
9
10     template<typename T >
11     class KeyFrameAnimation : public Manipulator< T >
12     {
13         public:
14                 typedef std::shared_ptr<KeyFrameAnimation<T>> Handler;
15             typedef std::pair< FrameNumber , T > KeyFrame;
16             typedef typename std::map< FrameNumber , T> KeyMap;
17
18         virtual ~KeyFrameAnimation(){}
19
20             virtual T value( mof::FrameNumber frame) const
21         {
22                     return m_interpolator(m_map , frame);
23         }
24
25             mof::FrameNumber getFinalKeyFrameNumber()
26         {
27                     return m_maxKeyFrameNumber;
28             }
29
30     private:
31             KeyMap m_map;
32             FrameNumber m_maxKeyFrameNumber;
33             boost::function2<T , const KeyMap& , mof::FrameNumber> m_interpolator;
34
35         KeyFrameAnimation
36         (
37                     const KeyFrame& front ,
38             const KeyFrame& back , 
39                     const boost::function2< T , const KeyMap& , FrameNumber > & interpolator
40                 )
41         : m_interpolator(interpolator)
42             {
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++)
47             {
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 ) );
50                 }
51         }
52
53             KeyFrameAnimation
54         (
55                     const KeyFrame& front , const KeyFrame& back 
56                 )
57         : m_interpolator(&mof::linerInterpolate<T>)
58             {
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++)
63             {
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 ) );
66                     }
67             }
68
69         template< typename T > friend
70             typename KeyFrameAnimation< T >::KeyFrame 
71             makeKeyFrame( mof::FrameNumber frame , const T & obj );
72
73         template< typename T > friend
74         typename KeyFrameAnimation< T >::Handler 
75         makeKeyFrameAnimationHandler
76         (
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
80         );
81
82         template< typename T > friend
83         typename KeyFrameAnimation< T >::Handler 
84         makeKeyFrameAnimationHandler
85         (
86                 const std::pair< FrameNumber , T >& front ,
87             const std::pair< FrameNumber , T >& back  
88         );
89
90     };
91 //{{{ ヘルパ関数
92         template< typename T >
93         typename KeyFrameAnimation< T >::KeyFrame 
94         makeKeyFrame( mof::FrameNumber frame , const T & obj )
95     {
96                 return std::make_pair< FrameNumber , T>(frame , obj);
97         }
98
99     template< typename T >
100     typename KeyFrameAnimation< T >::Handler 
101     makeKeyFrameAnimationHandler
102     (
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
106     )
107         {
108         return KeyFrameAnimation< T >::Handler
109             (
110                 new KeyFrameAnimation< T >( front , back , interpolator )
111             );
112         }
113
114     template< typename T >
115     typename KeyFrameAnimation< T >::Handler
116     makeKeyFrameAnimationHandler
117     (
118             const std::pair< FrameNumber, T>& front,
119         const std::pair< FrameNumber, T>& back  
120     )
121     {
122         return KeyFrameAnimation< T >::Handler
123             (
124                 new KeyFrameAnimation< T >( front , back ) 
125             );
126         }
127
128     template< typename T >
129     typename std::shared_ptr<KeyFrameAnimation<T>> 
130     makeKeyFrameAnimationHandler
131     (
132             FrameNumber fn1 , const T& v1 ,
133             FrameNumber fn2 , const T& v2 
134     )
135     {
136         KeyFrameAnimation<T>::KeyFrame keyFrames[] =
137         {
138             makeKeyFrame(fn1 , v1) ,
139             makeKeyFrame(fn2 , v2) 
140         };
141         return makeKeyFrameAnimationHandler(keyFrames[0] , lastOf(keyFrames));
142         }
143     
144     template< typename T >
145     typename std::shared_ptr<KeyFrameAnimation< T >> 
146     makeKeyFrameAnimationHandler
147     (
148             FrameNumber fn1 , const T& v1 ,
149             FrameNumber fn2 , const T& v2 ,
150                 const boost::function2< T , const std::map< FrameNumber , T >& , FrameNumber> & interpolator
151     )
152     {
153         KeyFrameAnimation<T>::KeyFrame keyFrames[] =
154         {
155             makeKeyFrame(fn1 , v1) ,
156             makeKeyFrame(fn2 , v2) 
157         };
158         return makeKeyFrameAnimationHandler(keyFrames[0] , lastOf(keyFrames) , interpolator);
159         }
160
161
162
163 //}}}
164 } //namespace mof
165