#include <OpenThreads/ScopedLock>
-#include <osg/observer_ptr>
#include <osg/ref_ptr>
#include <osg/Group>
#include <osg/NodeCallback>
if (!texture)
return;
- // Hmm, true??
- texture->setDataVariance(osg::Object::STATIC);
+ // Do not touch dynamically generated textures.
+ if (texture->getReadPBuffer())
+ return;
+ if (texture->getDataVariance() == osg::Object::DYNAMIC)
+ return;
+ // If no image attached, we assume this one is dynamically generated
Image* image = texture->getImage(0);
if (!image)
return;
if (!texture)
return;
+ // Cannot be static if this is a render to texture thing
+ if (texture->getReadPBuffer())
+ return;
+ if (texture->getDataVariance() == osg::Object::DYNAMIC)
+ return;
+ // If no image attached, we assume this one is dynamically generated
+ Image* image = texture->getImage(0);
+ if (!image)
+ return;
+
texture->setDataVariance(Object::STATIC);
}
{
if (!stateSet)
return;
- SGTextureStateAttributeVisitor::apply(stateSet);
stateSet->setDataVariance(Object::STATIC);
- }
-};
-
-class SGAcMaterialCrippleVisitor : public SGStateAttributeVisitor {
-public:
- virtual void apply(StateSet::RefAttributePair& refAttr)
- {
- Material* material;
- material = dynamic_cast<Material*>(refAttr.first.get());
- if (!material)
- return;
- material->setColorMode(Material::AMBIENT_AND_DIFFUSE);
+ SGTextureStateAttributeVisitor::apply(stateSet);
}
};
}
if (res.loadedFromCache())
- SG_LOG(SG_IO, SG_INFO, "Returning cached image \""
+ SG_LOG(SG_IO, SG_BULK, "Returning cached image \""
<< res.getImage()->getFileName() << "\"");
else
- SG_LOG(SG_IO, SG_INFO, "Reading image \""
+ SG_LOG(SG_IO, SG_BULK, "Reading image \""
<< res.getImage()->getFileName() << "\"");
return res;
osg::Node* cached
= dynamic_cast<Node*>(registry->getFromObjectCache(fileName));
if (cached)
- SG_LOG(SG_IO, SG_INFO, "Got cached model \""
+ SG_LOG(SG_IO, SG_BULK, "Got cached model \""
<< fileName << "\"");
else
- SG_LOG(SG_IO, SG_INFO, "Reading model \""
+ SG_LOG(SG_IO, SG_BULK, "Reading model \""
<< fileName << "\"");
return cached;
}
}
osg::Node* DefaultCopyPolicy::copy(osg::Node* model, const string& fileName,
- const osgDB::ReaderWriter::Options* opt)
+ const osgDB::ReaderWriter::Options* opt)
{
- /// Crude hack for the bounding volume sharing problem.
- /// Better solution this week.
- /// Note that this does not really build in the case we come here
- /// the second time for the same node
- BoundingVolumeBuildVisitor bvBuilder;
- model->accept(bvBuilder);
-
// Add an extra reference to the model stored in the database.
- // That it to avoid expiring the object from the cache even if it is still
+ // That is to avoid expiring the object from the cache even if it is still
// in use. Note that the object cache will think that a model is unused
// if the reference count is 1. If we clone all structural nodes here
// we need that extra reference to the original object
return absFileName;
}
+
+void
+BuildLeafBVHPolicy::buildBVH(const std::string& fileName, osg::Node* node)
+{
+ SG_LOG(SG_IO, SG_BULK, "Building leaf attached boundingvolume tree for \""
+ << fileName << "\".");
+ BoundingVolumeBuildVisitor bvBuilder(true);
+ node->accept(bvBuilder);
+}
+
+void
+BuildGroupBVHPolicy::buildBVH(const std::string& fileName, osg::Node* node)
+{
+ SG_LOG(SG_IO, SG_BULK, "Building group attached boundingvolume tree for \""
+ << fileName << "\".");
+ BoundingVolumeBuildVisitor bvBuilder(false);
+ node->accept(bvBuilder);
+}
+
+void
+NoBuildBVHPolicy::buildBVH(const std::string& fileName, osg::Node*)
+{
+ SG_LOG(SG_IO, SG_BULK, "Omitting boundingvolume tree for \""
+ << fileName << "\".");
+}
+
ModelRegistry::ModelRegistry() :
- _defaultCallback(new DefaultCallback("")),
- _nestingLevel(0)
+ _defaultCallback(new DefaultCallback(""))
{
}
const ReaderWriter::Options* opt)
{
ScopedLock<ReentrantMutex> lock(readerMutex);
- ++_nestingLevel;
// XXX Workaround for OSG plugin bug.
- Registry* registry = Registry::instance();
+// Registry* registry = Registry::instance();
ReaderWriter::ReadResult res;
CallbackMap::iterator iter
= nodeCallbackMap.find(getFileExtension(fileName));
else
result = _defaultCallback->readNode(fileName, opt);
- if (0 == --_nestingLevel) {
- SG_LOG(SG_IO, SG_INFO, "Building boundingvolume tree for \""
- << fileName << "\".");
- BoundingVolumeBuildVisitor bvBuilder;
- result.getNode()->accept(bvBuilder);
- } else {
- SG_LOG(SG_IO, SG_INFO, "Defering boundingvolume tree built for \""
- << fileName << "\" to parent.");
- }
return result;
}
transform->setDataVariance(Object::STATIC);
transform->setMatrix(m);
transform->addChild(node);
- // Ok, this step is questionable.
- // It is there to have the same visual appearance of ac objects for the
- // first cut. Osg's ac3d loader will correctly set materials from the
- // ac file. But the old plib loader used GL_AMBIENT_AND_DIFFUSE for the
- // materials that in effect igored the ambient part specified in the
- // file. We emulate that for the first cut here by changing all
- // ac models here. But in the long term we should use the
- // unchanged model and fix the input files instead ...
- SGAcMaterialCrippleVisitor matCriple;
- root->accept(matCriple);
+
return root;
}
};
typedef ModelRegistryCallback<ACProcessPolicy, DefaultCachePolicy,
ACOptimizePolicy, DefaultCopyPolicy,
- OSGSubstitutePolicy> ACCallback;
+ OSGSubstitutePolicy, BuildLeafBVHPolicy>
+ACCallback;
namespace
{