Added support for reading values from an ImageLayer, and building of the
elevation data in GeometryTechnique.
This commit is contained in:
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user