Show
Ignore:
Timestamp:
03/25/09 12:17:21 (4 years ago)
Author:
robert
Message:

Added new virtual reseveElements, setElement, getElment and addElement methods to DrawElements?
to make is easier to write code that can work on DrawElementUByte, UShort or UInt.

Changed the osgTerrain::GeometryTechnique? so that it automatically chooses
the use of DrawElementUShort or DrawElementsUInt accordining to the size of the tile.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgTerrain/GeometryTechnique.cpp

    r9388 r9969  
    417417//    bool optimizeOrientations = elevations!=0; 
    418418    bool swapOrientation = !(masterLocator->orientationOpenGL()); 
    419      
    420     osg::ref_ptr<osg::DrawElementsUInt> elements = new osg::DrawElementsUInt(GL_TRIANGLES); 
    421     elements->reserve((numRows-1) * (numColumns-1) * 6); 
     419 
     420    bool smallTile = numVertices <= 16384; 
     421 
     422    // osg::notify(osg::NOTICE)<<"smallTile = "<<smallTile<<std::endl; 
     423     
     424    osg::ref_ptr<osg::DrawElements> elements = smallTile ?  
     425        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_TRIANGLES)) : 
     426        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_TRIANGLES)); 
     427         
     428    elements->reserveElements((numRows-1) * (numColumns-1) * 6); 
    422429 
    423430    geometry->addPrimitiveSet(elements.get()); 
     
    464471                if (fabsf(e00-e11)<fabsf(e01-e10)) 
    465472                { 
    466                     elements->push_back(i01); 
    467                     elements->push_back(i00); 
    468                     elements->push_back(i11); 
    469  
    470                     elements->push_back(i00); 
    471                     elements->push_back(i10); 
    472                     elements->push_back(i11); 
     473                    elements->addElement(i01); 
     474                    elements->addElement(i00); 
     475                    elements->addElement(i11); 
     476 
     477                    elements->addElement(i00); 
     478                    elements->addElement(i10); 
     479                    elements->addElement(i11); 
    473480                } 
    474481                else 
    475482                { 
    476                     elements->push_back(i01); 
    477                     elements->push_back(i00); 
    478                     elements->push_back(i10); 
    479  
    480                     elements->push_back(i01); 
    481                     elements->push_back(i10); 
    482                     elements->push_back(i11); 
     483                    elements->addElement(i01); 
     484                    elements->addElement(i00); 
     485                    elements->addElement(i10); 
     486 
     487                    elements->addElement(i01); 
     488                    elements->addElement(i10); 
     489                    elements->addElement(i11); 
    483490                } 
    484491            } 
    485492            else if (numValid==3) 
    486493            { 
    487                 if (i00>=0) elements->push_back(i00); 
    488                 if (i01>=0) elements->push_back(i01); 
    489                 if (i11>=0) elements->push_back(i11); 
    490                 if (i10>=0) elements->push_back(i10); 
     494                if (i00>=0) elements->addElement(i00); 
     495                if (i01>=0) elements->addElement(i01); 
     496                if (i11>=0) elements->addElement(i11); 
     497                if (i10>=0) elements->addElement(i10); 
    491498            } 
    492499             
     
    507514    if (createSkirt) 
    508515    { 
    509         osg::ref_ptr<osg::DrawElementsUShort> skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 
     516        osg::ref_ptr<osg::DrawElements> skirtDrawElements = smallTile ?  
     517            static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 
     518            static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 
    510519 
    511520        // create bottom skirt vertices 
     
    529538                } 
    530539                 
    531                 skirtDrawElements->push_back(orig_i); 
    532                 skirtDrawElements->push_back(new_i); 
     540                skirtDrawElements->addElement(orig_i); 
     541                skirtDrawElements->addElement(new_i); 
    533542            } 
    534543            else 
    535544            { 
    536                 if (!skirtDrawElements->empty()) 
     545                if (skirtDrawElements->getNumIndices()!=0) 
    537546                { 
    538547                    geometry->addPrimitiveSet(skirtDrawElements.get()); 
    539                     skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 
     548                    skirtDrawElements = smallTile ?  
     549                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 
     550                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 
    540551                } 
    541552                 
     
    543554        } 
    544555 
    545         if (!skirtDrawElements->empty()) 
     556        if (skirtDrawElements->getNumIndices()!=0) 
    546557        { 
    547558            geometry->addPrimitiveSet(skirtDrawElements.get()); 
    548             skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 
     559            skirtDrawElements = smallTile ?  
     560                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 
     561                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 
    549562        } 
    550563 
     
    567580                } 
    568581                 
    569                 skirtDrawElements->push_back(orig_i); 
    570                 skirtDrawElements->push_back(new_i); 
     582                skirtDrawElements->addElement(orig_i); 
     583                skirtDrawElements->addElement(new_i); 
    571584            } 
    572585            else 
    573586            { 
    574                 if (!skirtDrawElements->empty()) 
     587                if (skirtDrawElements->getNumIndices()!=0) 
    575588                { 
    576589                    geometry->addPrimitiveSet(skirtDrawElements.get()); 
    577                     skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 
     590                    skirtDrawElements = smallTile ?  
     591                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 
     592                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 
    578593                } 
    579594                 
     
    581596        } 
    582597 
    583         if (!skirtDrawElements->empty()) 
     598        if (skirtDrawElements->getNumIndices()!=0) 
    584599        { 
    585600            geometry->addPrimitiveSet(skirtDrawElements.get()); 
    586             skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 
     601            skirtDrawElements = smallTile ?  
     602                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 
     603                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 
    587604        } 
    588605 
     
    605622                } 
    606623                 
    607                 skirtDrawElements->push_back(orig_i); 
    608                 skirtDrawElements->push_back(new_i); 
     624                skirtDrawElements->addElement(orig_i); 
     625                skirtDrawElements->addElement(new_i); 
    609626            } 
    610627            else 
    611628            { 
    612                 if (!skirtDrawElements->empty()) 
     629                if (skirtDrawElements->getNumIndices()!=0) 
    613630                { 
    614631                    geometry->addPrimitiveSet(skirtDrawElements.get()); 
    615                     skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 
     632                    skirtDrawElements = smallTile ?  
     633                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 
     634                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 
    616635                } 
    617636                 
     
    619638        } 
    620639 
    621         if (!skirtDrawElements->empty()) 
     640        if (skirtDrawElements->getNumIndices()!=0) 
    622641        { 
    623642            geometry->addPrimitiveSet(skirtDrawElements.get()); 
    624             skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 
     643            skirtDrawElements = smallTile ?  
     644                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 
     645                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 
    625646        } 
    626647 
     
    643664                } 
    644665                 
    645                 skirtDrawElements->push_back(orig_i); 
    646                 skirtDrawElements->push_back(new_i); 
     666                skirtDrawElements->addElement(orig_i); 
     667                skirtDrawElements->addElement(new_i); 
    647668            } 
    648669            else 
    649670            { 
    650                 if (!skirtDrawElements->empty()) 
     671                if (skirtDrawElements->getNumIndices()!=0) 
    651672                { 
    652673                    geometry->addPrimitiveSet(skirtDrawElements.get()); 
     
    657678        } 
    658679 
    659         if (!skirtDrawElements->empty()) 
     680        if (skirtDrawElements->getNumIndices()!=0) 
    660681        { 
    661682            geometry->addPrimitiveSet(skirtDrawElements.get()); 
    662             skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP); 
     683            smallTile ?  
     684                static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) : 
     685                static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP)); 
    663686        } 
    664687    }