From ffc8123a738058b2fa0c085716d37bd158534b6c Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 16 Aug 2007 18:49:46 +0000 Subject: [PATCH] Changed the tolower of the file extension into the plugin name construction code. Added support for CompositeLayer. --- include/osgTerrain/Layer | 55 ++++++++++++++++++++++++++- src/osgDB/Registry.cpp | 35 ++++++++++++----- src/osgPlugins/osgTerrain/Terrain.cpp | 21 ++++++++++ src/osgTerrain/Layer.cpp | 21 +++++++++- 4 files changed, 119 insertions(+), 13 deletions(-) diff --git a/include/osgTerrain/Layer b/include/osgTerrain/Layer index cf345bac8..7be2b53bf 100644 --- a/include/osgTerrain/Layer +++ b/include/osgTerrain/Layer @@ -34,6 +34,8 @@ class OSGTERRAIN_EXPORT Layer : public osg::Object META_Object(osgTerrain, Layer); + virtual void setFileName(const std::string& filename) { _filename = filename; } + virtual const std::string& getFileName() const { return _filename; } void setLocator(Locator* locator) { _locator = locator; } Locator* getLocator() { return _locator.get(); } @@ -156,6 +158,7 @@ class OSGTERRAIN_EXPORT Layer : public osg::Object virtual ~Layer(); + std::string _filename; osg::ref_ptr _locator; osg::ref_ptr _validDataOperator; osg::Vec4 _defaultValue; @@ -171,6 +174,11 @@ class OSGTERRAIN_EXPORT ImageLayer : public Layer /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ ImageLayer(const ImageLayer& imageLayer,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); + META_Object(osgTerrain, ImageLayer); + + void setFileName(const std::string& filename) { _filename = filename; if (_image.valid()) _image->setFileName(filename); } + virtual const std::string& getFileName() const { return _image.get() ? _image->getFileName() : _filename; } + virtual bool transform(float offset, float scale); void setImage(osg::Image* image); @@ -193,7 +201,7 @@ class OSGTERRAIN_EXPORT ImageLayer : public Layer virtual ~ImageLayer() {} - osg::ref_ptr _image; + osg::ref_ptr _image; }; @@ -206,6 +214,11 @@ class OSGTERRAIN_EXPORT HeightFieldLayer : public Layer /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ HeightFieldLayer(const HeightFieldLayer& hfLayer,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); + META_Object(osgTerrain, HeightFieldLayer); + + void setFileName(const std::string& filename) { _filename = filename; } + virtual const std::string& getFileName() const { return _filename; } + virtual bool transform(float offset, float scale); void setHeightField(osg::HeightField* hf); @@ -233,6 +246,46 @@ class OSGTERRAIN_EXPORT HeightFieldLayer : public Layer }; + +class OSGTERRAIN_EXPORT CompositeLayer : public Layer +{ + public: + + CompositeLayer(); + + /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ + CompositeLayer(const CompositeLayer& compositeLayer,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); + + META_Object(osgTerrain, CompositeLayer); + + void clear(); + + void setFileName(unsigned int i, const std::string& filename) { _layers[i].first = filename; if (_layers[i].second.valid()) _layers[i].second->setFileName(filename); } + const std::string& getFileName(unsigned int i) const { return _layers[i].second.valid() ? _layers[i].second->getFileName() : _layers[i].first; } + + void setLayer(unsigned int i, Layer* layer) { _layers[i].second = layer; } + Layer* getLayer(unsigned int i) { return _layers[i].second.get(); } + const Layer* getLayer(unsigned int i) const { return _layers[i].second.get(); } + + void addLayer(const std::string& filename) { _layers.push_back(FileNameLayerPair(filename,0)); } + + void addLayer(Layer* layer) { _layers.push_back(FileNameLayerPair(layer->getFileName(),layer)); } + + void removeLayer(unsigned int i) { _layers.erase(_layers.begin()+i); } + + unsigned int getNumLayers() const { return _layers.size(); } + + protected: + + virtual ~CompositeLayer() {} + + typedef std::pair< std::string, osg::ref_ptr > FileNameLayerPair; + + typedef std::vector< FileNameLayerPair > Layers; + + Layers _layers; +}; + } #endif diff --git a/src/osgDB/Registry.cpp b/src/osgDB/Registry.cpp index ee394faec..8b2b0209f 100644 --- a/src/osgDB/Registry.cpp +++ b/src/osgDB/Registry.cpp @@ -30,6 +30,15 @@ #include #include +#if defined(__sgi) + #include +#elif defined(__GNUC__) || !defined(WIN32) || defined(__MWERKS__) + #include + using std::tolower; + using std::strlen; +#endif + + using namespace osg; using namespace osgDB; @@ -545,14 +554,20 @@ std::string Registry::trim( const std::string& str ) std::string Registry::createLibraryNameForFile(const std::string& fileName) { - std::string ext = getLowerCaseFileExtension(fileName); - return createLibraryNameForExtension(ext); + return createLibraryNameForExtension(getFileExtension(fileName)); } std::string Registry::createLibraryNameForExtension(const std::string& ext) { + std::string lowercase_ext; + for(std::string::const_iterator itr=ext.begin(); + itr!=ext.end(); + ++itr) + { + lowercase_ext.push_back(tolower(*itr)); + } - ExtensionAliasMap::iterator itr=_extAliasMap.find(ext); + ExtensionAliasMap::iterator itr=_extAliasMap.find(lowercase_ext); if (itr!=_extAliasMap.end() && ext != itr->second) return createLibraryNameForExtension(itr->second); #ifdef OSG_JAVA_BUILD @@ -569,23 +584,23 @@ std::string Registry::createLibraryNameForExtension(const std::string& ext) #if defined(WIN32) // !! recheck evolving Cygwin DLL extension naming protocols !! NHV #ifdef __CYGWIN__ - return "cyg"+prepend+"osgdb_"+ext+".dll"; + return "cyg"+prepend+"osgdb_"+lowercase_ext+".dll"; #elif defined(__MINGW32__) - return "lib"+prepend+"osgdb_"+ext+".dll"; + return "lib"+prepend+"osgdb_"+lowercase_ext+".dll"; #else #ifdef _DEBUG - return prepend+"osgdb_"+ext+"d.dll"; + return prepend+"osgdb_"+lowercase_ext+"d.dll"; #else - return prepend+"osgdb_"+ext+".dll"; + return prepend+"osgdb_"+lowercase_ext+".dll"; #endif #endif #elif macintosh - return prepend+"osgdb_"+ext; + return prepend+"osgdb_"+lowercase_ext; #elif defined(__hpux__) // why don't we use PLUGIN_EXT from the makefiles here? - return prepend+"osgdb_"+ext+".sl"; + return prepend+"osgdb_"+lowercase_ext+".sl"; #else - return prepend+"osgdb_"+ext+".so"; + return prepend+"osgdb_"+lowercase_ext+".so"; #endif } diff --git a/src/osgPlugins/osgTerrain/Terrain.cpp b/src/osgPlugins/osgTerrain/Terrain.cpp index 3f14066db..2203dd19a 100644 --- a/src/osgPlugins/osgTerrain/Terrain.cpp +++ b/src/osgPlugins/osgTerrain/Terrain.cpp @@ -38,6 +38,27 @@ osgTerrain::Layer* readLayer(osgDB::Input& fr) while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { bool itrAdvanced = false; + + if (fr.matchSequence("Images {") || fr.matchSequence("images {")) + { + osg::ref_ptr cl = new osgTerrain::CompositeLayer; + + int local_entry = fr[0].getNoNestedBrackets(); + + fr += 2; + while (!fr.eof() && fr[0].getNoNestedBrackets()>local_entry) + { + cl->addLayer(fr[0].getStr()); + ++fr; + } + + layer = cl.get(); + + itrAdvanced = true; + + ++fr; + } + if (fr.matchSequence("Image %w") || fr.matchSequence("image %w") || fr.matchSequence("Image %s") || fr.matchSequence("image %s")) { diff --git a/src/osgTerrain/Layer.cpp b/src/osgTerrain/Layer.cpp index 3d94e98c6..bbd01c9f0 100644 --- a/src/osgTerrain/Layer.cpp +++ b/src/osgTerrain/Layer.cpp @@ -20,8 +20,9 @@ Layer::Layer() { } -Layer::Layer(const Layer& Layer,const osg::CopyOp& copyop): - osg::Object(Layer,copyop) +Layer::Layer(const Layer& layer,const osg::CopyOp& copyop): + osg::Object(layer,copyop), + _filename(layer._filename) { } @@ -321,3 +322,19 @@ unsigned int HeightFieldLayer::getModifiedCount() const { return _modifiedCount; } + + +///////////////////////////////////////////////////////////////////////////// +// +// HieghtFieldLayer +// +CompositeLayer::CompositeLayer() +{ +} + +CompositeLayer::CompositeLayer(const CompositeLayer& compositeLayer,const osg::CopyOp& copyop): + Layer(compositeLayer,copyop) +{ +} + +