class DrawableDrawCallback
: public osg::Drawable::DrawCallback
{
virtual
voiddrawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable)const
{
std::cout<<"draw call back - pre drawImplementation"<<drawable<<std::endl;
drawable->drawImplementation(renderInfo);
std::cout<<"draw call back - post drawImplementation"<<drawable<<std::endl;
}
};
struct DrawableUpdateCallback :public
osg::Drawable::UpdateCallback
{
virtual
voidupdate(osg::NodeVisitor*, osg::Drawable* drawable)
{
std::cout<<"Drawable update callback "<<drawable<<std::endl;
}
};
struct DrawableCullCallback
: public osg::Drawable::CullCallback
{
/** do customized cull code.*/
virtual
boolcull(osg::NodeVisitor*, osg::Drawable* drawable, osg::State*/*state*/)
const
{
std::cout<<"Drawable cull callback "<<drawable<<std::endl;
return
false;
}
};
osg::Drawable类中:
structEventCallback : public virtual osg::Object
{
EventCallback() {}
EventCallback(const EventCallback&,const CopyOp&) {}
META_Object(osg,EventCallback);
virtual void
event(osg::NodeVisitor*, osg::Drawable*) {}
};
――――――――
osg::Drawable::DrawCallback、osg::Drawable::UpdateCallback、osg::Drawable::EventCallback、osg::Drawable::CullCallback、osg::NodeCallback都继承自osg::Object:
struct DrawCallback : public virtual osg::Object{}
struct UpdateCallback : public virtual osg::Object{}
struct EventCallback : public virtual osg::Object{}
struct CullCallback : public virtual osg::Object
class OSG_EXPORT NodeCallback : public virtual Object{}
――――――――――――――――――――
class CameraUpdateCallback
: public osg::NodeCallback
{
virtual
voidoperator()(osg::Node* node, osg::NodeVisitor* nv)
{
std::cout<<"Camera update callback - pre traverse"<<node<<std::endl;
traverse(node,nv);
std::cout<<"Camera update callback - post traverse"<<node<<std::endl;
}
};
――――――――――――――――――――――――――
Group->setEventCallback(osg::NodeCallback);或者
osgViewer::viewer->addEventhandler(osgGA::GUIEventHandler)可以设置用户事件回调(如用户鼠标、键盘操作)。
GUIEventHandler继承自NodeCallback和Drawable::EventCallback:
class OSGGA_EXPORT GUIEventHandler : public osg::NodeCallback, public osg::Drawable::EventCallback
―――――――――――
osgViewer::view:
class OSGVIEWER_EXPORT View : public osg::View, public osgGA::GUIActionAdapter
osgViewer::viewer:
void Viewer::constructorInit()
{
_eventVisitor =
new osgGA::EventVisitor;
_eventVisitor->setActionAdapter(this);
}
void Viewer::eventTraversal()
{
……
for(osgGA::EventQueue::Events::iterator
itr = events.begin();
itr != events.end();
++itr)
{
osgGA::GUIEventAdapter*
event = itr->get();
_eventVisitor->reset();
_eventVisitor->addEvent(
event );
getSceneData()->accept(*_eventVisitor);
}
virtualvoid
operator()(osg::Node* node, osg::NodeVisitor* nv)
{
。。。。。。
{
osgGA::EventVisitor* ev =
dynamic_cast<osgGA::EventVisitor*>(nv);
if (ev && ev->getActionAdapter() && !ev->getEvents().empty())
{
for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();
itr != ev->getEvents().end();
++itr)
{
handleWithCheckAgainstIgnoreHandledEventsMask(*(*itr), *(ev->getActionAdapter()),
node, nv);
}
}
}
traverse(node, nv);
}
osg::NodeCallback最终调用的是operator()。而的核心函数是handle(),可以获取当前viewer:
bool handle(const
osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
osgViewer::Viewer* viewer =
dynamic_cast<osgViewer::Viewer*>(&aa);
}
――――――
void GUIEventHandler::operator()(osg::Node*
node, osg::NodeVisitor* nv)
{
osgGA::EventVisitor* ev =
dynamic_cast<osgGA::EventVisitor*>(nv);
if (ev && ev->getActionAdapter() && !ev->getEvents().empty())
{
for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();
itr != ev->getEvents().end();
++itr)
{
handleWithCheckAgainstIgnoreHandledEventsMask(*(*itr),
*(ev->getActionAdapter()), node, nv);
}
}
if (node->getNumChildrenRequiringEventTraversal()>0)traverse(node,nv);
}
――――――――――――
GUIEventHandler:: inline bool
handleWithCheckAgainstIgnoreHandledEventsMask(const GUIEventAdapter& ea,GUIActionAdapter& aa, osg::Object* object, osg::NodeVisitor* nv)
{
if (!ea.getHandled() ||
(ea.getEventType() & _ignoreHandledEventsMask)==0)
{
bool handled =
handle(ea,aa,object,nv);
if (handled) ea.setHandled(true);
return handled;
}
else
{
return false;
}
}