diff --git a/examples/osgsidebyside/osgsidebyside.cpp b/examples/osgsidebyside/osgsidebyside.cpp index c4acad979..3117f6471 100644 --- a/examples/osgsidebyside/osgsidebyside.cpp +++ b/examples/osgsidebyside/osgsidebyside.cpp @@ -41,48 +41,15 @@ using namespace osg; using namespace osgGA; -class SwitchDOFVisitor : public osg::NodeVisitor, public osgGA::GUIEventHandler +class SwitchDOFHandler : public osgGA::GUIEventHandler { public: - SwitchDOFVisitor(): - osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) + + + SwitchDOFHandler() { } - SwitchDOFVisitor(const SwitchDOFVisitor& sdfv, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY): - osg::Object(sdfv, copyop), - osg::Callback(sdfv, copyop), - osg::NodeVisitor(sdfv, copyop), - osgGA::GUIEventHandler(sdfv, copyop) - {} - - META_Object(osg, SwitchDOFVisitor) - - virtual void apply(Group& node) - { - osgSim::MultiSwitch* pMSwitch = dynamic_cast(&node); - - if (pMSwitch) - { - mSwitches.push_back(pMSwitch); - } - - osg::NodeVisitor::apply(node); - } - - virtual void apply(Transform& node) - { - osgSim::DOFTransform* pDof = dynamic_cast(&node); - - if (pDof) - { - mDofs.push_back(pDof); - pDof->setAnimationOn(true); - } - - osg::NodeVisitor::apply(node); - } - void nextSwitch() { for (size_t i=0; i < mSwitches.size(); i++) @@ -156,9 +123,53 @@ public: return false; } + void collectNodesOfInterest(osg::Node* node) + { + CollectNodes cn(this); + node->accept(cn); + } + private: - std::vector mSwitches; - std::vector mDofs; + + friend class CollectNodes; + + class CollectNodes : public osg::NodeVisitor + { + public: + SwitchDOFHandler* _parent; + + CollectNodes(SwitchDOFHandler* parent): + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), + _parent(parent) + { + } + + virtual void apply(Group& node) + { + osgSim::MultiSwitch* pMSwitch = dynamic_cast(&node); + if (pMSwitch) + { + _parent->mSwitches.push_back(pMSwitch); + } + + traverse(node); + } + + virtual void apply(Transform& node) + { + osgSim::DOFTransform* pDof = dynamic_cast(&node); + if (pDof) + { + _parent->mDofs.push_back(pDof); + pDof->setAnimationOn(true); + } + + traverse(node); + } + }; + + std::vector< osg::ref_ptr > mSwitches; + std::vector< osg::ref_ptr > mDofs; }; void singleWindowSideBySideCameras(osgViewer::Viewer& viewer) @@ -267,8 +278,8 @@ int main( int argc, char **argv ) viewer.addEventHandler(new osgViewer::LODScaleHandler()); viewer.addEventHandler(new osgGA::StateSetManipulator()); - SwitchDOFVisitor* visit = new SwitchDOFVisitor; - viewer.addEventHandler(visit); + SwitchDOFHandler* switchOFHandler = new SwitchDOFHandler; + viewer.addEventHandler(switchOFHandler); // load the scene. osg::ref_ptr loadedModel = osgDB::readRefNodeFiles(arguments); @@ -294,13 +305,12 @@ int main( int argc, char **argv ) group2->addChild(convertedModel.get()); group2->setNodeMask(2); - // Activate DOF animations and collect switches - loadedModel->accept(*visit); - convertedModel->accept(*visit); - group->addChild(group1); group->addChild(group2); + // Activate DOF animations and collect switches + switchOFHandler->collectNodesOfInterest(group); + viewer.setSceneData(group); viewer.setThreadingModel(osgViewer::Viewer::DrawThreadPerContext); diff --git a/src/osgPlugins/freetype/ReaderWriterFreeType.cpp b/src/osgPlugins/freetype/ReaderWriterFreeType.cpp index bdb8f7cf3..934b76ee6 100644 --- a/src/osgPlugins/freetype/ReaderWriterFreeType.cpp +++ b/src/osgPlugins/freetype/ReaderWriterFreeType.cpp @@ -11,7 +11,7 @@ class ReaderWriterFreeType : public osgDB::ReaderWriter ReaderWriterFreeType() { supportsExtension("ttf","true type font format"); - supportsExtension("ttc","true type format"); + supportsExtension("ttc","true type collection format"); supportsExtension("pfb","type1 binary format"); supportsExtension("pfa","type2 ascii format"); supportsExtension("cid","Postscript CID-Fonts format"); @@ -23,6 +23,7 @@ class ReaderWriterFreeType : public osgDB::ReaderWriter supportsExtension("woff","web open font format"); supportsOption("monochrome","Select monochrome font."); + supportsOption("index=", "Select index of font within ttc collection. Defaults to 0."); } virtual const char* className() const { return "FreeType Font Reader/Writer"; } @@ -38,6 +39,20 @@ class ReaderWriterFreeType : public osgDB::ReaderWriter return flags; } + static unsigned int getIndex(const osgDB::ReaderWriter::Options* options) + { + if(!options) return 0; + + std::string indexstr = options->getPluginStringData("index"); + int index = std::atoi(indexstr.c_str()); + if(index < 0) + { + OSG_WARN<< "Warning: invalid index string (" << indexstr << ") when loading freetype font. Attempting to use default index 0." << std::endl; + return 0; + } + else return (unsigned int)index; + } + virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options) const { std::string ext = osgDB::getLowerCaseFileExtension(file); @@ -53,7 +68,7 @@ class ReaderWriterFreeType : public osgDB::ReaderWriter return ReadResult::ERROR_IN_READING_FILE; } - return freeTypeLibrary->getFont(fileName,0,getFlags(options)); + return freeTypeLibrary->getFont(fileName, getIndex(options), getFlags(options)); } virtual ReadResult readObject(std::istream& stream, const osgDB::ReaderWriter::Options* options) const @@ -65,7 +80,7 @@ class ReaderWriterFreeType : public osgDB::ReaderWriter return ReadResult::ERROR_IN_READING_FILE; } - return freeTypeLibrary->getFont(stream, 0, getFlags(options)); + return freeTypeLibrary->getFont(stream, getIndex(options), getFlags(options)); } };