#ifndef SPIDER_H #define SPIDER_H 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "spiderdata.h" #define BOBSCALEX .3 #define BOBSCALEY .3 #define BOBSCALEZ .3 #define BOBZCONST .35 class Spider; class Spider { public: Spider(pfGroup *parent, int newid, SpiderData * spdata[9]) { Spider(parent, 0, 0, 0.6, newid, spdata); } Spider(pfGroup *parent, float newx, float newy, float newz, int newid, SpiderData * spdata[9]) { Spider(parent, newx, newy, newz, BOBSCALEX, BOBSCALEY, BOBSCALEZ, newid, spdata); } Spider(pfGroup *parent, float newx, float newy, float newz, float newsx, float newsy, float newsz, int newid, SpiderData * spdata_holder[9]) { spider_x = newx; spider_y = newy; spider_z = newz; spider_sx = newsx; spider_sy = newsy; spider_sz = newsz; idnum = newid; for( int r=0;r<9;r++) { sdata[r] = NULL; spdata_holder[r] = NULL; } // set defaults SPEED = .2; WALK_SPEED = 60; LEG_RT_AMT = 30; LEG0DELAY = 0; LEG1DELAY = 10; LEG2DELAY = 20; LEG3DELAY = 30; LEG4DELAY = 0; LEG5DELAY = 10; LEG6DELAY = 20; LEG7DELAY = 30; pfNode *obj; pfDCS *dcsbody; sdata[8] = new SpiderData(WALK_SPEED, LEG_RT_AMT, 0, spider_x, spider_y, spider_z, spider_sx,spider_sy,spider_sz); spdata_holder[8] = sdata[8]; //printf("after new sdata 8: %d \n", sdata[8]); // load spider body dcsbody = new pfDCS; obj = pfdLoadFile("body.iv"); dcsbody->setTravFuncs(PFTRAV_APP, moveBody, NULL); dcsbody->setTravData(PFTRAV_APP, sdata[8]); dcsbody->setScale(spider_sx,spider_sy,spider_sz); dcsbody->addChild(obj); parent->addChild(dcsbody); for (int i = 0; i < 8; i++) { pfDCS *dcs; dcs = new pfDCS; sdata[i] = new SpiderData(WALK_SPEED, LEG_RT_AMT, 0, spider_x, spider_y, spider_z, spider_sx,spider_sy,spider_sz); spdata_holder[i] = sdata[i]; //printf("after new sdata %d: %d\n", i, sdata[i]); switch(i) { case 0: obj = pfdLoadFile("leg0.iv"); sdata[0]->setLegDelay( LEG0DELAY ); dcs->setTravFuncs(PFTRAV_APP, moveLeg0, NULL); dcs->setTravData(PFTRAV_APP, sdata[0]); dcs->setScale(spider_sx,spider_sy,spider_sz); break; case 1: obj = pfdLoadFile("leg1.iv"); sdata[1]->setLegDelay( LEG1DELAY ); dcs->setTravFuncs(PFTRAV_APP, moveLeg1, NULL); dcs->setTravData(PFTRAV_APP, sdata[1]); dcs->setScale(spider_sx,spider_sy,spider_sz); break; case 2: obj = pfdLoadFile("leg2.iv"); sdata[2]->setLegDelay( LEG2DELAY ); dcs->setTravFuncs(PFTRAV_APP, moveLeg2, NULL); dcs->setTravData(PFTRAV_APP, sdata[2]); dcs->setScale(spider_sx,spider_sy,spider_sz); break; case 3: obj = pfdLoadFile("leg3.iv"); sdata[3]->setLegDelay( LEG3DELAY ); dcs->setTravFuncs(PFTRAV_APP, moveLeg3, NULL); dcs->setTravData(PFTRAV_APP, sdata[3]); dcs->setScale(spider_sx,spider_sy,spider_sz); break; case 4: obj = pfdLoadFile("leg4.iv"); sdata[4]->setLegDelay( LEG4DELAY ); dcs->setTravFuncs(PFTRAV_APP, moveLeg4, NULL); dcs->setTravData(PFTRAV_APP, sdata[4]); dcs->setScale(spider_sx,spider_sy,spider_sz); break; case 5: obj = pfdLoadFile("leg5.iv"); sdata[5]->setLegDelay( LEG5DELAY ); dcs->setTravFuncs(PFTRAV_APP, moveLeg5, NULL); dcs->setTravData(PFTRAV_APP, sdata[5]); dcs->setScale(spider_sx,spider_sy,spider_sz); break; case 6: obj = pfdLoadFile("leg6.iv"); sdata[6]->setLegDelay( LEG6DELAY ); dcs->setTravFuncs(PFTRAV_APP, moveLeg6, NULL); dcs->setTravData(PFTRAV_APP, sdata[6]); dcs->setScale(spider_sx,spider_sy,spider_sz); break; case 7: obj = pfdLoadFile("leg7.iv"); sdata[7]->setLegDelay( LEG7DELAY ); dcs->setTravFuncs(PFTRAV_APP, moveLeg7, NULL); dcs->setTravData(PFTRAV_APP, sdata[7]); dcs->setScale(spider_sx,spider_sy,spider_sz); break; default: break; } dcs->addChild(obj); parent->addChild(dcs); } //printf("Just before Spider() ends\n"); //printInfo(); } // main work is here static int moveBody(pfTraverser *trav, void * data) { // get a pointer to DCS node pfDCS *dcs = (pfDCS *) trav->getNode(); SpiderData * sd = (SpiderData*)data; float x=0,y=0,z=0,rotz=0; rotz = sd->getRotZ(); z -= (1 - sd->getsz() )*BOBZCONST; dcs->setTrans(x+sd->getx(), y+sd->gety(), z+sd->getz() ); dcs->setRot( rotz, 0, 0 ); return PFTRAV_CONT; } static int moveLeg0(pfTraverser *trav, void * data) { pfDCS *dcs = (pfDCS *) trav->getNode(); SpiderData * sd = (SpiderData*)data; float x=0,y=0,z=0,rot=0; // do scaling x *= sd->getsx(); y *= sd->getsy(); z *= sd->getsz(); z -= (1 - sd->getsz() )*BOBZCONST; //rot = -30+ sd->getleg_rt_amt(); //rot = 0; float maxrotate = 30; float rottmp = (pfGetTime()*sd->getwalk_speed()); rottmp += sd->getleg_delay(); while (rottmp > maxrotate) rottmp -= maxrotate; if ( rottmp < maxrotate/2 ) rot += rottmp; else rot += maxrotate - rottmp ; rot += sd->getRotZ(); dcs->setTrans( x+sd->getx(), y+sd->gety(), z+sd->getz() ); dcs->setRot(rot,0,0); return PFTRAV_CONT; } static int moveLeg1(pfTraverser *trav, void * data) { pfDCS *dcs = (pfDCS *) trav->getNode(); // get a pointer to DCS SpiderData * sd = (SpiderData*)data; float x=0,y=0,z=0,rot=0; //float x=0.1,y=-0.05,z=0,rot=0; // do scaling x *= sd->getsx(); y *= sd->getsy(); z *= sd->getsz(); z -= (1 - sd->getsz() )*BOBZCONST; //rot = -10+sd->getleg_rt_amt(); //rot = 20; float maxrotate = 30; float rottmp = (pfGetTime()*sd->getwalk_speed()); rottmp += sd->getleg_delay(); while (rottmp > maxrotate) rottmp -= maxrotate; if ( rottmp < maxrotate/2 ) rot += rottmp; else rot += maxrotate - rottmp ; rot += sd->getRotZ(); dcs->setTrans( x+sd->getx(), y+sd->gety(), z+sd->getz() ); dcs->setRot(rot,0,0); return PFTRAV_CONT; } static int moveLeg2(pfTraverser *trav, void *data) { pfDCS *dcs = (pfDCS *) trav->getNode(); // get a pointer to SpiderData * sd = (SpiderData*)data; float x=0,y=0,z=0,rot=0; //float x=0.2,y=-0.05,z=0,rot=0; x *= sd->getsx(); y *= sd->getsy(); z *= sd->getsz(); z -= (1 - sd->getsz() )*BOBZCONST; //rot = 10+sd->getleg_rt_amt(); float maxrotate = 30; float rottmp = (pfGetTime()*sd->getwalk_speed()); rottmp += sd->getleg_delay(); while (rottmp > maxrotate) rottmp -= maxrotate; if ( rottmp < maxrotate/2 ) rot += rottmp; else rot += maxrotate - rottmp ; rot += sd->getRotZ(); dcs->setTrans( x+sd->getx(), y+sd->gety(), z+sd->getz() ); dcs->setRot(rot,0,0); return PFTRAV_CONT; } static int moveLeg3(pfTraverser *trav, void *data) { pfDCS *dcs = (pfDCS *) trav->getNode(); // get a pointer to SpiderData * sd = (SpiderData*)data; float x=0,y=0,z=0,rot=0; //float x=0.3,y=0,z=0,rot=0; x *= sd->getsx(); y *= sd->getsy(); z *= sd->getsz(); z -= (1 - sd->getsz() )*BOBZCONST; //rot = 30+sd->getleg_rt_amt(); float maxrotate = 30; float rottmp = (pfGetTime()*sd->getwalk_speed()); rottmp += sd->getleg_delay(); while (rottmp > maxrotate) rottmp -= maxrotate; if ( rottmp < maxrotate/2 ) rot += rottmp; else rot += maxrotate - rottmp ; rot += sd->getRotZ(); dcs->setTrans( x+sd->getx(), y+sd->gety(), z+sd->getz() ); dcs->setRot(rot,0,0); return PFTRAV_CONT; } static int moveLeg4(pfTraverser *trav, void *data) { pfDCS *dcs = (pfDCS *) trav->getNode(); // get a pointer to SpiderData * sd = (SpiderData*)data; float x=0,y=0,z=0,rot=0; //float x=-0.15,y=0.24,z=0,rot=0; x *= sd->getsx(); y *= sd->getsy(); z *= sd->getsz(); z -= (1 - sd->getsz() )*BOBZCONST; //rot = -130+sd->getleg_rt_amt(); float maxrotate = 30; float rottmp = (pfGetTime()*sd->getwalk_speed()); rottmp += sd->getleg_delay(); while (rottmp > maxrotate) rottmp -= maxrotate; if ( rottmp < maxrotate/2 ) rot -= rottmp; else rot -= maxrotate - rottmp ; rot += sd->getRotZ(); dcs->setTrans( x+sd->getx(), y+sd->gety(), z+sd->getz() ); dcs->setRot(rot,0,0); return PFTRAV_CONT; } static int moveLeg5(pfTraverser *trav, void *data) { pfDCS *dcs = (pfDCS *) trav->getNode(); // get a pointer to SpiderData * sd = (SpiderData*)data; float x=0,y=0,z=0,rot=0; //float x=-0.1,y=0.24,z=0,rot=0; x *= sd->getsx(); y *= sd->getsy(); z *= sd->getsz(); z -= (1 - sd->getsz() )*BOBZCONST; //rot = -150+sd->getleg_rt_amt(); float maxrotate = 30; float rottmp = (pfGetTime()*sd->getwalk_speed()); rottmp += sd->getleg_delay(); while (rottmp > maxrotate) rottmp -= maxrotate; if ( rottmp < maxrotate/2 ) rot -= rottmp; else rot -= maxrotate - rottmp ; rot += sd->getRotZ(); dcs->setTrans( x+sd->getx(), y+sd->gety(), z+sd->getz() ); dcs->setRot(rot,0,0); return PFTRAV_CONT; } static int moveLeg6(pfTraverser *trav, void *data) { pfDCS *dcs = (pfDCS *) trav->getNode(); // get a pointer to SpiderData * sd = (SpiderData*)data; float x=0,y=0,z=0,rot=0; //float x=-0.1,y=0.24,z=0,rot=0; x *= sd->getsx(); y *= sd->getsy(); z *= sd->getsz(); z -= (1 - sd->getsz() )*BOBZCONST; //rot = -170+sd->getleg_rt_amt(); float maxrotate = 30; float rottmp = (pfGetTime()*sd->getwalk_speed()); rottmp += sd->getleg_delay(); while (rottmp > maxrotate) rottmp -= maxrotate; if ( rottmp < maxrotate/2 ) rot -= rottmp; else rot -= maxrotate - rottmp ; rot += sd->getRotZ(); dcs->setTrans( x+sd->getx(), y+sd->gety(), z+sd->getz() ); dcs->setRot(rot,0,0); return PFTRAV_CONT; } static int moveLeg7(pfTraverser *trav, void *data) { pfDCS *dcs = (pfDCS *) trav->getNode(); // get a pointer to SpiderData * sd = (SpiderData*)data; float x=0,y=0,z=0,rot=0; //float x=-0.1,y=0.24,z=0,rot=0; x *= sd->getsx(); y *= sd->getsy(); z *= sd->getsz(); z -= (1 - sd->getsz() )*BOBZCONST; //rot = -190+sd->getleg_rt_amt(); float maxrotate = 30; float rottmp = (pfGetTime()*sd->getwalk_speed()); rottmp += sd->getleg_delay(); while (rottmp > maxrotate) rottmp -= maxrotate; if ( rottmp < maxrotate/2 ) rot -= rottmp; else rot -= maxrotate - rottmp ; rot += sd->getRotZ(); dcs->setTrans( x+sd->getx(), y+sd->gety(), z+sd->getz() ); dcs->setRot(rot,0,0); return PFTRAV_CONT; } void setLoc( float newx, float newy, float newz ) { printf("------> I SHOULDN'T BE USED!!! <------\n"); spider_x = newx; spider_y = newy; spider_z = newz; printInfo(); // update spiderdata's for( int i = 0; i < 9; i++ ) { //printf("before i: %d\n", i); sdata[i]->setLoc(spider_x,spider_y,spider_z); //printf("after i: %d\n\n", i); } } float getx() { return spider_x; } float gety() { return spider_y; } float getz() { return spider_z; } void printInfo() { printf("Spider: printInfo: spider: %d xyz %f %f %f\n", idnum, spider_x, spider_y, spider_z); //for(int i=0;i<9;i++) // { //printf("sdata[%d]: %d\n", i, sdata[i]); //printf("Calling sdata[%d]->printInfo()\n", i); //sdata[i]->printInfo(); // } } //// end main work private: pfGroup *parent; float SPEED; float WALK_SPEED; float LEG_RT_AMT; float LEG0DELAY; float LEG1DELAY; float LEG2DELAY; float LEG3DELAY; float LEG4DELAY; float LEG5DELAY; float LEG6DELAY; float LEG7DELAY; float spider_x,spider_y,spider_z; float spider_sx,spider_sy,spider_sz; int idnum; SpiderData * sdata[9]; }; #endif