00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #pragma once
00013
00015 #include "nvsgcommon.h"
00016
00017 #include "nvsg/Animation.h"
00018
00019 namespace nvsg
00020 {
00022
00025 template<typename T> class InterpolatedAnimation : public Animation<T>
00026 {
00027 public:
00028
00029 virtual size_t getNumberOfFrames( void ) const;
00030
00031
00033
00034 size_t getNumberOfKeys( void ) const;
00035
00037
00038 void setNumberOfKeys( size_t count
00039 );
00040
00042
00043 void setKeyFrame( size_t key
00044 , unsigned int frame
00045 , const T & value
00046 );
00047
00049
00050 unsigned int getCurrentFrame( void ) const;
00051
00053
00054 const T & getCurrentValue( void ) const;
00055
00057
00058 unsigned int getFrame( size_t key ) const;
00059
00061
00062 const T & getValue( size_t key ) const;
00063
00065
00066 size_t getKey( unsigned int frame ) const;
00067
00068 protected:
00070 InterpolatedAnimation( void );
00071
00073 InterpolatedAnimation( const InterpolatedAnimation &rhs
00074 );
00075
00077 virtual ~InterpolatedAnimation( void );
00078
00080 void setCurrent( size_t key ) const;
00081
00083 void setCurrent( unsigned int frame, const T &value ) const;
00084
00085 private:
00086 std::vector<unsigned int> m_keys;
00087 std::vector<T> m_values;
00088 mutable unsigned int m_currentFrame;
00089 mutable T m_currentValue;
00090 };
00091
00092 template<typename T>
00093 inline InterpolatedAnimation<T>::InterpolatedAnimation( void )
00094 : m_currentFrame(-1)
00095 {
00096 __TRACE();
00097 }
00098
00099 template<typename T>
00100 inline InterpolatedAnimation<T>::InterpolatedAnimation( const InterpolatedAnimation &rhs )
00101 : m_keys( rhs.m_keys )
00102 , m_values( rhs.m_values )
00103 , m_currentFrame( rhs.m_currentFrame )
00104 , m_currentValue( rhs.m_currentValue )
00105 {
00106 __TRACE();
00107 }
00108
00109 template<typename T>
00110 inline InterpolatedAnimation<T>::~InterpolatedAnimation(void)
00111 {
00112 __TRACE();
00113 }
00114
00115 template<typename T>
00116 inline size_t InterpolatedAnimation<T>::getNumberOfFrames( void ) const
00117 {
00118 __TRACE();
00119 __ASSERT( m_keys.size() );
00120 return( 1 + m_keys[m_keys.size()-1] );
00121 }
00122
00123 template<typename T>
00124 inline size_t InterpolatedAnimation<T>::getNumberOfKeys( void ) const
00125 {
00126 __TRACE();
00127 return( m_keys.size() );
00128 }
00129
00130 template<typename T>
00131 inline void InterpolatedAnimation<T>::setNumberOfKeys( size_t count )
00132 {
00133 __TRACE();
00134 m_keys.resize( count );
00135 m_values.resize( count );
00136 }
00137
00138 template<typename T>
00139 inline void InterpolatedAnimation<T>::setKeyFrame( size_t key, unsigned int frame, const T &value )
00140 {
00141 __TRACE();
00142 __ASSERT( key < m_keys.size() );
00143 m_keys[key] = frame;
00144 m_values[key] = value;
00145 }
00146
00147 template<typename T>
00148 inline unsigned int InterpolatedAnimation<T>::getCurrentFrame( void ) const
00149 {
00150 __TRACE();
00151 return( m_currentFrame );
00152 }
00153
00154 template<typename T>
00155 inline const T & InterpolatedAnimation<T>::getCurrentValue( void ) const
00156 {
00157 __TRACE();
00158 return( m_currentValue );
00159 }
00160
00161 template<typename T>
00162 inline unsigned int InterpolatedAnimation<T>::getFrame( size_t key ) const
00163 {
00164 __TRACE();
00165 return( m_keys[key] );
00166 }
00167
00168 template<typename T>
00169 inline const T & InterpolatedAnimation<T>::getValue( size_t key ) const
00170 {
00171 __TRACE();
00172 return( m_values[key] );
00173 }
00174
00175 template<typename T>
00176 inline size_t InterpolatedAnimation<T>::getKey( unsigned int frame ) const
00177 {
00178 __TRACE();
00179 std::vector<unsigned int>::const_iterator it = std::lower_bound( m_keys.begin(), m_keys.end(), frame );
00180 __ASSERT( it != m_keys.end() );
00181 return( it - m_keys.begin() );
00182 }
00183
00184 template<typename T>
00185 inline void InterpolatedAnimation<T>::setCurrent( size_t key ) const
00186 {
00187 __TRACE();
00188 m_currentFrame = m_keys[key];
00189 m_currentValue = m_values[key];
00190 }
00191
00192 template<typename T>
00193 inline void InterpolatedAnimation<T>::setCurrent( unsigned int frame, const T &value ) const
00194 {
00195 __TRACE();
00196 m_currentFrame = frame;
00197 m_currentValue = value;
00198 }
00199 }