#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/pfGroup.h> #include <Performer/pfdu.h> #include <pfcave.h> void create_scene(pfChannel *chan,int argc,char **argv); void load_objects(int argc,char **argv,pfGroup *parent); void define_earthsky(pfChannel *chan); int main(int argc,char **argv) { pfInit(); pfCAVEConfig(&argc,argv,NULL); pfConfig(); pfCAVEInitChannels(); create_scene(pfCAVEMasterChan(),argc,argv); define_earthsky(pfCAVEMasterChan()); while (!getbutton(ESCKEY)) { pfSync(); pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); } CAVEHalt(); pfExit(); return 0; } void create_scene(pfChannel *chan,int argc,char **argv) { /* Create a pfScene */ pfScene *scene = new pfScene; pfGeoState *gstate = new pfGeoState; pfGroup *group = new pfGroup; /* Set up the default GeoState */ gstate->setMode(PFSTATE_ENLIGHTING, PF_ON); gstate->setMode(PFSTATE_CULLFACE, PFCF_OFF); scene->setGState(gstate); /* Add a light with default settings */ scene->addChild(new pfLightSource); /* Add the group, and load the objects under it */ scene->addChild(group); load_objects(argc,argv,group); /* Assign the scene to the display channel */ chan->setScene(scene); } 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); } /* Load the object files, and put them under the parent group */ 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