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:
@@ -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;
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user