Changeset 8313

Show
Ignore:
Timestamp:
05/12/08 18:59:04
Author:
robert
Message:

Added signal handling code, and prelimary lat/long computation

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • OpenSceneGraph/trunk/applications/osgfilecache/CMakeLists.txt

    r8297 r8313  
    22SET(TARGET_SRC osgfilecache.cpp ) 
    33 
     4SET(TARGET_ADDED_LIBRARIES osgTerrain ) 
     5 
    46#### end var setup  ### 
    57SETUP_APPLICATION(osgfilecache) 
  • OpenSceneGraph/trunk/applications/osgfilecache/osgfilecache.cpp

    r8298 r8313  
    1313#include <osg/ArgumentParser> 
    1414#include <osg/ApplicationUsage> 
     15#include <osg/CoordinateSystemNode> 
     16#include <osg/io_utils> 
     17 
     18#include <osgTerrain/TerrainTile> 
    1519 
    1620#include <osgDB/Archive> 
     
    2226#include <algorithm> 
    2327 
     28#include <signal.h> 
     29 
     30static bool s_ExitApplication = false; 
     31 
    2432class LoadDataVisitor : public osg::NodeVisitor 
    2533{ 
    2634public: 
     35 
    2736 
    2837    LoadDataVisitor(unsigned int maxNumLevels=0): 
     
    3140        _currentLevel(0) {} 
    3241         
     42    void apply(osg::CoordinateSystemNode& cs) 
     43    { 
     44        std::cout<<"CoordinateSystemNode "<<std::endl; 
     45         
     46        if (!s_ExitApplication) traverse(cs); 
     47    } 
     48     
     49    void apply(osg::Group& group) 
     50    { 
     51        osgTerrain::TerrainTile* terrainTile = dynamic_cast<osgTerrain::TerrainTile*>(&group); 
     52        osgTerrain::Locator* locator = terrainTile ? terrainTile->getLocator() : 0; 
     53        if (locator) 
     54        { 
     55            std::cout<<"    Found terrain locator "<<locator<<std::endl; 
     56            osg::Vec3d l00(0.0,0.0,0.0); 
     57            osg::Vec3d l10(1.0,0.0,0.0); 
     58            osg::Vec3d l11(1.0,1.0,0.0); 
     59            osg::Vec3d l01(0.0,1.0,0.0); 
     60             
     61            osg::Vec3d w00, w10, w11, w01; 
     62             
     63            locator->convertLocalToModel(l00, w00); 
     64            locator->convertLocalToModel(l10, w10); 
     65            locator->convertLocalToModel(l11, w11); 
     66            locator->convertLocalToModel(l01, w01); 
     67             
     68            if (locator->getEllipsoidModel() && 
     69                locator->getCoordinateSystemType()==osgTerrain::Locator::GEOCENTRIC) 
     70            { 
     71                convertXYZToLatLongHeight(locator->getEllipsoidModel(), w00); 
     72                convertXYZToLatLongHeight(locator->getEllipsoidModel(), w10); 
     73                convertXYZToLatLongHeight(locator->getEllipsoidModel(), w11); 
     74                convertXYZToLatLongHeight(locator->getEllipsoidModel(), w01); 
     75            } 
     76 
     77            osg::notify(osg::NOTICE)<<"    w00 = "<<w00<<std::endl; 
     78            osg::notify(osg::NOTICE)<<"    w10 = "<<w10<<std::endl; 
     79            osg::notify(osg::NOTICE)<<"    w11 = "<<w11<<std::endl; 
     80            osg::notify(osg::NOTICE)<<"    w01 = "<<w01<<std::endl; 
     81        } 
     82         
     83        if (!s_ExitApplication) traverse(group); 
     84    } 
     85 
    3386    void apply(osg::PagedLOD& plod) 
    3487    { 
    3588        if (_currentLevel>_maxLevels) return; 
     89         
     90        if (s_ExitApplication) return; 
    3691     
    3792        ++_currentLevel; 
    3893     
    3994        std::cout<<"Found PagedLOD "<<plod.getNumFileNames()<<std::endl; 
     95         
     96        // first compute the bounds of this subgraph 
     97        for(unsigned int i=0; i<plod.getNumFileNames(); ++i) 
     98        { 
     99            if (plod.getFileName(i).empty()) 
     100            { 
     101                std::cout<<"  search local subgraph"<<std::endl; 
     102                traverse(plod); 
     103            } 
     104        }         
     105         
    40106        for(unsigned int i=0; i<plod.getNumFileNames(); ++i) 
    41107        { 
     
    57123                osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(filename); 
    58124                 
    59                 if (node.valid()) node->accept(*this); 
     125                if (!s_ExitApplication && node.valid()) node->accept(*this); 
    60126            } 
    61127        } 
     
    65131     
    66132protected: 
     133 
     134    void convertXYZToLatLongHeight(osg::EllipsoidModel* em, osg::Vec3d& v) 
     135    { 
     136        em->convertXYZToLatLongHeight(v.x(), v.y(), v.z(), 
     137                                      v.x(), v.y(), v.z()); 
     138                                       
     139        v.x() = osg::RadiansToDegrees(v.x()); 
     140        v.y() = osg::RadiansToDegrees(v.y()); 
     141    } 
    67142 
    68143    unsigned int _maxLevels; 
     
    70145}; 
    71146 
     147static void signalHandler(int sig) 
     148{ 
     149    printf("\nCaught signal %d, requesting exit...\n\n",sig); 
     150    s_ExitApplication = true; 
     151} 
    72152 
    73153int main( int argc, char **argv ) 
    74154{ 
     155#ifndef _WIN32 
     156    signal(SIGHUP, signalHandler); 
     157    signal(SIGQUIT, signalHandler); 
     158    signal(SIGKILL, signalHandler); 
     159    signal(SIGUSR1, signalHandler); 
     160    signal(SIGUSR2, signalHandler); 
     161#endif 
     162    signal(SIGABRT, signalHandler); 
     163    signal(SIGINT, signalHandler); 
     164    signal(SIGTERM, signalHandler); 
     165 
     166 
    75167    // use an ArgumentParser object to manage the program arguments. 
    76168    osg::ArgumentParser arguments(&argc,argv); 
     
    113205    loadedModel->accept(ldv); 
    114206 
     207    if (s_ExitApplication) 
     208    { 
     209        std::cout<<"osgfilecache cleanly exited in response to signal."<<std::endl; 
     210    } 
     211 
    115212    return 0; 
    116213}