Fixed compare(ProgramObject) and added UniformeValue::compare and ShaderObject::compare

to support proper sorting of shaders.
This commit is contained in:
Robert Osfield
2004-07-28 19:56:22 +00:00
parent 40a1a39bff
commit 3d61e25cce
4 changed files with 77 additions and 13 deletions

View File

@@ -171,6 +171,42 @@ ProgramObject::~ProgramObject()
}
}
int ProgramObject::compare(const osg::StateAttribute& sa) const
{
// check the types are equal and then create the rhs variable
// used by the COMPARE_StateAttribute_Paramter macro's below.
COMPARE_StateAttribute_Types(ProgramObject,sa)
if (_shaderObjectList.size()<rhs._shaderObjectList.size()) return -1;
if (_shaderObjectList.size()>rhs._shaderObjectList.size()) return 1;
ShaderObjectList::const_iterator litr=_shaderObjectList.begin();
ShaderObjectList::const_iterator ritr=rhs._shaderObjectList.begin();
for(;
litr!=_shaderObjectList.end();
++litr,++ritr)
{
int result = (*litr)->compare(*(*ritr));
if (result!=0) return result;
}
if (_univalList.size()<rhs._univalList.size()) return -1;
if (_univalList.size()>rhs._univalList.size()) return 1;
UniformValueList::const_iterator luitr=_univalList.begin();
UniformValueList::const_iterator ruitr=rhs._univalList.begin();
for(;
luitr!=_univalList.end();
++luitr,++ruitr)
{
int result = (*luitr)->compare(*(*ruitr));
if (result!=0) return result;
}
return 0; // passed all the above comparison macro's, must be equal.
}
// mark all PCPOs as needing a relink
void ProgramObject::dirtyProgramObject()
@@ -415,6 +451,13 @@ ShaderObject::~ShaderObject()
/*TODO*/
}
int ShaderObject::compare(const ShaderObject& so) const
{
if (getShaderSource()<so.getShaderSource()) return -1;
if (so.getShaderSource()<getShaderSource()) return 1;
return 0;
}
// mark each PCSO (per-context Shader Object) as needing a recompile
void ShaderObject::dirtyShaderObject()
{

View File

@@ -25,6 +25,13 @@
using namespace osgGL2;
using namespace osg;
int UniformValue::compare(const UniformValue& uv) const
{
if (_name<uv._name) return -1;
if (uv._name<_name) return 1;
return 0;
}
int UniformValue::getLocation( Extensions *ext, const GLhandleARB progObj ) const
{
GLint loc = ext->glGetUniformLocation( progObj, _name.c_str() );