Modified Files:
scene/model/model.cxx: Next step in direction liveries
This commit is contained in:
@@ -71,6 +71,71 @@ private:
|
|||||||
osg::ref_ptr<osg::Referenced> mReferenced;
|
osg::ref_ptr<osg::Referenced> mReferenced;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Visitor for
|
||||||
|
class SGTextureUpdateVisitor : public SGTextureStateAttributeVisitor {
|
||||||
|
public:
|
||||||
|
SGTextureUpdateVisitor(const osgDB::FilePathList& pathList) :
|
||||||
|
mPathList(pathList)
|
||||||
|
{ }
|
||||||
|
osg::Texture2D* textureReplace(int unit, osg::StateSet::RefAttributePair& refAttr)
|
||||||
|
{
|
||||||
|
osg::Texture2D* texture = dynamic_cast<osg::Texture2D*>(refAttr.first.get());
|
||||||
|
if (!texture)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Image> image = texture->getImage(0);
|
||||||
|
if (!image)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// The currently loaded file name
|
||||||
|
std::string fullFilePath = image->getFileName();
|
||||||
|
// The short name
|
||||||
|
std::string fileName = osgDB::getSimpleFileName(fullFilePath);
|
||||||
|
// The name that should be found with the current database path
|
||||||
|
std::string fullLiveryFile = osgDB::findFileInPath(fileName, mPathList);
|
||||||
|
// If they are identical then there is nothing to do
|
||||||
|
if (fullLiveryFile == fullFilePath)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
image = osgDB::readImageFile(fullLiveryFile);
|
||||||
|
if (!image)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
osg::CopyOp copyOp(osg::CopyOp::DEEP_COPY_ALL &
|
||||||
|
~osg::CopyOp::DEEP_COPY_IMAGES);
|
||||||
|
texture = static_cast<osg::Texture2D*>(copyOp(texture));
|
||||||
|
if (!texture)
|
||||||
|
return 0;
|
||||||
|
texture->setImage(image.get());
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
virtual void apply(osg::StateSet* stateSet)
|
||||||
|
{
|
||||||
|
if (!stateSet)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// get a copy that we can safely modify the statesets values.
|
||||||
|
osg::StateSet::TextureAttributeList attrList;
|
||||||
|
attrList = stateSet->getTextureAttributeList();
|
||||||
|
for (unsigned unit = 0; unit < attrList.size(); ++unit) {
|
||||||
|
osg::StateSet::AttributeList::iterator i;
|
||||||
|
i = attrList[unit].begin();
|
||||||
|
while (i != attrList[unit].end()) {
|
||||||
|
osg::Texture2D* texture = textureReplace(unit, i->second);
|
||||||
|
if (texture) {
|
||||||
|
stateSet->removeTextureAttribute(unit, i->second.first.get());
|
||||||
|
stateSet->setTextureAttribute(unit, texture, i->second.second);
|
||||||
|
stateSet->setTextureMode(unit, GL_TEXTURE_2D, osg::StateAttribute::ON);
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
osgDB::FilePathList mPathList;
|
||||||
|
};
|
||||||
|
|
||||||
class SGTexCompressionVisitor : public SGTextureStateAttributeVisitor {
|
class SGTexCompressionVisitor : public SGTextureStateAttributeVisitor {
|
||||||
public:
|
public:
|
||||||
SGTexCompressionVisitor(osg::Texture::InternalFormatMode formatMode) :
|
SGTexCompressionVisitor(osg::Texture::InternalFormatMode formatMode) :
|
||||||
@@ -251,6 +316,12 @@ public:
|
|||||||
res = osgDB::ReaderWriter::ReadResult(osg::CopyOp(flags)(res.getNode()));
|
res = osgDB::ReaderWriter::ReadResult(osg::CopyOp(flags)(res.getNode()));
|
||||||
res.getNode()->addObserver(databaseReference);
|
res.getNode()->addObserver(databaseReference);
|
||||||
|
|
||||||
|
SGTextureUpdateVisitor liveryUpdate(osgDB::getDataFilePathList());
|
||||||
|
res.getNode()->accept(liveryUpdate);
|
||||||
|
|
||||||
|
// OSGFIXME: don't forget that mutex here
|
||||||
|
registry->getOrCreateSharedStateManager()->share(res.getNode(), 0);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user