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
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include <stdlib.h>
00044 #include <stdio.h>
00045
00046 #include "OSGConfig.h"
00047 #include "OSGNodePtr.h"
00048 #include "OSGTriangleIterator.h"
00049
00050 OSG_USING_NAMESPACE
00051
00052
00053
00054
00055
00056
00067 #if !defined(OSG_DO_DOC) || defined(OSG_DOC_DEV)
00068
00084 #endif // only include in dev docs
00085
00086
00087
00088
00089
00090
00091 char TriangleIterator::cvsid[] = "@(#)$Id: OSGTriangleIterator.cpp,v 1.13 2001/10/15 04:52:16 vossg Exp $";
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 TriangleIterator::TriangleIterator(void) : PrimitiveIterator(),
00104 _triIndex(0), _actPrimIndex(0), _triPntIndex()
00105 {
00106 }
00107
00108 TriangleIterator::TriangleIterator(const TriangleIterator &source) :
00109 PrimitiveIterator(source),
00110 _triIndex(source._triIndex), _actPrimIndex(source._actPrimIndex),
00111 _triPntIndex()
00112 {
00113 _triPntIndex[0] = source._triPntIndex[0];
00114 _triPntIndex[1] = source._triPntIndex[1];
00115 _triPntIndex[2] = source._triPntIndex[2];
00116 }
00117
00118
00124 TriangleIterator::TriangleIterator(const GeometryPtr& geo) :
00125 PrimitiveIterator(),
00126 _triIndex(0), _actPrimIndex(0), _triPntIndex()
00127 {
00128 setGeo(geo);
00129 }
00130
00131
00138 TriangleIterator::TriangleIterator(const NodePtr& geo) :
00139 PrimitiveIterator(),
00140 _triIndex(0), _actPrimIndex(0), _triPntIndex()
00141 {
00142 setGeo(geo);
00143 }
00144
00145
00146 TriangleIterator::~TriangleIterator(void)
00147 {
00148 }
00149
00150
00151
00155 void TriangleIterator::operator++()
00156 {
00157
00158 if(isAtEnd())
00159 return;
00160
00161 ++_triIndex;
00162
00163
00164 if(_actPrimIndex >= getLength())
00165 {
00166 ++(static_cast<PrimitiveIterator&>(*this));
00167 startPrim();
00168
00169 return;
00170 }
00171
00172 switch(getType())
00173 {
00174 case GL_TRIANGLES: _triPntIndex[0] = _actPrimIndex++;
00175 _triPntIndex[1] = _actPrimIndex++;
00176 _triPntIndex[2] = _actPrimIndex++;
00177 break;
00178 case GL_QUAD_STRIP:
00179 case GL_TRIANGLE_STRIP: if(_actPrimIndex & 1)
00180 {
00181 _triPntIndex[0] = _triPntIndex[2];
00182 }
00183 else
00184 {
00185 _triPntIndex[1] = _triPntIndex[2];
00186 }
00187 _triPntIndex[2] = _actPrimIndex++;
00188
00189 if(getPositionIndex(0) == getPositionIndex(1) ||
00190 getPositionIndex(0) == getPositionIndex(2) ||
00191 getPositionIndex(1) == getPositionIndex(2))
00192 {
00193 --_triIndex;
00194 ++(*this);
00195 }
00196
00197 break;
00198 case GL_POLYGON:
00199 case GL_TRIANGLE_FAN: _triPntIndex[1] = _triPntIndex[2];
00200 _triPntIndex[2] = _actPrimIndex++;
00201 break;
00202 case GL_QUADS: if(_actPrimIndex & 1)
00203 {
00204 _triPntIndex[1] = _triPntIndex[2];
00205 _triPntIndex[2] = _actPrimIndex++;
00206 }
00207 else
00208 {
00209 _triPntIndex[0] = _actPrimIndex++;
00210 _triPntIndex[1] = _actPrimIndex++;
00211 _triPntIndex[2] = _actPrimIndex++;
00212 }
00213 break;
00214 default: SWARNING << "TriangleIterator::++: encountered "
00215 << "unknown primitive type "
00216 << getType()
00217 << ", ignoring!" << std::endl;
00218 startPrim();
00219 break;
00220 }
00221 }
00222
00223
00228 void TriangleIterator::startPrim(void)
00229 {
00230
00231 if(isAtEnd())
00232 return;
00233
00234 _triPntIndex[0] = 0;
00235 _triPntIndex[1] = 1;
00236 _triPntIndex[2] = 2;
00237 _actPrimIndex = 3;
00238
00239
00240 while(! isAtEnd())
00241 {
00242 switch(getType())
00243 {
00244 case GL_POINTS:
00245 case GL_LINES:
00246 case GL_LINE_STRIP:
00247 case GL_LINE_LOOP:
00248 break;
00249 case GL_TRIANGLES:
00250 case GL_TRIANGLE_STRIP:
00251 case GL_TRIANGLE_FAN:
00252 case GL_QUADS:
00253 case GL_QUAD_STRIP:
00254 case GL_POLYGON: if(getLength() >= 3)
00255 return;
00256 break;
00257 default: SWARNING << "TriangleIterator::startPrim: "
00258 << "encountered "
00259 << "unknown primitive type "
00260 << getType()
00261 << ", ignoring!" << std::endl;
00262 break;
00263 }
00264
00265 ++(static_cast<PrimitiveIterator&>(*this));
00266 }
00267 }
00268
00269
00276 void TriangleIterator::seek(Int32 index)
00277 {
00278 setToBegin();
00279
00280 while(getIndex() != index)
00281 ++(*this);
00282 }
00283
00284
00289 void TriangleIterator::setToBegin(void)
00290 {
00291 PrimitiveIterator::setToBegin();
00292 _triIndex = 0;
00293 startPrim();
00294 }
00295
00300 void TriangleIterator::setToEnd(void)
00301 {
00302 PrimitiveIterator::setToEnd();
00303 _actPrimIndex = 0;
00304 }
00305
00306
00307
00308 TriangleIterator& TriangleIterator::operator =(const TriangleIterator &source)
00309 {
00310 if(this == &source)
00311 return *this;
00312
00313 *static_cast<Inherited *>(this) = source;
00314
00315 this->_triIndex = source._triIndex;
00316 this->_actPrimIndex = source._actPrimIndex;
00317 this->_triPntIndex[0] = source._triPntIndex[0];
00318 this->_triPntIndex[1] = source._triPntIndex[1];
00319 this->_triPntIndex[2] = source._triPntIndex[2];
00320
00321 return *this;
00322 }
00323
00324
00325
00326 bool TriangleIterator::operator <(const TriangleIterator &other) const
00327 {
00328 return
00329 (*static_cast<const Inherited *>(this) < other) ||
00330 ( (*static_cast<const Inherited *>(this) == other) &&
00331 _actPrimIndex < other._actPrimIndex);
00332 }
00333
00334 bool TriangleIterator::operator ==(const TriangleIterator &other) const
00335 {
00336 if(isAtEnd() && other.isAtEnd())
00337 return true;
00338
00339 if(isAtEnd() || other.isAtEnd())
00340 return false;
00341
00342 return
00343 (*static_cast<const Inherited *>(this) == other ) &&
00344 _actPrimIndex == other._actPrimIndex;
00345 }
00346
00347 bool TriangleIterator::operator !=(const TriangleIterator &other) const
00348 {
00349 return !(*this == other);
00350 }