Merge branch 'master' into shader_pipeline
This commit is contained in:
commit
97ba981dce
@ -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<osgSim::MultiSwitch*>(&node);
|
||||
|
||||
if (pMSwitch)
|
||||
{
|
||||
mSwitches.push_back(pMSwitch);
|
||||
}
|
||||
|
||||
osg::NodeVisitor::apply(node);
|
||||
}
|
||||
|
||||
virtual void apply(Transform& node)
|
||||
{
|
||||
osgSim::DOFTransform* pDof = dynamic_cast<osgSim::DOFTransform*>(&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<osgSim::MultiSwitch*> mSwitches;
|
||||
std::vector<osgSim::DOFTransform*> 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<osgSim::MultiSwitch*>(&node);
|
||||
if (pMSwitch)
|
||||
{
|
||||
_parent->mSwitches.push_back(pMSwitch);
|
||||
}
|
||||
|
||||
traverse(node);
|
||||
}
|
||||
|
||||
virtual void apply(Transform& node)
|
||||
{
|
||||
osgSim::DOFTransform* pDof = dynamic_cast<osgSim::DOFTransform*>(&node);
|
||||
if (pDof)
|
||||
{
|
||||
_parent->mDofs.push_back(pDof);
|
||||
pDof->setAnimationOn(true);
|
||||
}
|
||||
|
||||
traverse(node);
|
||||
}
|
||||
};
|
||||
|
||||
std::vector< osg::ref_ptr<osgSim::MultiSwitch> > mSwitches;
|
||||
std::vector< osg::ref_ptr<osgSim::DOFTransform> > 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<osg::Node> 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);
|
||||
|
@ -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=<uint>", "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));
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user