Added IntensityMap reading in .view files

This commit is contained in:
Robert Osfield
2007-09-26 14:02:40 +00:00
parent dcd7fd837f
commit 2640fd1456
3 changed files with 231 additions and 4 deletions

View File

@@ -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);

View File

@@ -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))

View File

@@ -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<float,float> 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<float*>(image->data());
for(unsigned int i=0; i<numPixels; ++i)
{
float position = (1.0f - float(i)/float(numPixels-1)) * 180.0f;
float intensity = 1.0f;
if (position <= intensityMap.begin()->first)
{
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<osgViewer::View&>(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<osg::Image> 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;