Added IntensityMap reading in .view files
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user