#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 bounce(pfTraverser *trav,void *d); 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); } struct _bounceData { pfVec3 position; pfVec3 velocity; float prevTime; }; static pfNode * animatedObject(char *file) { pfNode *obj; struct _bounceData *data; pfDCS *dcs; obj = pfdLoadFile(file); if (!obj) pfExit(); data = (struct _bounceData *) pfMalloc(sizeof(struct _bounceData)); data->position.set(0, 4, 5); data->velocity.set(-0.4, 0.3, 0); data->prevTime = -1.0; dcs = new pfDCS; dcs->setTravFuncs(PFTRAV_APP,bounce,NULL); dcs->setTravData(PFTRAV_APP,data); dcs->addChild(obj); return dcs; } static int bounce(pfTraverser *trav,void *d) { #define GRAVITY 10.0f pfDCS *dcs = (pfDCS *) trav->getNode(); /* Get a pointer to the DCS node itself */ struct _bounceData *data = (struct _bounceData *) d; float dt = pfGetTime() - data->prevTime; if (dt < 1.0f) { data->position += data->velocity * dt; if (data->position[2] < 0.0) { if (data->velocity[2] < 0) data->velocity[2] *= -1.0f; } else data->velocity[2] -= GRAVITY * dt; } dcs->setTrans(data->position[0],data->position[1],data->position[2]); data->prevTime = pfGetTime(); return PFTRAV_CONT; }