⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convertfromperformer.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// -*-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 + -