From 6b47ea31b56d07a99c63c2d3140281998c533374 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 23 Jan 2007 14:10:10 +0000 Subject: [PATCH] Added delete selected object using delete and back space key, and added save option --- .../osgkeyboardmouse/osgkeyboardmouse.cpp | 64 +++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/examples/osgkeyboardmouse/osgkeyboardmouse.cpp b/examples/osgkeyboardmouse/osgkeyboardmouse.cpp index 172be13f6..e6971d74a 100644 --- a/examples/osgkeyboardmouse/osgkeyboardmouse.cpp +++ b/examples/osgkeyboardmouse/osgkeyboardmouse.cpp @@ -55,6 +55,51 @@ public: bool _addToModel; }; +class DeleteSelectedNodesVisitor : public osg::NodeVisitor +{ +public: + + DeleteSelectedNodesVisitor(): + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) + { + } + + virtual void apply(osg::Node& node) + { + osgFX::Scribe* scribe = dynamic_cast(&node); + if (scribe) + { + _selectedNodes.push_back(scribe); + } + else + { + traverse(node); + } + } + + void pruneSelectedNodes() + { + for(SelectedNodes::iterator itr = _selectedNodes.begin(); + itr != _selectedNodes.end(); + ++itr) + { + osg::Node* node = itr->get(); + osg::Node::ParentList parents = node->getParents(); + for(osg::Node::ParentList::iterator pitr = parents.begin(); + pitr != parents.end(); + ++pitr) + { + osg::Group* parent = *pitr; + parent->removeChild(node); + } + } + } + + typedef std::vector< osg::ref_ptr > SelectedNodes; + SelectedNodes _selectedNodes; + +}; + class ExitHandler : public osgGA::GUIEventHandler { public: @@ -105,14 +150,27 @@ public: bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { osgViewer::SimpleViewer* viewer = dynamic_cast(&aa); + if (!viewer) return false; switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::KEYUP): { - if (ea.getKey()=='s' && viewer) + if (ea.getKey()=='s') { saveSelectedModel(viewer->getSceneData()); + } + else if (ea.getKey()=='o') + { + osg::notify(osg::NOTICE)<<"Saved model to file 'saved_model.osg'"<getSceneData()), "saved_model.osg"); + } + else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Delete || ea.getKey()==osgGA::GUIEventAdapter::KEY_BackSpace) + { + osg::notify(osg::NOTICE)<<"Delete"<getSceneData()->accept(dsnv); + dsnv.pruneSelectedNodes(); } return false; } @@ -121,10 +179,6 @@ public: { _mx = ea.getX(); _my = ea.getY(); - - osg::notify(osg::NOTICE)<<"_mx="<<_mx<<" _my="<<_my<