// includes
#include <stdlib.h>
#include <math.h>
#include <Performer/pf/pfScene.h>
#include <Performer/pf/pfChannel.h>
#include <Performer/pf/pfDCS.h>
#include <Performer/pf/pfGeode.h>
#include <Performer/pr/pfGeoSet.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;
// 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 = new pfScene;
dcs = new pfDCS;
scene->addChild(dcs);
dcs->setTrans(0.0, 100.0, 0.0);
dcs->setScale(50.0);
geode = new pfGeode;
dcs->addChild(geode);
gs = pfdNewCube(pfGetSharedArena());
geode->addGSet(gs);
// attach scene to the CAVELib channels
pfCAVEMasterChan()->setScene(scene);
// start the simulation loop
pfInitClock(0.0);
while (!CAVEgetbutton(CAVE_ESCKEY)) {
// update scene
dcs->setRot(50.0*pfGetTime(), 0.0, 0.0);
// generate next frame
pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame();
}
// halt the CAVE
pfCAVEHalt();
// exit the Performer
pfExit();
// exit the Program
return(0);
}
Diese Makefile kompiliert das obige Beispielprogramm.
TARGET = cube
SRC = $(TARGET).cc
CC = CC
CFLAGS = -mips3 -n32 $(OPT) -I/usr/local/CAVE/include
OPT = -O
DEFS = -DN32 -DIRIX6_5
PERFLIB = -lpfdu_ogl -lpfui -lpfutil_ogl -lpf_ogl
CAVELIB = -L/usr/local/CAVE/lib32 -lpf -lpfcave_ogl -lcave_ogl -lGL -lX11 -lXi -lm
LIBS = -no_unresolved $(CAVELIB) $(PERFLIB)
$(TARGET): $(SRC)
$(CC) $(DEFS) $(CFLAGS) $? -o $@ $(LIBS)
run: $(TARGET)
$(TARGET)
clean:
clobber:
rm -f $(TARGET)
// includes
#include <stdlib.h>
#include <math.h>
#include <Performer/pf/pfScene.h>
#include <Performer/pf/pfChannel.h>
#include <Performer/pf/pfDCS.h>
#include <Performer/pf/pfGeode.h>
#include <Performer/pr/pfGeoSet.h>
#include <Performer/pr/pfGeoState.h>
#include <Performer/pf/pfLightSource.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;
pfGeoState *gstate;
void *arena;
float hpr[3], xyz[3];
// initialise the Performer
pfInit();
// configure the CAVELib
pfCAVEConfig(&argc, argv, NULL);
// configure the Performer
pfConfig();
// initialises the channels and opens the graphic windows
pfCAVEInitChannels();
arena = pfGetSharedArena();
// generate a scene
scene = new pfScene;
// enable lighting and add a lightsource
gstate = new(arena) pfGeoState;
gstate->setMode(PFSTATE_ENLIGHTING, PF_ON);
scene->setGState(gstate);
scene->addChild(new pfLightSource);
dcs = new pfDCS;
scene->addChild(dcs);
dcs->setTrans(0.0, 100.0, 0.0);
dcs->setScale(50.0);
geode = new pfGeode;
dcs->addChild(geode);
gs = pfdNewArrow(10, arena);
geode->addGSet(gs);
// attach scene to the CAVELib channels
pfCAVEMasterChan()->setScene(scene);
// start the simulation loop
while (!CAVEgetbutton(CAVE_ESCKEY)) {
// update scene
// get orientation/position of the controller
pfCAVEGetOrientation(CAVE_WAND, hpr);
pfCAVEGetPosition(CAVE_WAND, xyz);
// set orientation/position of the arrow
dcs->setRot(hpr[2], hpr[0]-90.0, hpr[1]);
dcs->setTrans(xyz[0], xyz[1], xyz[2]);
// generate next frame
pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame();
}
// halt the CAVE
pfCAVEHalt();
// exit the Performer
pfExit();
// exit the Program
return(0);
}
TARGET = arrow
SRC = $(TARGET).cc
CC = CC
CFLAGS = -mips3 -n32 $(OPT) -I/usr/local/CAVE/include
OPT = -O
DEFS = -DN32 -DIRIX6_5
PERFLIB = -lpfdu_ogl -lpfui -lpfutil_ogl -lpf_ogl
CAVELIB = -L/usr/local/CAVE/lib32 -lpf -lpfcave_ogl -lcave_ogl -lGL -lX11 -lXi -lm
LIBS = -no_unresolved $(CAVELIB) $(PERFLIB)
$(TARGET): $(SRC)
$(CC) $(DEFS) $(CFLAGS) $? -o $@ $(LIBS)
run: $(TARGET)
$(TARGET)
// includes
#include <stdlib.h>
#include <math.h>
#include <Performer/pf/pfScene.h>
#include <Performer/pf/pfChannel.h>
#include <Performer/pf/pfDCS.h>
#include <Performer/pf/pfGeode.h>
#include <Performer/pr/pfGeoSet.h>
#include <Performer/pfdu.h>
#include <Performer/pfutil.h>
#include <cave_ogl.h>
#include <pfcave.h>
// globals
void *arena;
// prototypes
pfGeode *makeAxis(void);
// main
int main(int argc, char **argv) {
pfScene *scene;
pfDCS *dcs;
// initialise the Performer
pfInit();
// configure the CAVELib
pfCAVEConfig(&argc, argv, NULL);
// configure the Performer
pfConfig();
// initialises the channels and opens the graphic windows
pfCAVEInitChannels();
arena = pfGetSharedArena();
// generate a scene
scene = new pfScene;
dcs = new pfDCS;
dcs->setScale(50.0);
scene->addChild(dcs);
dcs->addChild(makeAxis());
// attach scene to the CAVELib channels
pfCAVEMasterChan()->setScene(scene);
// start the simulation loop
while (!CAVEgetbutton(CAVE_ESCKEY)) {
// generate next frame
pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame();
}
// halt the CAVE
pfCAVEHalt();
// exit the Performer
pfExit();
// exit the Program
return(0);
}
pfGeode *makeAxis(void) {
pfVec4 *color;
pfVec3 *coords;
pfGeoSet *gs;
pfGeode *geode;
geode = new pfGeode;
gs = new(arena) pfGeoSet;
gs->setPrimType(PFGS_LINES);
gs->setNumPrims(3);
color = (pfVec4 *)pfMalloc(6*sizeof(pfVec4), arena);
coords = (pfVec3 *)pfMalloc(6*sizeof(pfVec3), arena);
// x axis
coords[0].set(-1.0, 0.0, 0.0);
coords[1].set( 1.0, 0.0, 0.0);
color[0].set(0.0, 0.0, 0.0, 1.0);
color[1].set(1.0, 0.0, 0.0, 1.0);
// y axis
coords[2].set(0.0, -1.0, 0.0);
coords[3].set(0.0, 1.0, 0.0);
color[2].set(0.0, 0.0, 0.0, 1.0);
color[3].set(0.0, 1.0, 0.0, 1.0);
// z axis
coords[4].set(0.0, 0.0, -1.0);
coords[5].set(0.0, 0.0, 1.0);
color[4].set(0.0, 0.0, 0.0, 1.0);
color[5].set(0.0, 0.0, 1.0, 1.0);
gs->setAttr(PFGS_COORD3, PFGS_PER_VERTEX, coords, NULL);
// gs->setAttr(PFGS_COLOR4, PFGS_OVERALL, color, NULL);
// gs->setAttr(PFGS_COLOR4, PFGS_PER_PRIM, color, NULL);
gs->setAttr(PFGS_COLOR4, PFGS_PER_VERTEX, color, NULL);
geode->addGSet(gs);
return(geode);
}
TARGET = axis SRC = $(TARGET).cc CC = CC CFLAGS = -mips3 -n32 $(OPT) -I/usr/local/CAVE/include OPT = -O DEFS = -DN32 -DIRIX6_5 PERFLIB = -lpfdu_ogl -lpfui -lpfutil_ogl -lpf_ogl CAVELIB = -L/usr/local/CAVE/lib32 -lpf -lpfcave_ogl -lcave_ogl -lGL -lX11 -lXi -lm LIBS = -no_unresolved $(CAVELIB) $(PERFLIB) $(TARGET): $(SRC) $(CC) $(DEFS) $(CFLAGS) $? -o $@ $(LIBS) run: $(TARGET) ./$(TARGET)
Sourcecode navigate.cc und Makefile.navigate.
// includes
#include <stdlib.h>
#include <math.h>
#include <Performer/pf/pfScene.h>
#include <Performer/pf/pfChannel.h>
#include <Performer/pf/pfDCS.h>
#include <Performer/pf/pfGeode.h>
#include <Performer/pr/pfGeoSet.h>
#include <Performer/pr/pfGeoState.h>
#include <Performer/pf/pfLightSource.h>
#include <Performer/pfdu.h>
#include <Performer/pfutil.h>
#include <cave_ogl.h>
#include <pfcave.h>
// globals
void *arena;
// prototypes
pfGroup *makeArrow(void);
pfGroup *makeChessBoard(int size);
// main
int main(int argc, char **argv) {
pfScene *scene;
pfDCS *dcs, *nav;
pfGeoState *gstate;
pfMatrix matrix;
float hpr[3], xyz[3];
// initialise the Performer
pfInit();
// configure the CAVELib
pfCAVEConfig(&argc, argv, NULL);
// configure the Performer
pfConfig();
// initialises the channels and opens the graphic windows
pfCAVEInitChannels();
arena = pfGetSharedArena();
// generate a scene
scene = new pfScene;
// enable lighting and add a lightsource
gstate = new(arena) pfGeoState;
gstate->setMode(PFSTATE_ENLIGHTING, PF_ON);
scene->setGState(gstate);
scene->addChild(new pfLightSource);
dcs = new pfDCS;
dcs->setScale(50.0);
dcs->addChild(makeArrow());
scene->addChild(dcs);
nav = new pfDCS;
scene->addChild(nav);
// create a simple gemoetry
nav->addChild(makeChessBoard(16));
// attach scene to the CAVELib channels
pfCAVEMasterChan()->setScene(scene);
// start the simulation loop
while (!CAVEgetbutton(CAVE_ESCKEY)) {
pfCAVEDCSWandTransform(dcs);
pfCAVEGetOrientation(CAVE_WAND, hpr);
pfCAVEGetPosition(CAVE_WAND, xyz);
// controller orientation to the left -> rotate scene to the right
if (hpr[2]<-10.0) {
matrix.makeRot(+3.0, 0.0, 0.0, 1.0);
matrix.postTrans(matrix, xyz[0], xyz[1], xyz[2]);
matrix.preTrans(-xyz[0], -xyz[1], -xyz[2], matrix);
matrix.preMult(*(nav->getMatPtr()));
nav->setMat(matrix);
}
// and vice versa
if (hpr[2]>+10.0) {
matrix.makeRot(-3.0, 0.0, 0.0, 1.0);
matrix.postTrans(matrix, xyz[0], xyz[1], xyz[2]);
matrix.preTrans(-xyz[0], -xyz[1], -xyz[2], matrix);
matrix.preMult(*(nav->getMatPtr()));
nav->setMat(matrix);
}
// if button is pressed move forward
if (CAVEBUTTON3) {
matrix.makeTrans(0.0, -10.0, 0.0);
matrix.preMult(*(nav->getMatPtr()));
nav->setMat(matrix);
}
// generate next frame
pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame();
}
// halt the CAVE
pfCAVEHalt();
// exit the Performer
pfExit();
// exit the Program
return(0);
}
// ---------------------------------------------------------------------------
pfGroup *makeArrow(void) {
pfGeode *geode;
pfGeoSet *gs;
pfSCS *scs;
pfMatrix *matrix;
pfVec4 *color;
color = new(arena)pfVec4(0.3, 0.3, 1.0, 1.0);
geode = new pfGeode;
gs = pfdNewArrow(10, arena);
gs->setAttr(PFGS_COLOR4, PFGS_OVERALL, color, NULL);
geode->addGSet(gs);
matrix = new pfMatrix;
matrix->makeRot(-90.0, 1.0, 0.0, 0.0);
scs = new pfSCS(*matrix);
scs->addChild(geode);
return(scs);
}
pfGroup *makeChessBoard(int size) {
pfGeode *blackNode, *whiteNode;
pfGeoSet *blackGS, *whiteGS;
pfVec4 *black, *white;
pfSCS *scs;
pfMatrix *matrix;
pfGroup *group;
group = new pfGroup;
black = new(arena) pfVec4(0.3, 0.3, 1.0, 1.0);
blackNode = new pfGeode;
blackGS = pfdNewCube(arena);
blackGS->setAttr(PFGS_COLOR4, PFGS_OVERALL, black, NULL);
blackNode->addGSet(blackGS);
white = new(arena) pfVec4(1.0, 1.0, 1.0, 1.0);
whiteNode = new pfGeode;
whiteGS = pfdNewCube(arena);
whiteGS->setAttr(PFGS_COLOR4, PFGS_OVERALL, white, NULL);
whiteNode->addGSet(whiteGS);
for (int i=0; i<size; i++)
for (int j=0; j<size; j++) {
matrix = new pfMatrix;
matrix->makeTrans(100.0*(i-size/2), 100.0*(j-size/2), 0.0);
matrix->preScale(99.0, 99.0, 1.0, *matrix);
scs = new pfSCS(*matrix);
if ((i+j+(size%2))%2)
scs->addChild(blackNode);
else
scs->addChild(whiteNode);
group->addChild(scs);
}
return(group);
}