Show
Ignore:
Timestamp:
05/27/08 17:28:39 (6 years ago)
Author:
robert
Message:

Introduced a TerrainHandler? that adjust the sameple ratio and vertical scale
of terrain interactively using the 'r','R' and 'v','V' keys respecitvely.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp

    r8186 r8366  
    182182 
    183183 
     184// class to handle events with a pick 
     185class TerrainHandler : public osgGA::GUIEventHandler { 
     186public:  
     187 
     188    TerrainHandler(osgTerrain::Terrain* terrain): 
     189        _terrain(terrain) {} 
     190     
     191    bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa) 
     192    { 
     193        switch(ea.getEventType()) 
     194        { 
     195            case(osgGA::GUIEventAdapter::KEYDOWN): 
     196            {    
     197                if (ea.getKey()=='r') 
     198                { 
     199                    _terrain->setSampleRatio(_terrain->getSampleRatio()*0.5); 
     200                    osg::notify(osg::NOTICE)<<"Sample ratio "<<_terrain->getSampleRatio()<<std::endl; 
     201                    return true; 
     202                } 
     203                else if (ea.getKey()=='R') 
     204                { 
     205                    _terrain->setSampleRatio(_terrain->getSampleRatio()/0.5); 
     206                    osg::notify(osg::NOTICE)<<"Sample ratio "<<_terrain->getSampleRatio()<<std::endl; 
     207                    return true; 
     208                } 
     209                else if (ea.getKey()=='v') 
     210                { 
     211                    _terrain->setVerticalScale(_terrain->getVerticalScale()*1.25); 
     212                    osg::notify(osg::NOTICE)<<"Vertical scale "<<_terrain->getVerticalScale()<<std::endl; 
     213                    return true; 
     214                } 
     215                else if (ea.getKey()=='V') 
     216                { 
     217                    _terrain->setVerticalScale(_terrain->getVerticalScale()/1.25); 
     218                    osg::notify(osg::NOTICE)<<"Vertical scale "<<_terrain->getVerticalScale()<<std::endl; 
     219                    return true; 
     220                } 
     221 
     222                return false; 
     223            }     
     224            default: 
     225                return false; 
     226        } 
     227    } 
     228     
     229protected: 
     230 
     231    ~TerrainHandler() {} 
     232 
     233    osg::ref_ptr<osgTerrain::Terrain>  _terrain; 
     234}; 
     235 
    184236int main( int argc, char **argv ) 
    185237{ 
     
    189241    // construct the viewer. 
    190242    osgViewer::Viewer viewer(arguments); 
     243     
     244    float verticalScale = 1.0f; 
     245    while(arguments.read("-v",verticalScale)) {} 
     246     
     247    float sampleRatio = 1.0f; 
     248    while(arguments.read("-r",sampleRatio)) {} 
    191249 
    192250 
     
    260318            terrain = new osgTerrain::Terrain; 
    261319            terrain->addChild(rootnode); 
    262             terrain->setSampleRatio(0.25f); 
    263320 
    264321            rootnode = terrain; 
    265322        }     
     323 
     324        terrain->setSampleRatio(sampleRatio); 
     325        terrain->setVerticalScale(verticalScale); 
     326 
     327        // register our custom handler for adjust Terrain settings         
     328        viewer.addEventHandler(new TerrainHandler(terrain)); 
    266329 
    267330        osg::CoordinateSystemNode* csn = findTopMostNodeOfType<osg::CoordinateSystemNode>(rootnode);