#include #include #include #include #include #include #include #include #include #include static void createScene(pfChannel *chan,int argc,char **argv); static void loadObjects(int argc,char **argv,pfGroup *parent); static int navigate(pfTraverser *trav,void *data); int main(int argc,char **argv) { pfInit(); pfCAVEConfig(&argc,argv,NULL); pfConfig(); pfCAVEInitChannels(); if (CAVEConfig->Simulator) pfCAVEMasterChan()->getFStats()->setClass( PFSTATS_ALL^PFSTATSHW_ENGFXPIPE_FILL, PFSTATS_ON); else pfCAVEMasterChan()->getFStats()->setClass(PFSTATS_ALL, PFSTATS_OFF); pfCAVEMasterChan()->setLODAttr(PFLOD_FADE, 10.0f); /* Enable LOD fades */ createScene(pfCAVEMasterChan(),argc,argv); while (!CAVEgetbutton(CAVE_ESCKEY)) { pfSync(); pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); } pfCAVEHalt(); pfExit(); return 0; } static void createScene(pfChannel *chan,int argc,char **argv) { pfScene *scene; pfGeoState *gstate; pfDCS *dcs; scene = new pfScene; gstate = new pfGeoState; gstate->setMode(PFSTATE_ENLIGHTING, PF_ON); gstate->setMode(PFSTATE_CULLFACE, PFCF_OFF); scene->setGState(gstate); scene->addChild(new pfLightSource); dcs = new pfDCS; scene->addChild(dcs); dcs->setTravFuncs(PFTRAV_APP,navigate,NULL); loadObjects(argc,argv,dcs); chan->setScene(scene); } static void loadObjects(int argc,char **argv,pfGroup *parent) { int i; pfNode *obj; pfVec3 origin(0,0,0); pfLOD *lod = new pfLOD; lod->setCenter(origin); lod->setRange(0,0.1f); for (i=1; iaddChild(obj); lod->setRange(i,i*40.0f); /* Space the levels 40 feet apart */ lod->setTransition(i,10.0f); } else pfExit(); } lod->setRange(i-1,100000.0f); parent->addChild(lod); } static int navigate(pfTraverser *trav,void *) { #define SPEED 1.0f pfDCS *navDcs = (pfDCS *) trav->getNode(); float jx=CAVE_JOYSTICK_X,jy=CAVE_JOYSTICK_Y; if (fabs(jx) > 0.07) CAVENavRot(-1.0f*jx,'z'); if (fabs(jy) > 0.07) { float w[3]; CAVEGetVector(CAVE_WAND_FRONT,w); CAVENavTranslate(w[0]*jy*SPEED,w[1]*jy*SPEED,w[2]*jy*SPEED); } if ((CAVEBUTTON1) && (CAVEBUTTON3)) CAVENavLoadIdentity(); pfCAVEDCSNavTransform(navDcs); return PFTRAV_CONT; }