Refactored osgUtil::ShaderGen to use #pragma(tic) shader composition.

This commit is contained in:
Robert Osfield
2018-03-14 08:22:45 +00:00
parent 009580676f
commit 4447190dd6
5 changed files with 164 additions and 418 deletions

View File

@@ -26,57 +26,19 @@
namespace osgUtil
{
class OSGUTIL_EXPORT ShaderGenCache : public osg::Referenced
{
public:
enum StateMask
{
BLEND = 1,
LIGHTING = 2,
FOG = 4,
DIFFUSE_MAP = 8, //< Texture in unit 0
NORMAL_MAP = 16 //< Texture in unit 1 and vertex attribute array 6
};
typedef std::map<int, osg::ref_ptr<osg::StateSet> > StateSetMap;
ShaderGenCache() {};
void setStateSet(int stateMask, osg::StateSet *program);
osg::StateSet *getStateSet(int stateMask) const;
osg::StateSet *getOrCreateStateSet(int stateMask);
protected:
osg::StateSet *createStateSet(int stateMask) const;
mutable OpenThreads::Mutex _mutex;
StateSetMap _stateSetMap;
};
class OSGUTIL_EXPORT ShaderGenVisitor : public osg::NodeVisitor
{
public:
ShaderGenVisitor();
ShaderGenVisitor(ShaderGenCache *stateCache);
void setStateCache(ShaderGenCache *stateCache) { _stateCache = stateCache; }
ShaderGenCache *getStateCache() const { return _stateCache.get(); }
/// assign default uber program to specified StateSet - typically the root node of the scene graph or the view's Camera
void assignUberProgram(osg::StateSet *stateSet);
/// Top level state set applied as the first one.
void setRootStateSet(osg::StateSet *stateSet);
osg::StateSet *getRootStateSet() const { return _rootStateSet.get(); }
void apply(osg::Node& node);
void apply(osg::Node &node);
void apply(osg::Drawable &drawable);
void reset();
void remapStateSet(osg::StateSet* stateSet);
protected:
void update(osg::Drawable *drawable);
osg::ref_ptr<ShaderGenCache> _stateCache;
osg::ref_ptr<osg::State> _state;
osg::ref_ptr<osg::StateSet> _rootStateSet;
};
}