Modified Files:

simgear/scene/model/model.cxx
	simgear/scene/util/SGSceneFeatures.cxx
	simgear/scene/util/SGSceneFeatures.hxx:
	Make sure textures are shared. Do not rely on a graphics
	context to be available on model loading.
This commit is contained in:
frohlich 2007-06-03 18:21:04 +00:00
parent de6003367d
commit 04cd9b3eb6
3 changed files with 73 additions and 35 deletions

View File

@ -22,6 +22,7 @@
#include <osgDB/SharedStateManager>
#include <osgUtil/Optimizer>
#include <simgear/scene/util/SGSceneFeatures.hxx>
#include <simgear/scene/util/SGStateAttributeVisitor.hxx>
#include <simgear/scene/util/SGTextureStateAttributeVisitor.hxx>
@ -128,10 +129,6 @@ private:
class SGTexCompressionVisitor : public SGTextureStateAttributeVisitor {
public:
SGTexCompressionVisitor(osg::Texture::InternalFormatMode formatMode) :
mFormatMode(formatMode)
{ }
virtual void apply(int, osg::StateSet::RefAttributePair& refAttr)
{
osg::Texture2D* texture;
@ -145,15 +142,26 @@ public:
int s = image->s();
int t = image->t();
if (s <= t && 32 <= s) {
texture->setInternalFormatMode(mFormatMode);
SGSceneFeatures::instance()->setTextureCompression(texture);
} else if (t < s && 32 <= t) {
texture->setInternalFormatMode(mFormatMode);
SGSceneFeatures::instance()->setTextureCompression(texture);
}
}
};
private:
osg::Texture::InternalFormatMode mFormatMode;
class SGTexDataVarianceVisitor : public SGTextureStateAttributeVisitor {
public:
virtual void apply(int, osg::StateSet::RefAttributePair& refAttr)
{
osg::Texture* texture;
texture = dynamic_cast<osg::Texture*>(refAttr.first.get());
if (!texture)
return;
texture->setDataVariance(osg::Object::STATIC);
}
};
class SGAcMaterialCrippleVisitor : public SGStateAttributeVisitor {
@ -276,23 +284,17 @@ public:
if (needTristrip)
opts |= osgUtil::Optimizer::TRISTRIP_GEOMETRY;
// opts |= osgUtil::Optimizer::TESSELATE_GEOMETRY;
opts |= osgUtil::Optimizer::OPTIMIZE_TEXTURE_SETTINGS;
// opts |= osgUtil::Optimizer::OPTIMIZE_TEXTURE_SETTINGS;
optimizer.optimize(res.getNode(), opts);
// OSGFIXME
// Make sure the data variance of sharable objects is set to STATIC ...
SGTexDataVarianceVisitor dataVarianceVisitor;
res.getNode()->accept(dataVarianceVisitor);
// ... so that textures are now globally shared
registry->getSharedStateManager()->share(res.getNode());
// OSGFIXME: guard that with a flag
// OSGFIXME: in the long term it is unclear if we have an OpenGL
// context here...
osg::Texture::Extensions* e = osg::Texture::getExtensions(0, true);
if (e->isTextureCompressionARBSupported()) {
SGTexCompressionVisitor texComp(osg::Texture::USE_ARB_COMPRESSION);
res.getNode()->accept(texComp);
} else if (e->isTextureCompressionS3TCSupported()) {
SGTexCompressionVisitor texComp(osg::Texture::USE_S3TC_DXT5_COMPRESSION);
res.getNode()->accept(texComp);
}
SGTexCompressionVisitor texComp;
res.getNode()->accept(texComp);
}
// Add an extra reference to the model stored in the database.
@ -313,10 +315,14 @@ public:
res = osgDB::ReaderWriter::ReadResult(osg::CopyOp(flags)(res.getNode()));
res.getNode()->addObserver(databaseReference);
// Update liveries
SGTextureUpdateVisitor liveryUpdate(osgDB::getDataFilePathList());
res.getNode()->accept(liveryUpdate);
// OSGFIXME: don't forget that mutex here
// Make sure the data variance of sharable objects is set to STATIC ...
SGTexDataVarianceVisitor dataVarianceVisitor;
res.getNode()->accept(dataVarianceVisitor);
// ... so that textures are now globally shared
registry->getOrCreateSharedStateManager()->share(res.getNode(), 0);
return res;
@ -359,19 +365,10 @@ SGLoadTexture2D(const std::string& path, bool wrapu, bool wrapv, int)
int s = image->s();
int t = image->t();
// OSGFIXME: guard with a flag
if (osg::Texture::getExtensions(0, true)->isTextureCompressionARBSupported()) {
if (s <= t && 32 <= s) {
texture->setInternalFormatMode(osg::Texture::USE_ARB_COMPRESSION);
} else if (t < s && 32 <= t) {
texture->setInternalFormatMode(osg::Texture::USE_ARB_COMPRESSION);
}
} else if (osg::Texture::getExtensions(0, true)->isTextureCompressionS3TCSupported()) {
if (s <= t && 32 <= s) {
texture->setInternalFormatMode(osg::Texture::USE_S3TC_DXT5_COMPRESSION);
} else if (t < s && 32 <= t) {
texture->setInternalFormatMode(osg::Texture::USE_S3TC_DXT5_COMPRESSION);
}
if (s <= t && 32 <= s) {
SGSceneFeatures::instance()->setTextureCompression(texture.get());
} else if (t < s && 32 <= t) {
SGSceneFeatures::instance()->setTextureCompression(texture.get());
}
}

View File

@ -29,12 +29,14 @@
#include <osg/VertexProgram>
#include <osg/Point>
#include <osg/PointSprite>
#include <osg/Texture>
#include <simgear/structure/SGSharedPtr.hxx>
#include <simgear/threads/SGThread.hxx>
#include <simgear/threads/SGGuard.hxx>
SGSceneFeatures::SGSceneFeatures() :
_textureCompression(UseARBCompression),
_shaderLights(true),
_pointSpriteLights(true),
_distanceAttenuationLights(true)
@ -55,6 +57,28 @@ SGSceneFeatures::instance()
return sceneFeatures;
}
void
SGSceneFeatures::setTextureCompression(osg::Texture* texture) const
{
switch (_textureCompression) {
case UseARBCompression:
texture->setInternalFormatMode(osg::Texture::USE_ARB_COMPRESSION);
break;
case UseDXT1Compression:
texture->setInternalFormatMode(osg::Texture::USE_S3TC_DXT1_COMPRESSION);
break;
case UseDXT3Compression:
texture->setInternalFormatMode(osg::Texture::USE_S3TC_DXT3_COMPRESSION);
break;
case UseDXT5Compression:
texture->setInternalFormatMode(osg::Texture::USE_S3TC_DXT5_COMPRESSION);
break;
default:
texture->setInternalFormatMode(osg::Texture::USE_IMAGE_DATA_FORMAT);
break;
}
}
bool
SGSceneFeatures::getHavePointSprites(unsigned contextId) const
{

View File

@ -24,10 +24,26 @@
#include <simgear/structure/SGReferenced.hxx>
namespace osg { class Texture; }
class SGSceneFeatures : public SGReferenced {
public:
static SGSceneFeatures* instance();
enum TextureCompression {
DoNotUseCompression,
UseARBCompression,
UseDXT1Compression,
UseDXT3Compression,
UseDXT5Compression
};
void setTextureCompression(TextureCompression textureCompression)
{ _textureCompression = textureCompression; }
TextureCompression getTextureCompression() const
{ return _textureCompression; }
void setTextureCompression(osg::Texture* texture) const;
void setEnablePointSpriteLights(bool enable)
{ _pointSpriteLights = enable; }
bool getEnablePointSpriteLights(unsigned contextId) const
@ -67,6 +83,7 @@ private:
SGSceneFeatures(const SGSceneFeatures&);
SGSceneFeatures& operator=(const SGSceneFeatures&);
TextureCompression _textureCompression;
bool _shaderLights;
bool _pointSpriteLights;
bool _distanceAttenuationLights;