#include #include #include #include #include #include #include #include #include #include #include "pfcave.h" pfDCS * create_scene(pfChannel *chan,int argc,char **argv); void load_objects(int argc,char **argv,pfGroup *parent); void navigate(pfDCS *dcs); int update_seq(pfTraverser *trav,void *); int main(int argc,char **argv) { pfDCS *nav_dcs; pfInit(); pfCAVEConfig(&argc,argv,NULL); CAVEFar = 1000; pfConfig(); pfCAVEInitChannels(); nav_dcs = create_scene(pfCAVEMasterChan(),argc,argv); while (!CAVEgetbutton(CAVE_ESCKEY)) { pfSync(); pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); navigate(nav_dcs); } pfCAVEHalt(); pfExit(); return 0; } int update_seq(pfTraverser *trav,void *) { pfSequence *seq = (pfSequence *) trav->getNode(); if (CAVEButtonChange(1) == -1) { int mode = seq->getMode(); switch (mode) { case PFSEQ_START: case PFSEQ_RESUME: seq->setMode(PFSEQ_PAUSE); break; case PFSEQ_STOP: seq->setMode(PFSEQ_START); break; case PFSEQ_PAUSE: seq->setMode(PFSEQ_RESUME); break; } } return PFTRAV_CONT; } #define SPEED 2.0f void navigate(pfDCS *dcs) { float jx=CAVE_JOYSTICK_X,jy=CAVE_JOYSTICK_Y; if (fabs(jx) > 0.2) CAVENavRot(1.0f*jx,'z'); if (fabs(jy) > 0.2) { float w[3]; CAVEGetVector(CAVE_WAND_FRONT,w); CAVENavTranslate(w[0]*jy*SPEED,w[1]*jy*SPEED,w[2]*jy*SPEED); } if (CAVEBUTTON3) CAVENavLoadIdentity(); pfCAVEDCSNavTransform(dcs); } pfDCS * create_scene(pfChannel *chan,int argc,char **argv) { pfScene *scene = new pfScene; pfGeoState *gstate = new pfGeoState; pfDCS *dcs = new pfDCS; gstate->setMode(PFSTATE_ENLIGHTING, PF_ON); gstate->setMode(PFSTATE_CULLFACE, PFCF_OFF); scene->setGState(gstate); scene->addChild(new pfLightSource); scene->addChild(dcs); load_objects(argc,argv,dcs); chan->setScene(scene); return dcs; } void load_objects(int argc,char **argv,pfGroup *parent) { int i; pfNode *obj; pfSequence *seq; if (argc < 2) { fprintf(stderr,"Usage: %s objectfiles\n",argv[0]); pfExit(); exit(1); } seq = new pfSequence; for (i=1; iaddChild(obj); seq->setTime(i-1, 1.0); } else { pfExit(); exit(-1); } } seq->setDuration(1.0,-1); seq->setMode(PFSEQ_START); seq->setTravFuncs(PFTRAV_APP,update_seq,NULL); parent->addChild(seq); }