Show
Ignore:
Timestamp:
08/27/04 10:03:26 (10 years ago)
Author:
robert
Message:

Added handling of short (<=4 points) polygons as tri fans and the rest
as polygons which are tesselated, to improve load and build time, yet
still resselating the large polygons that need it.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgPlugins/obj/ReaderWriterOBJ.cpp

    r3325 r3327  
    269269    } 
    270270 
     271    // #define USE_DRAWARRAYLENGTHS 
     272 
    271273    if (numPolygonElements>0) 
    272274    { 
    273275        unsigned int startPos = vertices->size(); 
    274         osg::DrawArrayLengths* drawArrayLengths = new osg::DrawArrayLengths(GL_POLYGON,startPos); 
     276         
     277        #ifdef USE_DRAWARRAYLENGTHS 
     278            osg::DrawArrayLengths* drawArrayLengths = new osg::DrawArrayLengths(GL_POLYGON,startPos); 
     279            geometry->addPrimitiveSet(drawArrayLengths); 
     280        #endif 
    275281 
    276282        for(itr=elementList.begin(); 
     
    281287            if (element.dataType==obj::Element::POLYGON) 
    282288            { 
    283                 drawArrayLengths->push_back(element.vertexIndices.size()); 
     289 
     290                #ifdef USE_DRAWARRAYLENGTHS 
     291                    drawArrayLengths->push_back(element.vertexIndices.size()); 
     292                #else 
     293                    if (element.vertexIndices.size()>4) 
     294                    { 
     295                        osg::DrawArrays* drawArrays = new osg::DrawArrays(GL_POLYGON,startPos,element.vertexIndices.size()); 
     296                        startPos += element.vertexIndices.size(); 
     297                        geometry->addPrimitiveSet(drawArrays); 
     298                    } 
     299                    else 
     300                    { 
     301                        osg::DrawArrays* drawArrays = new osg::DrawArrays(GL_TRIANGLE_FAN,startPos,element.vertexIndices.size()); 
     302                        startPos += element.vertexIndices.size(); 
     303                        geometry->addPrimitiveSet(drawArrays); 
     304                    } 
     305                #endif 
     306 
    284307             
    285308                if (model.needReverse(element)) 
     
    342365        } 
    343366 
    344         geometry->addPrimitiveSet(drawArrayLengths); 
    345367 
    346368    } 
     
    376398            osg::StateSet* stateset = materialToSetSetMap[es.materialName].get(); 
    377399            geometry->setStateSet(stateset); 
    378  
    379 //            osgUtil::Tesselator tesselator; 
    380 //            tesselator.retesselatePolygons(*geometry); 
    381  
     400         
     401            // tesseleate any large polygons 
     402            osgUtil::Tesselator tesselator; 
     403            tesselator.retesselatePolygons(*geometry); 
     404 
     405            // tri strip polygons to improve graphics peformance 
    382406            osgUtil::TriStripVisitor tsv; 
    383407            tsv.stripify(*geometry); 
    384408 
     409            // if no normals present add them. 
    385410            if (!geometry->getNormalArray() || geometry->getNormalArray()->getNumElements()==0) 
    386411            {