#include #include #include #include #include #include #include #include #include #include void create_scene(pfChannel *chan,int argc,char **argv); void load_objects(int argc,char **argv,pfGroup *parent); int navigate(pfTraverser *trav,void *data); int main(int argc,char **argv) { pfInit(); pfCAVEConfig(&argc,argv,NULL); CAVEFar = 1000; pfConfig(); pfCAVEInitChannels(); create_scene(pfCAVEMasterChan(),argc,argv); while (!CAVEgetbutton(CAVE_ESCKEY)) { pfSync(); pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); } pfCAVEHalt(); pfExit(); return 0; } #define SPEED 2.0f int navigate(pfTraverser *trav,void *) { pfDCS *nav_dcs = (pfDCS *) trav->getNode(); 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(nav_dcs); return PFTRAV_CONT; } void 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); dcs->setTravFuncs(PFTRAV_APP,navigate,NULL); load_objects(argc,argv,dcs); chan->setScene(scene); } void load_objects(int argc,char **argv,pfGroup *parent) { int i; pfNode *obj; if (argc < 2) { fprintf(stderr,"Usage: %s objectfiles\n",argv[0]); pfExit(); exit(1); } for (i=1; iaddChild(obj); else { pfExit(); exit(-1); } } }