From 7480d51830e4489bc3f654fbb1788704b3c5d964 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 6 May 2005 09:58:49 +0000 Subject: [PATCH] From Mike Weiblen, further work on GLSL support --- include/osg/Program | 19 ++++++++++++------- include/osg/Uniform | 4 ++-- src/osg/Program.cpp | 24 +++++++++++++++++------- src/osg/State.cpp | 2 +- src/osg/StateSet.cpp | 2 +- src/osg/Uniform.cpp | 6 +++--- 6 files changed, 36 insertions(+), 21 deletions(-) diff --git a/include/osg/Program b/include/osg/Program index e33441f54..d49dc84fb 100644 --- a/include/osg/Program +++ b/include/osg/Program @@ -12,7 +12,7 @@ */ /* file: include/osg/Program - * author: Mike Weiblen 2005-04-29 + * author: Mike Weiblen 2005-05-05 */ #ifndef OSG_PROGRAM @@ -364,6 +364,9 @@ class OSG_EXPORT Program : public osg::StateAttribute * in the OpenGL context related to contextID.*/ static void flushDeletedGlPrograms(unsigned int contextID,double currentTime, double& availableTime); + typedef std::map< std::string, std::pair > NameInfoMap; + const NameInfoMap& getActiveUniforms(unsigned int contextID) const; + const NameInfoMap& getActiveAttribs(unsigned int contextID) const; public: @@ -390,7 +393,7 @@ class OSG_EXPORT Program : public osg::StateAttribute void useProgram() const; - void resetAppliedUnifroms() const + void resetAppliedUniforms() const { for(LastAppliedUniformList::iterator itr=_lastAppliedUniformList.begin(); itr!=_lastAppliedUniformList.end(); @@ -426,8 +429,11 @@ class OSG_EXPORT Program : public osg::StateAttribute } } - inline GLint getUniformLocation( const std::string& name ) const { NameLocationMap::const_iterator itr = _uniformLocationMap.find(name); return (itr!=_uniformLocationMap.end()) ? itr->second : -1; } - inline GLint getAttribLocation( const std::string& name ) const { NameLocationMap::const_iterator itr = _attribLocationMap.find(name); return (itr!=_attribLocationMap.end()) ? itr->second : -1; } + const NameInfoMap& getActiveUniforms() const {return _uniformInfoMap;} + const NameInfoMap& getActiveAttribs() const {return _attribInfoMap;} + + inline GLint getUniformLocation( const std::string& name ) const { NameInfoMap::const_iterator itr = _uniformInfoMap.find(name); return (itr!=_uniformInfoMap.end()) ? itr->second.first : -1; } + inline GLint getAttribLocation( const std::string& name ) const { NameInfoMap::const_iterator itr = _attribInfoMap.find(name); return (itr!=_attribInfoMap.end()) ? itr->second.first : -1; } protected: /*methods*/ ~PerContextProgram(); @@ -445,9 +451,8 @@ class OSG_EXPORT Program : public osg::StateAttribute bool _isLinked; const unsigned int _contextID; - typedef std::map NameLocationMap; - NameLocationMap _uniformLocationMap; - NameLocationMap _attribLocationMap; + NameInfoMap _uniformInfoMap; + NameInfoMap _attribInfoMap; typedef std::pair UniformModifiedCountPair; typedef std::vector LastAppliedUniformList; diff --git a/include/osg/Uniform b/include/osg/Uniform index 811e72768..0e6f74394 100644 --- a/include/osg/Uniform +++ b/include/osg/Uniform @@ -11,7 +11,7 @@ */ /* file: include/osg/Uniform - * author: Mike Weiblen 2005-04-21 + * author: Mike Weiblen 2005-05-05 */ #ifndef OSG_UNIFORM @@ -153,7 +153,7 @@ class OSG_EXPORT Uniform : public Object public: Uniform(); - Uniform( const std::string& name, Type type ); + Uniform( Type type, const std::string& name ); /** Copy constructor using CopyOp to manage deep vs shallow copy. */ Uniform(const Uniform& rhs, const CopyOp& copyop=CopyOp::SHALLOW_COPY); diff --git a/src/osg/Program.cpp b/src/osg/Program.cpp index e12cfd815..ed59d9510 100644 --- a/src/osg/Program.cpp +++ b/src/osg/Program.cpp @@ -13,7 +13,7 @@ */ /* file: src/osg/Program.cpp - * author: Mike Weiblen 2005-04-29 + * author: Mike Weiblen 2005-05-05 */ #include @@ -2100,6 +2100,16 @@ bool Program::getGlProgramInfoLog(unsigned int contextID, std::string& log) cons return getPCP( contextID )->getInfoLog( log ); } +const Program::NameInfoMap& Program::getActiveUniforms(unsigned int contextID) const +{ + return getPCP( contextID )->getActiveUniforms(); +} + +const Program::NameInfoMap& Program::getActiveAttribs(unsigned int contextID) const +{ + return getPCP( contextID )->getActiveAttribs(); +} + /////////////////////////////////////////////////////////////////////////// // osg::Program::PerContextProgram // PCP is an OSG abstraction of the per-context glProgram @@ -2138,8 +2148,8 @@ void Program::PerContextProgram::linkProgram() << " id=" << _glProgramHandle << std::endl; - _uniformLocationMap.clear(); - _attribLocationMap.clear(); + _uniformInfoMap.clear(); + _attribInfoMap.clear(); // set any explicit vertex attribute bindings const AttribBindingList& bindlist = _program->getAttribBindingList(); @@ -2170,7 +2180,7 @@ void Program::PerContextProgram::linkProgram() // dont build maps if link failed if( ! _isLinked ) return; - // build _uniformLocationMap + // build _uniformInfoMap GLint numUniforms = 0; GLsizei maxLen = 0; _extensions->glGetProgramiv( _glProgramHandle, GL_ACTIVE_UNIFORMS, &numUniforms ); @@ -2190,7 +2200,7 @@ void Program::PerContextProgram::linkProgram() if( loc != -1 ) { - _uniformLocationMap[name] = loc; + _uniformInfoMap[name] = std::pair(loc,type); osg::notify(osg::INFO) << "\tUniform \"" << name << "\"" @@ -2202,7 +2212,7 @@ void Program::PerContextProgram::linkProgram() delete [] name; } - // build _attribLocationMap + // build _attribInfoMap GLint numAttrib = 0; _extensions->glGetProgramiv( _glProgramHandle, GL_ACTIVE_ATTRIBUTES, &numAttrib ); _extensions->glGetProgramiv( _glProgramHandle, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxLen ); @@ -2221,7 +2231,7 @@ void Program::PerContextProgram::linkProgram() if( loc != -1 ) { - _attribLocationMap[name] = loc; + _attribInfoMap[name] = std::pair(loc,type); osg::notify(osg::INFO) << "\tAttrib \"" << name << "\"" diff --git a/src/osg/State.cpp b/src/osg/State.cpp index 5ad624e41..7f413f898 100644 --- a/src/osg/State.cpp +++ b/src/osg/State.cpp @@ -120,7 +120,7 @@ void State::reset() apitr!=_appliedProgramObjectSet.end(); ++apitr) { - (*apitr)->resetAppliedUnifroms(); + (*apitr)->resetAppliedUniforms(); } _appliedProgramObjectSet.clear(); diff --git a/src/osg/StateSet.cpp b/src/osg/StateSet.cpp index eb178ce75..b0ed8a9cf 100644 --- a/src/osg/StateSet.cpp +++ b/src/osg/StateSet.cpp @@ -935,7 +935,7 @@ Uniform* StateSet::getOrCreateUniform(const std::string& name, Uniform::Type typ // no uniform found matching name so create it.. - Uniform* uniform = new Uniform(name,type); + Uniform* uniform = new Uniform(type,name); addUniform(uniform); return uniform; diff --git a/src/osg/Uniform.cpp b/src/osg/Uniform.cpp index 925d9173f..042a94b1e 100644 --- a/src/osg/Uniform.cpp +++ b/src/osg/Uniform.cpp @@ -11,7 +11,7 @@ */ /* file: src/osg/Uniform.cpp - * author: Mike Weiblen 2005-04-21 + * author: Mike Weiblen 2005-05-05 */ #include @@ -34,8 +34,8 @@ Uniform::Uniform() : } -Uniform::Uniform( const std::string& name, Type type ) : - _name(name), _type(type),_modifiedCount(0) +Uniform::Uniform( Type type, const std::string& name ) : + _type(type), _name(name), _modifiedCount(0) { setDataVariance(STATIC);