#include "stdafx.h"
#include <iostream>
#include <osg/NodeVisitor>
#include <osg/Node>
#include "osg/Group"
#include "osgDB/readfile"
#include <osg/Geode>
using namespace std;
class VisitorExtent;
class NodeExtent;
class VisitorExtent : public osg::NodeVisitor
{
public:
VisitorExtent() : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN)
{
}
virtual void apply(osg::Group& node);
virtual void apply(NodeExtent& node)
{
cout << "NodeExt\n";
}
virtual void apply(osg::Geode& node)
{
cout << "Geode\n";
__super::apply(node);
}
virtual void apply(osg::Geometry& node)
{
cout << "Geometry\n";
}
};
class NodeExtent : public osg::Node
{
public:
virtual void accept(VisitorExtent& nv)
{
if (nv.validNodeMask(*this))
{
nv.pushOntoNodePath(this);
nv.apply(*this);
nv.popFromNodePath();
}
}
};
void VisitorExtent::apply(osg::Group& node)
{
for (int i = 0; i < node.getNumChildren(); i++)
{
if (NodeExtent* ex = dynamic_cast<NodeExtent*>(node.getChild(i)))
apply(*ex);
}
__super::apply(node);
}
void main()
{
osg::Group* grp = new osg::Group;
NodeExtent* n = new NodeExtent;
grp->addChild(osgDB::readNodeFile("cow.osg"));
grp->addChild(n);
VisitorExtent v;
grp->accept(v);
getchar();
}
osg visitor 扩展
最新推荐文章于 2023-03-14 19:50:26 发布