diff --git a/include/osgDB/ReadFile b/include/osgDB/ReadFile index 0b9298a8a..f3ff3ca7e 100644 --- a/include/osgDB/ReadFile +++ b/include/osgDB/ReadFile @@ -51,7 +51,7 @@ inline T* readFile(const std::string& filename, const Options* options) { osg::ref_ptr object = readObjectFile(filename, options); osg::ref_ptr t = dynamic_cast(object.get()); - object = 0; + object = 0; return t.release(); } @@ -281,7 +281,7 @@ inline osg::ref_ptr readRefNodeFile(const std::string& filename) * The osgDB::Registry is used to load the appropriate ReaderWriter plugin * for the filename extension, and this plugin then handles the request * to read the specified file.*/ -extern OSGDB_EXPORT osg::ref_ptr readRefShaderFile(const std::string& filename,const Options* options); +extern OSGDB_EXPORT osg::ref_ptr readRefShaderFile(const std::string& filename,const Options* options); /** Read an osg::Shader from file. * Return an assigned osg::ref_ptr on success, @@ -291,7 +291,32 @@ extern OSGDB_EXPORT osg::ref_ptr readRefShaderFile(const std::stri * to read the specified file.*/ inline osg::ref_ptr readRefShaderFile(const std::string& filename) { - return readRefShaderFile(filename,Registry::instance()->getOptions()); + return readRefShaderFile(filename, Registry::instance()->getOptions()); +} + +/** Read an osg::Shader from file and set to specified shader type. + * Return valid osg::Shader on success, + * return NULL on failure. + * Use the Options object to control cache operations and file search paths in osgDB::Registry. + * The osgDB::Registry is used to load the appropriate ReaderWriter plugin + * for the filename extension, and this plugin then handles the request + * to read the specified file.*/ +inline osg::ref_ptr readRefShaderFile(osg::Shader::Type type, const std::string& filename, const Options* options) +{ + osg::ref_ptr shader = readShaderFile(filename, options); + if (shader.valid() && type != osg::Shader::UNDEFINED) shader->setType(type); + return shader; +} + +/** Read an osg::Shader from file and set to specified shader type + * Return valid osg::Shader on success, + * return NULL on failure. + * The osgDB::Registry is used to load the appropriate ReaderWriter plugin + * for the filename extension, and this plugin then handles the request + * to read the specified file.*/ +inline osg::ref_ptr readRefShaderFile(osg::Shader::Type type, const std::string& filename) +{ + return readRefShaderFile(type, filename, Registry::instance()->getOptions()); } diff --git a/src/osgVolume/RayTracedTechnique.cpp b/src/osgVolume/RayTracedTechnique.cpp index bf7d4ba48..4ef618f7d 100644 --- a/src/osgVolume/RayTracedTechnique.cpp +++ b/src/osgVolume/RayTracedTechnique.cpp @@ -205,8 +205,8 @@ void RayTracedTechnique::init() // get shaders from source - osg::Shader* vertexShader = osgDB::readShaderFile(osg::Shader::VERTEX, "shaders/volume.vert"); - if (vertexShader) + osg::ref_ptr vertexShader = osgDB::readRefShaderFile(osg::Shader::VERTEX, "shaders/volume.vert"); + if (vertexShader.valid()) { program->addShader(vertexShader); } @@ -287,10 +287,10 @@ void RayTracedTechnique::init() if (tf) { - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_tf_mip.frag"); - if (fragmentShader) + osg::ref_ptr fragmentShader = osgDB::readRefShaderFile(osg::Shader::FRAGMENT, "shaders/volume_tf_mip.frag"); + if (fragmentShader.valid()) { - program->addShader(fragmentShader); + program->addShader(fragmentShader.get()); } else { @@ -304,10 +304,10 @@ void RayTracedTechnique::init() } else { - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_mip.frag"); - if (fragmentShader) + osg::ref_ptr fragmentShader = osgDB::readRefShaderFile(osg::Shader::FRAGMENT, "shaders/volume_mip.frag"); + if (fragmentShader.valid()) { - program->addShader(fragmentShader); + program->addShader(fragmentShader.get()); } else { @@ -325,8 +325,8 @@ void RayTracedTechnique::init() if (tf) { - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_tf_iso.frag"); - if (fragmentShader) + osg::ref_ptr fragmentShader = osgDB::readRefShaderFile(osg::Shader::FRAGMENT, "shaders/volume_tf_iso.frag"); + if (fragmentShader.valid()) { program->addShader(fragmentShader); } @@ -338,8 +338,8 @@ void RayTracedTechnique::init() } else { - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_iso.frag"); - if (fragmentShader) + osg::ref_ptr fragmentShader = osgDB::readRefShaderFile(osg::Shader::FRAGMENT, "shaders/volume_iso.frag"); + if (fragmentShader.valid()) { OSG_INFO<<"Shader found"< fragmentShader = osgDB::readRefShaderFile(osg::Shader::FRAGMENT, "shaders/volume_lit_tf.frag"); + if (fragmentShader.valid()) { program->addShader(fragmentShader); } @@ -374,8 +374,8 @@ void RayTracedTechnique::init() } else { - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_lit.frag"); - if (fragmentShader) + osg::ref_ptr fragmentShader = osgDB::readRefShaderFile(osg::Shader::FRAGMENT, "shaders/volume_lit.frag"); + if (fragmentShader.valid()) { program->addShader(fragmentShader); } @@ -392,8 +392,8 @@ void RayTracedTechnique::init() if (tf) { - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_tf.frag"); - if (fragmentShader) + osg::ref_ptr fragmentShader = osgDB::readRefShaderFile(osg::Shader::FRAGMENT, "shaders/volume_tf.frag"); + if (fragmentShader.valid()) { program->addShader(fragmentShader); } @@ -406,8 +406,8 @@ void RayTracedTechnique::init() } else { - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume.frag"); - if (fragmentShader) + osg::ref_ptr fragmentShader = osgDB::readRefShaderFile(osg::Shader::FRAGMENT, "shaders/volume.frag"); + if (fragmentShader.valid()) { program->addShader(fragmentShader); }