Changeset 6583

Show
Ignore:
Timestamp:
05/02/07 15:58:38
Author:
robert
Message:

Introduced new tesslation technique that adjusts the triangulation so that the
diagonal goes between the corners with least vertical deviation.

Files:

Legend:

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

    r6573 r6583  
    2424#include <osg/TexEnvCombine> 
    2525#include <osg/Program> 
     26#include <osg/Math> 
    2627 
    2728using namespace osgTerrain; 
     
    176177    } 
    177178 
    178     osg::FloatArray* _elevations = 0
     179    osg::FloatArray* _elevations = new osg::FloatArray(numVertices)
    179180    osg::TransferFunction1D* tf = dynamic_cast<osg::TransferFunction1D*>(colorTF); 
    180181    if (tf) 
     
    185186        if (!colorLayer) 
    186187        { 
    187             _elevations = new osg::FloatArray(numVertices); 
     188            // _elevations = new osg::FloatArray(numVertices); 
    188189            if (_terrainGeometry.valid()) _terrainGeometry->setTexCoords(tf_index, _elevations); 
    189190            if (_geometry.valid()) _geometry->setTexCoordArray(tf_index, _elevations); 
     
    258259    } 
    259260 
     261 
    260262    // populate primitive sets 
    261     // _primitiveSets.clear(); 
    262     for(j=0; j<numRows-1; ++j) 
    263     { 
    264         osg::DrawElementsUInt* elements = new osg::DrawElementsUInt(GL_TRIANGLE_STRIP, numColumns*2); 
    265         for(unsigned int i=0; i<numColumns; ++i) 
    266         { 
    267             unsigned int iv = j*numColumns + i; 
    268             (*elements)[i*2] = iv + numColumns; 
    269             (*elements)[i*2+1] = iv; 
    270         } 
     263    bool optimizeOrientations = _elevations!=0; 
     264     
     265    if (!optimizeOrientations) 
     266    { 
     267        osg::notify(osg::NOTICE)<<"Old tesselation"<<std::endl; 
     268        for(j=0; j<numRows-1; ++j) 
     269        { 
     270            osg::DrawElementsUInt* elements = new osg::DrawElementsUInt(GL_TRIANGLE_STRIP, numColumns*2); 
     271            for(unsigned int i=0; i<numColumns; ++i) 
     272            { 
     273                unsigned int iv = j*numColumns + i; 
     274                (*elements)[i*2] = iv + numColumns; 
     275                (*elements)[i*2+1] = iv; 
     276            } 
     277 
     278            if (_terrainGeometry.valid()) _terrainGeometry->addPrimitiveSet(elements); 
     279 
     280            if (_geometry.valid()) _geometry->addPrimitiveSet(elements); 
     281        } 
     282    } 
     283    else 
     284    { 
     285        osg::notify(osg::NOTICE)<<"New tesselation"<<std::endl; 
     286     
     287        osg::DrawElementsUInt* elements = new osg::DrawElementsUInt(GL_TRIANGLES); 
     288        elements->reserve((numRows-1) * (numColumns-1) * 6); 
    271289         
    272290        if (_terrainGeometry.valid()) _terrainGeometry->addPrimitiveSet(elements); 
    273  
    274291        if (_geometry.valid()) _geometry->addPrimitiveSet(elements); 
     292 
     293        for(j=0; j<numRows-1; ++j) 
     294        { 
     295            for(unsigned int i=0; i<numColumns-1; ++i) 
     296            { 
     297                unsigned int i00 = j*numColumns + i; 
     298                unsigned int i10 = i00+1; 
     299                unsigned int i01 = i00+numColumns; 
     300                unsigned int i11 = i01+1; 
     301                float e00 = (*_elevations)[i00]; 
     302                float e10 = (*_elevations)[i10]; 
     303                float e01 = (*_elevations)[i01]; 
     304                float e11 = (*_elevations)[i11]; 
     305                 
     306                if (fabsf(e00-e11)<fabsf(e01-e10)) 
     307                { 
     308                    elements->push_back(i01); 
     309                    elements->push_back(i00); 
     310                    elements->push_back(i11); 
     311 
     312                    elements->push_back(i00); 
     313                    elements->push_back(i10); 
     314                    elements->push_back(i11); 
     315                } 
     316                else 
     317                { 
     318                    elements->push_back(i01); 
     319                    elements->push_back(i00); 
     320                    elements->push_back(i10); 
     321 
     322                    elements->push_back(i01); 
     323                    elements->push_back(i10); 
     324                    elements->push_back(i11); 
     325                } 
     326            } 
     327        } 
    275328    } 
    276329