Added support for reading values from an ImageLayer, and building of the

elevation data in GeometryTechnique.
This commit is contained in:
Robert Osfield
2007-03-30 14:57:57 +00:00
parent 192dbe919b
commit d434ee0db8
3 changed files with 78 additions and 12 deletions

View File

@@ -35,14 +35,15 @@ class OSGTERRAIN_EXPORT Layer : public osg::Object
void setLocator(Locator* locator) { _locator = locator; }
Locator* getLocator() { return _locator.get(); }
const Locator* getLocator() const { return _locator.get(); }
virtual unsigned int getNumColumns() const { return 0; }
virtual unsigned int getNumRows() const { return 0; }
void setDefaultValue(const osg::Vec4& value) { _defaultValue = value; }
const osg::Vec4& getDefaultValue() const { return _defaultValue; }
virtual bool getValue(unsigned int /*i*/, unsigned int /*j*/, float& /*value*/) const { return false; }
virtual bool getValue(unsigned int /*i*/, unsigned int /*j*/, osg::Vec2& /*value*/) const { return false; }
virtual bool getValue(unsigned int /*i*/, unsigned int /*j*/, osg::Vec3& /*value*/) const { return false; }
@@ -112,7 +113,8 @@ class OSGTERRAIN_EXPORT Layer : public osg::Object
virtual ~Layer();
osg::ref_ptr<Locator> _locator;
osg::ref_ptr<Locator> _locator;
osg::Vec4 _defaultValue;
};

View File

@@ -13,6 +13,9 @@
#include <osgTerrain/GeometryTechnique>
#include <osgTerrain/TerrainNode>
#include <osgUtil/SmoothingVisitor>
#include <osg/io_utils>
using namespace osgTerrain;
@@ -100,6 +103,14 @@ void GeometryTechnique::init()
unsigned int numRows = 100;
unsigned int numColumns = 100;
if (elevationLayer)
{
numColumns = elevationLayer->getNumColumns();
numRows = elevationLayer->getNumRows();
}
unsigned int numVertices = numRows * numColumns;
// allocate and assign vertices
@@ -129,6 +140,15 @@ void GeometryTechnique::init()
{
unsigned int iv = j*numColumns + i;
osg::Vec3d ndc( (double)i/(double)(numColumns-1), (double)j/(double)(numColumns-1), 0.0);
if (elevationLayer)
{
float value = 0.0f;
elevationLayer->getValue(i,j, value);
// osg::notify(osg::NOTICE)<<"i="<<i<<" j="<<j<<" z="<<value<<std::endl;
ndc.z() = value;
}
osg::Vec3d model;
masterLocator->convertLocalToModel(ndc, model);
@@ -158,6 +178,9 @@ void GeometryTechnique::init()
_geometry->addPrimitiveSet(elements);
}
osgUtil::SmoothingVisitor smoother;
_geode->accept(smoother);
_dirty = false;
}

View File

@@ -81,7 +81,42 @@ void ImageLayer::setImage(osg::Image* image)
bool ImageLayer::getValue(unsigned int i, unsigned int j, float& value) const
{
osg::notify(osg::NOTICE)<<"Not implemented yet"<<std::endl;
const unsigned char* data = _image->data(i,j);
switch(_image->getDataType())
{
case(GL_BYTE):
value = *((const char*)data);
// osg::notify(osg::NOTICE)<<"byte "<<value<<std::endl;
break;
case(GL_UNSIGNED_BYTE):
value = *data;
// osg::notify(osg::NOTICE)<<"Unsigned byte "<<value<<std::endl;
break;
case(GL_SHORT):
value = *((const short*)data);
// osg::notify(osg::NOTICE)<<"Short "<<value<<std::endl;
break;
case(GL_UNSIGNED_SHORT):
value = *((const unsigned short*)data);
// osg::notify(osg::NOTICE)<<"Unsigned Short "<<value<<std::endl;
break;
case(GL_INT):
value = *((const int*)data);
// osg::notify(osg::NOTICE)<<"Int "<<value<<std::endl;
break;
case(GL_UNSIGNED_INT):
// osg::notify(osg::NOTICE)<<"Unsigned Int "<<value<<std::endl;
value = *((const unsigned int*)data);
break;
case(GL_FLOAT):
// osg::notify(osg::NOTICE)<<"Float "<<value<<std::endl;
value = *((const float*)data);
break;
default:
value = _defaultValue.x();
return false;
}
return false;
}
@@ -126,24 +161,30 @@ void HeightFieldLayer::setHeightField(osg::HeightField* hf)
bool HeightFieldLayer::getValue(unsigned int i, unsigned int j, float& value) const
{
osg::notify(osg::NOTICE)<<"Not implemented yet"<<std::endl;
return false;
value = _heightField->getHeight(i,j);
return true;
}
bool HeightFieldLayer::getValue(unsigned int i, unsigned int j, osg::Vec2& value) const
{
osg::notify(osg::NOTICE)<<"Not implemented yet"<<std::endl;
return false;
value.x() = _heightField->getHeight(i,j);
value.y() = _defaultValue.y();
return true;
}
bool HeightFieldLayer::getValue(unsigned int i, unsigned int j, osg::Vec3& value) const
{
osg::notify(osg::NOTICE)<<"Not implemented yet"<<std::endl;
return false;
value.x() = _heightField->getHeight(i,j);
value.y() = _defaultValue.y();
value.z() = _defaultValue.z();
return true;
}
bool HeightFieldLayer::getValue(unsigned int i, unsigned int j, osg::Vec4& value) const
{
osg::notify(osg::NOTICE)<<"Not implemented yet"<<std::endl;
return false;
value.x() = _heightField->getHeight(i,j);
value.y() = _defaultValue.y();
value.z() = _defaultValue.z();
value.w() = _defaultValue.w();
return true;
}