#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <Performer/pf/pfChannel.h> #include <Performer/pf/pfEarthSky.h> #include <Performer/pf/pfLightSource.h> #include <Performer/pf/pfDCS.h> #include <Performer/pfdu.h> #include <pfcave.h> pfDCS * create_scene(pfChannel *chan,int argc,char **argv); void load_objects(int argc,char **argv,pfGroup *parent); void define_earthsky(pfChannel *chan); void navigate(pfDCS *dcs); int main(int argc,char **argv) { pfDCS *nav_dcs; pfInit(); pfCAVEConfig(&argc,argv,NULL); CAVEFar = 1000; pfConfig(); pfCAVEInitChannels(); /* Create the scene with a DCS at the top */ nav_dcs = create_scene(pfCAVEMasterChan(),argc,argv); define_earthsky(pfCAVEMasterChan()); while (!CAVEgetbutton(CAVE_ESCKEY)) { pfSync(); pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); /* Update the navigation */ navigate(nav_dcs); } CAVEHalt(); pfExit(); return 0; } #define SPEED 2.0f void navigate(pfDCS *dcs) { /* Do normal CAVE navigation */ 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(); /* Store the CAVE navigation in the DCS */ 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; i<argc; i++) { if (obj = pfdLoadFile(argv[i])) parent->addChild(obj); else { pfExit(); exit(-1); } } } void define_earthsky(pfChannel *chan) { pfEarthSky *esky = new pfEarthSky(); esky->setMode(PFES_BUFFER_CLEAR, PFES_SKY_GRND); esky->setAttr(PFES_GRND_HT, 0.0f); esky->setColor(PFES_GRND_FAR, 0.3f, 0.1f, 0.0f, 1.0f); esky->setColor(PFES_GRND_NEAR, 0.5f, 0.3f, 0.1f, 1.0f); chan->setESky(esky); }
Last modified 5 February 1996.
Dave Pape, pape@evl.uic.edu