Changeset 8805

Show
Ignore:
Timestamp:
08/28/08 18:15:57
Author:
robert
Message:

Introduce the concept of layer set name, using the osg::Object::s/getName() to store
the setname, and using a compound string (set:setname:filename) in place of standard filename when reading and writing
files.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • OpenSceneGraph/trunk/include/osgTerrain/Layer

    r8803 r8805  
    2727#define MAXIMUM_NUMBER_OF_LEVELS 30 
    2828 
     29/** Extact the setname and filename from a compound string in the from set:setname:filename". 
     30  * Returns a setname of "" when non set:setname: entry is present.*/ 
     31void extractSetNameAndFileName(const std::string& compoundstring, std::string& setname, std::string& filename); 
     32 
     33/** Create a compound string in the form set:setname:filename, or just filename if setname is "".*/ 
     34std::string createCompondSetNameAndFileName(const std::string& setname, const std::string& filename); 
     35 
    2936class OSGTERRAIN_EXPORT Layer : public osg::Object 
    3037{ 
     
    4350        /** Get the file name of the layer. */ 
    4451        virtual const std::string& getFileName() const { return _filename; } 
    45          
     52 
     53        /** Return the compound name of the layer in the form set::name::filename string.*/ 
     54        std::string getCompoundName() const { return createCompondSetNameAndFileName(getName(), getFileName()); } 
    4655 
    4756        void setLocator(Locator* locator) { _locator = locator; } 
     
    332341 
    333342 
    334 class OSGTERRAIN_EXPORT CompositeLayer : public Layer 
    335 { 
    336     public: 
    337  
    338         CompositeLayer(); 
    339  
    340         /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ 
    341         CompositeLayer(const CompositeLayer& compositeLayer,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); 
    342          
    343         META_Object(osgTerrain, CompositeLayer); 
    344  
    345         void clear(); 
    346  
    347         void setFileName(unsigned int i, const std::string& filename) { _layers[i].first = filename; if (_layers[i].second.valid()) _layers[i].second->setFileName(filename); } 
    348         const std::string& getFileName(unsigned int i) const { return _layers[i].second.valid() ? _layers[i].second->getFileName() : _layers[i].first; } 
    349  
    350         void setLayer(unsigned int i, Layer* layer) { _layers[i].second = layer; } 
    351         Layer* getLayer(unsigned int i) { return _layers[i].second.get(); } 
    352         const Layer* getLayer(unsigned int i) const { return _layers[i].second.get(); } 
    353  
    354         void addLayer(const std::string& filename) { _layers.push_back(FileNameLayerPair(filename,0)); } 
    355          
    356         void addLayer(Layer* layer) { _layers.push_back(FileNameLayerPair(layer->getFileName(),layer)); } 
    357  
    358         void removeLayer(unsigned int i) { _layers.erase(_layers.begin()+i); } 
    359          
    360         unsigned int getNumLayers() const { return _layers.size(); } 
    361  
    362     protected: 
    363  
    364         virtual ~CompositeLayer() {} 
    365          
    366         typedef std::pair< std::string, osg::ref_ptr<Layer> > FileNameLayerPair; 
    367          
    368         typedef std::vector< FileNameLayerPair > Layers; 
    369          
    370         Layers _layers; 
    371 }; 
    372  
    373343class OSGTERRAIN_EXPORT ProxyLayer : public Layer 
    374344{ 
     
    419389}; 
    420390 
    421  
    422  
    423 class OSGTERRAIN_EXPORT SwitchLayer : public Layer 
     391class OSGTERRAIN_EXPORT CompositeLayer : public Layer 
     392
     393    public: 
     394 
     395        CompositeLayer(); 
     396 
     397        /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ 
     398        CompositeLayer(const CompositeLayer& compositeLayer,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); 
     399         
     400        META_Object(osgTerrain, CompositeLayer); 
     401 
     402        void clear(); 
     403 
     404        void setSetName(unsigned int i, const std::string& setname) { _layers[i].setname = setname; if (_layers[i].layer.valid()) _layers[i].layer->setName(setname); } 
     405        const std::string& getSetName(unsigned int i) const { return _layers[i].layer.valid() ? _layers[i].layer->getName() : _layers[i].setname; } 
     406 
     407        void setFileName(unsigned int i, const std::string& filename) { _layers[i].filename = filename; if (_layers[i].layer.valid()) _layers[i].layer->setFileName(filename); } 
     408        const std::string& getFileName(unsigned int i) const { return _layers[i].layer.valid() ? _layers[i].layer->getFileName() : _layers[i].filename; } 
     409 
     410        void setCompoundName(unsigned int i, const std::string& compoundname); 
     411        std::string getCompoundName(unsigned int i) const; 
     412 
     413 
     414        void setLayer(unsigned int i, Layer* layer) { _layers[i].layer = layer; } 
     415        Layer* getLayer(unsigned int i) { return _layers[i].layer.get(); } 
     416        const Layer* getLayer(unsigned int i) const { return _layers[i].layer.get(); } 
     417 
     418        void addLayer(const std::string& compoundname); 
     419         
     420        void addLayer(Layer* layer) { _layers.push_back(CompoundNameLayer(layer->getName(),layer->getFileName(),layer)); } 
     421 
     422        void removeLayer(unsigned int i) { _layers.erase(_layers.begin()+i); } 
     423         
     424        unsigned int getNumLayers() const { return _layers.size(); } 
     425 
     426    protected: 
     427 
     428        virtual ~CompositeLayer() {} 
     429 
     430        struct CompoundNameLayer 
     431        { 
     432            CompoundNameLayer() {} 
     433         
     434            CompoundNameLayer(const CompoundNameLayer& cnl): 
     435                setname(cnl.setname), 
     436                filename(cnl.filename), 
     437                layer(cnl.layer) {} 
     438 
     439            CompoundNameLayer(const std::string& sn, const std::string& fn, Layer* l): 
     440                setname(sn), 
     441                filename(fn), 
     442                layer(l) {} 
     443 
     444            CompoundNameLayer& operator = (const CompoundNameLayer& cnl) 
     445            { 
     446                if (&cnl==this) return *this; 
     447                 
     448                setname = cnl.setname; 
     449                filename = cnl.filename; 
     450                layer = cnl.layer; 
     451                return *this; 
     452            } 
     453 
     454            std::string         setname; 
     455            std::string         filename; 
     456            osg::ref_ptr<Layer> layer; 
     457        }; 
     458         
     459        typedef std::vector< CompoundNameLayer > Layers; 
     460         
     461        Layers _layers; 
     462}; 
     463 
     464 
     465class OSGTERRAIN_EXPORT SwitchLayer : public CompositeLayer 
    424466{ 
    425467    public: 
     
    434476        void clear(); 
    435477         
    436         void setActiveLayer(unsigned int i) { _activeLayer = i; } 
    437         unsigned int getActiveLayer() const { return _activeLayer; } 
    438  
    439         void setFileName(unsigned int i, const std::string& filename) { _layers[i].first = filename; if (_layers[i].second.valid()) _layers[i].second->setFileName(filename); } 
    440         const std::string& getFileName(unsigned int i) const { return _layers[i].second.valid() ? _layers[i].second->getFileName() : _layers[i].first; } 
    441  
    442         void setLayer(unsigned int i, Layer* layer) { _layers[i].second = layer; } 
    443         Layer* getLayer(unsigned int i) { return _layers[i].second.get(); } 
    444         const Layer* getLayer(unsigned int i) const { return _layers[i].second.get(); } 
    445  
    446         void addLayer(const std::string& filename) { _layers.push_back(FileNameLayerPair(filename,0)); } 
    447          
    448         void addLayer(Layer* layer) { _layers.push_back(FileNameLayerPair(layer->getFileName(),layer)); } 
    449  
    450         void removeLayer(unsigned int i) { _layers.erase(_layers.begin()+i); } 
    451          
    452         unsigned int getNumLayers() const { return _layers.size(); } 
     478        void setActiveLayer(int i) { _activeLayer = i; } 
     479        int getActiveLayer() const { return _activeLayer; } 
    453480 
    454481    protected: 
     
    456483        virtual ~SwitchLayer() {} 
    457484         
    458         typedef std::pair< std::string, osg::ref_ptr<Layer> > FileNameLayerPair; 
    459          
    460         typedef std::vector< FileNameLayerPair > Layers; 
    461          
    462         unsigned int _activeLayer; 
    463         Layers _layers; 
    464 }; 
     485        int _activeLayer; 
     486}; 
     487 
     488 
    465489 
    466490} 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/CompositeLayer.cpp

    r7786 r8805  
    4343        { 
    4444            out->writeBool(false); 
    45             out->writeString(getFileName(i)); 
     45            out->writeString(getCompoundName(i)); 
    4646        } 
    4747    } 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/SwitchLayer.cpp

    r8803 r8805  
    1414#include "Exception.h" 
    1515#include "SwitchLayer.h" 
    16 #include "Layer.h" 
     16#include "CompositeLayer.h" 
    1717 
    1818using namespace ive; 
     
    2424 
    2525    // If the osg class is inherited by any other class we should also write this to file. 
    26     osgTerrain::Layer*  layer = dynamic_cast<osgTerrain::Layer*>(this); 
     26    osgTerrain::CompositeLayer*  layer = dynamic_cast<osgTerrain::CompositeLayer*>(this); 
    2727    if  (layer) 
    28         ((ive::Layer*)(layer))->write(out); 
     28        ((ive::CompositeLayer*)(layer))->write(out); 
    2929    else 
    3030        throw Exception("SwitchLayer::write(): Could not cast this osgLayer::SwitchLayer to an osgTerrain::Layer."); 
    3131 
    3232 
    33     out->writeUInt(getActiveLayer()); 
    34  
    35     LayerHelper helper; 
    36  
    37     out->writeUInt(getNumLayers()); 
    38     for(unsigned int i=0; i<getNumLayers(); ++i) 
    39     { 
    40         if(getLayer(i)) 
    41         { 
    42             out->writeBool(true); 
    43             helper.writeLayer(out, getLayer(i)); 
    44         } 
    45         else 
    46         { 
    47             out->writeBool(false); 
    48             out->writeString(getFileName(i)); 
    49         } 
    50     } 
     33    out->writeInt(getActiveLayer()); 
    5134} 
    5235 
     
    6245 
    6346    // If the osg class is inherited by any other class we should also read this from file. 
    64     osgTerrain::Layer*  layer = dynamic_cast<osgTerrain::Layer*>(this); 
     47    osgTerrain::CompositeLayer*  layer = dynamic_cast<osgTerrain::CompositeLayer*>(this); 
    6548    if (layer) 
    66         ((ive::Layer*)(layer))->read(in); 
     49        ((ive::CompositeLayer*)(layer))->read(in); 
    6750    else 
    6851        throw Exception("SwitchLayer::read(): Could not cast this osgLayer::Layer to an osg::Group."); 
    6952 
    70  
    71     setActiveLayer(in->readUInt()); 
    72  
    73     LayerHelper helper; 
    74  
    75     unsigned int numLayers = in->readUInt(); 
    76     for(unsigned int i=0; i<numLayers; ++i) 
    77     { 
    78         bool readInlineLayer = in->readBool(); 
    79         if (readInlineLayer) 
    80         { 
    81             addLayer(helper.readLayer(in)); 
    82         } 
    83         else 
    84         { 
    85             addLayer(in->readString()); 
    86         } 
    87     } 
     53    setActiveLayer(in->readInt()); 
    8854} 
  • OpenSceneGraph/trunk/src/osgPlugins/osgTerrain/CompositeLayer.cpp

    r7925 r8805  
    7676        else if (fr.matchSequence("ProxyLayer %s") || fr.matchSequence("ProxyLayer %w")) 
    7777        { 
    78             osgTerrain::ProxyLayer* proxyLayer = new osgTerrain::ProxyLayer; 
    79             proxyLayer->setFileName(fr[1].getStr()); 
     78            std::string setname; 
     79            std::string filename; 
     80            osgTerrain::extractSetNameAndFileName(fr[1].getStr(),setname, filename); 
     81            if (!filename.empty()) 
     82            { 
     83                osgTerrain::ProxyLayer* proxyLayer = new osgTerrain::ProxyLayer; 
     84                proxyLayer->setFileName(filename); 
     85                proxyLayer->setName(setname); 
    8086 
    81             if (locator.valid()) proxyLayer->setLocator(locator.get()); 
    82             if (minLevel!=0) proxyLayer->setMinLevel(minLevel); 
    83             if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel); 
     87                if (locator.valid()) proxyLayer->setLocator(locator.get()); 
     88                if (minLevel!=0) proxyLayer->setMinLevel(minLevel); 
     89                if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel); 
     90                 
    8491 
    85             layer.addLayer(proxyLayer); 
    86  
     92                layer.addLayer(proxyLayer); 
     93            } 
     94             
    8795            fr += 2; 
    8896 
     
    146154                    }  
    147155                 
    148                     fw.indent()<<"ProxyLayer "<<proxyLayer->getFileName()<<std::endl; 
     156                    fw.indent()<<"ProxyLayer "<<proxyLayer->getCompoundName()<<std::endl; 
    149157                } 
    150158            } 
     
    156164        else if (!layer.getFileName(i).empty()) 
    157165        { 
    158             fw.indent()<<"file "<<layer.getFileName(i)<<std::endl; 
     166            fw.indent()<<"file "<<layer.getCompoundName(i)<<std::endl; 
    159167        } 
    160168    } 
  • OpenSceneGraph/trunk/src/osgPlugins/osgTerrain/HeightFieldLayer.cpp

    r7780 r8805  
    3434    if (fr.matchSequence("file %w") || fr.matchSequence("file %s")) 
    3535    { 
    36         osg::ref_ptr<osg::HeightField> hf = osgDB::readHeightFieldFile(fr[1].getStr()); 
    37         if (hf.valid()) 
     36        std::string setname; 
     37        std::string filename; 
     38        osgTerrain::extractSetNameAndFileName(fr[1].getStr(),setname, filename); 
     39        if (!filename.empty()) 
    3840        { 
    39             layer.setHeightField(hf.get()); 
     41            osg::ref_ptr<osg::HeightField> hf = osgDB::readHeightFieldFile(filename); 
     42            if (hf.valid()) 
     43            { 
     44                layer.setName(setname); 
     45                layer.setFileName(filename); 
     46                layer.setHeightField(hf.get());                 
     47            } 
    4048        } 
    41  
    4249        fr += 2; 
    4350        itrAdvanced = true; 
     
    6269    if (!layer.getFileName().empty()) 
    6370    { 
    64         fw.indent()<<"file "<<layer.getFileName()<<std::endl; 
     71        std::string str = osgTerrain::createCompondSetNameAndFileName(layer.getName(), layer.getFileName()); 
     72        fw.indent()<<"file "<< str << std::endl; 
    6573    } 
    6674    else 
  • OpenSceneGraph/trunk/src/osgPlugins/osgTerrain/ImageLayer.cpp

    r7780 r8805  
    3434    if (fr.matchSequence("file %w") || fr.matchSequence("file %s")) 
    3535    { 
    36         osg::ref_ptr<osg::Image> image = osgDB::readImageFile(fr[1].getStr()); 
    37         if (image.valid()) 
     36        std::string setname; 
     37        std::string filename; 
     38        osgTerrain::extractSetNameAndFileName(fr[1].getStr(),setname, filename); 
     39        if (!filename.empty()) 
    3840        { 
    39             layer.setImage(image.get()); 
     41            osg::ref_ptr<osg::Image> image = osgDB::readImageFile(filename); 
     42            if (image.valid()) 
     43            { 
     44                layer.setName(setname); 
     45                layer.setFileName(filename); 
     46                layer.setImage(image.get()); 
     47            } 
    4048        } 
    41  
     49         
    4250        fr += 2; 
    4351        itrAdvanced = true; 
     
    5462    if (!layer.getFileName().empty()) 
    5563    { 
    56         fw.indent()<<"file "<<layer.getFileName()<<std::endl; 
     64        std::string str = osgTerrain::createCompondSetNameAndFileName(layer.getName(), layer.getFileName()); 
     65        fw.indent()<<"file "<< str << std::endl; 
    5766    } 
    5867 
  • OpenSceneGraph/trunk/src/osgPlugins/osgTerrain/SwitchLayer.cpp

    r8803 r8805  
    3434    new osgTerrain::SwitchLayer, 
    3535    "SwitchLayer", 
    36     "Object SwitchLayer Layer", 
     36    "Object SwitchLayer CompositeLayer Layer", 
    3737    SwitchLayer_readLocalData, 
    3838    SwitchLayer_writeLocalData 
     
    4444 
    4545    bool itrAdvanced = false; 
    46      
    47     osg::ref_ptr<osgTerrain::Locator> locator = 0; 
    4846 
    49     unsigned int i; 
    50     if (fr.read("ActiveLayer",i)) layer.setActiveLayer(i); 
    51  
    52     do 
     47    int i; 
     48    if (fr.read("ActiveLayer",i))  
    5349    { 
    54         itrAdvanced = false; 
    55  
    56         osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::Locator>()); 
    57         locator = dynamic_cast<osgTerrain::Locator*>(readObject.get()); 
    58         if (readObject.valid()) itrAdvanced = true; 
    59  
    60         unsigned int minLevel=0; 
    61         if (fr.read("MinLevel",minLevel)) 
    62         { 
    63             itrAdvanced = true; 
    64         } 
    65  
    66         unsigned int maxLevel = MAXIMUM_NUMBER_OF_LEVELS; 
    67         if (fr.read("MaxLevel",maxLevel)) 
    68         { 
    69             itrAdvanced = true; 
    70         } 
    71  
    72         if (fr.matchSequence("file %s") || fr.matchSequence("file %w") ) 
    73         { 
    74             layer.addLayer(fr[1].getStr()); 
    75             fr += 2; 
    76  
    77             itrAdvanced = true; 
    78         } 
    79         else if (fr.matchSequence("ProxyLayer %s") || fr.matchSequence("ProxyLayer %w")) 
    80         { 
    81             osgTerrain::ProxyLayer* proxyLayer = new osgTerrain::ProxyLayer; 
    82             proxyLayer->setFileName(fr[1].getStr()); 
    83  
    84             if (locator.valid()) proxyLayer->setLocator(locator.get()); 
    85             if (minLevel!=0) proxyLayer->setMinLevel(minLevel); 
    86             if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel); 
    87  
    88             layer.addLayer(proxyLayer); 
    89  
    90             fr += 2; 
    91  
    92             itrAdvanced = true; 
    93         } 
    94         else 
    95         { 
    96             osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::Layer>()); 
    97             osgTerrain::Layer* readLayer = dynamic_cast<osgTerrain::Layer*>(readObject.get()); 
    98             if (readLayer) 
    99             { 
    100                 if (locator.valid()) 
    101                 { 
    102                     readLayer->setLocator(locator.get()); 
    103                     locator = 0; 
    104                 } 
    105  
    106                 if (minLevel!=0) readLayer->setMinLevel(minLevel); 
    107                 if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) readLayer->setMaxLevel(maxLevel); 
    108  
    109                 layer.addLayer(readLayer); 
    110             } 
    111  
    112             if (readObject.valid()) itrAdvanced = true; 
    113         } 
    114          
    115     } while (itrAdvanced); 
    116          
    117     if (locator.valid()) layer.setLocator(locator.get()); 
     50        layer.setActiveLayer(i); 
     51        itrAdvanced = true; 
     52    }; 
    11853 
    11954    return itrAdvanced; 
     
    12661    fw.indent()<<"ActiveLayer "<<layer.getActiveLayer()<<std::endl; 
    12762 
    128     for(unsigned int i=0; i<layer.getNumLayers();++i) 
    129     { 
    130         if (layer.getLayer(i)) 
    131         { 
    132             const osgTerrain::ProxyLayer* proxyLayer = dynamic_cast<const osgTerrain::ProxyLayer*>(layer.getLayer(i)); 
    133             if (proxyLayer) 
    134             { 
    135                 if (!proxyLayer->getFileName().empty()) 
    136                 { 
    137                     const osgTerrain::Locator* locator = proxyLayer->getLocator(); 
    138                     if (locator && !locator->getDefinedInFile()) 
    139                     { 
    140                         fw.writeObject(*locator); 
    141                     } 
    142                      
    143                     if (proxyLayer->getMinLevel()!=0) 
    144                     { 
    145                         fw.indent()<<"MinLevel "<<proxyLayer->getMinLevel()<<std::endl; 
    146                     }  
    147  
    148                     if (proxyLayer->getMaxLevel()!=MAXIMUM_NUMBER_OF_LEVELS) 
    149                     { 
    150                         fw.indent()<<"MaxLevel "<<proxyLayer->getMaxLevel()<<std::endl; 
    151                     }  
    152                  
    153                     fw.indent()<<"ProxyLayer "<<proxyLayer->getFileName()<<std::endl; 
    154                 } 
    155             } 
    156             else 
    157             {      
    158                 fw.writeObject(*(layer.getLayer(i))); 
    159             } 
    160         } 
    161         else if (!layer.getFileName(i).empty()) 
    162         { 
    163             fw.indent()<<"file "<<layer.getFileName(i)<<std::endl; 
    164         } 
    165     } 
    166  
    167  
    168  
    16963    return true; 
    17064} 
  • OpenSceneGraph/trunk/src/osgTerrain/Layer.cpp

    r8803 r8805  
    1616 
    1717using namespace osgTerrain; 
     18 
     19void osgTerrain::extractSetNameAndFileName(const std::string& compoundstring, std::string& setname, std::string& filename) 
     20{ 
     21    std::string::size_type setcolonpos = compoundstring.find("set:"); 
     22    if (setcolonpos==std::string::npos) 
     23    { 
     24        setname = ""; 
     25        filename = compoundstring; 
     26        return; 
     27    } 
     28     
     29    if (compoundstring.size()==4) 
     30    { 
     31        setname = ""; 
     32        filename = ""; 
     33        return; 
     34    } 
     35     
     36    std::string::size_type secondcolonpos = compoundstring.find_first_of(':', setcolonpos+4); 
     37    if (secondcolonpos==std::string::npos) 
     38    { 
     39        setname = compoundstring.substr(setcolonpos+4,std::string::npos); 
     40        filename = ""; 
     41        return; 
     42    } 
     43 
     44    setname = compoundstring.substr(setcolonpos+4,secondcolonpos-setcolonpos-4); 
     45    filename = compoundstring.substr(secondcolonpos+1, std::string::npos); 
     46} 
     47 
     48std::string osgTerrain::createCompondSetNameAndFileName(const std::string& setname, const std::string& filename) 
     49{ 
     50    if (setname.empty()) return filename; 
     51    return std::string("set:")+setname+std::string(":")+filename; 
     52} 
     53 
    1854 
    1955Layer::Layer(): 
     
    457493} 
    458494 
     495///////////////////////////////////////////////////////////////////////////// 
     496// 
     497// ProxyLayer 
     498// 
     499ProxyLayer::ProxyLayer() 
     500{ 
     501} 
     502 
     503ProxyLayer::ProxyLayer(const ProxyLayer& proxyLayer,const osg::CopyOp& copyop): 
     504    Layer(proxyLayer,copyop) 
     505{ 
     506} 
     507 
     508ProxyLayer::~ProxyLayer() 
     509{ 
     510} 
     511 
     512void ProxyLayer::setFileName(const std::string& filename) 
     513{ 
     514    _filename = filename; 
     515    if (_implementation.valid()) 
     516    { 
     517        _implementation->setFileName(_filename); 
     518    } 
     519} 
     520 
     521unsigned int ProxyLayer::getNumColumns() const 
     522{ 
     523    if (_implementation.valid()) return _implementation->getNumColumns(); 
     524    else return 0; 
     525} 
     526 
     527unsigned int ProxyLayer::getNumRows() const 
     528{ 
     529    if (_implementation.valid()) return _implementation->getNumRows(); 
     530    else return 0; 
     531} 
     532 
     533bool ProxyLayer::transform(float offset, float scale) 
     534{ 
     535    if (_implementation.valid()) return _implementation->transform(offset,scale); 
     536    else return false; 
     537} 
     538 
     539bool ProxyLayer::getValue(unsigned int i, unsigned int j, float& value) const 
     540{ 
     541    if (_implementation.valid()) return _implementation->getValue(i,j,value); 
     542    else return false; 
     543} 
     544 
     545bool ProxyLayer::getValue(unsigned int i, unsigned int j, osg::Vec2& value) const 
     546{ 
     547    if (_implementation.valid()) return _implementation->getValue(i,j,value); 
     548    else return false; 
     549} 
     550 
     551bool ProxyLayer::getValue(unsigned int i, unsigned int j, osg::Vec3& value) const 
     552{ 
     553    if (_implementation.valid()) return _implementation->getValue(i,j,value); 
     554    else return false; 
     555} 
     556 
     557bool ProxyLayer::getValue(unsigned int i, unsigned int j, osg::Vec4& value) const 
     558{ 
     559    if (_implementation.valid()) return _implementation->getValue(i,j,value); 
     560    else return false; 
     561} 
     562 
     563void ProxyLayer::dirty() 
     564{ 
     565    if (_implementation.valid()) _implementation->dirty(); 
     566} 
     567 
     568void ProxyLayer::setModifiedCount(unsigned int value) 
     569{ 
     570    if (_implementation.valid()) _implementation->setModifiedCount(value); 
     571}; 
     572 
     573unsigned int ProxyLayer::getModifiedCount() const 
     574{ 
     575    return _implementation.valid() ? _implementation->getModifiedCount() : 0; 
     576} 
     577 
     578 
     579osg::BoundingSphere ProxyLayer::computeBound(bool treatAsElevationLayer) const 
     580{ 
     581    if (_implementation.valid()) return _implementation->computeBound(treatAsElevationLayer); 
     582    else return osg::BoundingSphere(); 
     583} 
     584 
     585 
    459586 
    460587///////////////////////////////////////////////////////////////////////////// 
     
    477604} 
    478605 
     606void CompositeLayer::setCompoundName(unsigned int i, const std::string& compoundname) 
     607{ 
     608    std::string setname; 
     609    std::string filename; 
     610    extractSetNameAndFileName(compoundname, setname, filename); 
     611     
     612    _layers[i].setname = setname; 
     613    _layers[i].filename = filename; 
     614} 
     615 
     616std::string CompositeLayer::getCompoundName(unsigned int i) const 
     617{ 
     618    return createCompondSetNameAndFileName(_layers[i].setname, _layers[i].filename); 
     619} 
     620 
     621void CompositeLayer::addLayer(const std::string& compoundname) 
     622{ 
     623    std::string setname; 
     624    std::string filename; 
     625    extractSetNameAndFileName(compoundname, setname, filename); 
     626 
     627    _layers.push_back(CompoundNameLayer(setname,filename,0)); 
     628} 
     629 
    479630///////////////////////////////////////////////////////////////////////////// 
    480631// 
    481 // ProxyLayer 
    482 // 
    483 ProxyLayer::ProxyLayer() 
    484 { 
    485 } 
    486  
    487 ProxyLayer::ProxyLayer(const ProxyLayer& proxyLayer,const osg::CopyOp& copyop): 
    488     Layer(proxyLayer,copyop) 
    489 { 
    490 } 
    491  
    492 ProxyLayer::~ProxyLayer() 
    493 { 
    494 } 
    495  
    496 void ProxyLayer::setFileName(const std::string& filename) 
    497 { 
    498     _filename = filename; 
    499     if (_implementation.valid()) 
    500     { 
    501         _implementation->setFileName(_filename); 
    502     } 
    503 } 
    504  
    505 unsigned int ProxyLayer::getNumColumns() const 
    506 { 
    507     if (_implementation.valid()) return _implementation->getNumColumns(); 
    508     else return 0; 
    509 } 
    510  
    511 unsigned int ProxyLayer::getNumRows() const 
    512 { 
    513     if (_implementation.valid()) return _implementation->getNumRows(); 
    514     else return 0; 
    515 } 
    516  
    517 bool ProxyLayer::transform(float offset, float scale) 
    518 { 
    519     if (_implementation.valid()) return _implementation->transform(offset,scale); 
    520     else return false; 
    521 } 
    522  
    523 bool ProxyLayer::getValue(unsigned int i, unsigned int j, float& value) const 
    524 { 
    525     if (_implementation.valid()) return _implementation->getValue(i,j,value); 
    526     else return false; 
    527 } 
    528  
    529 bool ProxyLayer::getValue(unsigned int i, unsigned int j, osg::Vec2& value) const 
    530 { 
    531     if (_implementation.valid()) return _implementation->getValue(i,j,value); 
    532     else return false; 
    533 } 
    534  
    535 bool ProxyLayer::getValue(unsigned int i, unsigned int j, osg::Vec3& value) const 
    536 { 
    537     if (_implementation.valid()) return _implementation->getValue(i,j,value); 
    538     else return false; 
    539 } 
    540  
    541 bool ProxyLayer::getValue(unsigned int i, unsigned int j, osg::Vec4& value) const 
    542 { 
    543     if (_implementation.valid()) return _implementation->getValue(i,j,value); 
    544     else return false; 
    545 } 
    546  
    547 void ProxyLayer::dirty() 
    548 { 
    549     if (_implementation.valid()) _implementation->dirty(); 
    550 } 
    551  
    552 void ProxyLayer::setModifiedCount(unsigned int value) 
    553 { 
    554     if (_implementation.valid()) _implementation->setModifiedCount(value); 
    555 }; 
    556  
    557 unsigned int ProxyLayer::getModifiedCount() const 
    558 { 
    559     return _implementation.valid() ? _implementation->getModifiedCount() : 0; 
    560 } 
    561  
    562  
    563 osg::BoundingSphere ProxyLayer::computeBound(bool treatAsElevationLayer) const 
    564 { 
    565     if (_implementation.valid()) return _implementation->computeBound(treatAsElevationLayer); 
    566     else return osg::BoundingSphere(); 
    567 } 
    568  
    569  
    570 ///////////////////////////////////////////////////////////////////////////// 
    571 // 
    572632// SwitchLayer 
    573633// 
    574634SwitchLayer::SwitchLayer(): 
    575     _activeLayer(0
     635    _activeLayer(-1
    576636{ 
    577637} 
    578638 
    579639SwitchLayer::SwitchLayer(const SwitchLayer& switchLayer,const osg::CopyOp& copyop): 
    580     Layer(switchLayer,copyop), 
    581     _activeLayer(0) 
    582 
    583 
    584  
    585  
    586 void SwitchLayer::clear() 
    587 
    588     _layers.clear(); 
    589 
    590  
     640    CompositeLayer(switchLayer,copyop), 
     641    _activeLayer(-1) 
     642
     643