Advertisement
Guest User

Forcing a new OSG RenderBin from a plugin

a guest
Oct 31st, 2015
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. void MyNode::traverse(osg::NodeVisitor& nv)
  2. {
  3.     if ( nv.getVisitorType() == nv.CULL_VISITOR )
  4.     {
  5.         osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(&nv);
  6.  
  7.         osg::ref_ptr<osgUtil::RenderBin> newBin;
  8.  
  9.         osgUtil::RenderBin* bin = cv->getCurrentRenderBin();
  10.         osgUtil::RenderBin* parentBin = bin->getParent();
  11.  
  12.         if ( parentBin )
  13.         {
  14.             // If a parent bin exists, "allocate" the first unused bin number from its list of children
  15.             // and use that to force the creation of a new traversal-order bin:
  16.             int newBinNumber = parentBin->getRenderBinList().rbegin()->first + 1;
  17.             newBin = parentBin->find_or_insert(newBinNumber, "TraversalOrderBin");
  18.         }
  19.         else
  20.         {
  21.             // If there is no parent, fall back on the stage and allocate a new child bin there:
  22.             int newBinNumber = bin->getStage()->getBinNum() + 1;
  23.             newBin = bin->getStage()->find_or_insert(newBinNumber, "TraversalOrderBin");
  24.         }
  25.  
  26.         // activate our new bin and traverse:
  27.         cv->setCurrentRenderBin( newBin.get() );
  28.  
  29.         osg::Group::traverse(nv);
  30.  
  31.         // restore the previous bin:
  32.         cv->setCurrentRenderBin( bin );
  33.     }
  34.     else
  35.     {
  36.         osg::Group::traverse( nv );
  37.     }    
  38. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement