diff --git a/examples/osganalysis/osganalysis.cpp b/examples/osganalysis/osganalysis.cpp index 919032abf..c418188a4 100644 --- a/examples/osganalysis/osganalysis.cpp +++ b/examples/osganalysis/osganalysis.cpp @@ -79,6 +79,74 @@ public: } }; +class OptimizeImageVisitor : public osg::NodeVisitor +{ +public: + OptimizeImageVisitor(osgDB::ImageProcessor* imageProcessor, bool compressImages, bool generateMipmaps): + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), + _imageProcessor(imageProcessor), + _compressImages(compressImages), + _generateMipmaps(generateMipmaps) {} + + osg::ref_ptr _imageProcessor; + bool _compressImages; + bool _generateMipmaps; + + void apply(osg::Node& node) + { + processStateSet(node.getStateSet()); + traverse(node); + } + + void apply(osg::Geode& node) + { + processStateSet(node.getStateSet()); + for(unsigned int i = 0; igetStateSet()); + } + + traverse(node); + } + + void processStateSet(osg::StateSet* stateset) + { + if (!stateset) return; + + for(unsigned int i=0; igetNumTextureAttributeLists(); ++i) + { + osg::StateAttribute* sa = stateset->getTextureAttribute(i, osg::StateAttribute::TEXTURE); + osg::Texture* texture = dynamic_cast(sa); + if (texture) + { + for(unsigned int i=0; igetNumImages(); ++i) + { + proccessImage(texture->getImage(i)); + } + } + }; + } + + + void proccessImage(osg::Image* image) + { + if (!image) return; + + if (_imageProcessor.valid()) + { + OSG_NOTICE<<"Will be using ImageProcessor to proces image "<getFileName()<getFileName()< compileSet = new osgUtil::IncrementalCompileOperation::CompileSet(_loadedModel.get()); @@ -685,6 +762,12 @@ int main(int argc, char** argv) databasePagingThread = new osg::OperationThread; databasePagingThread->startThread(); + + osg::ref_ptr group = new osg::Group; + viewer.setSceneData(group.get()); + + viewer.realize(); + std::string filename = fileNames[modelIndex++]; std::string outputFilename = outputPostfix.empty() ? std::string() : osgDB::getStrippedName(filename)+outputPostfix; @@ -696,10 +779,6 @@ int main(int argc, char** argv) databasePagingThread->add(databasePagingOperation.get()); - osg::ref_ptr group = new osg::Group; - viewer.setSceneData(group.get()); - - viewer.realize(); double timeOfLastMerge = viewer.getFrameStamp()->getReferenceTime(); @@ -727,6 +806,8 @@ int main(int argc, char** argv) if (databasePagingOperation.get() && databasePagingOperation->_modelReadyToMerge) { + OSG_NOTICE<<"Merging subgraph"<removeChildren(0,group->getNumChildren());