Added new osga plugin for reading OSG native archives
This commit is contained in:
parent
5d3dcd3e18
commit
4973824b1d
@ -48,6 +48,7 @@ PLUGIN_DIRS = \
|
|||||||
osgSim\
|
osgSim\
|
||||||
osgFX\
|
osgFX\
|
||||||
osg\
|
osg\
|
||||||
|
osga\
|
||||||
osgtgz\
|
osgtgz\
|
||||||
pic\
|
pic\
|
||||||
pnm\
|
pnm\
|
||||||
|
@ -2358,6 +2358,27 @@ Package=<4>
|
|||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
Project: "osgPlugin osga"=.\osgPlugins\osga\osga.dsp - Package Owner=<4>
|
||||||
|
|
||||||
|
Package=<5>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Package=<4>
|
||||||
|
{{{
|
||||||
|
Begin Project Dependency
|
||||||
|
Project_Dep_Name Core osg
|
||||||
|
End Project Dependency
|
||||||
|
Begin Project Dependency
|
||||||
|
Project_Dep_Name Core osgDB
|
||||||
|
End Project Dependency
|
||||||
|
Begin Project Dependency
|
||||||
|
Project_Dep_Name Core osgUtil
|
||||||
|
End Project Dependency
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
Project: "osgPlugin net"=".\osgPlugins\net\net.dsp" - Package Owner=<4>
|
Project: "osgPlugin net"=".\osgPlugins\net\net.dsp" - Package Owner=<4>
|
||||||
|
|
||||||
Package=<5>
|
Package=<5>
|
||||||
|
111
VisualStudio/osgPlugins/osga/osga.dsp
Normal file
111
VisualStudio/osgPlugins/osga/osga.dsp
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
# Microsoft Developer Studio Project File - Name="osgPlugin osga" - Package Owner=<4>
|
||||||
|
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||||
|
# ** DO NOT EDIT **
|
||||||
|
|
||||||
|
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||||
|
|
||||||
|
CFG=osgPlugin osga - Win32 Release
|
||||||
|
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||||
|
!MESSAGE use the Export Makefile command and run
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE NMAKE /f "osga.mak".
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE You can specify a configuration when running NMAKE
|
||||||
|
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE NMAKE /f "osga.mak" CFG="osgPlugin osga - Win32 Release"
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE Possible choices for configuration are:
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE "osgPlugin osga - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||||
|
!MESSAGE "osgPlugin osga - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||||
|
!MESSAGE
|
||||||
|
|
||||||
|
# Begin Project
|
||||||
|
# PROP AllowPerConfigDependencies 0
|
||||||
|
# PROP Scc_ProjName ""
|
||||||
|
# PROP Scc_LocalPath ""
|
||||||
|
CPP=cl.exe
|
||||||
|
MTL=midl.exe
|
||||||
|
RSC=rc.exe
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "osgPlugin osga - Win32 Release"
|
||||||
|
|
||||||
|
# PROP BASE Use_MFC 0
|
||||||
|
# PROP BASE Use_Debug_Libraries 0
|
||||||
|
# PROP BASE Output_Dir "Release"
|
||||||
|
# PROP BASE Intermediate_Dir "Release"
|
||||||
|
# PROP BASE Target_Dir ""
|
||||||
|
# PROP Use_MFC 0
|
||||||
|
# PROP Use_Debug_Libraries 0
|
||||||
|
# PROP Output_Dir "../../../lib"
|
||||||
|
# PROP Intermediate_Dir "Release"
|
||||||
|
# PROP Ignore_Export_Lib 0
|
||||||
|
# PROP Target_Dir ""
|
||||||
|
F90=df.exe
|
||||||
|
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c
|
||||||
|
# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "../../../include" /I "../../../../OpenThreads/include" /I "../../../../Producer/include" /I "../../../../3rdParty/include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c
|
||||||
|
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
|
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
|
# ADD BASE RSC /l 0x809 /d "NDEBUG"
|
||||||
|
# ADD RSC /l 0x809 /d "NDEBUG"
|
||||||
|
BSC32=bscmake.exe
|
||||||
|
# ADD BASE BSC32 /nologo
|
||||||
|
# ADD BSC32 /nologo
|
||||||
|
LINK32=link.exe
|
||||||
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||||
|
# ADD LINK32 OpenThreadsWin32.lib /nologo /dll /pdb:none /machine:I386 /nodefaultlib:"LIBC" /out:"../../../bin/osgdb_osga.dll" /libpath:"../../../lib" /libpath:"../../../../OpenThreads/lib/win32" /libpath:"../../../../Producer/lib" /libpath:"../../../../3rdParty/lib"
|
||||||
|
# SUBTRACT LINK32 /nodefaultlib
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "osgPlugin osga - Win32 Debug"
|
||||||
|
|
||||||
|
# PROP BASE Use_MFC 0
|
||||||
|
# PROP BASE Use_Debug_Libraries 1
|
||||||
|
# PROP BASE Output_Dir "Debug"
|
||||||
|
# PROP BASE Intermediate_Dir "Debug"
|
||||||
|
# PROP BASE Target_Dir ""
|
||||||
|
# PROP Use_MFC 0
|
||||||
|
# PROP Use_Debug_Libraries 1
|
||||||
|
# PROP Output_Dir "../../../lib"
|
||||||
|
# PROP Intermediate_Dir "Debug"
|
||||||
|
# PROP Ignore_Export_Lib 0
|
||||||
|
# PROP Target_Dir ""
|
||||||
|
F90=df.exe
|
||||||
|
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /GZ /c
|
||||||
|
# ADD CPP /nologo /MDd /W3 /Gm /vmg /vd0 /GR /GX /Zi /Od /I "../../../include" /I "../../../../OpenThreads/include" /I "../../../../Producer/include" /I "../../../../3rdParty/include" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "WIN32" /D "_DEBUG" /YX /FD /GZ /c
|
||||||
|
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
|
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
|
# ADD BASE RSC /l 0x809 /d "_DEBUG"
|
||||||
|
# ADD RSC /l 0x809 /d "_DEBUG"
|
||||||
|
BSC32=bscmake.exe
|
||||||
|
# ADD BASE BSC32 /nologo
|
||||||
|
# ADD BSC32 /nologo
|
||||||
|
LINK32=link.exe
|
||||||
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||||
|
# ADD LINK32 OpenThreadsWin32d.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"LIBC" /out:"../../../bin/osgdb_osgad.dll" /pdbtype:sept /libpath:"../../../lib" /libpath:"../../../../OpenThreads/lib/win32" /libpath:"../../../../Producer/lib" /libpath:"../../../../3rdParty/lib"
|
||||||
|
# SUBTRACT LINK32 /nodefaultlib
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
# Begin Target
|
||||||
|
|
||||||
|
# Name "osgPlugin osga - Win32 Release"
|
||||||
|
# Name "osgPlugin osga - Win32 Debug"
|
||||||
|
# Begin Group "Source Files"
|
||||||
|
|
||||||
|
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\..\src\osgPlugins\osga\ReaderWriterOSGA.cpp
|
||||||
|
# End Source File
|
||||||
|
# End Group
|
||||||
|
# Begin Group "Header Files"
|
||||||
|
|
||||||
|
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||||
|
# End Group
|
||||||
|
# Begin Group "Resource Files"
|
||||||
|
|
||||||
|
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||||
|
# End Group
|
||||||
|
# End Target
|
||||||
|
# End Project
|
@ -370,12 +370,23 @@ class OSGDB_EXPORT Registry : public osg::Referenced
|
|||||||
/** Get whether the Registry::ObjectCache should be used by default.*/
|
/** Get whether the Registry::ObjectCache should be used by default.*/
|
||||||
CacheHintOptions getUseObjectCacheHint() const { return _useObjectCacheHint; }
|
CacheHintOptions getUseObjectCacheHint() const { return _useObjectCacheHint; }
|
||||||
|
|
||||||
|
|
||||||
|
/** Add archive to archive cache so that future calls reference this archive.*/
|
||||||
|
void addToArchiveCache(const std::string& fileName, osgDB::Archive* archive);
|
||||||
|
|
||||||
|
/** Remove archive from cache.*/
|
||||||
|
void removeFromArchiveCache(const std::string& fileName);
|
||||||
|
|
||||||
|
/** Get an archive from the archive cache*/
|
||||||
|
osgDB::Archive* getFromArchiveCache(const std::string& fileName);
|
||||||
|
|
||||||
|
/** Remove all archives from the archive cache.*/
|
||||||
|
void clearArchiveCache();
|
||||||
|
|
||||||
|
|
||||||
/** get the attached library with specified name.*/
|
/** get the attached library with specified name.*/
|
||||||
DynamicLibrary* getLibrary(const std::string& fileName);
|
DynamicLibrary* getLibrary(const std::string& fileName);
|
||||||
|
|
||||||
typedef std::vector< osg::ref_ptr<ReaderWriter> > ReaderWriterList;
|
|
||||||
|
|
||||||
|
|
||||||
/** Set the DatabasePager.*/
|
/** Set the DatabasePager.*/
|
||||||
void setDatabasePager(DatabasePager* databasePager) { _databasePager = databasePager; }
|
void setDatabasePager(DatabasePager* databasePager) { _databasePager = databasePager; }
|
||||||
|
|
||||||
@ -400,12 +411,14 @@ class OSGDB_EXPORT Registry : public osg::Referenced
|
|||||||
|
|
||||||
virtual ~Registry();
|
virtual ~Registry();
|
||||||
|
|
||||||
|
typedef std::vector< osg::ref_ptr<ReaderWriter> > ReaderWriterList;
|
||||||
typedef std::map< std::string, osg::ref_ptr<DotOsgWrapper> > DotOsgWrapperMap;
|
typedef std::map< std::string, osg::ref_ptr<DotOsgWrapper> > DotOsgWrapperMap;
|
||||||
typedef std::vector< osg::ref_ptr<DynamicLibrary> > DynamicLibraryList;
|
typedef std::vector< osg::ref_ptr<DynamicLibrary> > DynamicLibraryList;
|
||||||
typedef std::map< std::string, std::string> ExtensionAliasMap;
|
typedef std::map< std::string, std::string> ExtensionAliasMap;
|
||||||
|
|
||||||
typedef std::pair<osg::ref_ptr<osg::Object>, double > ObjectTimeStampPair;
|
typedef std::pair<osg::ref_ptr<osg::Object>, double > ObjectTimeStampPair;
|
||||||
typedef std::map<std::string, ObjectTimeStampPair > ObjectCache;
|
typedef std::map<std::string, ObjectTimeStampPair > ObjectCache;
|
||||||
|
typedef std::map<std::string, osg::ref_ptr<osgDB::Archive> > ArchiveCache;
|
||||||
|
|
||||||
/** constructor is private, as its a singleton, preventing
|
/** constructor is private, as its a singleton, preventing
|
||||||
construction other than via the instance() method and
|
construction other than via the instance() method and
|
||||||
@ -437,6 +450,7 @@ class OSGDB_EXPORT Registry : public osg::Referenced
|
|||||||
const ReaderWriter::Options* _options;
|
const ReaderWriter::Options* _options;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// forward declare helper classes
|
||||||
struct ReadObjectFunctor;
|
struct ReadObjectFunctor;
|
||||||
struct ReadImageFunctor;
|
struct ReadImageFunctor;
|
||||||
struct ReadHeightFieldFunctor;
|
struct ReadHeightFieldFunctor;
|
||||||
@ -444,7 +458,12 @@ class OSGDB_EXPORT Registry : public osg::Referenced
|
|||||||
struct ReadArchiveFunctor;
|
struct ReadArchiveFunctor;
|
||||||
|
|
||||||
ReaderWriter::ReadResult read(const ReadFunctor& readFunctor);
|
ReaderWriter::ReadResult read(const ReadFunctor& readFunctor);
|
||||||
ReaderWriter::ReadResult readImplementation(const ReadFunctor& readFunctor,CacheHintOptions useObjectCache);
|
ReaderWriter::ReadResult readImplementation(const ReadFunctor& readFunctor,bool useObjectCache);
|
||||||
|
|
||||||
|
|
||||||
|
// forward declar helper class
|
||||||
|
class AvailableReaderWriterIterator;
|
||||||
|
|
||||||
|
|
||||||
osg::ref_ptr<ReadFileCallback> _readFileCallback;
|
osg::ref_ptr<ReadFileCallback> _readFileCallback;
|
||||||
osg::ref_ptr<WriteFileCallback> _writeFileCallback;
|
osg::ref_ptr<WriteFileCallback> _writeFileCallback;
|
||||||
@ -475,6 +494,10 @@ class OSGDB_EXPORT Registry : public osg::Referenced
|
|||||||
ObjectCache _objectCache;
|
ObjectCache _objectCache;
|
||||||
OpenThreads::Mutex _objectCacheMutex;
|
OpenThreads::Mutex _objectCacheMutex;
|
||||||
|
|
||||||
|
ArchiveCache _archiveCache;
|
||||||
|
OpenThreads::Mutex _archiveCacheMutex;
|
||||||
|
|
||||||
|
|
||||||
osg::ref_ptr<DatabasePager> _databasePager;
|
osg::ref_ptr<DatabasePager> _databasePager;
|
||||||
osg::ref_ptr<SharedStateManager> _sharedStateManager;
|
osg::ref_ptr<SharedStateManager> _sharedStateManager;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
using namespace osg;
|
using namespace osg;
|
||||||
using namespace osgDB;
|
using namespace osgDB;
|
||||||
|
|
||||||
class AvailableReaderWriterIterator
|
class Registry::AvailableReaderWriterIterator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AvailableReaderWriterIterator(Registry::ReaderWriterList& rwList):
|
AvailableReaderWriterIterator(Registry::ReaderWriterList& rwList):
|
||||||
@ -138,7 +138,7 @@ Registry::Registry()
|
|||||||
_createNodeFromImage = false;
|
_createNodeFromImage = false;
|
||||||
_openingLibrary = false;
|
_openingLibrary = false;
|
||||||
|
|
||||||
_useObjectCacheHint = CACHE_NONE;
|
_useObjectCacheHint = CACHE_ARCHIVES;
|
||||||
|
|
||||||
initFilePathLists();
|
initFilePathLists();
|
||||||
|
|
||||||
@ -220,6 +220,8 @@ Registry::~Registry()
|
|||||||
// even some issue with objects be allocated by a plugin that is
|
// even some issue with objects be allocated by a plugin that is
|
||||||
// mainted after that plugin is deleted... Robert Osfield, Jan 2004.
|
// mainted after that plugin is deleted... Robert Osfield, Jan 2004.
|
||||||
clearObjectCache();
|
clearObjectCache();
|
||||||
|
clearArchiveCache();
|
||||||
|
|
||||||
|
|
||||||
// unload all the plugin before we finally destruct.
|
// unload all the plugin before we finally destruct.
|
||||||
closeAllLibraries();
|
closeAllLibraries();
|
||||||
@ -1183,30 +1185,16 @@ ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor)
|
|||||||
osg::notify(osg::INFO)<<" archive : "<<archiveName<<std::endl;
|
osg::notify(osg::INFO)<<" archive : "<<archiveName<<std::endl;
|
||||||
osg::notify(osg::INFO)<<" filename : "<<fileName<<std::endl;
|
osg::notify(osg::INFO)<<" filename : "<<fileName<<std::endl;
|
||||||
|
|
||||||
//ReaderWriter::ReadResult result = openArchiveImplementation(archiveName,ReaderWriter::READ, 4096, CACHE_ARCHIVES);
|
ReaderWriter::ReadResult result = openArchiveImplementation(archiveName,ReaderWriter::READ, 4096, CACHE_ARCHIVES);
|
||||||
//osgDB::Archive* archive = result.takeArchive();
|
|
||||||
|
|
||||||
|
if (!result.validArchive()) return result;
|
||||||
|
|
||||||
static osg::ref_ptr<Archive> s_archive;
|
osgDB::Archive* archive = result.getArchive();
|
||||||
if (!s_archive)
|
|
||||||
{
|
|
||||||
s_archive = new Archive;
|
|
||||||
s_archive->open(archiveName,ReaderWriter::READ, 4096);
|
|
||||||
}
|
|
||||||
|
|
||||||
osg::ref_ptr<ReaderWriter::Options> options = new ReaderWriter::Options;
|
osg::ref_ptr<ReaderWriter::Options> options = new ReaderWriter::Options;
|
||||||
options->setDatabasePath(archiveName);
|
options->setDatabasePath(archiveName);
|
||||||
|
|
||||||
if (s_archive.valid())
|
return archive->readObject(fileName,options.get());
|
||||||
{
|
|
||||||
osg::notify(osg::INFO)<<" archive loaded"<<fileName<<std::endl;
|
|
||||||
return s_archive->readObject(fileName,options.get());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
osg::notify(osg::INFO)<<" no archive loaded"<<fileName<<std::endl;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if filename contains archive
|
// if filename contains archive
|
||||||
@ -1308,11 +1296,11 @@ ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor)
|
|||||||
return results.front();
|
return results.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
ReaderWriter::ReadResult Registry::readImplementation(const ReadFunctor& readFunctor, CacheHintOptions useObjectCache)
|
ReaderWriter::ReadResult Registry::readImplementation(const ReadFunctor& readFunctor, bool useObjectCache)
|
||||||
{
|
{
|
||||||
std::string file(readFunctor._filename);
|
std::string file(readFunctor._filename);
|
||||||
|
|
||||||
if (useObjectCache & CACHE_OBJECTS)
|
if (useObjectCache)
|
||||||
{
|
{
|
||||||
// search for entry in the object cache.
|
// search for entry in the object cache.
|
||||||
{
|
{
|
||||||
@ -1335,13 +1323,16 @@ ReaderWriter::ReadResult Registry::readImplementation(const ReadFunctor& readFun
|
|||||||
notify(INFO)<<"Adding to object cache "<<file<<std::endl;
|
notify(INFO)<<"Adding to object cache "<<file<<std::endl;
|
||||||
addEntryToObjectCache(file,rr.getObject());
|
addEntryToObjectCache(file,rr.getObject());
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
notify(INFO)<<"No valid object found for "<<file<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
return rr;
|
return rr;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
ObjectCache tmpObjectCache;
|
ObjectCache tmpObjectCache;
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -1365,13 +1356,28 @@ ReaderWriter::ReadResult Registry::readImplementation(const ReadFunctor& readFun
|
|||||||
|
|
||||||
ReaderWriter::ReadResult Registry::openArchiveImplementation(const std::string& fileName, ReaderWriter::ArchiveStatus status, unsigned int indexBlockSizeHint, CacheHintOptions useObjectCache)
|
ReaderWriter::ReadResult Registry::openArchiveImplementation(const std::string& fileName, ReaderWriter::ArchiveStatus status, unsigned int indexBlockSizeHint, CacheHintOptions useObjectCache)
|
||||||
{
|
{
|
||||||
return readImplementation(ReadArchiveFunctor(fileName, status, indexBlockSizeHint, _options.get()),useObjectCache);
|
if (useObjectCache&CACHE_ARCHIVES)
|
||||||
|
{
|
||||||
|
osgDB::Archive* archive = getFromArchiveCache(fileName);
|
||||||
|
if (archive) return archive;
|
||||||
|
|
||||||
|
ReaderWriter::ReadResult result = readImplementation(ReadArchiveFunctor(fileName, status, indexBlockSizeHint, _options.get()),false);
|
||||||
|
if (result.validArchive())
|
||||||
|
{
|
||||||
|
addToArchiveCache(fileName,result.getArchive());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return readImplementation(ReadArchiveFunctor(fileName, status, indexBlockSizeHint, _options.get()),false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ReaderWriter::ReadResult Registry::readObjectImplementation(const std::string& fileName,CacheHintOptions useObjectCache)
|
ReaderWriter::ReadResult Registry::readObjectImplementation(const std::string& fileName,CacheHintOptions useObjectCache)
|
||||||
{
|
{
|
||||||
return readImplementation(ReadObjectFunctor(fileName, _options.get()),useObjectCache);
|
return readImplementation(ReadObjectFunctor(fileName, _options.get()),(useObjectCache&CACHE_OBJECTS)!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj,const std::string& fileName)
|
ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj,const std::string& fileName)
|
||||||
@ -1413,7 +1419,7 @@ ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj,
|
|||||||
|
|
||||||
ReaderWriter::ReadResult Registry::readImageImplementation(const std::string& fileName,CacheHintOptions useObjectCache)
|
ReaderWriter::ReadResult Registry::readImageImplementation(const std::string& fileName,CacheHintOptions useObjectCache)
|
||||||
{
|
{
|
||||||
return readImplementation(ReadImageFunctor(fileName, _options.get()),useObjectCache);
|
return readImplementation(ReadImageFunctor(fileName, _options.get()),(useObjectCache&CACHE_IMAGES)!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image,const std::string& fileName)
|
ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image,const std::string& fileName)
|
||||||
@ -1454,7 +1460,7 @@ ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image,
|
|||||||
|
|
||||||
ReaderWriter::ReadResult Registry::readHeightFieldImplementation(const std::string& fileName,CacheHintOptions useObjectCache)
|
ReaderWriter::ReadResult Registry::readHeightFieldImplementation(const std::string& fileName,CacheHintOptions useObjectCache)
|
||||||
{
|
{
|
||||||
return readImplementation(ReadHeightFieldFunctor(fileName, _options.get()),useObjectCache);
|
return readImplementation(ReadHeightFieldFunctor(fileName, _options.get()),(useObjectCache&CACHE_HEIGHTFIELDS)!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightField& HeightField,const std::string& fileName)
|
ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightField& HeightField,const std::string& fileName)
|
||||||
@ -1495,7 +1501,7 @@ ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightF
|
|||||||
|
|
||||||
ReaderWriter::ReadResult Registry::readNodeImplementation(const std::string& fileName,CacheHintOptions useObjectCache)
|
ReaderWriter::ReadResult Registry::readNodeImplementation(const std::string& fileName,CacheHintOptions useObjectCache)
|
||||||
{
|
{
|
||||||
return readImplementation(ReadNodeFunctor(fileName, _options.get()),useObjectCache);
|
return readImplementation(ReadNodeFunctor(fileName, _options.get()),(useObjectCache&CACHE_NODES)!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,const std::string& fileName)
|
ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,const std::string& fileName)
|
||||||
@ -1560,6 +1566,8 @@ void Registry::updateTimeStampOfObjectsInCacheWithExtenalReferences(double curre
|
|||||||
|
|
||||||
void Registry::removeExpiredObjectsInCache(double expiryTime)
|
void Registry::removeExpiredObjectsInCache(double expiryTime)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_objectCacheMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_objectCacheMutex);
|
||||||
|
|
||||||
typedef std::vector<std::string> ObjectsToRemove;
|
typedef std::vector<std::string> ObjectsToRemove;
|
||||||
@ -1595,6 +1603,37 @@ void Registry::clearObjectCache()
|
|||||||
_objectCache.clear();
|
_objectCache.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Registry::addToArchiveCache(const std::string& fileName, osgDB::Archive* archive)
|
||||||
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_archiveCacheMutex);
|
||||||
|
_archiveCache[fileName] = archive;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Remove archive from cache.*/
|
||||||
|
void Registry::removeFromArchiveCache(const std::string& fileName)
|
||||||
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_archiveCacheMutex);
|
||||||
|
ArchiveCache::iterator itr = _archiveCache.find(fileName);
|
||||||
|
if (itr!=_archiveCache.end())
|
||||||
|
{
|
||||||
|
_archiveCache.erase(itr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
osgDB::Archive* Registry::getFromArchiveCache(const std::string& fileName)
|
||||||
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_archiveCacheMutex);
|
||||||
|
ArchiveCache::iterator itr = _archiveCache.find(fileName);
|
||||||
|
if (itr!=_archiveCache.end()) return itr->second.get();
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Registry::clearArchiveCache()
|
||||||
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_archiveCacheMutex);
|
||||||
|
_archiveCache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
DatabasePager* Registry::getOrCreateDatabasePager()
|
DatabasePager* Registry::getOrCreateDatabasePager()
|
||||||
{
|
{
|
||||||
if (!_databasePager) _databasePager = new DatabasePager;
|
if (!_databasePager) _databasePager = new DatabasePager;
|
||||||
|
16
src/osgPlugins/osga/GNUmakefile
Normal file
16
src/osgPlugins/osga/GNUmakefile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
TOPDIR = ../../..
|
||||||
|
include $(TOPDIR)/Make/makedefs
|
||||||
|
|
||||||
|
CXXFILES =\
|
||||||
|
ReaderWriterOSGA.cpp\
|
||||||
|
|
||||||
|
|
||||||
|
INC += -I$(THISDIR)
|
||||||
|
|
||||||
|
LIBS += $(OSG_LIBS) $(OTHER_LIBS)
|
||||||
|
|
||||||
|
TARGET_BASENAME = osga
|
||||||
|
include $(TOPDIR)/Make/cygwin_plugin_def
|
||||||
|
PLUGIN = $(PLUGIN_PREFIX)$(TARGET_BASENAME).$(PLUGIN_EXT)
|
||||||
|
|
||||||
|
include $(TOPDIR)/Make/makerules
|
71
src/osgPlugins/osga/ReaderWriterOSGA.cpp
Normal file
71
src/osgPlugins/osga/ReaderWriterOSGA.cpp
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#include <osg/Notify>
|
||||||
|
|
||||||
|
#include <osgDB/FileUtils>
|
||||||
|
#include <osgDB/FileNameUtils>
|
||||||
|
#include <osgDB/Archive>
|
||||||
|
|
||||||
|
class ReaderWriterOSGA : public osgDB::ReaderWriter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ReaderWriterOSGA() { }
|
||||||
|
|
||||||
|
virtual const char* className() const { return "OpenSceneGraph Archive Reader/Writer"; }
|
||||||
|
virtual bool acceptsExtension(const std::string& extension)
|
||||||
|
{
|
||||||
|
return osgDB::equalCaseInsensitive(extension,"osga");
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ReadResult openArchive(const std::string& file,ArchiveStatus status, unsigned int indexBlockSize = 4096, const Options* = NULL)
|
||||||
|
{
|
||||||
|
std::string ext = osgDB::getLowerCaseFileExtension(file);
|
||||||
|
if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
|
||||||
|
|
||||||
|
std::string fileName = osgDB::findDataFile( file );
|
||||||
|
if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
|
||||||
|
|
||||||
|
osg::ref_ptr<osgDB::Archive> archive = new osgDB::Archive;
|
||||||
|
if (!archive->open(fileName, status, indexBlockSize))
|
||||||
|
{
|
||||||
|
return ReadResult(ReadResult::FILE_NOT_HANDLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
return archive.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ReadResult readObject(const std::string& /*fileName*/,const Options* =NULL) { return ReadResult(ReadResult::FILE_NOT_HANDLED); }
|
||||||
|
virtual ReadResult readImage(const std::string& /*fileName*/,const Options* =NULL) { return ReadResult(ReadResult::FILE_NOT_HANDLED); }
|
||||||
|
virtual ReadResult readHeightField(const std::string& /*fileName*/,const Options* =NULL) { return ReadResult(ReadResult::FILE_NOT_HANDLED); }
|
||||||
|
|
||||||
|
virtual ReadResult readNode(const std::string& file,const Options* options)
|
||||||
|
{
|
||||||
|
ReadResult result = openArchive(file,osgDB::Archive::READ);
|
||||||
|
|
||||||
|
if (!result.validArchive()) return result;
|
||||||
|
|
||||||
|
|
||||||
|
osg::ref_ptr<ReaderWriter::Options> local_options = new ReaderWriter::Options;
|
||||||
|
local_options->setDatabasePath(file);
|
||||||
|
|
||||||
|
ReadResult result_2 = result.getArchive()->readNode(result.getArchive()->getMasterFileName(),local_options.get());
|
||||||
|
|
||||||
|
|
||||||
|
// register the archive so that it is cached for future use.
|
||||||
|
osgDB::Registry::instance()->addToArchiveCache(file, result.getArchive());
|
||||||
|
|
||||||
|
|
||||||
|
return result_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual WriteResult writeObject(const osg::Object& /*obj*/,const std::string& /*fileName*/,const Options* =NULL) {return WriteResult(WriteResult::FILE_NOT_HANDLED); }
|
||||||
|
virtual WriteResult writeImage(const osg::Image& /*image*/,const std::string& /*fileName*/,const Options* =NULL) {return WriteResult(WriteResult::FILE_NOT_HANDLED); }
|
||||||
|
virtual WriteResult writeHeightField(const osg::HeightField& /*heightField*/,const std::string& /*fileName*/,const Options* =NULL) {return WriteResult(WriteResult::FILE_NOT_HANDLED); }
|
||||||
|
virtual WriteResult writeNode(const osg::Node& /*node*/,const std::string& /*fileName*/,const Options* =NULL) { return WriteResult(WriteResult::FILE_NOT_HANDLED); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// register with Registry to instantiate the above reader/writer.
|
||||||
|
osgDB::RegisterReaderWriterProxy<ReaderWriterOSGA> g_osgaReaderWriterProxy;
|
Loading…
Reference in New Issue
Block a user