#include #include #include #include #include #include #include #include #include pfDCS * create_scene(pfChannel *chan,int argc,char **argv); void load_objects(int argc,char **argv,pfGroup *parent); void navigate(pfDCS *dcs); 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; } #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; if (argc < 2) { fprintf(stderr,"Usage: %s objectfiles\n",argv[0]); pfExit(); exit(1); } for (i=1; iaddChild(obj); else { pfExit(); exit(-1); } } }