#include #include #include #include #include #include #include #include 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 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 = dynamic_cast(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 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 readObject; while((readObject=fr.readObjectOfType(osgDB::type_wrapper())).valid()) { view.setCamera(static_cast(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()); if (readObject.valid()) view.addSlave(static_cast(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(obj); osg::notify(osg::NOTICE)<<"View_writeLocalData"<