/**** pfspeed - simple Performer/CAVE speed test by Dave Pape (pape@evl.uic.edu) *****/ #include #include #include #include #include #include #include #include #include "pfcave.h" #define NUM_TESTS 4 float getRate(void); float getBestRate(int numIterations); 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) { int i,frames; float startTime, endTime; CAVENear = .1; CAVEFar = 1000; pfInit(); // pfMultiprocess(PFMP_APPCULLDRAW); pfCAVEConfig(&argc,argv,NULL); if (argc > 1) pfdInitConverter(argv[1]); pfConfig(); pfCAVEInitChannels(); create_scene(pfCAVEMasterChan(),argc,argv); define_earthsky(pfCAVEMasterChan()); pfCAVEMasterChan()->getFStats()->setClass(PFSTATS_ALL, PFSTATS_OFF); printf("%.2f frames/sec\n",getBestRate(NUM_TESTS)); pfCAVEHalt(); pfExit(); return 0; } float getRate(void) { int frames; float startTime, endTime; endTime = pfGetTime(); startTime = pfGetTime(); frames = 0; while ((endTime - startTime < 2.0f) || (frames < 10)) { pfSync(); pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); endTime = pfGetTime(); frames++; } return frames / (endTime - startTime); } float getBestRate(int numIterations) { int i; float best,speed; for (i=0; i < 10; i++) { pfSync(); pfCAVEPreFrame(); pfFrame(); pfCAVEPostFrame(); } best = getRate(); for (i=1; i < numIterations; i++) { speed = getRate(); if (speed > best) best = speed; } return best; } void create_scene(pfChannel *chan,int argc,char **argv) { pfScene *scene = new pfScene; pfGeoState *gstate = new pfGeoState; pfGroup *group = new pfGroup; pfLightSource *light = new pfLightSource; gstate->setMode(PFSTATE_ENLIGHTING, PF_ON); gstate->setMode(PFSTATE_CULLFACE, PFCF_BACK); scene->setGState(gstate); light->setPos(0.5, -1.0, 1.0, 0.0); scene->addChild(light); scene->addChild(group); load_objects(argc,argv,group); chan->setScene(scene); } void load_objects(int argc,char **argv,pfGroup *parent) { int i; pfNode *obj; for (i=1; iaddChild(obj); else { pfExit(); exit(-1); } } } void define_earthsky(pfChannel *chan) { pfEarthSky *esky = new pfEarthSky(); esky->setColor(PFES_CLEAR, 0.3,0.5,1.0,0.0); chan->setESky(esky); }