#include #include #include #include #include #include #include #include #include #include "simpleNavigator.h" static void createScene(pfChannel *chan,int argc,char **argv); static pfNode * animatedObject(char *file); static int moveObject(pfTraverser *trav,void *); int main(int argc,char **argv) { pfInit(); simpleNavigator::init(); pfCAVEConfig(&argc,argv,NULL); pfConfig(); pfCAVEInitChannels(); if (CAVEConfig->Simulator) pfCAVEMasterChan()->getFStats()->setClass( PFSTATS_ALL^PFSTATSHW_ENGFXPIPE_FILL, PFSTATS_ON); else pfCAVEMasterChan()->getFStats()->setClass(PFSTATS_ALL, PFSTATS_OFF); createScene(pfCAVEMasterChan(),argc,argv); while (!CAVEgetbutton(CAVE_ESCKEY)) { pfSync(); pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); } pfCAVEHalt(); pfExit(); return 0; } /* createScene() - creates the scene. */ static void createScene(pfChannel *chan,int argc,char **argv) { pfScene *scene; pfGeoState *gstate; simpleNavigator *nav; scene = new pfScene; gstate = new pfGeoState; gstate->setMode(PFSTATE_ENLIGHTING, PF_ON); gstate->setMode(PFSTATE_CULLFACE, PFCF_OFF); scene->setGState(gstate); scene->addChild(new pfLightSource); nav = new simpleNavigator; scene->addChild(nav); if (argc > 1) nav->addChild(animatedObject(argv[1])); if (argc > 2) nav->addChild(pfdLoadFile(argv[2])); chan->setScene(scene); } static pfNode * animatedObject(char *file) { pfNode *obj; pfDCS *dcs; obj = pfdLoadFile(file); if (!obj) pfExit(); dcs = new pfDCS; dcs->setTravFuncs(PFTRAV_APP,moveObject,NULL); dcs->addChild(obj); return dcs; } static int moveObject(pfTraverser *trav,void *) { #define RADIUS 8.0f pfDCS *dcs = (pfDCS *) trav->getNode(); /* Get a pointer to the DCS node itself */ float sine,cosine,sine2,cosine2; pfSinCos(pfGetTime()*90.0f, &sine, &cosine); pfSinCos(pfGetTime()*300.0f, &sine2, &cosine2); dcs->setTrans(cosine*RADIUS, sine*RADIUS, 4.0f * sine2 + 4.0f); return PFTRAV_CONT; }