Added readScript/writeScript methods to ReaderWriter

git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14366 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
Robert Osfield
2014-07-14 15:59:06 +00:00
parent 5a7a20d01e
commit 50e63ad3ee
14 changed files with 314 additions and 68 deletions

View File

@@ -64,6 +64,11 @@ ReaderWriter::ReadResult ReadFileCallback::readShader(const std::string& filenam
return osgDB::Registry::instance()->readShaderImplementation(filename,options);
}
ReaderWriter::ReadResult ReadFileCallback::readScript(const std::string& filename, const Options* options)
{
return osgDB::Registry::instance()->readScriptImplementation(filename,options);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// WriteFileCallback default implementation
@@ -92,3 +97,8 @@ ReaderWriter::WriteResult WriteFileCallback::writeShader(const osg::Shader& obj,
{
return osgDB::Registry::instance()->writeShaderImplementation(obj,fileName,options);
}
ReaderWriter::WriteResult WriteFileCallback::writeScript(const osg::Script& obj, const std::string& fileName,const Options* options)
{
return osgDB::Registry::instance()->writeScriptImplementation(obj,fileName,options);
}

View File

@@ -250,6 +250,16 @@ Node* osgDB::readNodeFiles(osg::ArgumentParser& arguments,const Options* options
}
Script* osgDB::readScriptFile(const std::string& filename,const Options* options)
{
ReaderWriter::ReadResult rr = Registry::instance()->readScript(filename,options);
if (rr.validScript()) return rr.takeScript();
if (rr.error()) OSG_WARN << rr.message() << std::endl;
return NULL;
}
osg::ref_ptr<osg::Object> osgDB::readRefObjectFile(const std::string& filename,const Options* options)
{
ReaderWriter::ReadResult rr = Registry::instance()->readObject(filename,options);
@@ -289,3 +299,11 @@ osg::ref_ptr<osg::Node> osgDB::readRefNodeFile(const std::string& filename,const
if (rr.error()) OSG_WARN << rr.message() << std::endl;
return NULL;
}
osg::ref_ptr<osg::Script> osgDB::readRefScriptFile(const std::string& filename,const Options* options)
{
ReaderWriter::ReadResult rr = Registry::instance()->readScript(filename,options);
if (rr.validScript()) return osg::ref_ptr<osg::Script>(rr.getScript());
if (rr.error()) OSG_WARN << rr.message() << std::endl;
return NULL;
}

View File

@@ -25,6 +25,7 @@ osg::HeightField* ReaderWriter::ReadResult::getHeightField() { return dynamic_ca
osg::Node* ReaderWriter::ReadResult::getNode() { return dynamic_cast<osg::Node*>(_object.get()); }
osgDB::Archive* ReaderWriter::ReadResult::getArchive() { return dynamic_cast<osgDB::Archive*>(_object.get()); }
osg::Shader* ReaderWriter::ReadResult::getShader() { return dynamic_cast<osg::Shader*>(_object.get()); }
osg::Script* ReaderWriter::ReadResult::getScript() { return dynamic_cast<osg::Script*>(_object.get()); }
osg::Object* ReaderWriter::ReadResult::takeObject() { osg::Object* obj = _object.get(); if (obj) { obj->ref(); _object=NULL; obj->unref_nodelete(); } return obj; }
osg::Image* ReaderWriter::ReadResult::takeImage() { osg::Image* image=dynamic_cast<osg::Image*>(_object.get()); if (image) { image->ref(); _object=NULL; image->unref_nodelete(); } return image; }
@@ -32,6 +33,7 @@ osg::HeightField* ReaderWriter::ReadResult::takeHeightField() { osg::HeightField
osg::Node* ReaderWriter::ReadResult::takeNode() { osg::Node* node=dynamic_cast<osg::Node*>(_object.get()); if (node) { node->ref(); _object=NULL; node->unref_nodelete(); } return node; }
osgDB::Archive* ReaderWriter::ReadResult::takeArchive() { osgDB::Archive* archive=dynamic_cast<osgDB::Archive*>(_object.get()); if (archive) { archive->ref(); _object=NULL; archive->unref_nodelete(); } return archive; }
osg::Shader* ReaderWriter::ReadResult::takeShader() { osg::Shader* shader=dynamic_cast<osg::Shader*>(_object.get()); if (shader) { shader->ref(); _object=NULL; shader->unref_nodelete(); } return shader; }
osg::Script* ReaderWriter::ReadResult::takeScript() { osg::Script* script=dynamic_cast<osg::Script*>(_object.get()); if (script) { script->ref(); _object=NULL; script->unref_nodelete(); } return script; }
ReaderWriter::~ReaderWriter()
{

View File

@@ -970,6 +970,18 @@ struct Registry::ReadShaderFunctor : public Registry::ReadFunctor
virtual ReadFunctor* cloneType(const std::string& filename, const Options* options) const { return new ReadShaderFunctor(filename, options); }
};
struct Registry::ReadScriptFunctor : public Registry::ReadFunctor
{
ReadScriptFunctor(const std::string& filename, const Options* options):ReadFunctor(filename,options) {}
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw)const { return rw.readScript(_filename, _options); }
virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validScript(); }
virtual bool isValid(osg::Object* object) const { return dynamic_cast<osg::Script*>(object)!=0; }
virtual ReadFunctor* cloneType(const std::string& filename, const Options* options) const { return new ReadScriptFunctor(filename, options); }
};
void Registry::addArchiveExtension(const std::string ext)
{
for(ArchiveExtensionList::iterator aitr=_archiveExtList.begin();
@@ -1590,6 +1602,60 @@ ReaderWriter::WriteResult Registry::writeShaderImplementation(const Shader& shad
return result;
}
ReaderWriter::ReadResult Registry::readScriptImplementation(const std::string& fileName,const Options* options)
{
return readImplementation(ReadScriptFunctor(fileName, options),Options::CACHE_IMAGES);
}
ReaderWriter::WriteResult Registry::writeScriptImplementation(const Script& image,const std::string& fileName,const Options* options)
{
// record the errors reported by readerwriters.
typedef std::vector<ReaderWriter::WriteResult> Results;
Results results;
// first attempt to load the file from existing ReaderWriter's
AvailableReaderWriterIterator itr(_rwList, _pluginMutex);
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeScript(image,fileName,options);
if (rr.success()) return rr;
else results.push_back(rr);
}
// now look for a plug-in to save the file.
std::string libraryName = createLibraryNameForFile(fileName);
if (loadLibrary(libraryName)==LOADED)
{
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeScript(image,fileName,options);
if (rr.success()) return rr;
else results.push_back(rr);
}
}
if (results.empty())
{
return ReaderWriter::WriteResult("Warning: Could not find plugin to write image to file \""+fileName+"\".");
}
// sort the results so the most relevant (i.e. ERROR_IN_WRITING_FILE is more relevant than FILE_NOT_FOUND) results get placed at the end of the results list.
std::sort(results.begin(), results.end());
ReaderWriter::WriteResult result = results.back();
if (result.message().empty())
{
switch(result.status())
{
case(ReaderWriter::WriteResult::FILE_NOT_HANDLED): result.message() = "Warning: Write to \""+fileName+"\" not supported."; break;
case(ReaderWriter::WriteResult::ERROR_IN_WRITING_FILE): result.message() = "Warning: Error in writing to \""+fileName+"\"."; break;
default: break;
}
}
return result;
}
void Registry::addEntryToObjectCache(const std::string& filename, osg::Object* object, double timestamp)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_objectCacheMutex);

View File

@@ -61,3 +61,10 @@ bool osgDB::writeShaderFile(const Shader& shader,const std::string& filename, co
return wr.success();
}
bool osgDB::writeScriptFile(const Script& image,const std::string& filename, const Options* options )
{
ReaderWriter::WriteResult wr = Registry::instance()->writeScript( image, filename, options );
if (wr.error()) OSG_WARN << "Error writing file " << filename << ": " << wr.message() << std::endl;
return wr.success();
}

View File

@@ -29,7 +29,20 @@ class ReaderWriterV8 : public osgDB::ReaderWriter
virtual const char* className() const { return "V8 JavaScript ScriptEngine plugin"; }
virtual ReadResult readObject(std::istream& fin,const osgDB::ReaderWriter::Options* options =NULL) const
virtual ReadResult readObject(std::istream& fin, const osgDB::ReaderWriter::Options* options =NULL) const
{
return readScript(fin, options);
}
virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
if (file=="ScriptEngine.V8") return new v8::V8ScriptEngine();
if (file=="ScriptEngine.js") return new v8::V8ScriptEngine();
return readScript(file);
}
virtual ReadResult readScript(std::istream& fin,const osgDB::ReaderWriter::Options* options =NULL) const
{
osg::ref_ptr<osg::Script> script = new osg::Script;
script->setLanguage("js");
@@ -48,11 +61,8 @@ class ReaderWriterV8 : public osgDB::ReaderWriter
return script.release();
}
virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
virtual ReadResult readScript(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
if (file=="ScriptEngine.V8") return new v8::V8ScriptEngine();
if (file=="ScriptEngine.js") return new v8::V8ScriptEngine();
std::string ext = osgDB::getLowerCaseFileExtension(file);
if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
@@ -62,9 +72,8 @@ class ReaderWriterV8 : public osgDB::ReaderWriter
osgDB::ifstream istream(fileName.c_str(), std::ios::in);
if(!istream) return ReadResult::FILE_NOT_HANDLED;
return readObject(istream, options);
return readScript(istream, options);
}
};
// now register with Registry to instantiate the above

View File

@@ -28,45 +28,11 @@ class ReaderWriterLua : public osgDB::ReaderWriter
virtual const char* className() const { return "Lua ScriptEngine plugin"; }
virtual ReadResult readObject(std::istream& fin,const osgDB::ReaderWriter::Options* options =NULL) const
{
osg::ref_ptr<osg::Script> script = new osg::Script;
script->setLanguage("lua");
std::string str;
while(fin)
{
int c = fin.get();
if (c>=0 && c<=255)
{
str.push_back(c);
}
}
script->setScript(str);
return script.release();
}
virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
if (file=="ScriptEngine.lua") return new lua::LuaScriptEngine();
std::string ext = osgDB::getLowerCaseFileExtension(file);
if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
std::string fileName = osgDB::findDataFile( file, options );
if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
osgDB::ifstream istream(fileName.c_str(), std::ios::in);
if(!istream) return ReadResult::FILE_NOT_HANDLED;
return readObject(istream, options);
}
virtual ReadResult readObjectFromScript(std::istream& fin, const osgDB::ReaderWriter::Options* options =NULL) const
{
ReadResult result = readObject(fin, options);
ReadResult result = readScript(fin, options);
if (!result.validObject()) return result;
osg::ref_ptr<osg::Script> script = dynamic_cast<osg::Script*>(result.getObject());
@@ -112,6 +78,27 @@ class ReaderWriterLua : public osgDB::ReaderWriter
else return 0;
}
virtual ReadResult readObject(std::istream& fin, const osgDB::ReaderWriter::Options* options =NULL) const
{
return readObjectFromScript(fin, options);
}
virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
if (file=="ScriptEngine.lua") return new lua::LuaScriptEngine();
std::string ext = osgDB::getLowerCaseFileExtension(file);
if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
std::string fileName = osgDB::findDataFile( file, options );
if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
osgDB::ifstream istream(fileName.c_str(), std::ios::in);
if(!istream) return ReadResult::FILE_NOT_HANDLED;
return readObject(istream, options);
}
virtual ReadResult readImage(std::istream& fin, const osgDB::ReaderWriter::Options* options =NULL) const
{
return readObjectFromScript(fin, options);
@@ -136,8 +123,8 @@ class ReaderWriterLua : public osgDB::ReaderWriter
return readObjectFromScript(fin, options);
}
virtual ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
virtual ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
std::string ext = osgDB::getLowerCaseFileExtension(file);
if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
@@ -148,7 +135,41 @@ class ReaderWriterLua : public osgDB::ReaderWriter
if(!istream) return ReadResult::FILE_NOT_HANDLED;
return readNode(istream, options);
}
}
virtual ReadResult readScript(std::istream& fin,const osgDB::ReaderWriter::Options* options =NULL) const
{
osg::ref_ptr<osg::Script> script = new osg::Script;
script->setLanguage("lua");
std::string str;
while(fin)
{
int c = fin.get();
if (c>=0 && c<=255)
{
str.push_back(c);
}
}
script->setScript(str);
return script.release();
}
virtual ReadResult readScript(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
std::string ext = osgDB::getLowerCaseFileExtension(file);
if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
std::string fileName = osgDB::findDataFile( file, options );
if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
osgDB::ifstream istream(fileName.c_str(), std::ios::in);
if(!istream) return ReadResult::FILE_NOT_HANDLED;
return readScript(istream, options);
}
};
// now register with Registry to instantiate the above

View File

@@ -28,7 +28,19 @@ class ReaderWriterPython : public osgDB::ReaderWriter
virtual const char* className() const { return "Python ScriptEngine plugin"; }
virtual ReadResult readObject(std::istream& fin,const osgDB::ReaderWriter::Options* options =NULL) const
virtual ReadResult readObject(std::istream& fin, const osgDB::ReaderWriter::Options* options =NULL) const
{
return readScript(fin);
}
virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
if (file=="ScriptEngine.python") return new python::PythonScriptEngine();
return readScript(file, options);
}
virtual ReadResult readScript(std::istream& fin, const osgDB::ReaderWriter::Options* options =NULL) const
{
osg::ref_ptr<osg::Script> script = new osg::Script;
script->setLanguage("python");
@@ -47,10 +59,10 @@ class ReaderWriterPython : public osgDB::ReaderWriter
return script.release();
}
virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
virtual ReadResult readScript(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const
{
if (file=="ScriptEngine.python") return new python::PythonScriptEngine();
std::string ext = osgDB::getLowerCaseFileExtension(file);
if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
@@ -60,7 +72,7 @@ class ReaderWriterPython : public osgDB::ReaderWriter
osgDB::ifstream istream(fileName.c_str(), std::ios::in);
if(!istream) return ReadResult::FILE_NOT_HANDLED;
return readObject(istream, options);
return readScript(istream, options);
}
};