OpenSceneGraph/src/osgUtil/RenderStage.cpp
Robert Osfield 56cee8c711 Move the applying of Projection and ModelView matrices into osg::State so that
it now maintains references to the last applied matrices, automatically doing
lazy state updating.  This simplifies the various places in the OSG which
were previously doing the applying, add paves the way for managing the
projection matrix within the scene graph.

Remove MemoryAdapter and mem_ptr as they arn't being used, and can potentially
confuse users by their existance.
2002-03-29 17:26:40 +00:00

126 lines
3.1 KiB
C++

#include <osg/Notify>
#include <osgUtil/RenderStage>
using namespace osg;
using namespace osgUtil;
// register a RenderStage prototype with the RenderBin prototype list.
//RegisterRenderBinProxy<RenderStage> s_registerRenderStageProxy;
RenderStage::RenderStage()
{
// point RenderBin's _stage to this to ensure that references to
// stage don't go tempted away to any other stage.
_stage = this;
_stageDrawnThisFrame = false;
_clearMask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
_clearColor.set(0.0f,0.0f,0.0f,0.0f);
_clearAccum.set(0.0f,0.0f,0.0f,0.0f);
_clearDepth = 1.0;
_clearStencil = 0;
}
RenderStage::~RenderStage()
{
}
void RenderStage::reset()
{
_dependencyList.clear();
_stageDrawnThisFrame = false;
if (_renderStageLighting.valid()) _renderStageLighting->reset();
RenderBin::reset();
}
void RenderStage::addToDependencyList(RenderStage* rs)
{
if (rs) _dependencyList.push_back(rs);
}
void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
{
if (_stageDrawnThisFrame) return;
if (!_viewport)
{
notify(FATAL) << "Error: cannot drawm stage due to undefined viewport."<< std::endl;
return;
}
_stageDrawnThisFrame = true;
for(DependencyList::iterator itr=_dependencyList.begin();
itr!=_dependencyList.end();
++itr)
{
(*itr)->draw(state,previous);
}
// set up the back buffer.
#define USE_SISSOR_TEST
#ifdef USE_SISSOR_TEST
glScissor( _viewport->x(), _viewport->y(), _viewport->width(), _viewport->height() );
glEnable( GL_SCISSOR_TEST );
#endif
_viewport->apply(state);
// glEnable( GL_DEPTH_TEST );
// set which color planes to operate on.
if (_colorMask.valid()) _colorMask->apply(state);
else glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
if (_clearMask & GL_COLOR_BUFFER_BIT)
glClearColor( _clearColor[0], _clearColor[1], _clearColor[2], _clearColor[3]);
if (_clearMask & GL_DEPTH_BUFFER_BIT)
glClearDepth( _clearDepth);
if (_clearMask & GL_STENCIL_BUFFER_BIT)
glClearStencil( _clearStencil);
if (_clearMask & GL_ACCUM_BUFFER_BIT)
glClearAccum( _clearAccum[0], _clearAccum[1], _clearAccum[2], _clearAccum[3]);
glClear( _clearMask );
#ifdef USE_SISSOR_TEST
glDisable( GL_SCISSOR_TEST );
#endif
// set up projection
state.applyProjectionMatrix(&(_camera->getProjectionMatrix()));
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
// apply the lights.
if (_renderStageLighting.valid()) _renderStageLighting->draw(state,previous);
// draw the children and local.
RenderBin::draw(state,previous);
// now reset the state so its back in its default state.
if (previous)
{
RenderGraph::moveToRootRenderGraph(state,previous->_parent);
state.apply();
previous = NULL;
}
}
// Statistics features
bool RenderStage::getStats(Statistics* primStats)
{
if (_renderStageLighting.valid()) primStats->addLight(_renderStageLighting->_lightList.size());
return RenderBin::getStats(primStats);
}