Added support into the .p3d format for specifying the osgDB::Options::OptionString via the <tag options="value">.
Added support into .vnc plugin for passing in the keywords "swap", "RGB", "RGBA", "BGR", "BGRA" as OptionString values to allow .p3d presentations to control whether the pixelformat should be swapped or set to a specific format.
This commit is contained in:
@@ -798,6 +798,12 @@ bool ReaderWriterP3DXML::getProperties(osgDB::XmlNode*cur, osgPresentation::Slid
|
||||
OSG_NOTIFY(_notifyLevel)<<"read effect \""<<value.effect<<"\""<<std::endl;
|
||||
}
|
||||
|
||||
if (getProperty(cur, "options", value.options))
|
||||
{
|
||||
propertiesRead = true;
|
||||
OSG_NOTIFY(_notifyLevel)<<"read options \""<<value.options<<"\""<<std::endl;
|
||||
}
|
||||
|
||||
return propertiesRead;
|
||||
}
|
||||
|
||||
@@ -813,6 +819,12 @@ bool ReaderWriterP3DXML::getProperties(osgDB::XmlNode*cur, osgPresentation::Slid
|
||||
OSG_NOTIFY(_notifyLevel)<<"read page \""<<value.page<<"\""<<std::endl;
|
||||
}
|
||||
|
||||
if (getProperty(cur, "options", value.options))
|
||||
{
|
||||
propertiesRead = true;
|
||||
OSG_NOTIFY(_notifyLevel)<<"read options \""<<value.options<<"\""<<std::endl;
|
||||
}
|
||||
|
||||
osg::Vec4 bgColour;
|
||||
if (getProperty(cur, "background", value.backgroundColor))
|
||||
{
|
||||
@@ -1018,6 +1030,8 @@ void ReaderWriterP3DXML::parseVolume(osgPresentation::SlideShowConstructor& cons
|
||||
volumeData.transferFunction = readTransferFunctionFile(transferFunctionFile, 1.0/255.0);
|
||||
}
|
||||
|
||||
if (getProperty(cur, "options", volumeData.options)) {}
|
||||
|
||||
// check for draggers required
|
||||
std::string dragger;
|
||||
if (getProperty(cur, "dragger", dragger))
|
||||
@@ -1301,7 +1315,7 @@ void ReaderWriterP3DXML::parseLayer(osgPresentation::SlideShowConstructor& const
|
||||
std::string options;
|
||||
getProperty(cur, "options", options);
|
||||
|
||||
constructor.addGraph(cur->getTrimmedContents(), options,
|
||||
constructor.addGraph(cur->getTrimmedContents(),
|
||||
positionRead ? positionData : constructor.getImagePositionData(),
|
||||
imageData);
|
||||
}
|
||||
|
||||
@@ -52,8 +52,10 @@ class LibVncImage : public osgWidget::VncImage
|
||||
static void passwordCheck(rfbClient* client,const char* encryptedPassWord,int len);
|
||||
static char* getPassword(rfbClient* client);
|
||||
|
||||
std::string _optionString;
|
||||
std::string _username;
|
||||
std::string _password;
|
||||
|
||||
double _timeOfLastUpdate;
|
||||
double _timeOfLastRender;
|
||||
|
||||
@@ -277,7 +279,7 @@ void LibVncImage::close()
|
||||
|
||||
rfbBool LibVncImage::resizeImage(rfbClient* client)
|
||||
{
|
||||
osg::Image* image = (osg::Image*)(rfbClientGetClientData(client, 0));
|
||||
LibVncImage* image = (LibVncImage*)(rfbClientGetClientData(client, 0));
|
||||
|
||||
int width = client->width;
|
||||
int height = client->height;
|
||||
@@ -286,15 +288,23 @@ rfbBool LibVncImage::resizeImage(rfbClient* client)
|
||||
OSG_NOTICE<<"resize "<<width<<", "<<height<<", "<<depth<<" image = "<<image<<std::endl;
|
||||
PrintPixelFormat(&(client->format));
|
||||
|
||||
#ifdef __APPLE__
|
||||
// feedback is that Mac's have an endian swap even though the PixelFormat results see under OSX are identical.
|
||||
bool swap = true;
|
||||
#else
|
||||
bool swap = client->format.redShift!=0;
|
||||
#endif
|
||||
|
||||
if (!image->_optionString.empty())
|
||||
{
|
||||
if (image->_optionString.find("swap")!=std::string::npos) swap = true;
|
||||
}
|
||||
|
||||
GLenum gl_pixelFormat = swap ? GL_BGRA : GL_RGBA;
|
||||
|
||||
if (!image->_optionString.empty())
|
||||
{
|
||||
if (image->_optionString.find("RGB")!=std::string::npos) gl_pixelFormat = GL_RGBA;
|
||||
if (image->_optionString.find("RGBA")!=std::string::npos) gl_pixelFormat = GL_RGBA;
|
||||
if (image->_optionString.find("BGR")!=std::string::npos) gl_pixelFormat = GL_BGRA;
|
||||
if (image->_optionString.find("BGRA")!=std::string::npos) gl_pixelFormat = GL_BGRA;
|
||||
}
|
||||
|
||||
image->allocateImage(width, height, 1, gl_pixelFormat, GL_UNSIGNED_BYTE);
|
||||
image->setInternalTextureFormat(GL_RGBA);
|
||||
|
||||
@@ -393,6 +403,11 @@ class ReaderWriterVNC : public osgDB::ReaderWriter
|
||||
image->_password = details->password;
|
||||
}
|
||||
|
||||
if (options && !options->getOptionString().empty())
|
||||
{
|
||||
image->_optionString = options->getOptionString();
|
||||
}
|
||||
|
||||
if (!image->connect(hostname))
|
||||
{
|
||||
return "Could not connect to "+hostname;
|
||||
|
||||
@@ -879,7 +879,14 @@ void SlideShowConstructor::addImage(const std::string& filename, const PositionD
|
||||
{
|
||||
if (!_currentLayer) addLayer();
|
||||
|
||||
osg::Image* image = osgDB::readImageFile(filename, _options.get());
|
||||
osg::ref_ptr<osgDB::Options> options = _options;
|
||||
if (!imageData.options.empty())
|
||||
{
|
||||
options = _options->cloneOptions();
|
||||
options->setOptionString(imageData.options);
|
||||
}
|
||||
|
||||
osg::Image* image = osgDB::readImageFile(filename, options.get());
|
||||
|
||||
if (image) recordOptionsFilePath(_options.get());
|
||||
|
||||
@@ -1016,12 +1023,25 @@ void SlideShowConstructor::addStereoImagePair(const std::string& filenameLeft, c
|
||||
{
|
||||
if (!_currentLayer) addLayer();
|
||||
|
||||
osg::ref_ptr<osgDB::Options> optionsLeft = _options;
|
||||
if (!imageDataLeft.options.empty())
|
||||
{
|
||||
optionsLeft = _options->cloneOptions();
|
||||
optionsLeft->setOptionString(imageDataLeft.options);
|
||||
}
|
||||
|
||||
osg::ref_ptr<osg::Image> imageLeft = osgDB::readImageFile(filenameLeft, _options.get());
|
||||
if (imageLeft.valid()) recordOptionsFilePath(_options.get());
|
||||
osg::ref_ptr<osgDB::Options> optionsRight = _options;
|
||||
if (!imageDataRight.options.empty())
|
||||
{
|
||||
optionsRight = _options->cloneOptions();
|
||||
optionsRight->setOptionString(imageDataRight.options);
|
||||
}
|
||||
|
||||
osg::ref_ptr<osg::Image> imageRight = (filenameRight==filenameLeft) ? imageLeft.get() : osgDB::readImageFile(filenameRight, _options.get());
|
||||
if (imageRight.valid()) recordOptionsFilePath(_options.get());
|
||||
osg::ref_ptr<osg::Image> imageLeft = osgDB::readImageFile(filenameLeft, optionsLeft.get());
|
||||
if (imageLeft.valid()) recordOptionsFilePath(optionsLeft.get());
|
||||
|
||||
osg::ref_ptr<osg::Image> imageRight = (filenameRight==filenameLeft) ? imageLeft.get() : osgDB::readImageFile(filenameRight, optionsRight.get());
|
||||
if (imageRight.valid()) recordOptionsFilePath(optionsRight.get());
|
||||
|
||||
if (!imageLeft && !imageRight) return;
|
||||
|
||||
@@ -1209,7 +1229,7 @@ void SlideShowConstructor::addStereoImagePair(const std::string& filenameLeft, c
|
||||
_currentLayer->addChild(subgraph);
|
||||
}
|
||||
|
||||
void SlideShowConstructor::addGraph(const std::string& contents,const std::string& options,const PositionData& positionData, const ImageData& imageData)
|
||||
void SlideShowConstructor::addGraph(const std::string& contents, const PositionData& positionData, const ImageData& imageData)
|
||||
{
|
||||
static int s_count=0;
|
||||
|
||||
@@ -1247,9 +1267,9 @@ void SlideShowConstructor::addGraph(const std::string& contents,const std::strin
|
||||
dotFileName = tmpDirectory+osgDB::getStrippedName(filename)+std::string(".dot");
|
||||
|
||||
osg::ref_ptr<osgDB::Options> opts = _options.valid() ? _options->cloneOptions() : (new osgDB::Options);
|
||||
if (!options.empty())
|
||||
if (!imageData.options.empty())
|
||||
{
|
||||
opts->setOptionString(options);
|
||||
opts->setOptionString(imageData.options);
|
||||
}
|
||||
opts->setObjectCacheHint(osgDB::Options::CACHE_NONE);
|
||||
|
||||
@@ -1327,7 +1347,14 @@ osg::Image* SlideShowConstructor::addInteractiveImage(const std::string& filenam
|
||||
{
|
||||
if (!_currentLayer) addLayer();
|
||||
|
||||
osg::Image* image = osgDB::readImageFile(filename, _options.get());
|
||||
osg::ref_ptr<osgDB::Options> options = _options;
|
||||
if (!imageData.options.empty())
|
||||
{
|
||||
options = _options->cloneOptions();
|
||||
options->setOptionString(imageData.options);
|
||||
}
|
||||
|
||||
osg::Image* image = osgDB::readImageFile(filename, options.get());
|
||||
|
||||
OSG_INFO<<"addInteractiveImage("<<filename<<") "<<image<<std::endl;
|
||||
|
||||
@@ -1491,6 +1518,13 @@ void SlideShowConstructor::addModel(const std::string& filename, const PositionD
|
||||
{
|
||||
OSG_INFO<<"SlideShowConstructor::addModel("<<filename<<")"<<std::endl;
|
||||
|
||||
osg::ref_ptr<osgDB::Options> options = _options;
|
||||
if (!modelData.options.empty())
|
||||
{
|
||||
options = _options->cloneOptions();
|
||||
options->setOptionString(modelData.options);
|
||||
}
|
||||
|
||||
osg::Node* subgraph = 0;
|
||||
|
||||
if (filename=="sphere")
|
||||
@@ -1509,8 +1543,8 @@ void SlideShowConstructor::addModel(const std::string& filename, const PositionD
|
||||
}
|
||||
else
|
||||
{
|
||||
subgraph = osgDB::readNodeFile(filename, _options.get());
|
||||
if (subgraph) recordOptionsFilePath(_options.get());
|
||||
subgraph = osgDB::readNodeFile(filename, options.get());
|
||||
if (subgraph) recordOptionsFilePath(options.get());
|
||||
}
|
||||
|
||||
if (subgraph)
|
||||
@@ -1763,6 +1797,13 @@ void SlideShowConstructor::addVolume(const std::string& filename, const Position
|
||||
|
||||
PositionData positionData(in_positionData);
|
||||
|
||||
osg::ref_ptr<osgDB::Options> options = _options;
|
||||
if (!volumeData.options.empty())
|
||||
{
|
||||
options = _options->cloneOptions();
|
||||
options->setOptionString(volumeData.options);
|
||||
}
|
||||
|
||||
std::string foundFile = filename;
|
||||
osg::ref_ptr<osg::Image> image;
|
||||
osg::ref_ptr<osgVolume::Volume> volume;
|
||||
@@ -1784,7 +1825,7 @@ void SlideShowConstructor::addVolume(const std::string& filename, const Position
|
||||
itr != filenames.end();
|
||||
++itr)
|
||||
{
|
||||
osg::ref_ptr<osg::Image> loadedImage = osgDB::readImageFile(*itr);
|
||||
osg::ref_ptr<osg::Image> loadedImage = osgDB::readImageFile(*itr, options.get());
|
||||
if (loadedImage.valid())
|
||||
{
|
||||
images.push_back(loadedImage.get());
|
||||
@@ -1804,7 +1845,7 @@ void SlideShowConstructor::addVolume(const std::string& filename, const Position
|
||||
|
||||
if (fileType == osgDB::DIRECTORY)
|
||||
{
|
||||
image = osgDB::readImageFile(foundFile+".dicom", _options.get());
|
||||
image = osgDB::readImageFile(foundFile+".dicom", options.get());
|
||||
}
|
||||
else if (fileType == osgDB::REGULAR_FILE)
|
||||
{
|
||||
@@ -1817,14 +1858,14 @@ void SlideShowConstructor::addVolume(const std::string& filename, const Position
|
||||
}
|
||||
else
|
||||
{
|
||||
image = osgDB::readImageFile( foundFile, _options.get() );
|
||||
image = osgDB::readImageFile( foundFile, options.get() );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// not found image, so fallback to plguins/callbacks to find the model.
|
||||
image = osgDB::readImageFile( filename, _options.get() );
|
||||
if (image) recordOptionsFilePath(_options.get() );
|
||||
image = osgDB::readImageFile( filename, options.get() );
|
||||
if (image) recordOptionsFilePath(options.get() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user