📄 geoactions.cpp
字号:
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 + -