📄 convertfromperformer.cpp
字号:
// -*-c++-*-#include "ConvertFromPerformer.h"#include <osg/Group>#include <osg/MatrixTransform>#include <osg/LOD>#include <osg/Switch>#include <osg/Geode>#include <osg/Billboard>#include <osg/Texture2D>#include <osg/Image>#include <osg/CullFace>#include <osg/TexGen>#include <osg/TexEnv>#include <osg/TexMat>#include <osg/Material>#include <osg/Notify>#include <osg/Geometry>#include <osg/Sequence>#include <osg/ShadeModel>#include <osg/Depth>#include <osg/AlphaFunc>#include <osgDB/FileNameUtils>#include <osgDB/Registry>#include <osgDB/WriteFile>#include <Performer/pf/pfNode.h>#include <Performer/pf/pfGeode.h>#include <Performer/pf/pfBillboard.h>#include <Performer/pf/pfScene.h>#include <Performer/pf/pfGroup.h>#include <Performer/pf/pfDCS.h>#include <Performer/pf/pfSCS.h>#include <Performer/pf/pfLOD.h>#include <Performer/pf/pfSwitch.h>#include <Performer/pf/pfSequence.h>#include <Performer/pr/pfGeoState.h>#include <Performer/pr/pfMaterial.h>#include <Performer/pr/pfTexture.h>#ifdef WIN32#define snprintf _snprintf#endif// Need to undefine these because Performer defines them and it causes a// compiler error in ConvertFromPerformer::visitBillboard.#ifdef AXIAL_ROT#undef AXIAL_ROT#endif#ifdef POINT_ROT_EYE#undef POINT_ROT_EYE#endif#ifdef POINT_ROT_WORLD#undef POINT_ROT_WORLD#endifextern "C"{ extern int pfdStoreFile_osg (pfNode* root, char *fileName) { ConvertFromPerformer converter; osg::Node* node = converter.convert(root); if (node==NULL) return 0; if (osgDB::writeNodeFile(*node,fileName)) return 1; else return 0; }};ConvertFromPerformer::ConvertFromPerformer(){ _osgRoot = NULL; _gsetBindMap[PFGS_OFF] = osg::Geometry::BIND_OFF; _gsetBindMap[PFGS_OVERALL] = osg::Geometry::BIND_OVERALL; _gsetBindMap[PFGS_PER_PRIM] = osg::Geometry::BIND_PER_PRIMITIVE; _gsetBindMap[PFGS_PER_VERTEX] = osg::Geometry::BIND_PER_VERTEX; _saveImagesAsRGB = false; _saveAbsoluteImagePath = false;}ConvertFromPerformer::~ConvertFromPerformer(){}osg::Node* ConvertFromPerformer::convert(pfNode* node){ if (node==NULL) return NULL; return visitNode(NULL,node);}osg::Object* ConvertFromPerformer::getOsgObject(pfObject* pfObj){ PfObjectToOsgObjectMap::iterator fitr = _pfToOsgMap.find(pfObj); if (fitr != _pfToOsgMap.end()) { // osg::notify(DEBUG) << "Found shared object"<<std::endl; return (*fitr).second; } else return NULL;}void ConvertFromPerformer::registerPfObjectForOsgObject(pfObject* pfObj,osg::Object* osgObj){ _pfToOsgMap[pfObj] = osgObj;}osg::Node* ConvertFromPerformer::visitNode(osg::Group* osgParent,pfNode* node){ if (node==NULL) return NULL; if (node->getType()->isDerivedFrom( pfBillboard::getClassType())) return visitBillboard(osgParent,(pfBillboard*)node); else if (node->getType()->isDerivedFrom( pfGeode::getClassType())) return visitGeode(osgParent,(pfGeode*)node); else if (node->getType()->isDerivedFrom( pfScene::getClassType())) return visitScene(osgParent,(pfScene*)node); else if (node->getType()->isDerivedFrom( pfDCS::getClassType())) return visitDCS(osgParent,(pfDCS*)node); else if (node->getType()->isDerivedFrom( pfSCS::getClassType())) return visitSCS(osgParent,(pfSCS*)node); else if (node->getType()->isDerivedFrom( pfLOD::getClassType())) return visitLOD(osgParent,(pfLOD*)node); else if (node->getType()->isDerivedFrom( pfSequence::getClassType())) return visitSequence(osgParent,(pfSequence*)node); else if (node->getType()->isDerivedFrom( pfSwitch::getClassType())) return visitSwitch(osgParent,(pfSwitch*)node); else if (node->getType()->isDerivedFrom( pfGroup::getClassType())) return visitGroup(osgParent,(pfGroup*)node); return NULL;}osg::Node* ConvertFromPerformer::visitScene(osg::Group* osgParent,pfScene* scene){ osg::Group* osgScene = dynamic_cast<osg::Group*>(getOsgObject(scene)); if (osgScene) { if (osgParent) osgParent->addChild(osgScene); return osgScene; } osgScene = new osg::Group; if (osgParent) osgParent->addChild(osgScene); registerPfObjectForOsgObject(scene,osgScene); const char* name = scene->getName(); if (name) osgScene->setName(name); for(int i=0;i<scene->getNumChildren();++i) { visitNode(osgScene,scene->getChild(i)); } return (osg::Node*)osgScene;}osg::Node* ConvertFromPerformer::visitGroup(osg::Group* osgParent,pfGroup* group){ osg::Group* osgGroup = dynamic_cast<osg::Group*>(getOsgObject(group)); if (osgGroup) { if (osgParent) osgParent->addChild(osgGroup); return osgGroup; } osgGroup = new osg::Group; if (osgParent) osgParent->addChild(osgGroup); registerPfObjectForOsgObject(group,osgGroup); const char* name = group->getName(); if (name) osgGroup->setName(name); for(int i=0;i<group->getNumChildren();++i) { visitNode(osgGroup,group->getChild(i)); } return (osg::Node*)osgGroup;}osg::Node* ConvertFromPerformer::visitLOD(osg::Group* osgParent,pfLOD* lod){ osg::LOD* osgLOD = dynamic_cast<osg::LOD*>(getOsgObject(lod)); if (osgLOD) { if (osgParent) osgParent->addChild(osgLOD); return osgLOD; } osgLOD = new osg::LOD; if (osgParent) osgParent->addChild(osgLOD); registerPfObjectForOsgObject(lod,osgLOD); const char* name = lod->getName(); if (name) osgLOD->setName(name); pfVec3 center; lod->getCenter(center); osg::Vec3 osgCenter(center[0],center[1],center[2]); osgLOD->setCenter(osgCenter); int i; for(i=0;i<lod->getNumRanges()-1;++i) { osgLOD->setRange(i,lod->getRange(i),lod->getRange(i+1)); } for(i=0;i<lod->getNumChildren();++i) { visitNode(osgLOD,lod->getChild(i)); } return (osg::Node*)osgLOD;}osg::Node* ConvertFromPerformer::visitSwitch(osg::Group* osgParent,pfSwitch* switchNode){ osg::Switch* osgSwitch = dynamic_cast<osg::Switch*>(getOsgObject(switchNode)); if (osgSwitch) { if (osgParent) osgParent->addChild(osgSwitch); return osgSwitch; } osgSwitch = new osg::Switch; osgSwitch->setAllChildrenOff(); if (osgParent) osgParent->addChild(osgSwitch); registerPfObjectForOsgObject(switchNode,osgSwitch); const char* name = switchNode->getName(); if (name) osgSwitch->setName(name); float val = switchNode->getVal(); if (val==PFSWITCH_ON) { osgSwitch->setAllChildrenOn(); } else if (val==PFSWITCH_OFF) { osgSwitch->setAllChildrenOff(); } else { osgSwitch->setSingleChildOn((unsigned int)val); } for(int i=0;i<switchNode->getNumChildren();++i) { visitNode(osgSwitch,switchNode->getChild(i)); } return (osg::Node*)osgSwitch;}osg::Node* ConvertFromPerformer::visitSequence(osg::Group* osgParent, pfSequence* sequence){ //osg::notify(osg::WARN)<<"Warning : cannot convert pfSequence as no osg::Sequence exists, using osg::Switch instead."<<std::endl; osg::Sequence* osgSequence = dynamic_cast<osg::Sequence*>(getOsgObject(sequence)); if (osgSequence) { if (osgParent) osgParent->addChild(osgSequence); return osgSequence; } osgSequence = new osg::Sequence; if (osgParent) osgParent->addChild(osgSequence); registerPfObjectForOsgObject(sequence,osgSequence);#if 0 if (sequence->getNumChildren()>0) { // set switch to first child as a 'hack' to prevent all // children being traversed during rendering. Note, // once osg::Sequence has been implemented this can all // be removed. osgSequence->setValue(0); }#endif // add children for(int i=0;i<sequence->getNumChildren();++i) { //osg::notify(osg::WARN) << "child " << i << " time " << sequence->getTime(i) << std::endl; osgSequence->setTime(i, sequence->getTime(i)); visitNode(osgSequence,sequence->getChild(i)); } // interval int mode, begin, end; sequence->getInterval(&mode, &begin, &end); //osg::notify(osg::WARN) << "loop " << mode << std::endl; osg::Sequence::LoopMode loopMode = osg::Sequence::LOOP; if (mode == PFSEQ_SWING) loopMode = osg::Sequence::SWING; osgSequence->setInterval(loopMode, begin, end); // duration float speed; int repeat; sequence->getDuration(&speed, &repeat); osgSequence->setDuration(speed, repeat); // mode mode = sequence->getMode(); osg::Sequence::SequenceMode seqMode = osg::Sequence::START; switch (mode) { case PFSEQ_STOP: seqMode = osg::Sequence::STOP; break; case PFSEQ_PAUSE: seqMode = osg::Sequence::PAUSE; break; } osgSequence->setMode(seqMode); return (osg::Node*)osgSequence;}osg::Node* ConvertFromPerformer::visitDCS(osg::Group* osgParent,pfDCS* dcs){ osg::MatrixTransform* osgTransform = dynamic_cast<osg::MatrixTransform*>(getOsgObject(dcs)); if (osgTransform) { if (osgParent) osgParent->addChild(osgTransform); return osgTransform; } osgTransform = new osg::MatrixTransform; if (osgParent) osgParent->addChild(osgTransform); registerPfObjectForOsgObject(dcs,osgTransform); const char* name = dcs->getName(); if (name) osgTransform->setName(name); pfMatrix matrix; dcs->getMat(matrix); osg::Matrix osgMatrix(matrix[0][0],matrix[0][1],matrix[0][2],matrix[0][3], matrix[1][0],matrix[1][1],matrix[1][2],matrix[1][3], matrix[2][0],matrix[2][1],matrix[2][2],matrix[2][3], matrix[3][0],matrix[3][1],matrix[3][2],matrix[3][3]); osgTransform->setMatrix(osgMatrix); for(int i=0;i<dcs->getNumChildren();++i) { visitNode(osgTransform,dcs->getChild(i)); } return (osg::Node*)osgTransform;}osg::Node* ConvertFromPerformer::visitSCS(osg::Group* osgParent,pfSCS* scs){ // note the OSG does not currently have a SCS, so use DCS instead. osg::MatrixTransform* osgTransform = dynamic_cast<osg::MatrixTransform*>(getOsgObject(scs)); if (osgTransform) { if (osgParent) osgParent->addChild(osgTransform); return osgTransform; } osgTransform = new osg::MatrixTransform; if (osgParent) osgParent->addChild(osgTransform); osgTransform->setDataVariance(osg::Object::STATIC); registerPfObjectForOsgObject(scs,osgTransform); const char* name = scs->getName();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -