#include #include #include #include #include #include #include #include #include #include #include void create_scene(pfChannel *chan); int navigate(pfTraverser *trav,void *); int add_primitive(pfTraverser *trav,void *); int main(int argc,char **argv) { pfInit(); pfCAVEConfig(&argc,argv,NULL); CAVEFar = 1000; pfConfig(); pfCAVEInitChannels(); create_scene(pfCAVEMasterChan()); while (!CAVEgetbutton(CAVE_ESCKEY)) { pfSync(); pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); } pfCAVEHalt(); pfExit(); return 0; } int add_primitive(pfTraverser *trav,void *) { pfGroup *parent = (pfGroup *) trav->getNode(); pfGeoSet *object=NULL; if (CAVEButtonChange(1) == -1) object = pfdNewCube(pfGetSharedArena()); else if (CAVEButtonChange(2) == -1) object = pfdNewCylinder(32,pfGetSharedArena()); else if (CAVEButtonChange(3) == -1) object = pfdNewArrow(24,pfGetSharedArena()); if (object) { pfMatrix wandmatrix; pfGeode *geode = new pfGeode; float wandpos[3],wandori[3],*colors; colors = (float *)pfMalloc(4*sizeof(float),pfGetSharedArena()); colors[0] = drand48(); colors[1] = drand48(); colors[2] = drand48(); colors[3] = 1.0; object->setAttr(PFGS_COLOR4,PFGS_OVERALL,colors,NULL); CAVEGetPosition(CAVE_WAND_NAV,wandpos); CAVEGetOrientation(CAVE_WAND_NAV,wandori); wandmatrix.makeEuler(wandori[2],wandori[0],-wandori[1]); wandmatrix.postTrans(wandmatrix,wandpos[0],wandpos[1],wandpos[2]); pfdXformGSet(object,wandmatrix); geode->addGSet(object); parent->addChild(geode); } return PFTRAV_CONT; } #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); } pfCAVEDCSNavTransform(nav_dcs); return PFTRAV_CONT; } void create_scene(pfChannel *chan) { pfScene *scene = new pfScene; pfGeoState *gstate = new pfGeoState; pfDCS *dcs = new pfDCS; pfGroup *group = new pfGroup; 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); dcs->addChild(group); group->setTravFuncs(PFTRAV_APP,add_primitive,NULL); chan->setScene(scene); }