| | 58 | class DeleteSelectedNodesVisitor : public osg::NodeVisitor |
| | 59 | { |
| | 60 | public: |
| | 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 | |
| | 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(); |