From Farshid Lashkari,

"I've made some changes to osg which I think make it easier to control
the render order of CameraNode's. Instead of using the built-in orders
(PRE_RENDER, POST_RENDER, NESTED_RENDER), you can specify an integer
order. Values less than zero are pre rendered in order. Values greater
than zero are post rendered in order. And a value of 0 is equivalent
to NESTED_RENDER.

The changes should be fully backward compatible. Also, I changed the
RenderStageList type from a vector to a list because I needed to be
able to insert values anywhere in the list.

The reason I made these changes was because I wanted to be able to set
the render order of a CameraNode at runtime without having to reorder
it in the scenegraph."

and later in the final submission message (relating to what has been finally been merged)    :

"I've rethought my implementation and came up with something a little
better. The setRenderOrder will continue to take an enum, but will
have an optional orderNum parameter which can be both positive and
negative. I think this method is more intuitive and flexible."
This commit is contained in:
Robert Osfield
2006-09-04 13:15:08 +00:00
parent 5212d66cab
commit daa54a3b09
4 changed files with 49 additions and 17 deletions

View File

@@ -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;

View File

@@ -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),

View File

@@ -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;
}

View File

@@ -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 "<<this<< " "<<_viewport->x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<<std::endl;
}
@@ -940,7 +966,7 @@ void RenderStage::drawPostRenderStages(osg::State& state,RenderLeaf*& previous)
itr!=_postRenderList.end();
++itr)
{
(*itr)->draw(state,previous);
itr->second->draw(state,previous);
}
//cout << "Done Drawing prerendering stages "<<this<< " "<<_viewport->x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<<std::endl;
}
@@ -954,7 +980,7 @@ bool RenderStage::getStats(Statistics& stats) const
pre_itr != _preRenderList.end();
++pre_itr)
{
if ((*pre_itr)->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;
}