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; } +