OSG源代码部分剖析(待续)?????????????????????????????

本文深入剖析了osg::Drawable中的DrawCallback、UpdateCallback、EventCallback和CullCallback,以及NodeCallback和CameraUpdateCallback的使用。重点讨论了如何设置用户事件回调,如通过osgViewer::viewer和osgGA::GUIEventHandler处理鼠标和键盘操作。同时,讲解了osgGA::EventVisitor在事件处理中的核心作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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::DrawCallbackosg::Drawable::UpdateCallbackosg::Drawable::EventCallbackosg::Drawable::CullCallbackosg::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继承自NodeCallbackDrawable::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;

           }

       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值