Show
Ignore:
Timestamp:
09/02/14 12:00:33 (4 hours ago)
Author:
robert
Message:

Improved handling of ComboBox? popup toggling

Files:
1 modified

Legend:

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

    r12529 r14242  
    3939{ 
    4040        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) 
    41         {  
     41        { 
    4242            std::cout<<"update callback - pre traverse"<<node<<std::endl; 
    4343            traverse(node,nv); 
     
    4949{ 
    5050        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) 
    51         {  
     51        { 
    5252            std::cout<<"cull callback - pre traverse"<<node<<std::endl; 
    5353            traverse(node,nv); 
     
    8888 
    8989   public: 
    90     
     90 
    9191        InsertCallbacksVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) 
    9292        { 
    9393        } 
    94          
     94 
    9595        virtual void apply(osg::Node& node) 
    9696        { 
     
    103103        { 
    104104            geode.setUpdateCallback(new UpdateCallback()); 
    105              
     105 
    106106            //note, it makes no sense to attach a cull callback to the node 
    107107            //at there are no nodes to traverse below the geode, only 
     
    117117            } 
    118118        } 
    119          
     119 
    120120        virtual void apply(osg::Transform& node) 
    121121        { 
     
    141141{ 
    142142    virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) 
    143     {  
     143    { 
    144144        std::cout<<"Camera update callback - pre traverse"<<node<<std::endl; 
    145145        traverse(node,nv); 
     
    151151{ 
    152152    virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) 
    153     {  
     153    { 
    154154        std::cout<<"Camera event callback - pre traverse"<<node<<std::endl; 
    155155        traverse(node,nv); 
     
    158158}; 
    159159 
     160 
     161struct TestDrawableUpdateCallback : public osg::Drawable::UpdateCallback 
     162{ 
     163    TestDrawableUpdateCallback(const std::string &message): _message(message) {} 
     164 
     165    virtual void update(osg::NodeVisitor*, osg::Drawable* drw) { 
     166        printf("%s\n", _message.c_str()); 
     167    } 
     168    std::string _message; 
     169}; 
     170 
     171struct TestNodeUpdateCallback : public osg::NodeCallback 
     172{ 
     173    TestNodeUpdateCallback(const std::string &message): _message(message) {} 
     174 
     175    virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) { 
     176        printf("%s\n", _message.c_str()); 
     177    } 
     178    std::string _message; 
     179}; 
     180 
     181 
    160182int main( int argc, char **argv ) 
    161183{ 
    162184    // use an ArgumentParser object to manage the program arguments. 
    163185    osg::ArgumentParser arguments(&argc,argv); 
    164     
     186 
    165187    // set the osgDB::Registy read file callback to catch all requests for reading files. 
    166188    osgDB::Registry::instance()->setReadFileCallback(new MyReadFileCallback()); 
    167     
     189 
    168190    // initialize the viewer. 
    169191    osgViewer::Viewer viewer; 
    170192 
    171193    // load the nodes from the commandline arguments. 
    172     osg::Node* rootnode = osgDB::readNodeFiles(arguments); 
    173  
    174     // if not loaded assume no arguments passed in, try use default mode instead. 
    175     if (!rootnode) rootnode = osgDB::readNodeFile("cow.osgt"); 
    176  
    177     if (!rootnode) 
    178     { 
    179         osg::notify(osg::NOTICE)<<"Please specify a file on the command line"<<std::endl; 
    180  
    181         return 1; 
    182     } 
    183      
    184     // run optimization over the scene graph 
    185     osgUtil::Optimizer optimzer; 
    186     optimzer.optimize(rootnode); 
    187       
    188     // insert all the callbacks 
    189     InsertCallbacksVisitor icv; 
    190     rootnode->accept(icv); 
     194    osg::ref_ptr<osg::Node> rootnode; 
     195 
     196    if (arguments.read("--test")) 
     197    { 
     198        osg::ref_ptr<osg::Group> root = new osg::Group(); 
     199        rootnode = root; 
     200 
     201        osg::Node *test1 = new osg::Node(); 
     202        test1->setUpdateCallback(new TestNodeUpdateCallback("test1")); 
     203        root->addChild(test1); 
     204 
     205        osg::Drawable *test2 = new osg::Drawable(); 
     206        test2->osg::Node::setUpdateCallback(new TestNodeUpdateCallback("test2")); 
     207        root->addChild(test2); 
     208 
     209        osg::Drawable *test3 = new osg::Drawable(); 
     210        test3->setUpdateCallback(new TestDrawableUpdateCallback("test3")); 
     211        root->addChild(test3); 
     212 
     213        osg::Geode *test4 = new osg::Geode(); 
     214        osg::Drawable *drawable1 = new osg::Drawable(); 
     215        drawable1->osg::Node::setUpdateCallback(new TestNodeUpdateCallback("test4")); 
     216        test4->addDrawable(drawable1); 
     217        root->addChild(test4); 
     218 
     219        osg::Geode *test5 = new osg::Geode(); 
     220        osg::Drawable *drawable2 = new osg::Drawable(); 
     221        drawable2->setUpdateCallback(new TestDrawableUpdateCallback("test5")); 
     222        test5->addDrawable(drawable2); 
     223        root->addChild(test5); 
     224 
     225        osg::Geode *test6 = new osg::Geode(); 
     226        osg::Drawable *drawable3 = new osg::Drawable(); 
     227        drawable3->setUpdateCallback(new TestDrawableUpdateCallback("test6")); 
     228        test6->addChild(drawable3); 
     229        root->addChild(test6); 
     230 
     231        osg::Geode *test7 = new osg::Geode(); 
     232        osg::Drawable *drawable4 = new osg::Drawable(); 
     233        drawable4->osg::Node::setUpdateCallback(new TestNodeUpdateCallback("test7")); 
     234        test7->addChild(drawable4); 
     235        root->addChild(test7); 
     236 
     237        printf("Numchildren with updates %u\n", rootnode->getNumChildrenRequiringUpdateTraversal()); 
     238 
     239    } 
     240    else 
     241    { 
     242        rootnode = osgDB::readNodeFiles(arguments); 
     243 
     244        // if not loaded assume no arguments passed in, try use default mode instead. 
     245        if (!rootnode) rootnode = osgDB::readNodeFile("cow.osgt"); 
     246 
     247        if (!rootnode) 
     248        { 
     249            osg::notify(osg::NOTICE)<<"Please specify a file on the command line"<<std::endl; 
     250 
     251            return 1; 
     252        } 
     253 
     254        // run optimization over the scene graph 
     255        osgUtil::Optimizer optimzer; 
     256        optimzer.optimize(rootnode); 
     257 
     258        // insert all the callbacks 
     259        InsertCallbacksVisitor icv; 
     260        rootnode->accept(icv); 
     261    } 
    191262 
    192263    viewer.getCamera()->setUpdateCallback(new CameraUpdateCallback()); 
     
    196267    viewer.setSceneData(rootnode); 
    197268 
    198     return viewer.run(); 
     269    viewer.setCameraManipulator(new osgGA::TrackballManipulator); 
     270 
     271    viewer.realize(); 
     272 
     273    while(!viewer.done()) 
     274    { 
     275        OSG_NOTICE<<std::endl<<"New Frame"<<std::endl; 
     276        viewer.frame(); 
     277    } 
     278 
     279    return 0; 
    199280}