14 #ifndef OSGTERRAIN_LAYER
15 #define OSGTERRAIN_LAYER 1
20 #include <osg/TransferFunction>
22 #include <osgTerrain/Locator>
23 #include <osgTerrain/ValidDataOperator>
27 #define MAXIMUM_NUMBER_OF_LEVELS 30
48 void setSetName(
const std::string& setname) { setName(setname); }
51 const std::string&
getSetName()
const {
return getName(); }
54 virtual void setFileName(
const std::string& filename) { _filename = filename; }
57 virtual const std::string&
getFileName()
const {
return _filename; }
66 void setMinLevel(
unsigned int minLevel) { _minLevel = minLevel; }
69 void setMaxLevel(
unsigned int maxLevel) { _maxLevel = maxLevel; }
114 virtual bool transform(
float ,
float ) {
return false; }
123 virtual bool getValue(
unsigned int ,
unsigned int ,
float& )
const {
return false; }
128 inline bool getValidValue(
unsigned int i,
unsigned int j,
float& value)
const
130 if (getValue(i,j,value))
return _validDataOperator.valid() ? (*_validDataOperator)(value) :
true;
136 if (getValue(i,j,value))
return _validDataOperator.valid() ? (*_validDataOperator)(value) :
true;
142 if (getValue(i,j,value))
return _validDataOperator.valid() ? (*_validDataOperator)(value) :
true;
148 if (getValue(i,j,value))
return _validDataOperator.valid() ? (*_validDataOperator)(value) :
true;
162 inline void computeIndices(
double ndc_x,
double ndc_y,
unsigned int& i,
unsigned int& j,
double& ir,
double& jr)
164 ndc_x *= double(getNumColumns()-1);
165 ndc_y *= double(getNumRows()-1);
166 i = (
unsigned int)(ndc_x);
167 j = (
unsigned int)(ndc_y);
168 ir = ndc_x - double(i);
169 jr = ndc_y - double(j);
183 computeIndices(ndc_x, ndc_y, i, j, ir, jr);
188 r = (1.0f-ir)*(1.0f-jr);
189 if (r>0.0 && getValue(i,j,v))
196 if (r>0.0 && getValue(i+1,j,v))
203 if (r>0.0 && getValue(i+1,j+1,v))
210 if (r>0.0 && getValue(i,j+1,v))
230 computeIndices(ndc_x, ndc_y, i, j, ir, jr);
235 r = (1.0f-ir)*(1.0f-jr);
236 if (r>0.0 && getValidValue(i,j,v))
243 if (r>0.0 && getValidValue(i+1,j,v))
250 if (r>0.0 && getValidValue(i+1,j+1,v))
257 if (r>0.0 && getValidValue(i,j+1,v))
310 void setFileName(
const std::string& filename) { _filename = filename;
if (_image.valid()) _image->setFileName(filename); }
311 virtual const std::string&
getFileName()
const {
return _image.get() ? _image->getFileName() : _filename; }
313 virtual bool transform(
float offset,
float scale);
323 virtual unsigned int getNumColumns()
const {
return _image.valid() ? _image->s() : 0; }
324 virtual unsigned int getNumRows()
const {
return _image.valid() ? _image->t() : 0; }
326 virtual bool getValue(
unsigned int i,
unsigned int j,
float& value)
const;
327 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec2& value)
const;
328 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec3& value)
const;
329 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec4& value)
const;
331 virtual void dirty();
332 virtual void setModifiedCount(
unsigned int value);
333 virtual unsigned int getModifiedCount()
const;
354 virtual bool transform(
float offset,
float scale);
367 virtual unsigned int getNumColumns()
const {
return _tf.valid() ? _tf->getNumberImageCells() : 0; }
368 virtual unsigned int getNumRows()
const {
return _tf.valid() ? 1 : 0; }
370 virtual bool getValue(
unsigned int i,
unsigned int j,
float& value)
const;
371 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec2& value)
const;
372 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec3& value)
const;
373 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec4& value)
const;
375 virtual void dirty();
376 virtual void setModifiedCount(
unsigned int value);
377 virtual unsigned int getModifiedCount()
const;
398 void setFileName(
const std::string& filename) { _filename = filename; }
399 virtual const std::string&
getFileName()
const {
return _filename; }
401 virtual bool transform(
float offset,
float scale);
407 virtual unsigned int getNumColumns()
const {
return _heightField.valid() ? _heightField->getNumColumns() : 0; }
408 virtual unsigned int getNumRows()
const {
return _heightField.valid() ? _heightField->getNumRows() : 0; }
410 virtual bool getValue(
unsigned int i,
unsigned int j,
float& value)
const;
411 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec2& value)
const;
412 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec3& value)
const;
413 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec4& value)
const;
415 virtual void dirty();
416 virtual void setModifiedCount(
unsigned int value);
417 virtual unsigned int getModifiedCount()
const;
443 return _implementation.
valid() ? _implementation->getImage() : 0;
449 return _implementation.
valid() ? _implementation->getImage() : 0;
461 virtual void setFileName(
const std::string& filename);
462 virtual const std::string&
getFileName()
const {
return _filename; }
464 virtual unsigned int getNumColumns()
const;
465 virtual unsigned int getNumRows()
const;
467 virtual bool transform(
float offset,
float scale);
469 virtual bool getValue(
unsigned int i,
unsigned int j,
float& value)
const;
470 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec2& value)
const;
471 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec3& value)
const;
472 virtual bool getValue(
unsigned int i,
unsigned int j,
osg::Vec4& value)
const;
474 virtual void dirty();
475 virtual void setModifiedCount(
unsigned int value);
476 virtual unsigned int getModifiedCount()
const;
503 void setSetName(
unsigned int i,
const std::string& setname) { _layers[i].setname = setname;
if (_layers[i].layer.valid()) _layers[i].layer->setName(setname); }
506 const std::string&
getSetName(
unsigned int i)
const {
return _layers[i].layer.valid() ? _layers[i].layer->getName() : _layers[i].setname; }
509 void setFileName(
unsigned int i,
const std::string& filename) { _layers[i].filename = filename;
if (_layers[i].layer.valid()) _layers[i].layer->setFileName(filename); }
512 const std::string&
getFileName(
unsigned int i)
const {
return _layers[i].layer.valid() ? _layers[i].layer->getFileName() : _layers[i].filename; }
514 void setCompoundName(
unsigned int i,
const std::string& compoundname);
515 std::string getCompoundName(
unsigned int i)
const;
518 void setLayer(
unsigned int i,
Layer* layer) {
if (i>=_layers.size()) _layers.resize(i+1); _layers[i].layer = layer; }
519 Layer*
getLayer(
unsigned int i) {
return i<_layers.size() ? _layers[i].layer.get() : 0; }
520 const Layer*
getLayer(
unsigned int i)
const {
return i<_layers.size() ? _layers[i].layer.get() : 0; }
522 void addLayer(
const std::string& compoundname);
523 void addLayer(
const std::string& setname,
const std::string& filename);
527 void removeLayer(
unsigned int i) { _layers.erase(_layers.begin()+i); }
529 unsigned int getNumLayers()
const {
return static_cast<unsigned int>(_layers.size()); }
540 setname(cnl.setname),
541 filename(cnl.filename),
551 if (&cnl==
this)
return *
this;
564 typedef std::vector< CompoundNameLayer >
Layers;
587 if (_activeLayer < 0)
return 0;
588 if (_activeLayer >= static_cast<int>(getNumLayers()))
return 0;
589 return _layers[_activeLayer].layer->getImage();
595 if (_activeLayer < 0)
return 0;
596 if (_activeLayer >= static_cast<int>(getNumLayers()))
return 0;
597 return _layers[_activeLayer].layer->getImage();
std::vector< CompoundNameLayer > Layers
virtual ~HeightFieldLayer()
osg::ref_ptr< Locator > _locator
void setActiveLayer(int i)
void setFileName(const std::string &filename)
osg::ref_ptr< ValidDataOperator > _validDataOperator
int getActiveLayer() const
virtual const osg::Image * getImage() const
virtual const osg::Image * getImage() const
osg::HeightField * getHeightField()
virtual bool getValue(unsigned int, unsigned int, float &) const
unsigned int getMaxLevel() const
bool getValidValue(unsigned int i, unsigned int j, osg::Vec4 &value) const
virtual const osg::Image * getImage() const
Layer * getLayer(unsigned int i)
virtual const std::string & getFileName() const
unsigned int _modifiedCount
virtual const std::string & getFileName() const
void setLocator(Locator *locator)
CompoundNameLayer(const std::string &sn, const std::string &fn, Layer *l)
virtual osg::Image * getImage()
void setImplementation(Layer *layer)
virtual unsigned int getNumColumns() const
virtual void setFileName(const std::string &filename)
osg::ref_ptr< Layer > _implementation
ValidDataOperator * getValidDataOperator()
void computeIndices(double ndc_x, double ndc_y, unsigned int &i, unsigned int &j, double &ir, double &jr)
virtual unsigned int getNumRows() const
OSGTERRAIN_EXPORT void extractSetNameAndFileName(const std::string &compoundstring, std::string &setname, std::string &filename)
#define OSGTERRAIN_EXPORT
virtual osg::Image * getImage()
const Layer * getLayer(unsigned int i) const
virtual bool getValue(unsigned int, unsigned int, osg::Vec3 &) const
osg::Texture::FilterMode getMinFilter() const
virtual const std::string & getFileName() const
std::string getCompoundName() const
virtual unsigned int getModifiedCount() const
virtual const osg::Image * getImage() const
virtual unsigned int getNumRows() const
const osg::TransferFunction1D * getTransferFunction() const
virtual osg::Image * getImage()
void removeLayer(unsigned int i)
virtual unsigned int getNumColumns() const
bool getValidValue(unsigned int i, unsigned int j, osg::Vec2 &value) const
void setMaxLevel(unsigned int maxLevel)
#define META_Object(library, name)
osg::ref_ptr< osg::TransferFunction1D > _tf
void setDefaultValue(const osg::Vec4 &value)
osg::Texture::FilterMode _magFilter
virtual bool getValue(unsigned int, unsigned int, osg::Vec4 &) const
const std::string & getFileName(unsigned int i) const
bool getValidValue(unsigned int i, unsigned int j, osg::Vec3 &value) const
virtual osg::Image * getImage()
void setFileName(unsigned int i, const std::string &filename)
const std::string & getName() const
void setMinLevel(unsigned int minLevel)
virtual const std::string & getFileName() const
void setMagFilter(osg::Texture::FilterMode filter)
void addLayer(Layer *layer)
const osg::Vec4 & getDefaultValue() const
OSGTERRAIN_EXPORT std::string createCompoundSetNameAndFileName(const std::string &setname, const std::string &filename)
osg::ref_ptr< osg::Image > _image
void setFileName(const std::string &filename)
osg::Texture::FilterMode getMagFilter() const
const osg::HeightField * getHeightField() const
virtual void setModifiedCount(unsigned int)
Layer * getImplementation()
const ValidDataOperator * getValidDataOperator() const
virtual bool getValue(unsigned int, unsigned int, osg::Vec2 &) const
virtual const osg::Image * getImage() const
void setSetName(unsigned int i, const std::string &setname)
virtual unsigned int getNumRows() const
CompoundNameLayer(const CompoundNameLayer &cnl)
unsigned int getMinLevel() const
const std::string & getSetName(unsigned int i) const
void setValidDataOperator(ValidDataOperator *validDataOp)
virtual bool transform(float, float)
bool getValidValue(unsigned int i, unsigned int j, float &value) const
osg::ref_ptr< Layer > layer
osg::TransferFunction1D * getTransferFunction()
virtual unsigned int getNumColumns() const
const Locator * getLocator() const
bool getInterpolatedValidValue(double ndc_x, double ndc_y, float &value)
unsigned int getNumLayers() const
void setMinFilter(osg::Texture::FilterMode filter)
osg::ref_ptr< osg::HeightField > _heightField
const std::string & getSetName() const
bool getInterpolatedValue(double ndc_x, double ndc_y, float &value)
virtual unsigned int getNumRows() const
virtual unsigned int getNumColumns() const
virtual ~CompositeLayer()
virtual osg::Image * getImage()
const Layer * getImplementation() const
void setSetName(const std::string &setname)
void setLayer(unsigned int i, Layer *layer)
osg::Texture::FilterMode _minFilter