From Mike Weiblen, changes to internal help class in prep for array uniform support.

Small tweaks for build under Linux from Robert Osfield.
This commit is contained in:
Robert Osfield 2006-03-28 16:08:32 +00:00
parent 7f101c37ad
commit e7a4ad287b
3 changed files with 27 additions and 18 deletions

View File

@ -1,4 +1,4 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 Robert Osfield /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
* Copyright (C) 2003-2005 3Dlabs Inc. Ltd. * Copyright (C) 2003-2005 3Dlabs Inc. Ltd.
* Copyright (C) 2004-2005 Nathan Cournia * Copyright (C) 2004-2005 Nathan Cournia
* *
@ -12,7 +12,7 @@
*/ */
/* file: include/osg/Program /* file: include/osg/Program
* author: Mike Weiblen 2005-07-01 * author: Mike Weiblen 2006-03-25
*/ */
#ifndef OSG_PROGRAM #ifndef OSG_PROGRAM
@ -109,9 +109,16 @@ class OSG_EXPORT Program : public osg::StateAttribute
* in the OpenGL context related to contextID.*/ * in the OpenGL context related to contextID.*/
static void flushDeletedGlPrograms(unsigned int contextID,double currentTime, double& availableTime); static void flushDeletedGlPrograms(unsigned int contextID,double currentTime, double& availableTime);
typedef std::map< std::string, std::pair<GLint,GLenum> > NameInfoMap; struct ActiveVarInfo {
const NameInfoMap& getActiveUniforms(unsigned int contextID) const; ActiveVarInfo() : _location(-1), _type(Uniform::UNDEFINED), _size(-1) {}
const NameInfoMap& getActiveAttribs(unsigned int contextID) const; ActiveVarInfo( GLint loc, GLenum type, GLint size ) : _location(loc), _type(type), _size(size) {}
GLint _location;
GLenum _type;
GLint _size;
};
typedef std::map< std::string, ActiveVarInfo > ActiveVarInfoMap;
const ActiveVarInfoMap& getActiveUniforms(unsigned int contextID) const;
const ActiveVarInfoMap& getActiveAttribs(unsigned int contextID) const;
public: public:
@ -175,11 +182,11 @@ class OSG_EXPORT Program : public osg::StateAttribute
} }
} }
const NameInfoMap& getActiveUniforms() const {return _uniformInfoMap;} const ActiveVarInfoMap& getActiveUniforms() const {return _uniformInfoMap;}
const NameInfoMap& getActiveAttribs() const {return _attribInfoMap;} const ActiveVarInfoMap& 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 getUniformLocation( const std::string& name ) const { ActiveVarInfoMap::const_iterator itr = _uniformInfoMap.find(name); return (itr!=_uniformInfoMap.end()) ? itr->second._location : -1; }
inline GLint getAttribLocation( const std::string& name ) const { NameInfoMap::const_iterator itr = _attribInfoMap.find(name); return (itr!=_attribInfoMap.end()) ? itr->second.first : -1; } inline GLint getAttribLocation( const std::string& name ) const { ActiveVarInfoMap::const_iterator itr = _attribInfoMap.find(name); return (itr!=_attribInfoMap.end()) ? itr->second._location : -1; }
protected: /*methods*/ protected: /*methods*/
~PerContextProgram(); ~PerContextProgram();
@ -197,8 +204,8 @@ class OSG_EXPORT Program : public osg::StateAttribute
bool _isLinked; bool _isLinked;
const unsigned int _contextID; const unsigned int _contextID;
NameInfoMap _uniformInfoMap; ActiveVarInfoMap _uniformInfoMap;
NameInfoMap _attribInfoMap; ActiveVarInfoMap _attribInfoMap;
typedef std::pair<const osg::Uniform*, unsigned int> UniformModifiedCountPair; typedef std::pair<const osg::Uniform*, unsigned int> UniformModifiedCountPair;
typedef std::vector<UniformModifiedCountPair> LastAppliedUniformList; typedef std::vector<UniformModifiedCountPair> LastAppliedUniformList;

View File

@ -164,7 +164,7 @@ class OSG_EXPORT Uniform : public Object
SAMPLER_CUBE = GL_SAMPLER_CUBE, SAMPLER_CUBE = GL_SAMPLER_CUBE,
SAMPLER_1D_SHADOW = GL_SAMPLER_1D_SHADOW, SAMPLER_1D_SHADOW = GL_SAMPLER_1D_SHADOW,
SAMPLER_2D_SHADOW = GL_SAMPLER_2D_SHADOW, SAMPLER_2D_SHADOW = GL_SAMPLER_2D_SHADOW,
UNDEFINED = -1 UNDEFINED = 0x0
}; };
public: public:

View File

@ -1,4 +1,4 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 Robert Osfield /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
* Copyright (C) 2003-2005 3Dlabs Inc. Ltd. * Copyright (C) 2003-2005 3Dlabs Inc. Ltd.
* Copyright (C) 2004-2005 Nathan Cournia * Copyright (C) 2004-2005 Nathan Cournia
* *
@ -13,7 +13,7 @@
*/ */
/* file: src/osg/Program.cpp /* file: src/osg/Program.cpp
* author: Mike Weiblen 2005-07-01 * author: Mike Weiblen 2006-03-25
*/ */
#include <fstream> #include <fstream>
@ -2131,12 +2131,12 @@ bool Program::getGlProgramInfoLog(unsigned int contextID, std::string& log) cons
return getPCP( contextID )->getInfoLog( log ); return getPCP( contextID )->getInfoLog( log );
} }
const Program::NameInfoMap& Program::getActiveUniforms(unsigned int contextID) const const Program::ActiveVarInfoMap& Program::getActiveUniforms(unsigned int contextID) const
{ {
return getPCP( contextID )->getActiveUniforms(); return getPCP( contextID )->getActiveUniforms();
} }
const Program::NameInfoMap& Program::getActiveAttribs(unsigned int contextID) const const Program::ActiveVarInfoMap& Program::getActiveAttribs(unsigned int contextID) const
{ {
return getPCP( contextID )->getActiveAttribs(); return getPCP( contextID )->getActiveAttribs();
} }
@ -2240,11 +2240,12 @@ void Program::PerContextProgram::linkProgram()
if( loc != -1 ) if( loc != -1 )
{ {
_uniformInfoMap[name] = std::pair<GLint,GLenum>(loc,type); _uniformInfoMap[name] = ActiveVarInfo(loc,type,size);
osg::notify(osg::INFO) osg::notify(osg::INFO)
<< "\tUniform \"" << name << "\"" << "\tUniform \"" << name << "\""
<< " loc="<< loc << " loc="<< loc
<< " size="<< size
<< " type=" << Uniform::getTypename((Uniform::Type)type) << " type=" << Uniform::getTypename((Uniform::Type)type)
<< std::endl; << std::endl;
} }
@ -2271,11 +2272,12 @@ void Program::PerContextProgram::linkProgram()
if( loc != -1 ) if( loc != -1 )
{ {
_attribInfoMap[name] = std::pair<GLint,GLenum>(loc,type); _attribInfoMap[name] = ActiveVarInfo(loc,type,size);
osg::notify(osg::INFO) osg::notify(osg::INFO)
<< "\tAttrib \"" << name << "\"" << "\tAttrib \"" << name << "\""
<< " loc=" << loc << " loc=" << loc
<< " size=" << size
<< std::endl; << std::endl;
} }
} }