struct OBJ_Model * loadObj(char * directory,char * filename /*This does not have a .obj extension*/,int compileDisplayList) { fprintf(stderr,"Starting to load OBJ file %s \n",filename); struct OBJ_Model * obj = ( struct OBJ_Model * ) malloc(sizeof(struct OBJ_Model)); if ( obj == 0 ) { fprintf(stderr,"Could not allocate enough space for model %s \n",filename); return 0; } memset (obj,0,sizeof(struct OBJ_Model)); obj->scale=1.0f; unsigned int directory_length = strlen(directory); if (directory_length > MAX_MODEL_PATHS ) { fprintf(stderr,"Huge directory filename provided , will not loadObject ( %u char limit ) \n",MAX_MODEL_PATHS); free(obj); return 0; } strncpy(obj->directory, directory, MAX_MODEL_PATHS ); unsigned int file_name_length = strlen(filename); if (file_name_length > MAX_MODEL_PATHS ) { fprintf(stderr,"Huge filename provided , will not loadObject ( %u char limit ) \n",MAX_MODEL_PATHS); free(obj); return 0; } strncpy(obj->filename, filename, MAX_MODEL_PATHS ); if (!readOBJ(obj) ) { fprintf(stderr," Could not read object %s \n",filename); unloadObj(obj); return 0;} if (!calculateBoundingBox(obj)) { fprintf(stderr," Could not calculate bounding box for object %s \n",filename); unloadObj(obj); return 0;} if (!prepareObject(obj)) { fprintf(stderr," Could not prepare object %s \n",filename); unloadObj(obj); return 0;} if (!calculateBoundingBox(obj)) { fprintf(stderr," Could not calculate bounding box for object %s \n",filename); unloadObj(obj); return 0;} if (compileDisplayList) { compileOBJList(obj); } return obj; }
void unloadModel(struct Model * mod) { if (mod == 0 ) { return ; } switch ( mod->type ) { case OBJMODEL : unloadObj( (struct OBJ_Model * ) mod->model); break; }; }
int main (int argc, char *argv[]) { testfun *f; int i, r; RtsConfig conf = defaultRtsConfig; conf.rts_opts_enabled = RtsOptsAll; hs_init_ghc(&argc, &argv, conf); initLinker_(0); loadPackages(); for (i=0; i < ITERATIONS; i++) { r = loadObj(OBJPATH); if (!r) { errorBelch("loadObj(%s) failed", OBJPATH); exit(1); } r = resolveObjs(); if (!r) { errorBelch("resolveObjs failed"); exit(1); } #if LEADING_UNDERSCORE f = lookupSymbol("_f"); #else f = lookupSymbol("f"); #endif if (!f) { errorBelch("lookupSymbol failed"); exit(1); } r = f(3); if (r != 4) { errorBelch("call failed; %d", r); exit(1); } unloadObj(OBJPATH); performMajorGC(); printf("%d ", i); fflush(stdout); } for (i=0; i < ITERATIONS; i++) { r = loadObj(OBJPATH); if (!r) { errorBelch("loadObj(%s) failed", OBJPATH); exit(1); } r = resolveObjs(); if (!r) { errorBelch("resolveObjs failed"); exit(1); } #if LEADING_UNDERSCORE f = lookupSymbol("_f"); #else f = lookupSymbol("f"); #endif if (!f) { errorBelch("lookupSymbol failed"); exit(1); } r = f(3); if (r != 4) { errorBelch("call failed; %d", r); exit(1); } // check that we can purge first, then unload purgeObj(OBJPATH); performMajorGC(); unloadObj(OBJPATH); performMajorGC(); printf("%d ", i); fflush(stdout); } hs_exit(); exit(0); }