#include "bvvfc.hpp" #include "obbtree.hpp" #include "sphrtree.hpp" #include "aabbtree.hpp" #include "makevrml.hpp" #define BVTREE OBBtree // BOUNDING-VOLUME TREE TYPE BEING USED //VRML Vrml("output.wrl", _VRML_); VRML Vrml("output.iv", _OPENINVENTOR_); //---------------------------------------------------------------------- // USER-SUPPLIED CALLBACK FUNCTIONS FOR COMPLETE AND PARTIALLY OVERLAPPING BVs //---------------------------------------------------------------------- void UseCompleteInBVs(BVtree* BVt) { Vrml.DrawBV((BVTREE*)BVt); } void UsePartialBVs(BVtree* BVt) { Vrml.DrawBV((BVTREE*)BVt); } void UseCompleteOutBVs(BVtree* BVt) { /*Vrml.DrawBV(obbt);*/ } void UseVisitedBVs(BVtree* BVt) { /*Vrml.DrawBV(obbt);*/ } //---------------------------------------------------------------------- // READS IN AN ANIMATION PATH FILE (SEQ OF CAM AXES AND POS); USED AS A // TEST DRIVER FOR THE VFC. RETURNS THE # OF FRAMES OF ANIMATION READ. //---------------------------------------------------------------------- float ReadInPath(char* FileName, BVtree* BVt, Camera* Cam, ViewFrustum* VF, BVvfc* VFC) { printf("Reading in animation path [%s]. . .", FileName); float NumFrames=0; Vect3d CamOrig,CamX,CamY,CamZ; FILE* fp = fopen(FileName,"r"); if (fp==NULL) { printf("ERROR: Cannot open path file [%s]!", FileName); } while(fscanf(fp, "%f %f %f", &CamOrig.x, &CamOrig.y, &CamOrig.z) != EOF) { fscanf(fp, "%f %f %f", &CamX.x, &CamX.y, &CamX.z); fscanf(fp, "%f %f %f", &CamY.x, &CamY.y, &CamY.z); fscanf(fp, "%f %f %f", &CamZ.x, &CamZ.y, &CamZ.z); // MUST DO SOMETHING LIKE THIS FOR EACH NEW FRAME OF ANIMATION Cam->SetOrig(CamOrig); Cam->SetAxes(CamX,CamY,CamZ); VF->Update(Cam); VFC->CullBVtree(BVt); Vrml.DrawViewFrustum(*VF); NumFrames++; } fclose(fp); printf("DONE!\n"); return(NumFrames); } #ifdef STATS_ON //---------------------------------------------------------------------- // PRINT OUT STATS //---------------------------------------------------------------------- void PrintStats(BVtree* BVt, BVvfc* VFC, float NumFrames) { if (NumFrames == 0) { printf("NO ANIMATION FRAMES!\n"); return; } printf("VFC:\n"); printf(" Animation Frames : %.0f\n", NumFrames); printf("BVtree:\n"); printf(" Min Objs in BV : %.0f\n", BVt->MINOBJSLIMIT); printf(" Total Num BVs : %.0f\n", BVt->_TotalBVs_); printf("Num nodes visited : %.0f\n", VFC->_NumBVvisited_/NumFrames); printf(" Overlap Tests : %.2f\n", BVt->_NumBVtests_/NumFrames); printf(" Overlapping : %.2f\n", (VFC->_NumBVcompleteIn_+VFC->_NumBVpartial_)/NumFrames); printf(" CompleteIn : %.2f", VFC->_NumBVcompleteIn_/NumFrames); printf(" --> NumObjs : %.2f\n", VFC->_NumBVcompleteInObjs_/NumFrames); printf(" Partial : %.2f", VFC->_NumBVpartial_/NumFrames); printf(" --> NumObjs : %.2f\n", VFC->_NumBVpartialObjs_/NumFrames); printf(" CompleteOut : %.2f", VFC->_NumBVcompleteOut_/NumFrames); printf(" --> NumObjs : %.2f\n", VFC->_NumBVcompleteOutObjs_/NumFrames); printf("OBJs:\n"); printf(" Total Num : %d\n", BVt->NumObjs); } #endif void main() { // READ INITIALIZATION PARAMETERS FROM "init.dat" char ModelFile[60], PathFile[60]; int MinObjs; float Near, Far; FILE* fp = fopen("init.dat","r"); if (fp==NULL) { printf("ERROR: no init.dat file present!\n"); }; fscanf(fp, " ModelFile: %s", ModelFile); fscanf(fp, " MinObjs: %d", &MinObjs); fscanf(fp, " Near: %f", &Near); fscanf(fp, " Far: %f", &Far); fscanf(fp, " PathFile: %s", PathFile); fclose(fp); // CREATE AND INITIALIZE THE CAMERA Camera Cam; Cam.SetNearFar(Near, Far); // CREATE AND INITIALIZE THE VIEW-FRUSTUM ViewFrustum VF; // CREATE AND INITIALIZE THE VIEW-FRUSTUM CULLER BVvfc VFC; VFC.SetViewFrustum(&VF); VFC.SetCallBackCompleteInBV(UseCompleteInBVs); VFC.SetCallBackPartialBV(UsePartialBVs); VFC.SetCallBackCompleteOutBV(UseCompleteOutBVs); VFC.SetCallBackVisitedBV(UseVisitedBVs); // CREATE THE OBJECT LIST AND BOUNDING-VOLUME TREE PtSetObjList* OL = new PtSetObjList(ModelFile); // CREATE THE OBJECT LIST BVTREE BVt(OL, MinObjs); // BUILD THE TREE delete OL; // DELETE THE OBJECT LIST (OPTIONAL) // READ IN ANIMATION PATH FILE (CULL ALONG PATH AND GATHER STATS) float NumFrames = ReadInPath(PathFile, &BVt, &Cam, &VF, &VFC); #ifdef STATS_ON PrintStats(&BVt, &VFC, NumFrames); #endif }