00001 #ifndef KEYCONTROLLER_H
00002 #define KEYCONTROLLER_H
00003
00004 #include "Controller.h"
00005 #include "SpecificKeyIterator.h"
00006
00007 class VEditor_VKeyController;
00008
00009 #include "Editor_VKeyController.h"
00010 #include <map>
00011
00012
00014 template<class T> class VKeyController : public VController<T>
00015 {
00016 protected:
00017 map<int, T> m_mFrameKey;
00018
00019 public:
00020 VKeyController() {}
00021 VKeyController(VKeyController<T> *p) : VController<T>(p)
00022 {
00023 if (p != NULL)
00024 {
00025 m_mFrameKey = p->m_mFrameKey;
00026 }
00027 }
00028
00029 VController<T>* Clone()
00030 {
00031 return new VKeyController<T>(this);
00032 }
00033
00035 string Identify() const {
00036 return string("Key Controller");
00037 }
00038
00039 protected:
00040
00041 map<int, T>::iterator GetIterator( int pos )
00042 {
00043 map<int, T>::iterator mapiterator = m_mFrameKey.begin();
00044 for (; pos > 0 && mapiterator != m_mFrameKey.end(); pos-- )
00045 {
00046 mapiterator++;
00047 }
00048 return mapiterator;
00049 }
00050
00051 public:
00052
00054
00055
00057 void Delete(int pos)
00058 {
00059 map<int, T>::iterator iter = GetIterator(pos);
00060 if ( iter != m_mFrameKey.end() )
00061 m_mFrameKey.erase( iter );
00062 }
00063
00064 int Count() const
00065 {
00066 return m_mFrameKey.size();
00067 }
00068
00070 void SetFrame(int pos, int f)
00071 {
00072 map<int, T>::iterator iter = GetIterator(pos);
00073 if ( iter != m_mFrameKey.end() ) {
00074
00075 T temp = iter->second;
00076 m_mFrameKey.erase(iter);
00077
00078 m_mFrameKey.insert(pair<int, T>(f, temp));
00079
00080 }
00081 }
00082
00084 int GetFrame(int pos)
00085 {
00086 map<int, T>::iterator iter = GetIterator( pos );
00087 if ( iter != m_mFrameKey.end() )
00088 return iter->first;
00089 else
00090 return -1;
00091 }
00092
00094 bool Exists(int f) const
00095 {
00096 return m_mFrameKey.find(f) != m_mFrameKey.end();
00097 }
00098
00100 void CreateBlankKeyFrame( int frame )
00101 {
00102 int pointer = 0; bool neg = false;
00103 while ( Exists(frame + pointer))
00104 {
00105 pointer = abs(pointer) + 1;
00106 if (neg)
00107 pointer *= -1;
00108
00109 neg = !neg;
00110 }
00111
00112 AddUpdate( frame + pointer, Evaluate( frame + pointer ) );
00113 }
00114
00116 VAbstractEditor* CreateKeyEditor( int pos )
00117 {
00118 map<int, T>::iterator iter = GetIterator( pos );
00119 if ( iter != m_mFrameKey.end() )
00120 return iter->second.CreateEditor();
00121 else
00122 return NULL;
00123 }
00124
00126 bool SupportsDirectManipulation() const
00127 {
00128 return true;
00129 }
00130
00132
00134
00135
00137 void AddUpdate(int f, T key)
00138 {
00139 m_mFrameKey[f] = key;
00140 }
00141
00143 void SetKey(int pos, T key)
00144 {
00145 map<int, T>::iterator iter = GetIterator(pos);
00146 if ( iter != m_mFrameKey.end() )
00147 iter->second = key;
00148 }
00149
00151 T GetKey(int pos) const
00152 {
00153 map<int, T>::iterator iter = GetIterator(pos);
00154 if ( iter != m_mFrameKey.end() )
00155 return iter->second;
00156 else
00157 return T();
00158 }
00159
00161
00162
00164
00165
00167 T Evaluate(int nFrame)
00168 {
00169 map<int, T>::iterator p, pStart, pEnd;
00170 T ReturnValue;
00171
00172 p = m_mFrameKey.find(nFrame);
00173 pStart = p;
00174 pEnd = p;
00175
00176 if ( p == m_mFrameKey.end() ) {
00177 p = m_mFrameKey.begin();
00178 while (p != m_mFrameKey.end()) {
00179 if (nFrame > p->first) {
00180 p++;
00181 } else {
00182 pEnd = p;
00183 pStart = --p;
00184 break;
00185 }
00186 }
00187
00188 } else {
00189 ReturnValue = p->second;
00190 }
00191
00192 if (pStart == pEnd) {
00193 if ( m_mFrameKey.begin() != m_mFrameKey.end() )
00194 {
00195 if (nFrame >= ( m_mFrameKey.rbegin())->first) {
00196 ReturnValue = ( --m_mFrameKey.end() )->second;
00197 } else {
00198 if ( p == m_mFrameKey.end() ) {
00199 ReturnValue = m_mFrameKey.begin()->second;
00200 } else {
00201 ReturnValue = p->second;
00202 }
00203 }
00204 }
00205 } else {
00206
00207 ReturnValue = ((pStart->second - pEnd->second) * (nFrame - pStart->first)) / (pStart->first - pEnd->first) + pStart->second;
00208 }
00209
00210 return ReturnValue;
00211
00212 }
00213
00215 VAbstractEditor* CreateEditor()
00216 {
00217 return new VEditor_VKeyController(this);
00218 }
00219
00221 void OnLink()
00222 {
00223 AddUpdate( m_nStartFrame, Evaluate(m_nStartFrame) );
00224 }
00226
00227 };
00228
00229
00230 #endif