Ein kurzes Programm, das einen sich drehenden Wuerfel in die Mitte des CAVEs zeichnet.
/* includes*/ #include <stdlib.h> #include <math.h> #include <Performer/pf.h> #include <Performer/pfdu.h> #include <Performer/pfutil.h> #include <cave_ogl.h> #include <pfcave.h> /* main */ int main(int argc, char **argv) { pfScene *scene; pfDCS *dcs; pfGeode *geode; pfGeoSet *gs; pfChannel *chan; char name[80]; /* initialise the Performer */ pfInit(); /* configure the CAVELib */ pfCAVEConfig(&argc, argv, NULL); /* configure the Performer */ pfConfig(); /* initialises the Channels and opens the graphic windows */ pfCAVEInitChannels(); /* generate a scene */ scene = pfNewScene(); dcs = pfNewDCS(); pfAddChild(scene, dcs); pfDCSTrans(dcs, 0.0, 100.0, 0.0); pfDCSScale(dcs, 50.0); geode = pfNewGeode(); pfAddChild(dcs, geode); gs = pfdNewCube(pfGetSharedArena()); pfAddGSet(geode, gs); /* attach scene to the CAVELib channels */ chan = pfCAVEMasterChan(); pfChanScene(chan, scene); /* start the simulation loop */ pfInitClock(0.0); while (!CAVEgetbutton(CAVE_ESCKEY)) { /* update scene */ pfDCSRot(dcs, 50.0*pfGetTime(), 0.0, 0.0); /* generate next frame */ pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); } /* halt the CAVELib */ pfCAVEHalt(); /* exit the Performer */ pfExit(); /* exit the Program */ return(0); }
Die CAVELib-Bibliotheken liegen im den Verzeichnissen /usr/local/CAVE/lib, /usr/local/CAVE/lib32 und /usr/local/CAVE/lib64. Je nachdem welche Art von Code erzeugt werden soll (-o32, -n32 oder -64), muß dem Compiler der jeweilige Pfad übergeben werden, mit zum Beispiel: -L/usr/local/CAVE/lib32.
Die folgenden CAVELib/OpenGL-Bibliotheken müssen zu einem ausführbaren Programm gelinkt werden: -lpfcave_ogl -lcave_ogl -lGL -lX11 -lXi -lm
Die folgenden Performer-Bibliotheken müssen zu einem ausführbaren Programm gelinkt werden: -lpfdu_ogl -lpfui -lpfutil_ogl -lpf_ogl
Diese Makefile kompiliert das obige Beispielprogramm.
TARGET = cube SRC = $(TARGET).c CC = cc CFLAGS = -mips3 -n32 $(OPT) -I/usr/local/CAVE/include OPT = -O DEFS = -DN32 -DIRIX6_5 CAVELIB = -L/usr/local/CAVE/lib32 -lpf -lpfcave_ogl -lcave_ogl -lGL -lX11 -lXi -lm PERFLIB = -lpfdu_ogl -lpfui -lpfutil_ogl -lpf_ogl LIBS = -no_unresolved $(CAVELIB) $(PERFLIB) $(TARGET): $(SRC) $(CC) $(DEFS) $(CFLAGS) $? -o $@ $(LIBS) run: $(TARGET) $(TARGET) clean: clobber: rm -f $(TARGET)
Das folgende Programm kann eine Geometrie im Inventor- (.iv) und im VRML2-Format (.wrl) laden und zeigt diese dann im CAVE an.
Sourcecode zu loader.c und das dazugehörige Makefile.loader.
/* includes*/ #include <stdlib.h> #include <math.h> #include <Performer/pf.h> #include <Performer/pfdu.h> #include <Performer/pfutil.h> #include <cave_ogl.h> #include <pfcave.h> /* globals */ /* prototypes */ /* main */ int main(int argc, char **argv) { pfScene *scene; pfDCS *dcs; pfGeode *geode; pfGeoSet *gs; pfChannel *chan; char *name; pfNode *node; pfSphere bsphere; pfGeoState *gstate; if (argc!=2) { fprintf(stderr, "usage: load filename\n\n"); return(1); } name = argv[1]; /* initialise the Performer */ pfInit(); /* configure the CAVELib */ pfCAVEConfig(&argc, argv, NULL); /* initialise the converter for the filetypes to load */ pfdInitConverter("iv"); pfdInitConverter("wrl"); /* configure the Performer */ pfConfig(); /* initialise the channels and open the graphic windows */ pfCAVEInitChannels(); /* generate a scene */ scene = pfNewScene(); /* enable and add lightsource to scene */ gstate = pfNewGState(pfGetSharedArena()); pfGStateMode(gstate, PFSTATE_ENLIGHTING, PF_ON); pfSceneGState(scene, gstate); pfAddChild(scene, pfNewLSource()); dcs = pfNewDCS(); pfAddChild(scene, dcs); pfDCSTrans(dcs, 0.0, 100.0, 0.0); node=pfdLoadFile(name); if (!node) { fprintf(stderr, "could not load file'%s'\n", name); exit(1); } pfAddChild(dcs, node); pfNodeBSphere(node, NULL, PFBOUND_STATIC); pfGetNodeBSphere(node, &bsphere); if (bsphere.radius>0.0) pfDCSScale(dcs, 50.0/bsphere.radius); fprintf(stderr, "load: bsphere.radius %ff\n", bsphere.radius); /* attach scene to the CAVELib channels */ chan = pfCAVEMasterChan(); pfChanScene(chan, scene); /* start the simulation loop */ pfInitClock(0.0); while (!CAVEgetbutton(CAVE_ESCKEY)) { /* update scene */ pfDCSRot(dcs, 50.0*pfGetTime(), 0.0, 0.0); /* generate next frame */ pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); } /* halt the CAVELib */ pfCAVEHalt(); /* exit the Performer */ pfExit(); /* exit the Program */ return(0); }