diff --git a/include/osg/CameraNode b/include/osg/CameraNode index 04fbb55f7..3be47ef01 100644 --- a/include/osg/CameraNode +++ b/include/osg/CameraNode @@ -181,11 +181,14 @@ class OSG_EXPORT CameraNode : public Transform, public CullSettings /** Set the rendering order of this camera's subgraph relative to any camera that this subgraph is nested within. * For rendering to a texture, one typically uses PRE_RENDER. * For Head Up Displays, one would typically use POST_RENDER.*/ - void setRenderOrder(RenderOrder order) { _renderOrder = order; } + void setRenderOrder(RenderOrder order, int orderNum = 0) { _renderOrder = order; _renderOrderNum = orderNum; } /** Get the rendering order of this camera's subgraph relative to any camera that this subgraph is nested within.*/ RenderOrder getRenderOrder() const { return _renderOrder; } + /** Get the rendering order number of this camera relative to any sibling cameras in this subgraph.*/ + int getRenderOrderNum() const { return _renderOrderNum; } + /** Return true if this Camera is set up as a render to texture camera, i.e. it has textures assigned to it.*/ bool isRenderToTextureCamera() const; @@ -366,6 +369,7 @@ class OSG_EXPORT CameraNode : public Transform, public CullSettings Matrixd _viewMatrix; RenderOrder _renderOrder; + int _renderOrderNum; GLenum _drawBuffer; GLenum _readBuffer; diff --git a/src/osg/CameraNode.cpp b/src/osg/CameraNode.cpp index 608107918..b0cb8d635 100644 --- a/src/osg/CameraNode.cpp +++ b/src/osg/CameraNode.cpp @@ -20,6 +20,7 @@ CameraNode::CameraNode(): _clearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT), _transformOrder(PRE_MULTIPLY), _renderOrder(POST_RENDER), + _renderOrderNum(0), _drawBuffer(GL_NONE), _readBuffer(GL_NONE), _renderTargetImplementation(FRAME_BUFFER), @@ -39,6 +40,7 @@ CameraNode::CameraNode(const CameraNode& camera,const CopyOp& copyop): _projectionMatrix(camera._projectionMatrix), _viewMatrix(camera._viewMatrix), _renderOrder(camera._renderOrder), + _renderOrderNum(camera._renderOrderNum), _drawBuffer(camera._drawBuffer), _readBuffer(camera._readBuffer), _renderTargetImplementation(camera._renderTargetImplementation), diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index 077c7ccbf..3506544ec 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -1208,11 +1208,11 @@ void CullVisitor::apply(osg::CameraNode& camera) // dependancy list. switch(camera.getRenderOrder()) { - case osg::CameraNode::PRE_RENDER : - getCurrentRenderBin()->getStage()->addPreRenderStage(rtts.get()); + case osg::CameraNode::PRE_RENDER: + getCurrentRenderBin()->getStage()->addPreRenderStage(rtts.get(),camera.getRenderOrderNum()); break; - default : - getCurrentRenderBin()->getStage()->addPostRenderStage(rtts.get()); + default: + getCurrentRenderBin()->getStage()->addPostRenderStage(rtts.get(),camera.getRenderOrderNum()); break; } diff --git a/src/osgUtil/RenderStage.cpp b/src/osgUtil/RenderStage.cpp index e3a87bc2e..f275ee037 100644 --- a/src/osgUtil/RenderStage.cpp +++ b/src/osgUtil/RenderStage.cpp @@ -124,7 +124,7 @@ void RenderStage::reset() pre_itr != _preRenderList.end(); ++pre_itr) { - (*pre_itr)->reset(); + pre_itr->second->reset(); } RenderBin::reset(); @@ -133,7 +133,7 @@ void RenderStage::reset() post_itr != _postRenderList.end(); ++post_itr) { - (*post_itr)->reset(); + post_itr->second->reset(); } _preRenderList.clear(); @@ -146,7 +146,7 @@ void RenderStage::sort() pre_itr != _preRenderList.end(); ++pre_itr) { - (*pre_itr)->sort(); + pre_itr->second->sort(); } RenderBin::sort(); @@ -155,18 +155,44 @@ void RenderStage::sort() post_itr != _postRenderList.end(); ++post_itr) { - (*post_itr)->sort(); + post_itr->second->sort(); } } -void RenderStage::addPreRenderStage(RenderStage* rs) +void RenderStage::addPreRenderStage(RenderStage* rs, int order) { - if (rs) _preRenderList.push_back(rs); + if (rs) + { + RenderStageList::iterator itr; + for(itr = _preRenderList.begin(); itr != _preRenderList.end(); ++itr) { + if(order < itr->first) { + break; + } + } + if(itr == _preRenderList.end()) { + _preRenderList.push_back(RenderStageOrderPair(order,rs)); + } else { + _preRenderList.insert(itr,RenderStageOrderPair(order,rs)); + } + } } -void RenderStage::addPostRenderStage(RenderStage* rs) +void RenderStage::addPostRenderStage(RenderStage* rs, int order) { - if (rs) _postRenderList.push_back(rs); + if (rs) + { + RenderStageList::iterator itr; + for(itr = _postRenderList.begin(); itr != _postRenderList.end(); ++itr) { + if(order < itr->first) { + break; + } + } + if(itr == _postRenderList.end()) { + _postRenderList.push_back(RenderStageOrderPair(order,rs)); + } else { + _postRenderList.insert(itr,RenderStageOrderPair(order,rs)); + } + } } void RenderStage::drawPreRenderStages(osg::State& state,RenderLeaf*& previous) @@ -178,7 +204,7 @@ void RenderStage::drawPreRenderStages(osg::State& state,RenderLeaf*& previous) itr!=_preRenderList.end(); ++itr) { - (*itr)->draw(state,previous); + itr->second->draw(state,previous); } //cout << "Done Drawing prerendering stages "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<draw(state,previous); + itr->second->draw(state,previous); } //cout << "Done Drawing prerendering stages "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<getStats(stats)) + if (pre_itr->second->getStats(stats)) { statsCollected = true; } @@ -964,7 +990,7 @@ bool RenderStage::getStats(Statistics& stats) const post_itr != _postRenderList.end(); ++post_itr) { - if ((*post_itr)->getStats(stats)) + if (post_itr->second->getStats(stats)) { statsCollected = true; }