Files
OpenSceneGraph/src/osgPlugins/osgViewer/View.cpp

241 lines
7.0 KiB
C++

#include <osgViewer/View>
#include <iostream>
#include <string>
#include <osgDB/Registry>
#include <osgDB/Input>
#include <osgDB/Output>
#include <osgDB/ReadFile>
#include <osgDB/ParameterOutput>
bool View_readLocalData(osg::Object &obj, osgDB::Input &fr);
bool View_writeLocalData(const osg::Object &obj, osgDB::Output &fw);
osgDB::RegisterDotOsgWrapperProxy View_Proxy
(
new osgViewer::View,
"View",
"Object View",
View_readLocalData,
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 = dynamic_cast<osgViewer::View&>(obj);
bool iteratorAdvanced = false;
bool matchedFirst = false;
if ((matchedFirst = fr.matchSequence("setUpViewFor3DSphericalDisplay {")) ||
fr.matchSequence("setUpViewForPanoramicSphericalDisplay {"))
{
double radius = 1.0;
double collar = 0.45;
unsigned int screenNum = 0;
unsigned int intensityFormat = 8;
std::string filename;
osg::ref_ptr<osg::Image> intensityMap;
int entry = fr[0].getNoNestedBrackets();
fr += 2;
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
{
bool local_itrAdvanced = false;
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("intensityFile",filename)) local_itrAdvanced = true;
if (fr.matchSequence("intensityMap {")) intensityMap = readIntensityImage(fr,local_itrAdvanced);
if (fr.read("intensityFormat",intensityFormat)) local_itrAdvanced = true;
if (!local_itrAdvanced) ++fr;
}
// skip trailing '}'
++fr;
iteratorAdvanced = true;
if (!filename.empty())
{
intensityMap = osgDB::readImageFile(filename);
}
if (intensityMap.valid())
{
if (intensityFormat==16) intensityMap->setInternalTextureFormat(GL_LUMINANCE16F_ARB);
else if (intensityFormat==32) intensityMap->setInternalTextureFormat(GL_LUMINANCE32F_ARB);
// else intensityMap->setInternalTextureFormat(image->getPixelFormat());
}
if (matchedFirst) view.setUpViewFor3DSphericalDisplay(radius, collar, screenNum, intensityMap.get());
else view.setUpViewForPanoramicSphericalDisplay(radius, collar, screenNum, intensityMap.get());
}
int x = 0;
int y = 0;
int width = 128;
int height = 1024;
unsigned int screenNum = 0;
if (fr.read("setUpViewOnSingleScreen",screenNum))
{
view.setUpViewOnSingleScreen(screenNum);
iteratorAdvanced = true;
}
if (fr.read("setUpViewAcrossAllScreens"))
{
view.setUpViewAcrossAllScreens();
iteratorAdvanced = true;
}
if (fr.read("setUpViewInWindow",x,y,width,height,screenNum))
{
view.setUpViewInWindow(x, y, width, height, screenNum);
}
if (fr.read("setUpViewInWindow",x,y,width,height))
{
view.setUpViewInWindow(x, y, width, height);
}
osg::ref_ptr<osg::Object> readObject;
while((readObject=fr.readObjectOfType(osgDB::type_wrapper<osg::Camera>())).valid())
{
view.setCamera(static_cast<osg::Camera*>(readObject.get()));
iteratorAdvanced = true;
}
if (fr.matchSequence("Slaves {"))
{
int entry = fr[0].getNoNestedBrackets();
fr += 2;
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
{
readObject = fr.readObjectOfType(osgDB::type_wrapper<osg::Camera>());
if (readObject.valid()) view.addSlave(static_cast<osg::Camera*>(readObject.get()));
else ++fr;
}
// skip trailing '}'
++fr;
iteratorAdvanced = true;
}
return iteratorAdvanced;
}
bool View_writeLocalData(const osg::Object &obj, osgDB::Output &fw)
{
const osgViewer::View& view = dynamic_cast<const osgViewer::View&>(obj);
osg::notify(osg::NOTICE)<<"View_writeLocalData"<<std::endl;
if (view.getCamera())
{
fw.writeObject(*view.getCamera());
}
if (view.getNumSlaves() != 0)
{
fw.indent()<<"Slaves {"<<std::endl;
fw.moveIn();
for(unsigned int i=0; i<view.getNumSlaves(); ++i)
{
const osg::Camera* camera = view.getSlave(i)._camera.get();
if (camera)
{
fw.writeObject(*camera);
}
}
fw.moveOut();
fw.indent()<<"}"<<std::endl;
}
return true;
}