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
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;
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;
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 }