Show
Ignore:
Timestamp:
01/23/07 15:10:10 (8 years ago)
Author:
robert
Message:

Added delete selected object using delete and back space key, and added save option

Files:
1 modified

Legend:

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

    r5970 r6034  
    5656}; 
    5757 
     58class DeleteSelectedNodesVisitor : public osg::NodeVisitor 
     59{ 
     60public: 
     61 
     62    DeleteSelectedNodesVisitor(): 
     63        osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)         
     64    { 
     65    } 
     66     
     67    virtual void apply(osg::Node& node) 
     68    { 
     69        osgFX::Scribe* scribe = dynamic_cast<osgFX::Scribe*>(&node); 
     70        if (scribe) 
     71        { 
     72            _selectedNodes.push_back(scribe); 
     73        } 
     74        else 
     75        { 
     76            traverse(node); 
     77        } 
     78    } 
     79     
     80    void pruneSelectedNodes() 
     81    { 
     82        for(SelectedNodes::iterator itr = _selectedNodes.begin(); 
     83            itr != _selectedNodes.end(); 
     84            ++itr) 
     85        { 
     86            osg::Node* node = itr->get(); 
     87            osg::Node::ParentList parents = node->getParents(); 
     88            for(osg::Node::ParentList::iterator pitr = parents.begin(); 
     89                pitr != parents.end(); 
     90                ++pitr) 
     91            { 
     92                osg::Group* parent = *pitr; 
     93                parent->removeChild(node); 
     94            } 
     95        } 
     96    } 
     97     
     98    typedef std::vector< osg::ref_ptr<osgFX::Scribe> > SelectedNodes; 
     99    SelectedNodes _selectedNodes; 
     100     
     101}; 
     102 
    58103class ExitHandler : public osgGA::GUIEventHandler  
    59104{ 
     
    106151    { 
    107152        osgViewer::SimpleViewer* viewer = dynamic_cast<osgViewer::SimpleViewer*>(&aa); 
     153        if (!viewer) return false; 
    108154 
    109155        switch(ea.getEventType()) 
     
    111157            case(osgGA::GUIEventAdapter::KEYUP): 
    112158            { 
    113                 if (ea.getKey()=='s' && viewer) 
     159                if (ea.getKey()=='s') 
    114160                { 
    115161                    saveSelectedModel(viewer->getSceneData()); 
     162                }                 
     163                else if (ea.getKey()=='o') 
     164                { 
     165                    osg::notify(osg::NOTICE)<<"Saved model to file 'saved_model.osg'"<<std::endl; 
     166                    osgDB::writeNodeFile(*(viewer->getSceneData()), "saved_model.osg"); 
     167                } 
     168                else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Delete || ea.getKey()==osgGA::GUIEventAdapter::KEY_BackSpace) 
     169                { 
     170                    osg::notify(osg::NOTICE)<<"Delete"<<std::endl; 
     171                    DeleteSelectedNodesVisitor dsnv; 
     172                    viewer->getSceneData()->accept(dsnv); 
     173                    dsnv.pruneSelectedNodes(); 
    116174                } 
    117175                return false; 
     
    122180                _mx = ea.getX(); 
    123181                _my = ea.getY(); 
    124                  
    125                 osg::notify(osg::NOTICE)<<"_mx="<<_mx<<" _my="<<_my<<std::endl; 
    126                 osg::notify(osg::NOTICE)<<"  range ="<<ea.getXmin()<<", "<<ea.getXmax()<<std::endl; 
    127                  
    128182                return false; 
    129183            }