From d9828731d86352cf223dbfb8b3cf5fe11ad94cf4 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 4 Apr 2005 11:18:02 +0000 Subject: [PATCH] From Alberto Farre: "Here there are fixes for several flt loader problems. First one was an small bug when root database was an empty string we got a database path "/" instead of "./". Second one is more complex. Flt loader works in two passes, first one reads flt database and second one builds osg scenegraph. Special care must be taken for properly tracking database path as nested files are entered. Because textures are loaded in second pass, mentioned care should be taken once again. I wrote time ago a piece of code and I placed it in both files fltFile.cpp and flt2osg.cpp. After a long period offline I have seen the portion of code at flt2osg was missing, I just made some tests and I could see it is still required. Finally, I have seen that pool.cpp always try to make IMAGE cache instead of reading what Options says. Aditonally, I recently wrote an osg change, now it has external references "a la flt" what is called osg::ProxyNode. As part of the change now flt loader builds external references as ProxyNodes. I made the same mistake like pool.cpp and always made ARCHIVE cache instead of see what Options says, it has also been fixed." --- src/osgPlugins/flt/FltFile.cpp | 16 ++-- src/osgPlugins/flt/Pool.cpp | 134 +++++++++++++++++---------------- src/osgPlugins/flt/flt2osg.cpp | 42 +++++++++-- 3 files changed, 115 insertions(+), 77 deletions(-) diff --git a/src/osgPlugins/flt/FltFile.cpp b/src/osgPlugins/flt/FltFile.cpp index 08561008d..3cc38d0a5 100644 --- a/src/osgPlugins/flt/FltFile.cpp +++ b/src/osgPlugins/flt/FltFile.cpp @@ -81,8 +81,8 @@ FltFile::FltFile( } else { - // If they aren't both set, then they must both be NULL. - assert( (pLtPtAppearancePool==NULL) && (pLtPtAppearancePool==NULL) ); + // If they aren't both set, then they must both be NULL. + assert( (pLtPtAppearancePool==NULL) && (pLtPtAppearancePool==NULL) ); // use internal light point palettes _useInternalLtPtPalettes = true; setLtPtAppearancePool( new LtPtAppearancePool ); @@ -225,10 +225,10 @@ bool FltFile::readFile(const std::string& fileName) if (rec.getFlightVersion() >= 1580) { if (!(pSExternal->dwFlags & ExternalRecord::LIGHT_POINT_PALETTE_OVERRIDE)) - { + { pLtPtAppearancePool = _pFltFile->getLtPtAppearancePool(); pLtPtAnimationPool = _pFltFile->getLtPtAnimationPool(); - } + } } } @@ -244,8 +244,7 @@ bool FltFile::readFile(const std::string& fileName) { osg::ref_ptr options = _pFltFile->getOptions() ? _pFltFile->getOptions() : - new osgDB::ReaderWriter::Options; - + new osgDB::ReaderWriter::Options; //Path for Nested external references osgDB::FilePathList& fpl = options->getDatabasePathList(); const std::string& filePath = osgDB::getFilePath(filename); @@ -258,7 +257,7 @@ bool FltFile::readFile(const std::string& fileName) } else { - pushAndPopPath = (fpl.empty() ? "." : fpl.back()) + "/" + filePath; + pushAndPopPath = (fpl.empty() | fpl.back().empty() ? "." : fpl.back()) + "/" + filePath; } char optionsString[256]; @@ -279,6 +278,8 @@ bool FltFile::readFile(const std::string& fileName) } pExternalFltFile->readModel(filename); + + fpl.pop_back(); } rec.setExternal(pExternalFltFile); @@ -348,3 +349,4 @@ std::string FltFile::getDesiredUnitsString() const } } + diff --git a/src/osgPlugins/flt/Pool.cpp b/src/osgPlugins/flt/Pool.cpp index 4e1386c22..6ed2d928d 100644 --- a/src/osgPlugins/flt/Pool.cpp +++ b/src/osgPlugins/flt/Pool.cpp @@ -128,75 +128,82 @@ flt::AttrData* TexturePool::getTexture(int nIndex, osgDB::ReaderWriter::Options* if (nitr != _textureNameMap.end()) { const std::string& textureName = (*nitr).second; + flt::AttrData* textureAttrData = 0; - // Valid index, find the texture - // Get AttrData containing texture from registry pool. - flt::AttrData* textureAttrData = Registry::instance()->getTexture(textureName); - - if (textureAttrData) + if(options->getObjectCacheHint() & osgDB::ReaderWriter::Options::CACHE_IMAGES) { - // Add texture to local pool to be ab121le to get by index. - addTexture(nIndex, textureAttrData); + + // Valid index, find the texture + // Get AttrData containing texture from registry pool. + textureAttrData = Registry::instance()->getTexture(textureName); + + if (textureAttrData) + { + // Add texture to local pool to be ab121le to get by index. + addTexture(nIndex, textureAttrData); + return textureAttrData; + } + } + + CERR<<"setTexture attempting to load ("< image = osgDB::readImageFile(textureName, options ? options : osgDB::Registry::instance()->getOptions()); + if (image.valid()) + { + std::string attrName(textureName); + attrName += ".attr"; + + textureAttrData = dynamic_cast(osgDB::readObjectFile(attrName, options ? options : osgDB::Registry::instance()->getOptions() )); + + // if not found create default StateSet for the AttrData + if (textureAttrData == NULL) + { + textureAttrData = new flt::AttrData; + textureAttrData->stateset = new osg::StateSet; + + osg::Texture2D* osgTexture = new osg::Texture2D; + osgTexture->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::REPEAT); + osgTexture->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::REPEAT); + textureAttrData->stateset->setTextureAttributeAndModes( unit, osgTexture,osg::StateAttribute::ON); + + osg::TexEnv* osgTexEnv = new osg::TexEnv; + osgTexEnv->setMode(osg::TexEnv::MODULATE); + textureAttrData->stateset->setTextureAttribute( unit, osgTexEnv ); + } + + osg::Texture2D *osgTexture = dynamic_cast(textureAttrData->stateset->getTextureAttribute( unit, osg::StateAttribute::TEXTURE)); + if (osgTexture == NULL) + { + osgTexture = new osg::Texture2D; + textureAttrData->stateset->setTextureAttributeAndModes( unit, osgTexture,osg::StateAttribute::ON); + } + + osgTexture->setImage(image.get()); + } else { - CERR<<"setTexture attempting to load ("< image = osgDB::readImageFile(textureName, options ? options : osgDB::Registry::instance()->getOptions()); - if (image.valid()) - { - std::string attrName(textureName); - attrName += ".attr"; - - textureAttrData = dynamic_cast(osgDB::readObjectFile(attrName, options ? options : osgDB::Registry::instance()->getOptions() )); - - // if not found create default StateSet for the AttrData - if (textureAttrData == NULL) - { - textureAttrData = new flt::AttrData; - textureAttrData->stateset = new osg::StateSet; - - osg::Texture2D* osgTexture = new osg::Texture2D; - osgTexture->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::REPEAT); - osgTexture->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::REPEAT); - textureAttrData->stateset->setTextureAttributeAndModes( unit, osgTexture,osg::StateAttribute::ON); - - osg::TexEnv* osgTexEnv = new osg::TexEnv; - osgTexEnv->setMode(osg::TexEnv::MODULATE); - textureAttrData->stateset->setTextureAttribute( unit, osgTexEnv ); - } - - osg::Texture2D *osgTexture = dynamic_cast(textureAttrData->stateset->getTextureAttribute( unit, osg::StateAttribute::TEXTURE)); - if (osgTexture == NULL) - { - osgTexture = new osg::Texture2D; - textureAttrData->stateset->setTextureAttributeAndModes( unit, osgTexture,osg::StateAttribute::ON); - } - - osgTexture->setImage(image.get()); - - } - else - { - // invalid image file, register an empty state set AttrData - textureAttrData = new flt::AttrData; - textureAttrData->stateset = new osg::StateSet; - } - - // Add new texture to registry pool - // ( umm... should this have reference to the texture unit? RO. July2002) - Registry::instance()->addTexture(textureName, textureAttrData); - - // Also add to local pool to be able to get texture by index. - // ( umm... should this have reference to the texture unit? RO. July2002) - addTexture(nIndex, textureAttrData); - - CERR<<"Registry::instance()->addTexture("<addTexture("<stateset = new osg::StateSet; } + + // Add new texture to registry pool + // ( umm... should this have reference to the texture unit? RO. July2002) + if(options->getObjectCacheHint() & osgDB::ReaderWriter::Options::CACHE_IMAGES) + { + Registry::instance()->addTexture(textureName, textureAttrData); + } + + // Also add to local pool to be able to get texture by index. + // ( umm... should this have reference to the texture unit? RO. July2002) + addTexture(nIndex, textureAttrData); + + CERR<<"Registry::instance()->addTexture("<addTexture("<getOptions(); + #ifdef USE_PROXYNODE_FOR_EXTERNAL_FILES - external = dynamic_cast (osgDB::Registry::instance()->getFromObjectCache(rec->getFilename())); - if(external) + if(options->getObjectCacheHint() & osgDB::ReaderWriter::Options::CACHE_ARCHIVES) { - osg::Group *tempParent = visitAncillary(osgParent, *external, rec); - tempParent->addChild(external); - return external; + external = dynamic_cast (osgDB::Registry::instance()->getFromObjectCache(rec->getFilename())); + if(external) + { + osg::Group *tempParent = visitAncillary(osgParent, *external, rec); + tempParent->addChild(external); + return external; + } } #endif + + osgDB::FilePathList& fpl = options->getDatabasePathList(); + const std::string& filePath = osgDB::getFilePath(rec->getFilename()); + std::string pushAndPopPath; + //If absolute path + if( (filePath.length()>0 && filePath.find_first_of("/\\")==0) || + (filePath.length()>2 && filePath.substr(1,1)==":" && filePath.find_first_of("/\\")==2) ) + { + pushAndPopPath = filePath; + } + else + { + pushAndPopPath = (fpl.empty() | fpl.back().empty() ? "." : fpl.back()) + "/" + filePath; + } + fpl.push_back(pushAndPopPath); + + pFile->setDesiredUnits( rec->getFltFile()->getDesiredUnits() ); external = pFile->convert(); if (external) @@ -2467,7 +2490,8 @@ osg::Group* ConvertFromFLT::visitExternal(osg::Group& osgParent, ExternalRecord* proxynode->setCenterMode(osg::ProxyNode::USE_BOUNDING_SPHERE_CENTER); proxynode->addChild(external, rec->getFilename()); tempParent->addChild(proxynode); - osgDB::Registry::instance()->addEntryToObjectCache(rec->getFilename(), proxynode); + if(options->getObjectCacheHint() & osgDB::ReaderWriter::Options::CACHE_ARCHIVES) + osgDB::Registry::instance()->addEntryToObjectCache(rec->getFilename(), proxynode); #else tempParent->addChild(external); #endif @@ -2486,7 +2510,8 @@ osg::Group* ConvertFromFLT::visitExternal(osg::Group& osgParent, ExternalRecord* proxynode->setCenterMode(osg::ProxyNode::USE_BOUNDING_SPHERE_CENTER); proxynode->addChild(model, rec->getFilename()); tempParent->addChild(proxynode); - osgDB::Registry::instance()->addEntryToObjectCache(rec->getFilename(), proxynode); + if(options->getObjectCacheHint() & osgDB::ReaderWriter::Options::CACHE_ARCHIVES) + osgDB::Registry::instance()->addEntryToObjectCache(rec->getFilename(), proxynode); #else //tempParent->addChild(model); #endif @@ -2500,6 +2525,8 @@ osg::Group* ConvertFromFLT::visitExternal(osg::Group& osgParent, ExternalRecord* } } } + + fpl.pop_back(); } return external; } @@ -3272,3 +3299,4 @@ void ConvertFromFLT::setMeshTexCoordinates ( const uint32 &numVerts, const Local return; } +