Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

vuSphericInteractive.cpp

Go to the documentation of this file.
00001 #include "vuSphericInteractive.h"
00002 
00003 template <int SIZE, class TYPE>
00004 vuSphericInteractive<SIZE,TYPE>::vuSphericInteractive()
00005 {
00006   m_AlreadyVisited  = NULL;
00007   m_Volume          = NULL;
00008   m_NumberOfViews   = 0;
00009   m_NumberOfVisited = 0;
00010 }
00011 
00012 template <int SIZE, class TYPE>
00013 vuSphericInteractive<SIZE,TYPE>::~vuSphericInteractive()
00014 {
00015   CHECKNDELETE(m_AlreadyVisited);
00016   m_NumberOfViews   = 0;
00017   m_NumberOfVisited = 0;
00018   // m_Volume is outside living
00019 }
00020 
00021 template <int SIZE, class TYPE>
00022 void vuSphericInteractive<SIZE,TYPE>::setVolume(vu1611_2<SIZE,TYPE> *volume)
00023 {
00024   m_Volume = volume;
00025 }
00026 
00027 template <int SIZE, class TYPE>
00028 vu1611_2<SIZE,TYPE> *vuSphericInteractive<SIZE,TYPE>::getVolume()
00029 {
00030   return m_Volume;
00031 }
00032 
00033 template <int S, class T>
00034 dword vuSphericInteractive<S,T>::getNumberOfVisited()
00035 {
00036   return m_NumberOfVisited;
00037 }
00038 
00039 template <int S, class T>
00040 dword vuSphericInteractive<S,T>::getNumberOfViews()
00041 {
00042   return m_NumberOfViews;
00043 }
00044 
00045 template <int SIZE, class TYPE>
00046 void vuSphericInteractive<SIZE,TYPE>::reset()
00047 {  
00048   _ensureList();
00049   if (m_AlreadyVisited == NULL || m_NumberOfViews == 0) return;
00050   
00051   m_NumberOfVisited = 0;
00052   for (dword i=0; i<m_NumberOfViews; i++) {
00053     m_AlreadyVisited[i] = false;
00054   }
00055 }
00056 
00057 template <int SIZE, class TYPE>
00058 bool vuSphericInteractive<SIZE,TYPE>::isVisited(dword idx)
00059 {
00060   if (m_AlreadyVisited == NULL || m_NumberOfViews <= idx) return false;
00061   return m_AlreadyVisited[idx];
00062 }
00063 
00064 template <int SIZE, class TYPE>
00065 void vuSphericInteractive<SIZE,TYPE>::setIsVisited(dword idx, bool flag)
00066 {
00067   _ensureList();
00068   if (m_AlreadyVisited != NULL && idx < m_NumberOfViews) {
00069     if (!m_AlreadyVisited[idx] && flag) m_NumberOfVisited++;
00070     else if (m_AlreadyVisited[idx] && !flag) m_NumberOfVisited--;
00071     m_AlreadyVisited[idx] = flag;
00072   }
00073 }
00074 
00075 
00076 template <int S, class T>
00077 void vuSphericInteractive<S,T>::_ensureList()
00078 {
00079   if (m_Volume != NULL) {
00080     dword numOfViews = m_Volume->getNumberOfViews();
00081     
00082     if (m_NumberOfViews != numOfViews || m_AlreadyVisited == NULL) {
00083       m_NumberOfVisited = 0;
00084       m_NumberOfViews   = numOfViews;
00085       m_AlreadyVisited  = new bool[m_NumberOfViews];
00086     }
00087   }
00088 }
00089 
00090 template <int S, class T>
00091 vuSphericView<S,T> *vuSphericInteractive<S,T>::nearestView()
00092 {
00093   int idx = indexOfNearestView();
00094   
00095   if (idx > 0)
00096     return m_Volume->getView(idx);
00097   else
00098     return NULL;
00099 }
00100 
00101 template <int S, class T>
00102 int vuSphericInteractive<S,T>::indexOfNearestView()
00103 {
00104   if (m_Volume == NULL) return -1;
00105 
00106   vuVector               lookAt  = m_Volume->getCameraPtr()->getLookAtVector();
00107 
00108   vuSphericViewFilter<S,T> *filter  = m_Volume->getViewFilter();
00109   vuSphericView<S,T>       **views = filter->getViews();
00110   dword numberOfViews = filter->getNumberOfViews();
00111 
00112   dword *idxList = NULL;
00113   dword count   = 1;
00114 
00115   if (numberOfViews == 0) return -1; // no views available
00116 
00117   lookAt.makeUnit();
00118   lookAt *= -1;
00119   
00120   vuSphericFilter<S,T>::getNearestViews(idxList, count, lookAt, numberOfViews,
00121                                      views);
00122   if (count != 1) {
00123     cerr << "WARNING: vuSimpleFBR._numberOfNearestView(): count != 1" << endl;
00124     return -2; // could not found the nearest one
00125   }
00126   dword result = idxList[0];
00127   CHECKNDELETE(idxList);
00128 
00129   numberOfViews = m_Volume->getNumberOfViews();
00130   dword idx     = numberOfViews;
00131   
00132   for (dword i=0; i<numberOfViews; i++) {
00133     if (m_Volume->getView(i) == views[result]) {
00134       idx = i;
00135       break;
00136     }
00137   }
00138   return idx;
00139 }

Generated on Wed Dec 15 21:20:37 2004 for vuVolume by  doxygen 1.3.9.1