#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