Added State::s/getRootStateSet() that enables applications to insert a StateSet above all rendering for a graphics context. Utilized in the new shadper pipeline functionality
This commit is contained in:
parent
172ca9bae5
commit
a99b05ff87
@ -806,6 +806,12 @@ class OSG_EXPORT State : public Referenced
|
||||
inline const DisplaySettings* getDisplaySettings() const { return _displaySettings.get(); }
|
||||
|
||||
|
||||
/** Set the root StateSet this is applied above all StateSet that are pushed and popped during the draw traversal.*/
|
||||
void setRootStateSet(osg::StateSet* stateset);
|
||||
|
||||
/** Get the root StateSet.*/
|
||||
osg::StateSet* getRootStateSet() { return _rootStateSet.get(); }
|
||||
|
||||
|
||||
/** Set flag for early termination of the draw traversal.*/
|
||||
void setAbortRenderingPtr(bool* abortPtr) { _abortRenderingPtr = abortPtr; }
|
||||
@ -1047,6 +1053,8 @@ class OSG_EXPORT State : public Referenced
|
||||
GraphicsContext* _graphicsContext;
|
||||
unsigned int _contextID;
|
||||
|
||||
osg::ref_ptr<osg::StateSet> _rootStateSet;
|
||||
|
||||
osg::ref_ptr<VertexArrayState> _globalVertexArrayState;
|
||||
VertexArrayState* _vas;
|
||||
|
||||
|
@ -507,9 +507,36 @@ void State::setMaxBufferObjectPoolSize(unsigned int size)
|
||||
OSG_INFO<<"osg::State::_maxBufferObjectPoolSize="<<_maxBufferObjectPoolSize<<std::endl;
|
||||
}
|
||||
|
||||
void State::setRootStateSet(osg::StateSet* stateset)
|
||||
{
|
||||
if (_rootStateSet == stateset) return;
|
||||
|
||||
_rootStateSet = stateset;
|
||||
|
||||
if (_stateStateStack.empty())
|
||||
{
|
||||
if (stateset) pushStateSet(stateset);
|
||||
}
|
||||
else
|
||||
{
|
||||
StateSetStack previousStateSetStack = _stateStateStack;
|
||||
|
||||
// we want to reset all the various state stacks, inserting the new root StateSet as the topmost one automatically (popeAllStateSet() does this.)
|
||||
popAllStateSets();
|
||||
|
||||
// now we have to add back in all the StateSet's to make sure the state is consistent
|
||||
for(StateSetStack::iterator itr = previousStateSetStack.begin();
|
||||
itr != previousStateSetStack.end();
|
||||
++itr)
|
||||
{
|
||||
pushStateSet(*itr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void State::pushStateSet(const StateSet* dstate)
|
||||
{
|
||||
|
||||
_stateStateStack.push_back(dstate);
|
||||
if (dstate)
|
||||
{
|
||||
@ -551,6 +578,8 @@ void State::popAllStateSets()
|
||||
applyModelViewMatrix(0);
|
||||
|
||||
_lastAppliedProgramObject = 0;
|
||||
|
||||
if (_rootStateSet.valid()) pushStateSet(_rootStateSet.get());
|
||||
}
|
||||
|
||||
void State::popStateSet()
|
||||
@ -678,7 +707,7 @@ void State::captureCurrentState(StateSet& stateset) const
|
||||
|
||||
void State::apply(const StateSet* dstate)
|
||||
{
|
||||
// OSG_NOTICE<<__PRETTY_FUNCTION__<<std::endl;
|
||||
// OSG_NOTICE<<__PRETTY_FUNCTION__<<" _stateStateStack.size()="<<_stateStateStack.size()<<std::endl;
|
||||
|
||||
if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors("start of State::apply(StateSet*)");
|
||||
|
||||
@ -774,7 +803,7 @@ void State::apply(const StateSet* dstate)
|
||||
|
||||
void State::apply()
|
||||
{
|
||||
// OSG_NOTICE<<__PRETTY_FUNCTION__<<std::endl;
|
||||
// OSG_NOTICE<<__PRETTY_FUNCTION__<<" _stateStateStack.size()="<<_stateStateStack.size()<<std::endl;
|
||||
|
||||
|
||||
if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors("start of State::apply()");
|
||||
|
Loading…
Reference in New Issue
Block a user