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);
}