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

📄 geoactions.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        switch (getType()) {        case DB_DSK_SCALE_ACTION:            mtr->preMult( osg::Matrix::scale(axis*(getValue())) );            break;        case DB_DSK_TRANSLATE_ACTION:            mtr->preMult( osg::Matrix::translate(axis*(getValue())) );            break;        case DB_DSK_ROTATE_ACTION:            //std::cout << node->getName() << " v: " << getVar() << " rotion " << DEG2RAD(getValue()) << std::endl;            mtr->preMult( osg::Matrix::translate(-centre)*                 osg::Matrix::rotate(DEG2RAD(getValue()),axis)* // nov 2003 negative rotation convention                osg::Matrix::translate(centre));            break;        }    }}bool geoMoveBehaviour::makeBehave(const georecord *grec, const geoHeaderGeo *theHeader) {    bool ok=false;    const unsigned int act=grec->getType();    setType(act);    if (act==DB_DSK_ROTATE_ACTION) {        const geoField *gfd=grec->getField(GEO_DB_ROTATE_ACTION_INPUT_VAR);        if (gfd) {            unsigned fid= gfd->getUInt(); // field identifier            double *vcon=theHeader->getVar(fid); // returns address of var with fid            if (vcon) {                // std::cout<< "rotInput " << fid << " : " << theHeader->getVarname(fid)<< std::endl ;                setVar(vcon);                const geoField *gfdir=grec->getField(GEO_DB_ROTATE_ACTION_DIR);                int flip=gfdir!=NULL; // ?(gfdir->getInt()):false;//                printf("Flip %d gfdir %x\n",flip, gfdir);                gfd=grec->getField(GEO_DB_ROTATE_ACTION_VECTOR);                if (gfd) {                    float *ax= gfd->getVec3Arr(); // field identifier                    if (flip) setAxis(-osg::Vec3(ax[0],ax[1],ax[2]));                    else setAxis(osg::Vec3(ax[0],ax[1],ax[2]));                }                gfd=grec->getField(GEO_DB_ROTATE_ACTION_ORIGIN);                if (gfd) {                    float *ct= gfd->getVec3Arr(); // field identifier                    setCentre(osg::Vec3(ct[0],ct[1],ct[2]));                }                ok=true;            }        }    } else if (act==DB_DSK_TRANSLATE_ACTION) {                    const geoField *gfd=grec->getField(GEO_DB_TRANSLATE_ACTION_INPUT_VAR);        if (gfd) {            unsigned fid= gfd->getUInt(); // field identifier            double *vcon=theHeader->getVar(fid); // returns address of var with fid            if (vcon) {                setVar(vcon);                gfd=grec->getField(GEO_DB_TRANSLATE_ACTION_VECTOR);                if (gfd) {                    float *ax= gfd->getVec3Arr(); // field identifier                    setAxis(osg::Vec3(ax[0],ax[1],ax[2]));                }                gfd=grec->getField(GEO_DB_TRANSLATE_ACTION_ORIGIN);                if (gfd) {                    float *ct= gfd->getVec3Arr(); // field identifier                    setCentre(osg::Vec3(ct[0],ct[1],ct[2]));                }                ok=true;            }        }    } else if (act==DB_DSK_SCALE_ACTION) {     // Nov 2002 not yet implemented in the modeller!           }    return ok;}void geoMoveVertexBehaviour::doaction(osg::Matrix *mtr) {    // update the matrix mtr    if (getVar()) {            switch (getType()) {            case DB_DSK_SCALE_ACTION:                *mtr = (*mtr)*osg::Matrix::scale(getAxis()*(getValue())) ;                break;            case DB_DSK_TRANSLATE_ACTION:                *mtr = (*mtr)*osg::Matrix::translate(getAxis()*(getValue())) ;                break;            case DB_DSK_ROTATE_ACTION:                //std::cout << dr->getName() << " v: " << getVar() << " rotion " << DEG2RAD(getValue()) << std::endl;                *mtr = (*mtr)*osg::Matrix::translate(-getCentre())*                     osg::Matrix::rotate(DEG2RAD(getValue()),getAxis())*                     osg::Matrix::translate(getCentre());                break;            }    }}bool geoMoveVertexBehaviour::makeBehave(const georecord *grec, const geoHeaderGeo *theHeader){    const unsigned int act=grec->getType();    bool ok=false;    setType(act);    if (act==DB_DSK_ROTATE_ACTION) {        const geoField *gfd=grec->getField(GEO_DB_ROTATE_ACTION_INPUT_VAR);        if (gfd) {            unsigned fid= gfd->getUInt(); // field identifier            double *vcon=theHeader->getVar(fid); // returns address of var with fid            if (vcon) {                // std::cout<< "rotInput " << fid << " : " << theHeader->getVarname(fid)<< std::endl ;                setVar(vcon);                gfd=grec->getField(GEO_DB_ROTATE_ACTION_VECTOR);                if (gfd) {                    float *ax= gfd->getVec3Arr(); // field identifier                    setAxis(osg::Vec3(ax[0],ax[1],ax[2]));                }                gfd=grec->getField(GEO_DB_ROTATE_ACTION_ORIGIN);                if (gfd) {                    float *ct= gfd->getVec3Arr(); // field identifier                    setCentre(osg::Vec3(ct[0],ct[1],ct[2]));                }                ok=true;            }        }    } else if (act==DB_DSK_TRANSLATE_ACTION) {                    const geoField *gfd=grec->getField(GEO_DB_TRANSLATE_ACTION_INPUT_VAR);        if (gfd) {            unsigned fid= gfd->getUInt(); // field identifier            double *vcon=theHeader->getVar(fid); // returns address of var with fid            if (vcon) {                setVar(vcon);                gfd=grec->getField(GEO_DB_TRANSLATE_ACTION_VECTOR);                if (gfd) {                    float *ax= gfd->getVec3Arr(); // field identifier                    setAxis(osg::Vec3(ax[0],ax[1],ax[2]));                }                gfd=grec->getField(GEO_DB_TRANSLATE_ACTION_ORIGIN);                if (gfd) {                    float *ct= gfd->getVec3Arr(); // field identifier                    setCentre(osg::Vec3(ct[0],ct[1],ct[2]));                }                ok=true;            }        }    } else if (act==DB_DSK_SCALE_ACTION) {     // Nov 2002 not yet implemented in the modeller!           }    return ok;}bool geoVisibBehaviour::makeBehave(const georecord *grec, const geoHeaderGeo *theHeader) {    bool ok=false;    const geoField *gfd= grec->getField(GEO_DB_VISIBILITY_ACTION_INPUT_VAR);    if (gfd) {        unsigned fid= gfd->getUInt(); // field identifier        setVar(theHeader->getVar(fid)); // returns address of input var with fid        ok=true; // all data supplied    }    return ok;}void geoVisibBehaviour::doaction(osg::Node *node){ // do visibility operation on Node    if (getVar()) {        if (getValue() <0.0) {            node->setNodeMask(0x0); // invisible        } else {            node->setNodeMask(0xffffffff); // visible        }    }}bool geoColourBehaviour::makeBehave(const georecord *grec, const geoHeaderGeo *theHeader) {    bool ok=false;    const geoField *gfd= grec->getField(GEO_DB_COLOR_RAMP_ACTION_INPUT_VAR);    if (gfd) {        unsigned fid= gfd->getUInt(); // field identifier        setVar(theHeader->getVar(fid)); // returns address of input var with fid        gfd=grec->getField(GEO_DB_COLOR_RAMP_ACTION_COLOR_FROM_PALETTE);        if (gfd) {}        gfd=grec->getField(GEO_DB_COLOR_RAMP_ACTION_TOP_COLOR_INDEX);        topcindx=(gfd? gfd->getUInt():4096);        gfd=grec->getField(GEO_DB_COLOR_RAMP_ACTION_BOTTOM_COLOR_INDEX);        botcindx=(gfd? gfd->getUInt():0);        //also available: GEO_DB_COLOR_RAMP_ACTION_MATCH_COLUMNS        ok=true; // all data supplied    }    return ok;}void geoColourBehaviour::doaction(osg::Drawable *dr){ // do visibility operation on Node    if (getVar()) {        double val=getValue();        unsigned int idx=(unsigned int)val;        osg::Geometry *gm=dynamic_cast<osg::Geometry *>(dr);        if (gm) {            osg::Vec4Array* cla = dynamic_cast<osg::Vec4Array*>(gm->getColorArray());            if (cla) { // traps a colour behaviour added when using material for colour.                for (unsigned int i=nstart; i<(nend); i++) {                    unsigned char col[4];                    unsigned int idxtop=idx/128;                    (*colours)[idxtop].get(col); // from the colour palette                    float frac=(float)(idx-idxtop*128)/128.0f;                    (*cla)[i].set(col[0]*frac/255.0,col[1]*frac/255.0,col[2]*frac/255.0,1);                }            }        }    }}void geoStrContentBehaviour::doaction(osg::Drawable* /*node*/) { // do new text#ifdef USETEXT // buggy text feb 2003    osgText::Text *txt=dynamic_cast<osgText::Text *>(node);    char content[32];    switch (vt) {    case INT:        sprintf(content, format, (int)getValue());        break;    case FLOAT:        sprintf(content, format, (float)getValue());        break;    case DOUBLE:        sprintf(content, format, getValue());        break;    case CHAR:        sprintf(content, format, (char *)getVar());        break;    default:        sprintf(content, format, (char *)getVar());    }    txt->setText(std::string(content));#endif}bool geoStrContentBehaviour::makeBehave(const georecord *grec, const geoHeaderGeo *theHeader) {    bool ok=false;    const geoField *gfd=grec->getField(GEO_DB_STRING_CONTENT_ACTION_INPUT_VAR);    if (gfd) {        unsigned fid= gfd->getUInt(); // field identifier        setVar(theHeader->getVar(fid)); // returns address of input var with fid        if (getVar()) {            gfd=grec->getField(GEO_DB_STRING_CONTENT_ACTION_FORMAT);            if (gfd) {                char *ch=gfd->getChar();                format=new char[strlen(ch)+1];                strcpy(format, ch);                {                    char *ctmp=format;                    while (*ctmp) {                        if (*ctmp=='d') vt=INT;                        if (*ctmp=='f' && vt!=DOUBLE) vt=FLOAT;                        if (*ctmp=='l') vt=DOUBLE;                        ctmp++;                    }                }                gfd=grec->getField(GEO_DB_STRING_CONTENT_ACTION_PADDING_TYPE);                gfd=grec->getField(GEO_DB_STRING_CONTENT_ACTION_PADDING_TYPE);                ok=true;            }        }    }    return ok;}void geoBehaviourCB::operator() (osg::Node *node, osg::NodeVisitor* nv){ // callback updates the transform, colour, string content...    MatrixTransform *mtr=dynamic_cast<MatrixTransform *> (node);    if (mtr) mtr->setMatrix(Matrix::identity()); // all actions are multiplied to this//        printf("setting matrix %x\n", mtr); //   PositionAttitudeTransform *patr=dynamic_cast<PositionAttitudeTransform *> (node);   // if (patr) patr->setMatrix(Matrix::identity()); // all actions are multiplied to this    for (std::vector<geoBehaviour *>::const_iterator itr=gblist.begin();    itr<gblist.end();    itr++) { // motion behaviour         (*itr)->doaction(node);/* === the above is equivalent to my old code with lots of tests in: *//*      geoArithBehaviour *ab=dynamic_cast<geoArithBehaviour *>(*itr);        if (ab) ab->doaction(node);        geoAr3Behaviour *a3=dynamic_cast<geoAr3Behaviour *>(*itr);        if (a3) a3->doaction(node);        geoClampBehaviour *cb=dynamic_cast<geoClampBehaviour *>(*itr);        if (cb) cb->doaction(node);        geoRangeBehaviour *cr=dynamic_cast<geoRangeBehaviour *>(*itr);        if (cr) cr->doaction(node);        geoCompareBehaviour *cmb=dynamic_cast<geoCompareBehaviour *>(*itr);        if (cmb) cmb->doaction(node);        geoDiscreteBehaviour *db=dynamic_cast<geoDiscreteBehaviour *>(*itr);        if (db) db->doaction(node);        geoMoveBehaviour *mb=dynamic_cast<geoMoveBehaviour *>(*itr);        if (mb) mb->doaction(node);        // or visibility..        geoVisibBehaviour *vb=dynamic_cast<geoVisibBehaviour *>(*itr);        if (vb) vb->doaction(node);  */    }    traverse(node,nv);}void geoBehaviourDrawableCB::update(osg::NodeVisitor *,osg::Drawable *dr) {    Matrix mtr;    int prevvtr=-1; // previously moved vertex    Vec3 pos;    mtr.identity();    std::vector<geoBehaviour *>::const_iterator itr;    for (itr=gblist.begin();         itr<gblist.end();         itr++)        { // color or string action behaviour, can also do maths...        //     (*itr)->doaction(dr);             Node *nd=NULL;        geoArithBehaviour *ab=dynamic_cast<geoArithBehaviour *>(*itr);        if (ab) ab->doaction(nd);        geoAr3Behaviour *a3=dynamic_cast<geoAr3Behaviour *>(*itr);        if (a3) a3->doaction(nd);        geoClampBehaviour *cb=dynamic_cast<geoClampBehaviour *>(*itr);        if (cb) cb->doaction(nd);        geoRangeBehaviour *cr=dynamic_cast<geoRangeBehaviour *>(*itr);        if (cr) cr->doaction(nd);        geoStrContentBehaviour *sb=dynamic_cast<geoStrContentBehaviour *>(*itr);        if (sb) sb->doaction(dr);        // colorbehaviour may be for 1 or all vertices        geoColourBehaviour *clrb=dynamic_cast<geoColourBehaviour *>(*itr);        if (clrb) clrb->doaction(dr);        geoMoveVertexBehaviour *mvvb=dynamic_cast<geoMoveVertexBehaviour *>(*itr);        if (mvvb && (prevvtr<0 || prevvtr==mvvb->getindex())) {            mvvb->doaction(&mtr);            pos=mvvb->getpos();            prevvtr=mvvb->getindex();        }    }    osg::Geometry *gm=dynamic_cast<osg::Geometry *>(dr);    if (gm && prevvtr>=0) {        osg::Vec3Array* vtxa = dynamic_cast<osg::Vec3Array*>(gm->getVertexArray());        bool newpos=false;        (*vtxa)[prevvtr]=pos*mtr;        do { // check for other vertices that may be animated            newpos=false;            mtr.identity();            for (itr=gblist.begin();            itr<gblist.end();            itr++) { // color or string action behaviour, can also do maths...                geoMoveVertexBehaviour *mvvb=dynamic_cast<geoMoveVertexBehaviour *>(*itr);                if (mvvb) {                    int vidx=mvvb->getindex();                    if (mvvb && (prevvtr<vidx || (newpos && prevvtr==vidx))) {                        mvvb->doaction(&mtr);                        prevvtr=vidx;                        pos=mvvb->getpos();                        newpos=true;                    }                }            }             if (newpos) {                osg::Vec3Array* vtxa = dynamic_cast<osg::Vec3Array*>(gm->getVertexArray());                (*vtxa)[prevvtr]=pos*mtr;            }        } while (newpos);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -