Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

KeyController.h

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() ) { // delete and re-insert
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; // add or update
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; // set 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; // get frame
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() ) { // couldn't find
00177                                 p = m_mFrameKey.begin();
00178                                 while (p != m_mFrameKey.end()) {
00179                                         if (nFrame > p->first) {  // keep going
00180                                                 p++;
00181                                         } else { // we're here
00182                                                 pEnd   = p;
00183                                                 pStart = --p;
00184                                                 break;
00185                                         }
00186                                 }                       
00187                                 
00188                         } else { // found it!
00189                                 ReturnValue = p->second;
00190                         }
00191                         
00192                         if (pStart == pEnd) { // no data
00193                                 if ( m_mFrameKey.begin() != m_mFrameKey.end() ) // any data?
00194                                 {
00195                                         if (nFrame >= ( m_mFrameKey.rbegin())->first) { // are we after the last frame?
00196                                                 ReturnValue = ( --m_mFrameKey.end() )->second;
00197                                         } else {
00198                                                 if ( p == m_mFrameKey.end() ) { // couldn't find
00199                                                         ReturnValue = m_mFrameKey.begin()->second;
00200                                                 } else {
00201                                                         ReturnValue = p->second;
00202                                                 }
00203                                         }
00204                                 }
00205                         } else {    // linear tween
00206                                 // slope * (x - x0) + y0
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                 { // create a first blank keyframe
00223                         AddUpdate( m_nStartFrame, Evaluate(m_nStartFrame) );
00224                 }
00226 
00227 };
00228 
00229 
00230 #endif

Generated at Wed Aug 29 19:58:55 2001 for Pocket Animator by doxygen1.2.5 written by Dimitri van Heesch, © 1997-2001