Added object map to DisplaySettings::setObject(std::string, Object*) & getObject(std::string)
This enables caching of data, such as pre-loaded files or other objects
This commit is contained in:
parent
d0d00eafa8
commit
a17b1ac547
@ -380,6 +380,10 @@ class OSG_EXPORT DisplaySettings : public osg::Referenced
|
|||||||
void setValue(const std::string& name, const std::string& value);
|
void setValue(const std::string& name, const std::string& value);
|
||||||
bool getValue(const std::string& name, std::string& value, bool use_getenv_fallback=true) const;
|
bool getValue(const std::string& name, std::string& value, bool use_getenv_fallback=true) const;
|
||||||
|
|
||||||
|
void setObject(const std::string& name, osg::Object* object) { _objectMap[name] = object; }
|
||||||
|
Object* getObject(const std::string& name) { ObjectMap::iterator itr = _objectMap.find(name); return itr!=_objectMap.end() ? itr->second.get() : 0; }
|
||||||
|
const Object* getObject(const std::string& name) const { ObjectMap::const_iterator itr = _objectMap.find(name); return itr!=_objectMap.end() ? itr->second.get() : 0; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual ~DisplaySettings();
|
virtual ~DisplaySettings();
|
||||||
@ -451,9 +455,11 @@ protected:
|
|||||||
unsigned int _shaderPipelineNumTextureUnits;
|
unsigned int _shaderPipelineNumTextureUnits;
|
||||||
|
|
||||||
typedef std::map<std::string, std::string> ValueMap;
|
typedef std::map<std::string, std::string> ValueMap;
|
||||||
|
typedef std::map<std::string, ref_ptr<Object> > ObjectMap;
|
||||||
|
|
||||||
mutable OpenThreads::Mutex _valueMapMutex;
|
mutable OpenThreads::Mutex _valueMapMutex;
|
||||||
mutable ValueMap _valueMap;
|
mutable ValueMap _valueMap;
|
||||||
|
mutable ObjectMap _objectMap;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -874,7 +874,7 @@ void Shader::_computeShaderDefines()
|
|||||||
|
|
||||||
std::string::size_type first_chararcter = find_first(_shaderSource, NoneOf(" \t"), pos, eol);
|
std::string::size_type first_chararcter = find_first(_shaderSource, NoneOf(" \t"), pos, eol);
|
||||||
|
|
||||||
OSG_NOTICE<<"\nFound pragma line ["<<_shaderSource.substr(first_chararcter, eol-first_chararcter)<<"]"<<std::endl;
|
OSG_INFO<<"\nFound pragma line ["<<_shaderSource.substr(first_chararcter, eol-first_chararcter)<<"]"<<std::endl;
|
||||||
|
|
||||||
if (first_chararcter<eol)
|
if (first_chararcter<eol)
|
||||||
{
|
{
|
||||||
@ -916,7 +916,7 @@ void Shader::_computeShaderDefines()
|
|||||||
pos = eol;
|
pos = eol;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
for(ShaderDefines::iterator itr = _shaderPragmas.defines.begin();
|
for(ShaderDefines::iterator itr = _shaderPragmas.defines.begin();
|
||||||
itr != _shaderPragmas.defines.end();
|
itr != _shaderPragmas.defines.end();
|
||||||
++itr)
|
++itr)
|
||||||
|
@ -704,26 +704,17 @@ void StateSet::setGlobalDefaults()
|
|||||||
itr != files.end();
|
itr != files.end();
|
||||||
++itr)
|
++itr)
|
||||||
{
|
{
|
||||||
std::string fileName = *itr;
|
// look up object for specified filename - this will be preloaded by osgDB::Registry
|
||||||
std::string ext;
|
osg::Object* object = DisplaySettings::instance()->getObject(*itr);
|
||||||
std::string::size_type dot = fileName.find_last_of('.');
|
osg::Shader* shader = dynamic_cast<osg::Shader*>(object);
|
||||||
if (dot!=std::string::npos) ext = std::string(fileName.begin()+dot+1,fileName.end());
|
if (shader)
|
||||||
OSG_NOTICE<<" filename "<<*itr<<", "<<ext<<std::endl;
|
|
||||||
|
|
||||||
if (ext=="vert")
|
|
||||||
{
|
{
|
||||||
OSG_NOTICE<<"vertex shader: "<<*itr<<std::endl;
|
program->addShader(shader);
|
||||||
program->addShader(Shader::readShaderFile( Shader::VERTEX, fileName));
|
}
|
||||||
}
|
}
|
||||||
else if (ext=="frag")
|
|
||||||
{
|
|
||||||
OSG_NOTICE<<"fragment shader: "<<*itr<<std::endl;
|
|
||||||
program->addShader(Shader::readShaderFile( Shader::FRAGMENT, fileName));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
if (program->getNumShaders()==0)
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
OSG_NOTICE<<"void StateSet::setGlobalDefaults() ShaderPipeline enabled, numTextUnits = "<<DisplaySettings::instance()->getShaderPipelineNumTextureUnits()<<std::endl;
|
OSG_NOTICE<<"void StateSet::setGlobalDefaults() ShaderPipeline enabled, numTextUnits = "<<DisplaySettings::instance()->getShaderPipelineNumTextureUnits()<<std::endl;
|
||||||
|
|
||||||
|
@ -297,3 +297,33 @@ osg::ref_ptr<Node> osgDB::readRefNodeFiles(osg::ArgumentParser& arguments,const
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Helper proxy class for pre-loading shader pipeline shaders
|
||||||
|
//
|
||||||
|
struct LoadShaderShaderPipelineFilesProxy
|
||||||
|
{
|
||||||
|
LoadShaderShaderPipelineFilesProxy()
|
||||||
|
{
|
||||||
|
// pre-load any ShaderPipeline shaders
|
||||||
|
if (osg::DisplaySettings::instance()->getShaderPipeline())
|
||||||
|
{
|
||||||
|
OSG_INFO<<"LoadShaderShaderPipelineFilesProxy() Pre-loading the ShaderPipeline shaders"<<std::endl;
|
||||||
|
for(osg::DisplaySettings::Filenames::const_iterator itr = osg::DisplaySettings::instance()->getShaderPipelineFiles().begin();
|
||||||
|
itr != osg::DisplaySettings::instance()->getShaderPipelineFiles().end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::Shader> shader = osgDB::readRefShaderFile(*itr);
|
||||||
|
if (shader.valid())
|
||||||
|
{
|
||||||
|
OSG_INFO<<" read shader "<<*itr<<std::endl;
|
||||||
|
osg::DisplaySettings::instance()->setObject(*itr, shader.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static LoadShaderShaderPipelineFilesProxy s_LoadShaderShaderPipelineFilesProxy;
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include <osgDB/Registry>
|
#include <osgDB/Registry>
|
||||||
#include <osgDB/FileUtils>
|
#include <osgDB/FileUtils>
|
||||||
|
#include <osgDB/ReadFile>
|
||||||
#include <osgDB/FileNameUtils>
|
#include <osgDB/FileNameUtils>
|
||||||
#include <osgDB/fstream>
|
#include <osgDB/fstream>
|
||||||
#include <osgDB/Archive>
|
#include <osgDB/Archive>
|
||||||
|
Loading…
Reference in New Issue
Block a user