现在的位置: 首页 > 综合 > 正文

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

2013年09月05日 ⁄ 综合 ⁄ 共 4488字 ⁄ 字号 评论关闭

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;

           }

       }

抱歉!评论已关闭.