Skip to content

Commit 62dbe7b

Browse files
committed
Added 's' write selected nodes to "saved_selected.osgt feature.
1 parent ecaca71 commit 62dbe7b

File tree

1 file changed

+32
-3
lines changed

1 file changed

+32
-3
lines changed

examples/osgkeyboardmouse/osgkeyboardmouse.cpp

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ class CreateModelToSaveVisitor : public osg::NodeVisitor
7171
bool _addToModel;
7272
};
7373

74-
class DeleteSelectedNodesVisitor : public osg::NodeVisitor
74+
class SelectedNodesVisitor : public osg::NodeVisitor
7575
{
7676
public:
7777

78-
DeleteSelectedNodesVisitor():
78+
SelectedNodesVisitor():
7979
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
8080
{
8181
}
@@ -110,6 +110,23 @@ class DeleteSelectedNodesVisitor : public osg::NodeVisitor
110110
}
111111
}
112112

113+
osg::ref_ptr<osg::Node> createSelectedNodeSubgraph()
114+
{
115+
if (_selectedNodes.empty()) return osg::ref_ptr<osg::Node>();
116+
117+
if (_selectedNodes.size()==1) return _selectedNodes[0];
118+
119+
// note code doesn't yet handle selected nodes being nested within transforms.
120+
osg::ref_ptr<osg::Group> group;
121+
for(SelectedNodes::iterator itr = _selectedNodes.begin();
122+
itr != _selectedNodes.end();
123+
++itr)
124+
{
125+
group->addChild(*itr);
126+
}
127+
return group;
128+
}
129+
113130
typedef std::vector< osg::ref_ptr<osgFX::Scribe> > SelectedNodes;
114131
SelectedNodes _selectedNodes;
115132

@@ -150,6 +167,18 @@ class PickHandler : public osgGA::GUIEventHandler
150167
osg::notify(osg::NOTICE)<<"Saved model to file 'saved_model.osgt'"<<std::endl;
151168
osgDB::writeNodeFile(*(viewer->getSceneData()), "saved_model.osgt");
152169
}
170+
else if (ea.getKey()=='s')
171+
{
172+
SelectedNodesVisitor snv;
173+
viewer->getSceneData()->accept(snv);
174+
osg::ref_ptr<osg::Node> selected = snv.createSelectedNodeSubgraph();
175+
176+
if (selected)
177+
{
178+
osg::notify(osg::NOTICE)<<"Saved selected to file 'saved_selected.osgt'"<<std::endl;
179+
osgDB::writeNodeFile(*(viewer->getSceneData()), "saved_selected.osgt");
180+
}
181+
}
153182
else if (ea.getKey()=='p')
154183
{
155184
_usePolytopeIntersector = !_usePolytopeIntersector;
@@ -177,7 +206,7 @@ class PickHandler : public osgGA::GUIEventHandler
177206
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Delete || ea.getKey()==osgGA::GUIEventAdapter::KEY_BackSpace)
178207
{
179208
osg::notify(osg::NOTICE)<<"Delete"<<std::endl;
180-
DeleteSelectedNodesVisitor dsnv;
209+
SelectedNodesVisitor dsnv;
181210
viewer->getSceneData()->accept(dsnv);
182211
dsnv.pruneSelectedNodes();
183212
}

0 commit comments

Comments
 (0)