Added osg::State::popAllStateSets() method to pop all remain StateSet's off

the state stack, thus readying the state object to recieve a new frame.

Removed the state.reset() call in osgUtil::SceneView::cull() as this was
causing problems with stats producing inheritance of state when toggling
stats on.
This commit is contained in:
Robert Osfield
2003-09-10 21:22:47 +00:00
parent 1707276707
commit 69c4e87bb7
4 changed files with 15 additions and 3 deletions

View File

@@ -72,9 +72,13 @@ class SG_EXPORT State : public Referenced
/** push stateset onto state stack.*/
void pushStateSet(const StateSet* dstate);
/** pop drawstate off state stack.*/
/** pop stateset off state stack.*/
void popStateSet();
/** pop all stateset's off state stack, ensuring its empty ready for the next frame.
* note, to return OpenGL to default state, one should do any state.popAllStatSets(); state.apply().*/
void popAllStateSets();
/** copy the modes and attributes which captures the current state.*/
void captureCurrentState(StateSet& stateset) const;

View File

@@ -148,6 +148,11 @@ void State::pushStateSet(const StateSet* dstate)
}
}
void State::popAllStateSets()
{
while (!_drawStateStack.empty()) popStateSet();
}
void State::popStateSet()
{
if (_drawStateStack.empty()) return;

View File

@@ -170,7 +170,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::operator()( const Producer::C
state.popStateSet();
state.apply();
//state.apply();
}

View File

@@ -211,7 +211,7 @@ void SceneView::cull()
}
// we in theory should be able to be able to bypass reset, but we'll call it just incase.
_state->reset();
//_state->reset();
_state->setFrameStamp(_frameStamp.get());
_state->setDisplaySettings(_displaySettings.get());
@@ -805,6 +805,9 @@ void SceneView::draw()
_renderStage->drawPreRenderStages(*_state,previous);
_renderStage->draw(*_state,previous);
}
// re apply the defalt OGL state.
_state->popAllStateSets();
GLenum errorNo = glGetError();
if (errorNo!=GL_NO_ERROR)