pfCAVE Navigation Example

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


Previous page    Table of contents    Next page

Last modified 5 February 1996.

Dave Pape, pape@evl.uic.edu