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.
This commit is contained in:
@@ -26,6 +26,13 @@ namespace osgTerrain {
|
||||
|
||||
#define MAXIMUM_NUMBER_OF_LEVELS 30
|
||||
|
||||
/** Extact the setname and filename from a compound string in the from set:setname:filename".
|
||||
* Returns a setname of "" when non set:setname: entry is present.*/
|
||||
void extractSetNameAndFileName(const std::string& compoundstring, std::string& setname, std::string& filename);
|
||||
|
||||
/** Create a compound string in the form set:setname:filename, or just filename if setname is "".*/
|
||||
std::string createCompondSetNameAndFileName(const std::string& setname, const std::string& filename);
|
||||
|
||||
class OSGTERRAIN_EXPORT Layer : public osg::Object
|
||||
{
|
||||
public:
|
||||
@@ -42,7 +49,9 @@ class OSGTERRAIN_EXPORT Layer : public osg::Object
|
||||
|
||||
/** Get the file name of the layer. */
|
||||
virtual const std::string& getFileName() const { return _filename; }
|
||||
|
||||
|
||||
/** Return the compound name of the layer in the form set::name::filename string.*/
|
||||
std::string getCompoundName() const { return createCompondSetNameAndFileName(getName(), getFileName()); }
|
||||
|
||||
void setLocator(Locator* locator) { _locator = locator; }
|
||||
Locator* getLocator() { return _locator.get(); }
|
||||
@@ -331,45 +340,6 @@ 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<Layer> > FileNameLayerPair;
|
||||
|
||||
typedef std::vector< FileNameLayerPair > Layers;
|
||||
|
||||
Layers _layers;
|
||||
};
|
||||
|
||||
class OSGTERRAIN_EXPORT ProxyLayer : public Layer
|
||||
{
|
||||
public:
|
||||
@@ -418,9 +388,81 @@ class OSGTERRAIN_EXPORT ProxyLayer : 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 setSetName(unsigned int i, const std::string& setname) { _layers[i].setname = setname; if (_layers[i].layer.valid()) _layers[i].layer->setName(setname); }
|
||||
const std::string& getSetName(unsigned int i) const { return _layers[i].layer.valid() ? _layers[i].layer->getName() : _layers[i].setname; }
|
||||
|
||||
void setFileName(unsigned int i, const std::string& filename) { _layers[i].filename = filename; if (_layers[i].layer.valid()) _layers[i].layer->setFileName(filename); }
|
||||
const std::string& getFileName(unsigned int i) const { return _layers[i].layer.valid() ? _layers[i].layer->getFileName() : _layers[i].filename; }
|
||||
|
||||
void setCompoundName(unsigned int i, const std::string& compoundname);
|
||||
std::string getCompoundName(unsigned int i) const;
|
||||
|
||||
|
||||
class OSGTERRAIN_EXPORT SwitchLayer : public Layer
|
||||
void setLayer(unsigned int i, Layer* layer) { _layers[i].layer = layer; }
|
||||
Layer* getLayer(unsigned int i) { return _layers[i].layer.get(); }
|
||||
const Layer* getLayer(unsigned int i) const { return _layers[i].layer.get(); }
|
||||
|
||||
void addLayer(const std::string& compoundname);
|
||||
|
||||
void addLayer(Layer* layer) { _layers.push_back(CompoundNameLayer(layer->getName(),layer->getFileName(),layer)); }
|
||||
|
||||
void removeLayer(unsigned int i) { _layers.erase(_layers.begin()+i); }
|
||||
|
||||
unsigned int getNumLayers() const { return _layers.size(); }
|
||||
|
||||
protected:
|
||||
|
||||
virtual ~CompositeLayer() {}
|
||||
|
||||
struct CompoundNameLayer
|
||||
{
|
||||
CompoundNameLayer() {}
|
||||
|
||||
CompoundNameLayer(const CompoundNameLayer& cnl):
|
||||
setname(cnl.setname),
|
||||
filename(cnl.filename),
|
||||
layer(cnl.layer) {}
|
||||
|
||||
CompoundNameLayer(const std::string& sn, const std::string& fn, Layer* l):
|
||||
setname(sn),
|
||||
filename(fn),
|
||||
layer(l) {}
|
||||
|
||||
CompoundNameLayer& operator = (const CompoundNameLayer& cnl)
|
||||
{
|
||||
if (&cnl==this) return *this;
|
||||
|
||||
setname = cnl.setname;
|
||||
filename = cnl.filename;
|
||||
layer = cnl.layer;
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::string setname;
|
||||
std::string filename;
|
||||
osg::ref_ptr<Layer> layer;
|
||||
};
|
||||
|
||||
typedef std::vector< CompoundNameLayer > Layers;
|
||||
|
||||
Layers _layers;
|
||||
};
|
||||
|
||||
|
||||
class OSGTERRAIN_EXPORT SwitchLayer : public CompositeLayer
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -433,36 +475,18 @@ class OSGTERRAIN_EXPORT SwitchLayer : public Layer
|
||||
|
||||
void clear();
|
||||
|
||||
void setActiveLayer(unsigned int i) { _activeLayer = i; }
|
||||
unsigned int getActiveLayer() const { return _activeLayer; }
|
||||
|
||||
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(); }
|
||||
void setActiveLayer(int i) { _activeLayer = i; }
|
||||
int getActiveLayer() const { return _activeLayer; }
|
||||
|
||||
protected:
|
||||
|
||||
virtual ~SwitchLayer() {}
|
||||
|
||||
typedef std::pair< std::string, osg::ref_ptr<Layer> > FileNameLayerPair;
|
||||
|
||||
typedef std::vector< FileNameLayerPair > Layers;
|
||||
|
||||
unsigned int _activeLayer;
|
||||
Layers _layers;
|
||||
int _activeLayer;
|
||||
};
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -42,7 +42,7 @@ void CompositeLayer::write(DataOutputStream* out)
|
||||
else
|
||||
{
|
||||
out->writeBool(false);
|
||||
out->writeString(getFileName(i));
|
||||
out->writeString(getCompoundName(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
#include "Exception.h"
|
||||
#include "SwitchLayer.h"
|
||||
#include "Layer.h"
|
||||
#include "CompositeLayer.h"
|
||||
|
||||
using namespace ive;
|
||||
|
||||
@@ -23,31 +23,14 @@ void SwitchLayer::write(DataOutputStream* out)
|
||||
out->writeInt(IVESWITCHLAYER);
|
||||
|
||||
// If the osg class is inherited by any other class we should also write this to file.
|
||||
osgTerrain::Layer* layer = dynamic_cast<osgTerrain::Layer*>(this);
|
||||
osgTerrain::CompositeLayer* layer = dynamic_cast<osgTerrain::CompositeLayer*>(this);
|
||||
if (layer)
|
||||
((ive::Layer*)(layer))->write(out);
|
||||
((ive::CompositeLayer*)(layer))->write(out);
|
||||
else
|
||||
throw Exception("SwitchLayer::write(): Could not cast this osgLayer::SwitchLayer to an osgTerrain::Layer.");
|
||||
|
||||
|
||||
out->writeUInt(getActiveLayer());
|
||||
|
||||
LayerHelper helper;
|
||||
|
||||
out->writeUInt(getNumLayers());
|
||||
for(unsigned int i=0; i<getNumLayers(); ++i)
|
||||
{
|
||||
if(getLayer(i))
|
||||
{
|
||||
out->writeBool(true);
|
||||
helper.writeLayer(out, getLayer(i));
|
||||
}
|
||||
else
|
||||
{
|
||||
out->writeBool(false);
|
||||
out->writeString(getFileName(i));
|
||||
}
|
||||
}
|
||||
out->writeInt(getActiveLayer());
|
||||
}
|
||||
|
||||
void SwitchLayer::read(DataInputStream* in)
|
||||
@@ -61,28 +44,11 @@ void SwitchLayer::read(DataInputStream* in)
|
||||
id = in->readInt();
|
||||
|
||||
// If the osg class is inherited by any other class we should also read this from file.
|
||||
osgTerrain::Layer* layer = dynamic_cast<osgTerrain::Layer*>(this);
|
||||
osgTerrain::CompositeLayer* layer = dynamic_cast<osgTerrain::CompositeLayer*>(this);
|
||||
if (layer)
|
||||
((ive::Layer*)(layer))->read(in);
|
||||
((ive::CompositeLayer*)(layer))->read(in);
|
||||
else
|
||||
throw Exception("SwitchLayer::read(): Could not cast this osgLayer::Layer to an osg::Group.");
|
||||
|
||||
|
||||
setActiveLayer(in->readUInt());
|
||||
|
||||
LayerHelper helper;
|
||||
|
||||
unsigned int numLayers = in->readUInt();
|
||||
for(unsigned int i=0; i<numLayers; ++i)
|
||||
{
|
||||
bool readInlineLayer = in->readBool();
|
||||
if (readInlineLayer)
|
||||
{
|
||||
addLayer(helper.readLayer(in));
|
||||
}
|
||||
else
|
||||
{
|
||||
addLayer(in->readString());
|
||||
}
|
||||
}
|
||||
setActiveLayer(in->readInt());
|
||||
}
|
||||
|
||||
@@ -75,15 +75,23 @@ bool CompositeLayer_readLocalData(osg::Object& obj, osgDB::Input &fr)
|
||||
}
|
||||
else if (fr.matchSequence("ProxyLayer %s") || fr.matchSequence("ProxyLayer %w"))
|
||||
{
|
||||
osgTerrain::ProxyLayer* proxyLayer = new osgTerrain::ProxyLayer;
|
||||
proxyLayer->setFileName(fr[1].getStr());
|
||||
std::string setname;
|
||||
std::string filename;
|
||||
osgTerrain::extractSetNameAndFileName(fr[1].getStr(),setname, filename);
|
||||
if (!filename.empty())
|
||||
{
|
||||
osgTerrain::ProxyLayer* proxyLayer = new osgTerrain::ProxyLayer;
|
||||
proxyLayer->setFileName(filename);
|
||||
proxyLayer->setName(setname);
|
||||
|
||||
if (locator.valid()) proxyLayer->setLocator(locator.get());
|
||||
if (minLevel!=0) proxyLayer->setMinLevel(minLevel);
|
||||
if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel);
|
||||
|
||||
layer.addLayer(proxyLayer);
|
||||
if (locator.valid()) proxyLayer->setLocator(locator.get());
|
||||
if (minLevel!=0) proxyLayer->setMinLevel(minLevel);
|
||||
if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel);
|
||||
|
||||
|
||||
layer.addLayer(proxyLayer);
|
||||
}
|
||||
|
||||
fr += 2;
|
||||
|
||||
itrAdvanced = true;
|
||||
@@ -145,7 +153,7 @@ bool CompositeLayer_writeLocalData(const osg::Object& obj, osgDB::Output& fw)
|
||||
fw.indent()<<"MaxLevel "<<proxyLayer->getMaxLevel()<<std::endl;
|
||||
}
|
||||
|
||||
fw.indent()<<"ProxyLayer "<<proxyLayer->getFileName()<<std::endl;
|
||||
fw.indent()<<"ProxyLayer "<<proxyLayer->getCompoundName()<<std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -155,7 +163,7 @@ bool CompositeLayer_writeLocalData(const osg::Object& obj, osgDB::Output& fw)
|
||||
}
|
||||
else if (!layer.getFileName(i).empty())
|
||||
{
|
||||
fw.indent()<<"file "<<layer.getFileName(i)<<std::endl;
|
||||
fw.indent()<<"file "<<layer.getCompoundName(i)<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,12 +33,19 @@ bool HeightFieldLayer_readLocalData(osg::Object& obj, osgDB::Input &fr)
|
||||
|
||||
if (fr.matchSequence("file %w") || fr.matchSequence("file %s"))
|
||||
{
|
||||
osg::ref_ptr<osg::HeightField> hf = osgDB::readHeightFieldFile(fr[1].getStr());
|
||||
if (hf.valid())
|
||||
std::string setname;
|
||||
std::string filename;
|
||||
osgTerrain::extractSetNameAndFileName(fr[1].getStr(),setname, filename);
|
||||
if (!filename.empty())
|
||||
{
|
||||
layer.setHeightField(hf.get());
|
||||
osg::ref_ptr<osg::HeightField> hf = osgDB::readHeightFieldFile(filename);
|
||||
if (hf.valid())
|
||||
{
|
||||
layer.setName(setname);
|
||||
layer.setFileName(filename);
|
||||
layer.setHeightField(hf.get());
|
||||
}
|
||||
}
|
||||
|
||||
fr += 2;
|
||||
itrAdvanced = true;
|
||||
}
|
||||
@@ -61,7 +68,8 @@ bool HeightFieldLayer_writeLocalData(const osg::Object& obj, osgDB::Output& fw)
|
||||
|
||||
if (!layer.getFileName().empty())
|
||||
{
|
||||
fw.indent()<<"file "<<layer.getFileName()<<std::endl;
|
||||
std::string str = osgTerrain::createCompondSetNameAndFileName(layer.getName(), layer.getFileName());
|
||||
fw.indent()<<"file "<< str << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -33,12 +33,20 @@ bool ImageLayer_readLocalData(osg::Object& obj, osgDB::Input &fr)
|
||||
|
||||
if (fr.matchSequence("file %w") || fr.matchSequence("file %s"))
|
||||
{
|
||||
osg::ref_ptr<osg::Image> image = osgDB::readImageFile(fr[1].getStr());
|
||||
if (image.valid())
|
||||
std::string setname;
|
||||
std::string filename;
|
||||
osgTerrain::extractSetNameAndFileName(fr[1].getStr(),setname, filename);
|
||||
if (!filename.empty())
|
||||
{
|
||||
layer.setImage(image.get());
|
||||
osg::ref_ptr<osg::Image> image = osgDB::readImageFile(filename);
|
||||
if (image.valid())
|
||||
{
|
||||
layer.setName(setname);
|
||||
layer.setFileName(filename);
|
||||
layer.setImage(image.get());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fr += 2;
|
||||
itrAdvanced = true;
|
||||
}
|
||||
@@ -53,7 +61,8 @@ bool ImageLayer_writeLocalData(const osg::Object& obj, osgDB::Output& fw)
|
||||
|
||||
if (!layer.getFileName().empty())
|
||||
{
|
||||
fw.indent()<<"file "<<layer.getFileName()<<std::endl;
|
||||
std::string str = osgTerrain::createCompondSetNameAndFileName(layer.getName(), layer.getFileName());
|
||||
fw.indent()<<"file "<< str << std::endl;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -33,7 +33,7 @@ osgDB::RegisterDotOsgWrapperProxy SwitchLayer_Proxy
|
||||
(
|
||||
new osgTerrain::SwitchLayer,
|
||||
"SwitchLayer",
|
||||
"Object SwitchLayer Layer",
|
||||
"Object SwitchLayer CompositeLayer Layer",
|
||||
SwitchLayer_readLocalData,
|
||||
SwitchLayer_writeLocalData
|
||||
);
|
||||
@@ -43,78 +43,13 @@ bool SwitchLayer_readLocalData(osg::Object& obj, osgDB::Input &fr)
|
||||
osgTerrain::SwitchLayer& layer = static_cast<osgTerrain::SwitchLayer&>(obj);
|
||||
|
||||
bool itrAdvanced = false;
|
||||
|
||||
osg::ref_ptr<osgTerrain::Locator> locator = 0;
|
||||
|
||||
unsigned int i;
|
||||
if (fr.read("ActiveLayer",i)) layer.setActiveLayer(i);
|
||||
|
||||
do
|
||||
int i;
|
||||
if (fr.read("ActiveLayer",i))
|
||||
{
|
||||
itrAdvanced = false;
|
||||
|
||||
osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::Locator>());
|
||||
locator = dynamic_cast<osgTerrain::Locator*>(readObject.get());
|
||||
if (readObject.valid()) itrAdvanced = true;
|
||||
|
||||
unsigned int minLevel=0;
|
||||
if (fr.read("MinLevel",minLevel))
|
||||
{
|
||||
itrAdvanced = true;
|
||||
}
|
||||
|
||||
unsigned int maxLevel = MAXIMUM_NUMBER_OF_LEVELS;
|
||||
if (fr.read("MaxLevel",maxLevel))
|
||||
{
|
||||
itrAdvanced = true;
|
||||
}
|
||||
|
||||
if (fr.matchSequence("file %s") || fr.matchSequence("file %w") )
|
||||
{
|
||||
layer.addLayer(fr[1].getStr());
|
||||
fr += 2;
|
||||
|
||||
itrAdvanced = true;
|
||||
}
|
||||
else if (fr.matchSequence("ProxyLayer %s") || fr.matchSequence("ProxyLayer %w"))
|
||||
{
|
||||
osgTerrain::ProxyLayer* proxyLayer = new osgTerrain::ProxyLayer;
|
||||
proxyLayer->setFileName(fr[1].getStr());
|
||||
|
||||
if (locator.valid()) proxyLayer->setLocator(locator.get());
|
||||
if (minLevel!=0) proxyLayer->setMinLevel(minLevel);
|
||||
if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel);
|
||||
|
||||
layer.addLayer(proxyLayer);
|
||||
|
||||
fr += 2;
|
||||
|
||||
itrAdvanced = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::Layer>());
|
||||
osgTerrain::Layer* readLayer = dynamic_cast<osgTerrain::Layer*>(readObject.get());
|
||||
if (readLayer)
|
||||
{
|
||||
if (locator.valid())
|
||||
{
|
||||
readLayer->setLocator(locator.get());
|
||||
locator = 0;
|
||||
}
|
||||
|
||||
if (minLevel!=0) readLayer->setMinLevel(minLevel);
|
||||
if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) readLayer->setMaxLevel(maxLevel);
|
||||
|
||||
layer.addLayer(readLayer);
|
||||
}
|
||||
|
||||
if (readObject.valid()) itrAdvanced = true;
|
||||
}
|
||||
|
||||
} while (itrAdvanced);
|
||||
|
||||
if (locator.valid()) layer.setLocator(locator.get());
|
||||
layer.setActiveLayer(i);
|
||||
itrAdvanced = true;
|
||||
};
|
||||
|
||||
return itrAdvanced;
|
||||
}
|
||||
@@ -125,46 +60,5 @@ bool SwitchLayer_writeLocalData(const osg::Object& obj, osgDB::Output& fw)
|
||||
|
||||
fw.indent()<<"ActiveLayer "<<layer.getActiveLayer()<<std::endl;
|
||||
|
||||
for(unsigned int i=0; i<layer.getNumLayers();++i)
|
||||
{
|
||||
if (layer.getLayer(i))
|
||||
{
|
||||
const osgTerrain::ProxyLayer* proxyLayer = dynamic_cast<const osgTerrain::ProxyLayer*>(layer.getLayer(i));
|
||||
if (proxyLayer)
|
||||
{
|
||||
if (!proxyLayer->getFileName().empty())
|
||||
{
|
||||
const osgTerrain::Locator* locator = proxyLayer->getLocator();
|
||||
if (locator && !locator->getDefinedInFile())
|
||||
{
|
||||
fw.writeObject(*locator);
|
||||
}
|
||||
|
||||
if (proxyLayer->getMinLevel()!=0)
|
||||
{
|
||||
fw.indent()<<"MinLevel "<<proxyLayer->getMinLevel()<<std::endl;
|
||||
}
|
||||
|
||||
if (proxyLayer->getMaxLevel()!=MAXIMUM_NUMBER_OF_LEVELS)
|
||||
{
|
||||
fw.indent()<<"MaxLevel "<<proxyLayer->getMaxLevel()<<std::endl;
|
||||
}
|
||||
|
||||
fw.indent()<<"ProxyLayer "<<proxyLayer->getFileName()<<std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fw.writeObject(*(layer.getLayer(i)));
|
||||
}
|
||||
}
|
||||
else if (!layer.getFileName(i).empty())
|
||||
{
|
||||
fw.indent()<<"file "<<layer.getFileName(i)<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,42 @@
|
||||
|
||||
using namespace osgTerrain;
|
||||
|
||||
void osgTerrain::extractSetNameAndFileName(const std::string& compoundstring, std::string& setname, std::string& filename)
|
||||
{
|
||||
std::string::size_type setcolonpos = compoundstring.find("set:");
|
||||
if (setcolonpos==std::string::npos)
|
||||
{
|
||||
setname = "";
|
||||
filename = compoundstring;
|
||||
return;
|
||||
}
|
||||
|
||||
if (compoundstring.size()==4)
|
||||
{
|
||||
setname = "";
|
||||
filename = "";
|
||||
return;
|
||||
}
|
||||
|
||||
std::string::size_type secondcolonpos = compoundstring.find_first_of(':', setcolonpos+4);
|
||||
if (secondcolonpos==std::string::npos)
|
||||
{
|
||||
setname = compoundstring.substr(setcolonpos+4,std::string::npos);
|
||||
filename = "";
|
||||
return;
|
||||
}
|
||||
|
||||
setname = compoundstring.substr(setcolonpos+4,secondcolonpos-setcolonpos-4);
|
||||
filename = compoundstring.substr(secondcolonpos+1, std::string::npos);
|
||||
}
|
||||
|
||||
std::string osgTerrain::createCompondSetNameAndFileName(const std::string& setname, const std::string& filename)
|
||||
{
|
||||
if (setname.empty()) return filename;
|
||||
return std::string("set:")+setname+std::string(":")+filename;
|
||||
}
|
||||
|
||||
|
||||
Layer::Layer():
|
||||
_minLevel(0),
|
||||
_maxLevel(MAXIMUM_NUMBER_OF_LEVELS),
|
||||
@@ -456,26 +492,6 @@ unsigned int HeightFieldLayer::getModifiedCount() const
|
||||
return _modifiedCount;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// CompositeLayer
|
||||
//
|
||||
CompositeLayer::CompositeLayer()
|
||||
{
|
||||
}
|
||||
|
||||
CompositeLayer::CompositeLayer(const CompositeLayer& compositeLayer,const osg::CopyOp& copyop):
|
||||
Layer(compositeLayer,copyop)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void CompositeLayer::clear()
|
||||
{
|
||||
_layers.clear();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// ProxyLayer
|
||||
@@ -567,24 +583,61 @@ osg::BoundingSphere ProxyLayer::computeBound(bool treatAsElevationLayer) const
|
||||
}
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// CompositeLayer
|
||||
//
|
||||
CompositeLayer::CompositeLayer()
|
||||
{
|
||||
}
|
||||
|
||||
CompositeLayer::CompositeLayer(const CompositeLayer& compositeLayer,const osg::CopyOp& copyop):
|
||||
Layer(compositeLayer,copyop)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void CompositeLayer::clear()
|
||||
{
|
||||
_layers.clear();
|
||||
}
|
||||
|
||||
void CompositeLayer::setCompoundName(unsigned int i, const std::string& compoundname)
|
||||
{
|
||||
std::string setname;
|
||||
std::string filename;
|
||||
extractSetNameAndFileName(compoundname, setname, filename);
|
||||
|
||||
_layers[i].setname = setname;
|
||||
_layers[i].filename = filename;
|
||||
}
|
||||
|
||||
std::string CompositeLayer::getCompoundName(unsigned int i) const
|
||||
{
|
||||
return createCompondSetNameAndFileName(_layers[i].setname, _layers[i].filename);
|
||||
}
|
||||
|
||||
void CompositeLayer::addLayer(const std::string& compoundname)
|
||||
{
|
||||
std::string setname;
|
||||
std::string filename;
|
||||
extractSetNameAndFileName(compoundname, setname, filename);
|
||||
|
||||
_layers.push_back(CompoundNameLayer(setname,filename,0));
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// SwitchLayer
|
||||
//
|
||||
SwitchLayer::SwitchLayer():
|
||||
_activeLayer(0)
|
||||
_activeLayer(-1)
|
||||
{
|
||||
}
|
||||
|
||||
SwitchLayer::SwitchLayer(const SwitchLayer& switchLayer,const osg::CopyOp& copyop):
|
||||
Layer(switchLayer,copyop),
|
||||
_activeLayer(0)
|
||||
CompositeLayer(switchLayer,copyop),
|
||||
_activeLayer(-1)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void SwitchLayer::clear()
|
||||
{
|
||||
_layers.clear();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user