/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #include #include #include #include using namespace osg; using namespace osgUtil; // register a RenderStage prototype with the RenderBin prototype list. //RegisterRenderBinProxy s_registerRenderStageProxy; RenderStage::RenderStage(): RenderBin(getDefaultRenderBinSortMode()) { // 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(SortMode mode): RenderBin(mode) { // 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(const RenderStage& rhs,const osg::CopyOp& copyop): RenderBin(rhs,copyop), _stageDrawnThisFrame(false), _preRenderList(rhs._preRenderList), _postRenderList(rhs._postRenderList), _viewport(rhs._viewport), _clearMask(rhs._clearMask), _colorMask(rhs._colorMask), _clearColor(rhs._clearColor), _clearAccum(rhs._clearAccum), _clearDepth(rhs._clearDepth), _clearStencil(rhs._clearStencil), _renderStageLighting(rhs._renderStageLighting) { _stage = this; } RenderStage::~RenderStage() { } void RenderStage::reset() { _preRenderList.clear(); _stageDrawnThisFrame = false; if (_renderStageLighting.valid()) _renderStageLighting->reset(); RenderBin::reset(); } void RenderStage::addPreRenderStage(RenderStage* rs) { if (rs) _preRenderList.push_back(rs); } void RenderStage::addPostRenderStage(RenderStage* rs) { if (rs) _postRenderList.push_back(rs); } void RenderStage::drawPreRenderStages(osg::State& state,RenderLeaf*& previous) { if (_preRenderList.empty()) return; //cout << "Drawing prerendering stages "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<draw(state,previous); } //cout << "Done Drawing prerendering stages "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<x(), _viewport->y(), _viewport->width(), _viewport->height() ); //cout << " clearing "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<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 glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); // apply the positional state. if (_inheritedRenderStageLighting.valid()) { _inheritedRenderStageLighting->draw(state, previous, &_inheritedRenderStageLightingMatrix); } // apply the positional state. if (_renderStageLighting.valid()) { _renderStageLighting->draw(state, previous, 0); } // draw the children and local. RenderBin::drawImplementation(state,previous); // now reset the state so its back in its default state. if (previous) { RenderGraph::moveToRootRenderGraph(state,previous->_parent); state.apply(); previous = NULL; } } void RenderStage::drawPostRenderStages(osg::State& state,RenderLeaf*& previous) { if (_postRenderList.empty()) return; //cout << "Drawing prerendering stages "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<draw(state,previous); } //cout << "Done Drawing prerendering stages "<x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<addLight(_renderStageLighting->_lightList.size()); } return RenderBin::getStats(primStats); }