]> git.mxchange.org Git - simgear.git/commitdiff
Modified Files:
authorfrohlich <frohlich>
Sun, 3 Jun 2007 18:21:04 +0000 (18:21 +0000)
committerfrohlich <frohlich>
Sun, 3 Jun 2007 18:21:04 +0000 (18:21 +0000)
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.

simgear/scene/model/model.cxx
simgear/scene/util/SGSceneFeatures.cxx
simgear/scene/util/SGSceneFeatures.hxx

index 11cd0a85bf9cf246ba58dfbbb08259f5ce264d94..1d278f7ee63faeb0647185340c8f7c057a6a6bd4 100644 (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());
     }
   }
 
index be0183a4870cac9017c30a7a918b9770026e53cd..7cc712626bf9216512e86e196c8365534608058f 100644 (file)
 #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
 {
index 0aa46abc091f6368041cb0768500ca49fc7b538a..c38921e8cc222472c9f929fbc47a54ae0685f59a 100644 (file)
 
 #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;