Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef IndexIterator_INCLUDE_ONCE
00033 #define IndexIterator_INCLUDE_ONCE
00034
00035 #include <vlCore/Object.hpp>
00036
00037 namespace vl
00038 {
00039
00040
00041
00043 class IndexIteratorAbstract: public Object
00044 {
00045 VL_INSTRUMENT_ABSTRACT_CLASS(vl::IndexIteratorAbstract, Object)
00046
00047 public:
00048 IndexIteratorAbstract(): mIndex(-1)
00049 {
00050 VL_DEBUG_SET_OBJECT_NAME()
00051 }
00052 int index() const { return mIndex; }
00053 virtual bool hasNext() const = 0;
00054 virtual bool next() = 0;
00055
00056 protected:
00057 int mIndex;
00058 };
00059
00060
00061
00063 class IndexIterator: public Object
00064 {
00065 VL_INSTRUMENT_CLASS(vl::IndexIterator, Object)
00066
00067 public:
00068 IndexIterator()
00069 {
00070 VL_DEBUG_SET_OBJECT_NAME()
00071 }
00072 void initialize(IndexIteratorAbstract* iterator) { mIterator = iterator; }
00073 int index() { return mIterator->index(); }
00074 bool hasNext() { return mIterator->hasNext(); }
00075 bool next() { return mIterator->next(); }
00076 bool operator++() { return next(); }
00077
00078 protected:
00079 ref<IndexIteratorAbstract> mIterator;
00080 };
00081
00082
00083
00085 class IndexIteratorDrawArrays: public IndexIteratorAbstract
00086 {
00087 VL_INSTRUMENT_CLASS(vl::IndexIteratorDrawArrays, IndexIteratorAbstract)
00088
00089 public:
00090 IndexIteratorDrawArrays()
00091 {
00092 VL_DEBUG_SET_OBJECT_NAME()
00093 initialize(0,0);
00094 }
00095
00096 void initialize(int start, int count)
00097 {
00098 mStart = start;
00099 mCount = count;
00100 mCurPos = start;
00101 mIndex = start;
00102 }
00103
00104 virtual bool hasNext() const
00105 {
00106 return mCurPos != mStart + mCount;
00107 }
00108
00109 virtual bool next()
00110 {
00111 ++mCurPos;
00112 mIndex = mCurPos;
00113 return true;
00114 }
00115
00116 protected:
00117 int mStart;
00118 int mCount;
00119 int mCurPos;
00120 };
00121
00122
00123
00125 template<class TArray>
00126 class IndexIteratorElements: public IndexIteratorAbstract
00127 {
00128 VL_INSTRUMENT_CLASS(vl::IndexIteratorElements<TArray>, IndexIteratorAbstract)
00129
00130 public:
00131 IndexIteratorElements()
00132 {
00133 VL_DEBUG_SET_OBJECT_NAME()
00134 initialize( NULL, NULL, NULL, 0, false, 0 );
00135 }
00136
00137 void initialize( const TArray* idx_array, const std::vector<GLint>* p_base_vertices, const std::vector<GLsizei>* p_vert_counts,
00138 int base_vert, bool prim_restart_on, unsigned int prim_restart_idx )
00139 {
00140 mArray = idx_array;
00141 mBaseVert = base_vert;
00142 mpBaseVertices = p_base_vertices;
00143 mpVertCounts = p_vert_counts;
00144 mBaseCount = 0;
00145 mBaseIdx = 0;
00146
00147 mPrimRestartEnabled = prim_restart_on;
00148 mPrimRestartIdx = prim_restart_idx;
00149 mCurPos = 0;
00150 if (mArray && mArray->size())
00151 {
00152 mIndex = mArray->at(0) + mBaseVert;
00153 }
00154
00155 if (p_vert_counts)
00156 {
00157 VL_CHECK(p_base_vertices)
00158 VL_CHECK( p_base_vertices->size() == p_vert_counts->size() )
00159
00160 mBaseCount = (*p_vert_counts)[mBaseIdx];
00161
00162 mIndex = (*mpBaseVertices)[mBaseIdx];
00163 }
00164 }
00165
00166 virtual bool hasNext() const
00167 {
00168 return mCurPos != (int)mArray->size();
00169 }
00170
00171 virtual bool next()
00172 {
00173 ++mCurPos;
00174 while( mCurPos < (int)mArray->size() && mArray->at(mCurPos) == mPrimRestartIdx && mPrimRestartEnabled )
00175 ++mCurPos;
00176 if ( mCurPos < (int)mArray->size() )
00177 {
00178 mIndex = mArray->at(mCurPos) + mBaseVert;
00179 if (mpVertCounts)
00180 {
00181 VL_CHECK(mpBaseVertices)
00182 mBaseCount--;
00183 if (!mBaseCount)
00184 {
00185 mBaseIdx++;
00186 mBaseCount = (*mpVertCounts)[mBaseIdx];
00187 }
00188 mIndex += (*mpBaseVertices)[mBaseIdx];
00189 }
00190
00191 return true;
00192 }
00193 else
00194 {
00195 mIndex = -1;
00196 mCurPos = (int)mArray->size();
00197 return false;
00198 }
00199 }
00200
00201 protected:
00202 const TArray* mArray;
00203 int mBaseVert;
00204 int mCurPos;
00205 bool mPrimRestartEnabled;
00206 unsigned int mPrimRestartIdx;
00207 const std::vector<GLint>* mpBaseVertices;
00208 const std::vector<GLsizei>* mpVertCounts;
00209 int mBaseCount;
00210 int mBaseIdx;
00211 };
00212
00213 }
00214
00215 #endif