From 2640fd1456eeedd92ff994948a2d4f0bf2c07b31 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 26 Sep 2007 14:02:40 +0000 Subject: [PATCH] Added IntensityMap reading in .view files --- include/osgDB/Input | 9 ++ src/osgDB/Input.cpp | 144 ++++++++++++++++++++++++++++++ src/osgPlugins/osgViewer/View.cpp | 82 ++++++++++++++++- 3 files changed, 231 insertions(+), 4 deletions(-) diff --git a/include/osgDB/Input b/include/osgDB/Input index f74e4dea5..87fcd7c6b 100644 --- a/include/osgDB/Input +++ b/include/osgDB/Input @@ -60,6 +60,15 @@ class OSGDB_EXPORT Input : public FieldReaderIterator typedef osg::ArgumentParser::Parameter Parameter; + bool read(Parameter value1); + bool read(Parameter value1, Parameter value2); + bool read(Parameter value1, Parameter value2, Parameter value3); + bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4); + bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5); + bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6); + bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7); + bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8); + bool read(const char* str); bool read(const char* str, Parameter value1); bool read(const char* str, Parameter value1, Parameter value2); diff --git a/src/osgDB/Input.cpp b/src/osgDB/Input.cpp index 878acf474..70b5fa074 100644 --- a/src/osgDB/Input.cpp +++ b/src/osgDB/Input.cpp @@ -98,6 +98,150 @@ osg::Node* Input::readNode(const std::string& fileName) return readNodeFile(fileName,_options.get()); } +bool Input::read(Parameter value1) +{ + if (value1.valid((*this)[0].getStr())) + { + value1.assign((*this)[0].getStr()); + (*this) += 1; + return true; + } + else return false; +} + +bool Input::read(Parameter value1, Parameter value2) +{ + if (value1.valid((*this)[0].getStr()) && + value2.valid((*this)[1].getStr())) + { + value1.assign((*this)[0].getStr()); + value2.assign((*this)[1].getStr()); + (*this) += 2; + return true; + } + else return false; +} + +bool Input::read(Parameter value1, Parameter value2, Parameter value3) +{ + if (value1.valid((*this)[0].getStr()) && + value2.valid((*this)[1].getStr()) && + value3.valid((*this)[2].getStr())) + { + value1.assign((*this)[0].getStr()); + value2.assign((*this)[1].getStr()); + value3.assign((*this)[2].getStr()); + (*this) += 3; + return true; + } + else return false; +} + +bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4) +{ + if (value1.valid((*this)[0].getStr()) && + value2.valid((*this)[1].getStr()) && + value3.valid((*this)[2].getStr()) && + value4.valid((*this)[3].getStr())) + { + value1.assign((*this)[0].getStr()); + value2.assign((*this)[1].getStr()); + value3.assign((*this)[2].getStr()); + value4.assign((*this)[3].getStr()); + (*this) += 4; + return true; + } + else return false; +} + +bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5) +{ + if (value1.valid((*this)[0].getStr()) && + value2.valid((*this)[1].getStr()) && + value3.valid((*this)[2].getStr()) && + value4.valid((*this)[3].getStr()) && + value5.valid((*this)[4].getStr())) + { + value1.assign((*this)[0].getStr()); + value2.assign((*this)[1].getStr()); + value3.assign((*this)[2].getStr()); + value4.assign((*this)[3].getStr()); + value5.assign((*this)[4].getStr()); + (*this) += 5; + return true; + } + else return false; +} + +bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6) +{ + if (value1.valid((*this)[0].getStr()) && + value2.valid((*this)[1].getStr()) && + value3.valid((*this)[2].getStr()) && + value4.valid((*this)[3].getStr()) && + value5.valid((*this)[4].getStr()) && + value6.valid((*this)[5].getStr())) + { + value1.assign((*this)[0].getStr()); + value2.assign((*this)[1].getStr()); + value3.assign((*this)[2].getStr()); + value4.assign((*this)[3].getStr()); + value5.assign((*this)[4].getStr()); + value6.assign((*this)[5].getStr()); + (*this) += 6; + return true; + } + else return false; +} + +bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7) +{ + if (value1.valid((*this)[0].getStr()) && + value2.valid((*this)[1].getStr()) && + value3.valid((*this)[2].getStr()) && + value4.valid((*this)[3].getStr()) && + value5.valid((*this)[4].getStr()) && + value6.valid((*this)[5].getStr()) && + value7.valid((*this)[6].getStr())) + { + value1.assign((*this)[0].getStr()); + value2.assign((*this)[1].getStr()); + value3.assign((*this)[2].getStr()); + value4.assign((*this)[3].getStr()); + value5.assign((*this)[4].getStr()); + value6.assign((*this)[5].getStr()); + value7.assign((*this)[6].getStr()); + (*this) += 7; + return true; + } + else return false; +} + +bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8) +{ + if (value1.valid((*this)[0].getStr()) && + value2.valid((*this)[1].getStr()) && + value3.valid((*this)[2].getStr()) && + value4.valid((*this)[3].getStr()) && + value5.valid((*this)[4].getStr()) && + value6.valid((*this)[5].getStr()) && + value7.valid((*this)[6].getStr()) && + value8.valid((*this)[7].getStr())) + { + value1.assign((*this)[0].getStr()); + value2.assign((*this)[1].getStr()); + value3.assign((*this)[2].getStr()); + value4.assign((*this)[3].getStr()); + value5.assign((*this)[4].getStr()); + value6.assign((*this)[5].getStr()); + value7.assign((*this)[6].getStr()); + value8.assign((*this)[7].getStr()); + (*this) += 8; + return true; + } + else return false; +} + bool Input::read(const char* str) { if ((*this)[0].matchWord(str)) diff --git a/src/osgPlugins/osgViewer/View.cpp b/src/osgPlugins/osgViewer/View.cpp index da0cc4de1..8f8e4db2a 100644 --- a/src/osgPlugins/osgViewer/View.cpp +++ b/src/osgPlugins/osgViewer/View.cpp @@ -21,6 +21,79 @@ osgDB::RegisterDotOsgWrapperProxy View_Proxy View_writeLocalData ); +osg::Image* readIntensityImage(osgDB::Input& fr, bool& itrAdvanced) +{ + if (fr.matchSequence("intensityMap {")) + { + int entry = fr[0].getNoNestedBrackets(); + fr += 2; + + typedef std::map IntensityMap; + IntensityMap intensityMap; + while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) + { + float position, intensity; + if (fr.read(position,intensity)) + { + intensityMap[position] = intensity; + } + else + { + ++fr; + } + } + ++fr; + + itrAdvanced = true; + + if (!intensityMap.empty()) + { + unsigned int numPixels = 256; + + osg::Image* image = new osg::Image; + image->allocateImage(1,numPixels,1,GL_LUMINANCE,GL_FLOAT); + + float intensityMultiplier = 0.01f; + float* ptr = reinterpret_cast(image->data()); + for(unsigned int i=0; ifirst) + { + intensity = intensityMap.begin()->second * intensityMultiplier; + } + else if (position>=intensityMap.rbegin()->first) + { + intensity = intensityMap.rbegin()->second * intensityMultiplier; + } + else + { + IntensityMap::iterator above_itr = intensityMap.lower_bound(position); + if (above_itr != intensityMap.begin()) + { + IntensityMap::iterator below_itr = above_itr; + --below_itr; + float r = (position - below_itr->first) / (above_itr->first - below_itr->first); + intensity = (below_itr->second + (above_itr->second - below_itr->second) * r) * intensityMultiplier; + } + else + { + intensity = above_itr->second * intensityMultiplier; + } + + } + + *ptr++ = intensity; + } + + return image; + } + + } + return 0; +} + bool View_readLocalData(osg::Object &obj, osgDB::Input &fr) { osgViewer::View& view = static_cast(obj); @@ -34,7 +107,7 @@ bool View_readLocalData(osg::Object &obj, osgDB::Input &fr) double collar=0.45; unsigned int screenNum=0; std::string filename; - osg::Image* intensityMap=0; + osg::ref_ptr intensityMap; int entry = fr[0].getNoNestedBrackets(); fr += 2; @@ -45,7 +118,8 @@ bool View_readLocalData(osg::Object &obj, osgDB::Input &fr) if (fr.read("radius",radius)) local_itrAdvanced = true; if (fr.read("collar",collar)) local_itrAdvanced = true; if (fr.read("screenNum",screenNum)) local_itrAdvanced = true; - if (fr.read("intensityMap",filename)) local_itrAdvanced = true; + if (fr.read("intensityFile",filename)) local_itrAdvanced = true; + if (fr.matchSequence("intensityMap {")) intensityMap = readIntensityImage(fr,local_itrAdvanced); if (!local_itrAdvanced) ++fr; } @@ -60,8 +134,8 @@ bool View_readLocalData(osg::Object &obj, osgDB::Input &fr) intensityMap = osgDB::readImageFile(filename); } - if (matchedFirst) view.setUpViewFor3DSphericalDisplay(radius, collar, screenNum, intensityMap); - else view.setUpViewForPanoramicSphericalDisplay(radius, collar, screenNum, intensityMap); + if (matchedFirst) view.setUpViewFor3DSphericalDisplay(radius, collar, screenNum, intensityMap.get()); + else view.setUpViewForPanoramicSphericalDisplay(radius, collar, screenNum, intensityMap.get()); } int x = 0;