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

Added handling of DrawArrayLengths? PrimitiveSet?.

Files:
1 modified

Legend:

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

    r3209 r3326  
    209209    { 
    210210        osg::ref_ptr<osg::PrimitiveSet> primitive = _Contours[primNo].get(); 
    211         if (_ttype==TESS_TYPE_POLYGONS || _ttype==TESS_TYPE_DRAWABLE) { 
    212             if (primitive->getMode()==osg::PrimitiveSet::POLYGON ||_ttype==TESS_TYPE_DRAWABLE)  { 
    213                 beginTesselation(); 
    214                 addContour(primitive.get(), vertices); 
    215                 endTesselation(); 
    216  
    217                 collectTesselation(geom); 
    218             } else { // copy the contour primitive as it is not being tesselated 
     211        if (_ttype==TESS_TYPE_POLYGONS || _ttype==TESS_TYPE_DRAWABLE) 
     212        { 
     213            if (primitive->getMode()==osg::PrimitiveSet::POLYGON || _ttype==TESS_TYPE_DRAWABLE) 
     214            { 
     215 
     216                if (primitive->getType()==osg::PrimitiveSet::DrawArrayLengthsPrimitiveType) 
     217                { 
     218                    osg::DrawArrayLengths* drawArrayLengths = static_cast<osg::DrawArrayLengths*>(primitive.get()); 
     219                    unsigned int first = drawArrayLengths->getFirst();  
     220                    for(osg::DrawArrayLengths::iterator itr=drawArrayLengths->begin(); 
     221                        itr!=drawArrayLengths->end(); 
     222                        ++itr) 
     223                    { 
     224                        beginTesselation(); 
     225                            unsigned int last = first + *itr; 
     226                            addContour(primitive->getMode(),first,last,vertices); 
     227                            first = last; 
     228                        endTesselation(); 
     229                        collectTesselation(geom); 
     230                    } 
     231                } 
     232                else 
     233                { 
     234                    beginTesselation(); 
     235                        addContour(primitive.get(), vertices); 
     236                    endTesselation(); 
     237                    collectTesselation(geom); 
     238                } 
     239 
     240            } 
     241            else 
     242            { // copy the contour primitive as it is not being tesselated 
    219243                geom.addPrimitiveSet(primitive.get()); 
    220244            } 
     
    242266} 
    243267 
     268void Tesselator::addContour(GLenum mode, unsigned int first, unsigned int last, osg::Vec3Array* vertices) 
     269{ 
     270    beginContour(); 
     271 
     272    unsigned int idx=0; 
     273    unsigned int nperprim=0; // number of vertices per primitive 
     274    if (mode==osg::PrimitiveSet::QUADS) nperprim=4; 
     275    else if (mode==osg::PrimitiveSet::TRIANGLES) nperprim=3; 
     276 
     277    unsigned int i; 
     278    switch (mode) 
     279    { 
     280    case osg::PrimitiveSet::QUADS: 
     281    case osg::PrimitiveSet::TRIANGLES: 
     282    case osg::PrimitiveSet::POLYGON: 
     283    case osg::PrimitiveSet::LINE_LOOP: 
     284    case osg::PrimitiveSet::TRIANGLE_FAN: 
     285        { 
     286            for(i=first;i<last;++i, idx++) 
     287            { 
     288                addVertex(&((*vertices)[i])); 
     289                if (nperprim>0 && i<last-1 && idx%nperprim==nperprim-1) { 
     290                    endContour(); 
     291                    beginContour(); 
     292                } 
     293            } 
     294        } 
     295        break; 
     296    case osg::PrimitiveSet::QUAD_STRIP: 
     297        { // always has an even number of vertices 
     298            for(i=first;i<last;i+=2) 
     299            { // 0,2,4... 
     300                addVertex(&((*vertices)[i])); 
     301            } 
     302            for(i=last-1;i>=first;i-=2) 
     303            { // ...5,3,1 
     304                addVertex(&((*vertices)[i])); 
     305            } 
     306        } 
     307        break; 
     308    case osg::PrimitiveSet::TRIANGLE_STRIP: 
     309        { 
     310            for( i=first;i<last;i+=2) 
     311            {// 0,2,4,... 
     312                addVertex(&((*vertices)[i])); 
     313            } 
     314            for(i=((last-first)%2)?(last-2):(last-1) ;i>first&& i<last;i-=2) 
     315            { 
     316                addVertex(&((*vertices)[i])); 
     317            } 
     318        } 
     319        break; 
     320    default: // lines, points, line_strip 
     321        { 
     322            for(i=first;i<last;++i, idx++) 
     323            { 
     324                addVertex(&((*vertices)[i])); 
     325                if (nperprim>0 && i<last-1 && idx%nperprim==nperprim-1) { 
     326                    endContour(); 
     327                    beginContour(); 
     328                } 
     329            } 
     330        } 
     331        break; 
     332    } 
     333 
     334    endContour(); 
     335} 
     336 
    244337void Tesselator::addContour(osg::PrimitiveSet* primitive, osg::Vec3Array* vertices) 
    245338{ 
    246339    // adds a single primitive as a contour. 
    247     beginContour(); 
    248340    unsigned int nperprim=0; // number of vertices per primitive 
    249341    if (primitive->getMode()==osg::PrimitiveSet::QUADS) nperprim=4; 
     
    255347    case(osg::PrimitiveSet::DrawArraysPrimitiveType): 
    256348        { 
    257             unsigned int i; 
    258349            osg::DrawArrays* drawArray = static_cast<osg::DrawArrays*>(primitive); 
    259350            unsigned int first = drawArray->getFirst();  
    260351            unsigned int last = first+drawArray->getCount(); 
    261  
    262             switch (primitive->getMode()) { 
    263             case osg::PrimitiveSet::QUADS: 
    264             case osg::PrimitiveSet::TRIANGLES: 
    265             case osg::PrimitiveSet::POLYGON: 
    266             case osg::PrimitiveSet::LINE_LOOP: 
    267             case osg::PrimitiveSet::TRIANGLE_FAN: 
    268                 { 
    269                     for(i=first;i<last;++i, idx++) 
    270                     { 
    271                         addVertex(&((*vertices)[i])); 
    272                         if (nperprim>0 && i<last-1 && idx%nperprim==nperprim-1) { 
    273                             endContour(); 
    274                             beginContour(); 
    275                         } 
    276                     } 
    277                 } 
    278                 break; 
    279             case osg::PrimitiveSet::QUAD_STRIP: 
    280                 { // always has an even number of vertices 
    281                     for( i=first;i<last;i+=2) 
    282                     { // 0,2,4... 
    283                         addVertex(&((*vertices)[i])); 
    284                     } 
    285                     for(i=last-1;i>=first;i-=2) 
    286                     { // ...5,3,1 
    287                         addVertex(&((*vertices)[i])); 
    288                     } 
    289                 } 
    290                 break; 
    291             case osg::PrimitiveSet::TRIANGLE_STRIP: 
    292                 { 
    293                     for( i=first;i<last;i+=2) 
    294                     {// 0,2,4,... 
    295                         addVertex(&((*vertices)[i])); 
    296                     } 
    297                     for(i=((last-first)%2)?(last-2):(last-1) ;i>first&& i<last;i-=2) 
    298                     { 
    299                         addVertex(&((*vertices)[i])); 
    300                     } 
    301                 } 
    302                 break; 
    303             default: // lines, points, line_strip 
    304                 { 
    305                     for(i=first;i<last;++i, idx++) 
    306                     { 
    307                         addVertex(&((*vertices)[i])); 
    308                         if (nperprim>0 && i<last-1 && idx%nperprim==nperprim-1) { 
    309                             endContour(); 
    310                             beginContour(); 
    311                         } 
    312                     } 
    313                 } 
    314                 break; 
    315             } 
     352            addContour(primitive->getMode(),first,last,vertices); 
    316353            break; 
    317         } 
     354         } 
    318355    case(osg::PrimitiveSet::DrawElementsUBytePrimitiveType): 
    319356        { 
     357            beginContour(); 
    320358            osg::DrawElementsUByte* drawElements = static_cast<osg::DrawElementsUByte*>(primitive); 
    321359            for(osg::DrawElementsUByte::iterator indexItr=drawElements->begin(); 
    322             indexItr!=drawElements->end(); 
    323             ++indexItr, idx++) 
     360                indexItr!=drawElements->end(); 
     361                ++indexItr, idx++) 
    324362            { 
    325363                addVertex(&((*vertices)[*indexItr])); 
     
    329367                } 
    330368            } 
     369            endContour(); 
    331370            break; 
    332371        } 
    333372    case(osg::PrimitiveSet::DrawElementsUShortPrimitiveType): 
    334373        { 
     374            beginContour(); 
    335375            osg::DrawElementsUShort* drawElements = static_cast<osg::DrawElementsUShort*>(primitive); 
    336376            for(osg::DrawElementsUShort::iterator indexItr=drawElements->begin(); 
    337             indexItr!=drawElements->end(); 
    338             ++indexItr, idx++) 
     377                indexItr!=drawElements->end(); 
     378                ++indexItr, idx++) 
    339379            { 
    340380                addVertex(&((*vertices)[*indexItr])); 
     
    344384                } 
    345385            } 
     386            endContour(); 
    346387            break; 
    347388        } 
    348389    case(osg::PrimitiveSet::DrawElementsUIntPrimitiveType): 
    349390        { 
     391            beginContour(); 
    350392            osg::DrawElementsUInt* drawElements = static_cast<osg::DrawElementsUInt*>(primitive); 
    351393            for(osg::DrawElementsUInt::iterator indexItr=drawElements->begin(); 
    352             indexItr!=drawElements->end(); 
    353             ++indexItr, idx++) 
     394                indexItr!=drawElements->end(); 
     395                ++indexItr, idx++) 
    354396            { 
    355397                addVertex(&((*vertices)[*indexItr])); 
     
    359401                } 
    360402            } 
     403            endContour(); 
    361404            break; 
    362405        } 
    363406    default: 
     407        osg::notify(osg::NOTICE)<<"Tesselator::addContour(primitive, vertices) : Primitive type "<<primitive->getType()<<" not handled"<<std::endl; 
    364408        break; 
    365409    } 
    366410     
    367     endContour(); 
    368411} 
    369412 
     
    400443        osg::Geometry::ArrayList& tcal = geom.getTexCoordArrayList(); 
    401444        for(osg::Geometry::ArrayList::iterator tcalItr=tcal.begin(); 
    402         tcalItr!=tcal.end(); 
    403         ++tcalItr) 
     445            tcalItr!=tcal.end(); 
     446            ++tcalItr) 
    404447        { 
    405448            if (tcalItr->array.valid())  
     
    411454        // now add any new vertices that are required. 
    412455        for(NewVertexList::iterator itr=_newVertexList.begin(); 
    413         itr!=_newVertexList.end(); 
    414         ++itr) 
     456            itr!=_newVertexList.end(); 
     457            ++itr) 
    415458        { 
    416459            NewVertex& newVertex = (*itr);