Show
Ignore:
Timestamp:
11/19/09 12:16:58 (5 years ago)
Author:
robert
Message:

From Fabien Lavignotte, "I have used the osgUtil::DelaunayTriangulator? to insert roads into a
terrain. The triangulator is quite tricky to use properly but works
quite well, constraint triangulation is not an easy task... I have
encounter some crash during the development that the following patch
fix.
The two fixes are :

  • Fix in removeVerticesInside() : needs to take into account UByte and

UShort version of DrawElements? to avoid a crash later

  • Fix a crash in triangulate() : detect degenerate adjacency case to

exit early form the adjacent triangle traversal loop to avoid a crash
later"

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgUtil/DelaunayTriangulator.cpp

    r10764 r10777  
    614614} 
    615615 
     616template <typename TVector> 
     617void removeIndices( TVector& elements, unsigned int index ) 
     618{ 
     619    typename TVector::iterator itr = elements.begin(); 
     620    while ( itr != elements.end() ) 
     621    { 
     622        if ( (*itr)==index ) 
     623        { // remove entirely 
     624            itr = elements.erase(itr); 
     625        } 
     626        else 
     627        { 
     628            if ((*itr)>index) --(*itr); // move indices down 1 
     629            ++itr; // next index 
     630        } 
     631    } 
     632 } 
     633 
    616634void DelaunayConstraint::removeVerticesInside(const DelaunayConstraint *dco) 
    617635{    /** remove vertices from this which are internal to dco. 
     
    632650                { 
    633651                    osg::PrimitiveSet* prset=getPrimitiveSet(ipr); 
    634                     osg::DrawElementsUShort *dsup=dynamic_cast<osg::DrawElementsUShort *>(prset); 
    635                     if (dsup) { 
    636                         for (osg::DrawElementsUShort::iterator usitr=dsup->begin(); usitr!=dsup->end(); ) 
    637                         { 
    638                             if ((*usitr)==idx) 
    639                             { // remove entirely 
    640                                 usitr=dsup->erase(usitr); 
    641                             } 
    642                             else 
    643                             { 
    644                                 if ((*usitr)>idx) (*usitr)--; // move indices down 1 
    645                                 usitr++; // next index 
    646                             } 
    647                         } 
    648                     } 
    649                     else 
     652                    switch (prset->getType()) 
    650653                    { 
     654                    case osg::PrimitiveSet::DrawElementsUBytePrimitiveType: 
     655                        removeIndices( *static_cast<osg::DrawElementsUByte *>(prset), idx ); 
     656                        break; 
     657                    case osg::PrimitiveSet::DrawElementsUShortPrimitiveType: 
     658                        removeIndices( *static_cast<osg::DrawElementsUShort *>(prset), idx ); 
     659                        break; 
     660                    case osg::PrimitiveSet::DrawElementsUIntPrimitiveType: 
     661                        removeIndices( *static_cast<osg::DrawElementsUInt *>(prset), idx ); 
     662                        break; 
     663                    default: 
    651664                        osg::notify(osg::WARN) << "Invalid prset " <<ipr<< " tp " << prset->getType() << " types PrimitiveType,DrawArraysPrimitiveType=1 etc" << std::endl; 
     665                        break; 
    652666                    } 
    653667                } 
     
    10381052                                                    if (!tradj->usesVertex(ip2)) osg::notify(osg::WARN) << "tradj error " << tradj->a()<<  " , " << tradj->b()<<  " , " << tradj->c()<< std::endl; 
    10391053                                                } 
     1054                                                const Triangle *previousTradj = tradj; 
    10401055                                                tradj=getTriangleWithEdge(e2,e1, &triangles); 
     1056                                                if (tradj == previousTradj) { 
     1057                                                    tradj = 0; 
     1058                                                } 
    10411059                                            } 
    10421060                                            if (trisToDelete.size()>=900) {