From 8c7b5b58659a0a3727335a129645dc2d3025aa0e Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 10 May 2007 18:07:54 +0000 Subject: [PATCH] Added supoort for transforming layers by an offset and scale --- examples/osgterrain/osgterrain.cpp | 35 ++++++++++++ include/osgTerrain/Layer | 4 ++ src/osgTerrain/Layer.cpp | 88 ++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+) diff --git a/examples/osgterrain/osgterrain.cpp b/examples/osgterrain/osgterrain.cpp index d1a65fe4e..1cf72f650 100644 --- a/examples/osgterrain/osgterrain.cpp +++ b/examples/osgterrain/osgterrain.cpp @@ -88,6 +88,9 @@ int main(int argc, char** argv) bool readParameter = false; float minValue, maxValue; + float scale = 1.0f; + float offset = 0.0f; + int pos = 1; while(possetLocator(locator.get()); + if (offset!=0.0f || scale!=1.0f) + { + hfl->transform(offset,scale); + } + terrain->setElevationLayer(hfl.get()); osg::notify(osg::NOTICE)<<"created osgTerrain::HeightFieldLayer"<setImage(image.get()); imageLayer->setLocator(locator.get()); + if (offset!=0.0f || scale!=1.0f) + { + imageLayer->transform(offset,scale); + } + terrain->setElevationLayer(imageLayer.get()); osg::notify(osg::NOTICE)<<"created Elevation osgTerrain::ImageLayer"<setImage(image.get()); imageLayer->setLocator(locator.get()); + if (offset!=0.0f || scale!=1.0f) + { + imageLayer->transform(offset,scale); + } + terrain->setColorLayer(layerNum, imageLayer.get()); osg::notify(osg::NOTICE)<<"created Color osgTerrain::ImageLayer"< +void _processRow(unsigned int num, GLenum pixelFormat, T* data,const O& operation) +{ + switch(pixelFormat) + { + case(GL_LUMINANCE): { for(unsigned int i=0;i +void processRow(unsigned int num, GLenum pixelFormat, GLenum dataType, unsigned char* data, const O& operation) +{ + switch(dataType) + { + case(GL_BYTE): _processRow(num,pixelFormat, (char*)data, operation); break; + case(GL_UNSIGNED_BYTE): _processRow(num,pixelFormat, (unsigned char*)data, operation); break; + case(GL_SHORT): _processRow(num,pixelFormat, (short*) data, operation); break; + case(GL_UNSIGNED_SHORT): _processRow(num,pixelFormat, (unsigned short*)data, operation); break; + case(GL_INT): _processRow(num,pixelFormat, (int*) data, operation); break; + case(GL_UNSIGNED_INT): _processRow(num,pixelFormat, (unsigned int*) data, operation); break; + case(GL_FLOAT): _processRow(num,pixelFormat, (float*) data, operation); break; + } +} + +template +void processImage(osg::Image* image, const O& operation) +{ + if (!image) return; + + for(int r=0;rr();++r) + { + for(int t=0;tt();++t) + { + processRow(image->s(), image->getPixelFormat(), image->getDataType(), image->data(0,t,r), operation); + } + } +} + +struct TransformOperator +{ + TransformOperator(float offset, float scale): + _offset(offset), + _scale(scale) {} + + inline void operator() (unsigned char& v) const { v = (unsigned char)(_offset + (float)v * _scale); } + inline void operator() (unsigned short& v) const { v = (unsigned short)(_offset + (float)v * _scale); } + inline void operator() (unsigned int& v) const { v = (unsigned int)(_offset + (float)v * _scale); } + inline void operator() (char& v) const { v = (char)(_offset + (float)v * _scale); } + inline void operator() (short& v) const { v = (short)(_offset + (float)v * _scale); } + inline void operator() (int& v) const { v = (int)(_offset + (float)v * _scale); } + inline void operator() (float& v) const { v = _offset + v * _scale; } + + float _offset, _scale; +}; + + +bool ImageLayer::transform(float offset, float scale) +{ + if (!_image.valid()) return false; + + processImage(_image.get(), TransformOperator(offset,scale)); + + return true; +} bool ImageLayer::getValue(unsigned int i, unsigned int j, float& value) const { @@ -159,6 +229,24 @@ void HeightFieldLayer::setHeightField(osg::HeightField* hf) } + +bool HeightFieldLayer::transform(float offset, float scale) +{ + if (!_heightField) return false; + + osg::FloatArray* heights = _heightField->getFloatArray(); + if (!heights) return false; + + for(osg::FloatArray::iterator itr = heights->begin(); + itr != heights->end(); + ++itr) + { + *itr = offset + (*itr) * scale; + } + + return true; +} + bool HeightFieldLayer::getValue(unsigned int i, unsigned int j, float& value) const { value = _heightField->getHeight(i,j);