日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

osgCallback的实现方法及原理

發(fā)布時(shí)間:2023/12/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 osgCallback的实现方法及原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//更新遍歷,重載操作符operator,當(dāng)場(chǎng)景更新時(shí),operator()的內(nèi)容被調(diào)用,注意 //需要添加traverse()以實(shí)現(xiàn)節(jié)點(diǎn)的繼續(xù)遍歷。可以參考src/osg/stateset.cpp,runUpdateCallBack()中的調(diào)用 class UpdateCallback : public osg::NodeCallback {virtual void operator()(osg::Node* node, osg::NodeVisitor* nv){?std::cout<<"update callback - pre traverse"<<node<<std::endl;traverse(node,nv);std::cout<<"update callback - post traverse"<<node<<std::endl;} };//揀選遍歷,重載操作符operator(),當(dāng)場(chǎng)景執(zhí)行揀選優(yōu)化時(shí),operator()被調(diào)用,注意 //需要添加traverse()以實(shí)現(xiàn)節(jié)點(diǎn)的繼續(xù)遍歷,可以參考include/osgUtil/CullVisitor, //handle_cull_callbacks_and_traverse()中的調(diào)用過(guò)程。 class CullCallback : public osg::NodeCallback {virtual void operator()(osg::Node* node, osg::NodeVisitor* nv){?std::cout<<"cull callback - pre traverse"<<node<<std::endl;traverse(node,nv);std::cout<<"cull callback - post traverse"<<node<<std::endl;} };//幾何體繪制遍歷,重載drawImplementation(),當(dāng)幾何體進(jìn)行繪制時(shí),函數(shù)的內(nèi)容被調(diào)用,否則 //將無(wú)法畫出當(dāng)前的幾何形狀。可以參考include/osg/Drawable,draw()中的調(diào)用過(guò)程 class DrawableDrawCallback : public osg::Drawable::DrawCallback {virtual void drawImplementation(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;} };//幾何體更新遍歷,重載函數(shù)update().當(dāng)幾何體更新時(shí),其函數(shù)被調(diào)用。可以參考 //include/osgUtil/UpdateVisitor, handle_geode_callback()中的調(diào)用過(guò)程。 struct DrawableUpdateCallback : public osg::Drawable::UpdateCallback {virtual void update(osg::NodeVisitor*, osg::Drawable* drawable){std::cout<<"Drawable update callback "<<drawable<<std::endl;} };//幾何體揀選遍歷,重載函數(shù)cull。當(dāng)幾何體進(jìn)行揀選優(yōu)化時(shí),函數(shù)的內(nèi)容被調(diào)用。可以參考 //src/osgutil/cullVisitor, apply(Geode&)函數(shù)中的調(diào)用過(guò)程 struct DrawableCullCallback : public osg::Drawable::CullCallback {/** do customized cull code.*/virtual bool cull(osg::NodeVisitor*, osg::Drawable* drawable, osg::State* /*state*/) const{std::cout<<"Drawable cull callback "<<drawable<<std::endl;return false;} };class InsertCallbacksVisitor : public osg::NodeVisitor {public:InsertCallbacksVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN){}virtual void apply(osg::Node& node){node.setUpdateCallback(new UpdateCallback());node.setCullCallback(new CullCallback());traverse(node);}virtual void apply(osg::Geode& geode){geode.setUpdateCallback(new UpdateCallback());//note, it makes no sense to attach a cull callback to the node//at there are no nodes to traverse below the geode, only//drawables, and as such the Cull node callbacks is ignored.//If you wish to control the culling of drawables//then use a drawable cullback...for(unsigned int i=0;i<geode.getNumDrawables();++i){geode.getDrawable(i)->setUpdateCallback(new DrawableUpdateCallback());geode.getDrawable(i)->setCullCallback(new DrawableCullCallback());geode.getDrawable(i)->setDrawCallback(new DrawableDrawCallback());}}virtual void apply(osg::Transform& node){apply((osg::Node&)node);} };class MyReadFileCallback : public osgDB::Registry::ReadFileCallback { public:virtual osgDB::ReaderWriter::ReadResult readNode(const std::string& fileName, const osgDB::ReaderWriter::Options* options){std::cout<<"before readNode"<<std::endl;// note when calling the Registry to do the read you have to call readNodeImplementation NOT readNode, as this will// cause on infinite recusive loop.osgDB::ReaderWriter::ReadResult result = osgDB::Registry::instance()->readNodeImplementation(fileName,options);std::cout<<"after readNode"<<std::endl;return result;} };class CameraUpdateCallback : public osg::NodeCallback {virtual void operator()(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;} };class CameraEventCallback : public osg::NodeCallback {virtual void operator()(osg::Node* node, osg::NodeVisitor* nv){?std::cout<<"Camera event callback - pre traverse"<<node<<std::endl;traverse(node,nv);std::cout<<"Camera event callback - post traverse"<<node<<std::endl;} };int main( int argc, char **argv ) {// use an ArgumentParser object to manage the program arguments.osg::ArgumentParser arguments(&argc,argv);// set the osgDB::Registy read file callback to catch all requests for reading files.osgDB::Registry::instance()->setReadFileCallback(new MyReadFileCallback());// initialize the viewer.osgViewer::Viewer viewer;// load the nodes from the commandline arguments.osg::Node* rootnode = osgDB::readNodeFiles(arguments);// if not loaded assume no arguments passed in, try use default mode instead.if (!rootnode) rootnode = osgDB::readNodeFile("cow.osgt");if (!rootnode){osg::notify(osg::NOTICE)<<"Please specify a file on the command line"<<std::endl;return 1;}// run optimization over the scene graphosgUtil::Optimizer optimzer;optimzer.optimize(rootnode);// insert all the callbacksInsertCallbacksVisitor icv;rootnode->accept(icv);viewer.getCamera()->setUpdateCallback(new CameraUpdateCallback());viewer.getCamera()->setEventCallback(new CameraEventCallback());// set the scene to renderviewer.setSceneData(rootnode);return viewer.run(); }

綜述,可以得出回調(diào)的編寫方法:

1、編寫用戶結(jié)構(gòu)體,繼承OSG中響應(yīng)的虛函數(shù)結(jié)構(gòu)圖,如osg::NodeCallback;

2、重載回調(diào)執(zhí)行函數(shù),根據(jù)回調(diào)種類的不同,執(zhí)行函數(shù)的名稱也不同,可以參考o(jì)sgCallBack中的設(shè)置

3、注意在回調(diào)執(zhí)行的過(guò)程中,有一些必要的系統(tǒng)操作需要交由用戶來(lái)完成,例如readNodeImplementation,Drawable::drawImplementation,traverse等,否則系統(tǒng)本身的渲染工作可能會(huì)不正常。

編譯運(yùn)行osgcallback之后,可以看到控制臺(tái)不斷輸出各種回調(diào)的執(zhí)行結(jié)果,用戶可以根據(jù)自己的需要在不同的時(shí)間段進(jìn)入不同的回調(diào)來(lái)完成所需的工作。 ? ?

參考文章地址:http://www.360doc.com/content/14/0619/23/12278894_388198735.shtml

?

OSG源碼中回調(diào)函數(shù)的執(zhí)行過(guò)程

//當(dāng)你為你的節(jié)點(diǎn)設(shè)置了回調(diào)函數(shù) node.setUpdateCallback(new UpdateCallback());void ViewerBase::frame(double simulationTime) {updateTraversal(); /幀循環(huán),更新回調(diào) }//回調(diào)函數(shù)的執(zhí)行過(guò)程void Viewer::updateTraversal() {........._scene->updateSceneGraph(*_updateVisitor);//_updateVisitor為osgUtil::UpdateVisitor,用來(lái)負(fù)責(zé)場(chǎng)景更新遍歷......... }void Scene::updateSceneGraph(osg::NodeVisitor& updateVisitor) {if (getSceneData()){updateVisitor.setImageRequestHandler(getImagePager());getSceneData()->accept(updateVisitor);} }void Node::accept(osg::NodeVisitor& nv) { if (nv.validNodeMask(*this)){nv.pushOntoNodePath(this); nv.apply(*this); nv.popFromNodePath(); } } void UpdateVisitor::apply(osg::Group& node) { handle_callbacks_and_traverse(node); }inline void handle_callbacks_and_traverse(osg::Node& node) {handle_callbacks(node.getStateSet());osg::NodeCallback* callback = node.getUpdateCallback();if (callback) (*callback)(&node,this);else if (node.getNumChildrenRequiringUpdateTraversal()>0) traverse(node); } <strong> </strong>

?

總結(jié)

以上是生活随笔為你收集整理的osgCallback的实现方法及原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。