From Lilith Bryant, "As discussed previously on the users list. Fixes the redundant calls to
glActiveTexture on every State::apply after more than one texunits have been used. This is against 2.9.6 (I think SVN head is the same) Quick Synopsis: New functions: State::applyModeOnTexUnit State::applyAttributeOnTexUnit State::applyModeMapOnTexUnit State::applyAttributeMapOnTexUnit State::applyModeListOnTexUnit State::applyAttributeListOnTexUnit All copies of the normal versions, but they also set the active tex unit if absolutely necessary (i.e. only if they call something OpenGL). State::apply (*2) State::applyTextureAttribute Changed to call the above functions and no longer call setActiveTextureUnit themselves. State::setActiveTextureUnit Made inline, so the benefit of having applyModeOnTexUnit (etc) inline is retained. "
This commit is contained in:
@@ -501,14 +501,11 @@ void State::apply(const StateSet* dstate)
|
||||
unitMax = maximum(static_cast<unsigned int>(unitMax),static_cast<unsigned int>(_textureAttributeMapList.size()));
|
||||
for(unit=0;unit<unitMax;++unit)
|
||||
{
|
||||
if (setActiveTextureUnit(unit))
|
||||
{
|
||||
if (unit<ds_textureModeList.size()) applyModeList(getOrCreateTextureModeMap(unit),ds_textureModeList[unit]);
|
||||
else if (unit<_textureModeMapList.size()) applyModeMap(_textureModeMapList[unit]);
|
||||
if (unit<ds_textureModeList.size()) applyModeListOnTexUnit(unit,getOrCreateTextureModeMap(unit),ds_textureModeList[unit]);
|
||||
else if (unit<_textureModeMapList.size()) applyModeMapOnTexUnit(unit,_textureModeMapList[unit]);
|
||||
|
||||
if (unit<ds_textureAttributeList.size()) applyAttributeList(getOrCreateTextureAttributeMap(unit),ds_textureAttributeList[unit]);
|
||||
else if (unit<_textureAttributeMapList.size()) applyAttributeMap(_textureAttributeMapList[unit]);
|
||||
}
|
||||
if (unit<ds_textureAttributeList.size()) applyAttributeListOnTexUnit(unit,getOrCreateTextureAttributeMap(unit),ds_textureAttributeList[unit]);
|
||||
else if (unit<_textureAttributeMapList.size()) applyAttributeMapOnTexUnit(unit,_textureAttributeMapList[unit]);
|
||||
}
|
||||
|
||||
applyUniformList(_uniformMap,dstate->getUniformList());
|
||||
@@ -538,11 +535,8 @@ void State::apply()
|
||||
unsigned int unitMax = maximum(_textureModeMapList.size(),_textureAttributeMapList.size());
|
||||
for(unit=0;unit<unitMax;++unit)
|
||||
{
|
||||
if (setActiveTextureUnit(unit))
|
||||
{
|
||||
if (unit<_textureModeMapList.size()) applyModeMap(_textureModeMapList[unit]);
|
||||
if (unit<_textureAttributeMapList.size()) applyAttributeMap(_textureAttributeMapList[unit]);
|
||||
}
|
||||
if (unit<_textureModeMapList.size()) applyModeMapOnTexUnit(unit,_textureModeMapList[unit]);
|
||||
if (unit<_textureAttributeMapList.size()) applyAttributeMapOnTexUnit(unit,_textureAttributeMapList[unit]);
|
||||
}
|
||||
|
||||
applyUniformMap(_uniformMap);
|
||||
@@ -857,26 +851,6 @@ bool State::setClientActiveTextureUnit( unsigned int unit )
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/** set the current texture unit, return true if selected, false if selection failed such as when multitexturing is not supported.
|
||||
* note, only updates values that change.*/
|
||||
bool State::setActiveTextureUnit( unsigned int unit )
|
||||
{
|
||||
if (unit!=_currentActiveTextureUnit)
|
||||
{
|
||||
if (_glActiveTexture && unit < (unsigned int)(maximum(_glMaxTextureCoords,_glMaxTextureUnits)) )
|
||||
{
|
||||
_glActiveTexture(GL_TEXTURE0+unit);
|
||||
_currentActiveTextureUnit = unit;
|
||||
}
|
||||
else
|
||||
{
|
||||
return unit==0;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void State::setFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
|
||||
{
|
||||
#ifdef OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE
|
||||
|
||||
@@ -914,6 +914,13 @@ BEGIN_OBJECT_REFLECTOR(osg::State)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user