// References globals: markersNFTCount // Modifies globals: threadHandle, surfaceSet[], surfaceSetCount, markersNFT[] static int loadNFTData(void) { int i; KpmRefDataSet *refDataSet; // If data was already loaded, stop KPM tracking thread and unload previously loaded data. if (threadHandle) { ARLOGi("Reloading NFT data.\n"); unloadNFTData(); } else { ARLOGi("Loading NFT data.\n"); } refDataSet = NULL; for (i = 0; i < markersNFTCount; i++) { // Load KPM data. KpmRefDataSet *refDataSet2; ARLOGi("Reading %s.fset3\n", markersNFT[i].datasetPathname); if (kpmLoadRefDataSet(markersNFT[i].datasetPathname, "fset3", &refDataSet2) < 0 ) { ARLOGe("Error reading KPM data from %s.fset3\n", markersNFT[i].datasetPathname); markersNFT[i].pageNo = -1; continue; } markersNFT[i].pageNo = surfaceSetCount; ARLOGi(" Assigned page no. %d.\n", surfaceSetCount); if (kpmChangePageNoOfRefDataSet(refDataSet2, KpmChangePageNoAllPages, surfaceSetCount) < 0) { ARLOGe("Error: kpmChangePageNoOfRefDataSet\n"); exit(-1); } if (kpmMergeRefDataSet(&refDataSet, &refDataSet2) < 0) { ARLOGe("Error: kpmMergeRefDataSet\n"); exit(-1); } ARLOGi(" Done.\n"); // Load AR2 data. ARLOGi("Reading %s.fset\n", markersNFT[i].datasetPathname); if ((surfaceSet[surfaceSetCount] = ar2ReadSurfaceSet(markersNFT[i].datasetPathname, "fset", NULL)) == NULL ) { ARLOGe("Error reading data from %s.fset\n", markersNFT[i].datasetPathname); } ARLOGi(" Done.\n"); surfaceSetCount++; if (surfaceSetCount == PAGES_MAX) break; } if (kpmSetRefDataSet(kpmHandle, refDataSet) < 0) { ARLOGe("Error: kpmSetRefDataSet\n"); exit(-1); } kpmDeleteRefDataSet(&refDataSet); // Start the KPM tracking thread. threadHandle = trackingInitInit(kpmHandle); if (!threadHandle) exit(-1); ARLOGi("Loading of NFT data complete.\n"); return (TRUE); }
// References globals: markersNFTCount // Modifies globals: trackingThreadHandle, surfaceSet[], surfaceSetCount, markersNFT[], markersNFTCount static void *loadNFTDataAsync(THREAD_HANDLE_T *threadHandle) { int i, j; KpmRefDataSet *refDataSet; while (threadStartWait(threadHandle) == 0) { #ifdef DEBUG LOGE("Loading NFT data.\n"); #endif // If data was already loaded, stop KPM tracking thread and unload previously loaded data. if (trackingThreadHandle) { LOGE("NFT2 tracking thread is running. Stopping it first.\n"); trackingInitQuit(&trackingThreadHandle); detectedPage = -2; } j = 0; for (i = 0; i < surfaceSetCount; i++) { if (j == 0) LOGE("Unloading NFT tracking surfaces."); ar2FreeSurfaceSet(&surfaceSet[i]); // Also sets surfaceSet[i] to NULL. j++; } if (j > 0) LOGE("Unloaded %d NFT tracking surfaces.\n", j); surfaceSetCount = 0; refDataSet = NULL; for (i = 0; i < markersNFTCount; i++) { // Load KPM data. KpmRefDataSet *refDataSet2; LOGI("Reading %s.fset3\n", markersNFT[i].datasetPathname); if (kpmLoadRefDataSet(markersNFT[i].datasetPathname, "fset3", &refDataSet2) < 0 ) { LOGE("Error reading KPM data from %s.fset3\n", markersNFT[i].datasetPathname); markersNFT[i].pageNo = -1; continue; } markersNFT[i].pageNo = surfaceSetCount; LOGI(" Assigned page no. %d.\n", surfaceSetCount); if (kpmChangePageNoOfRefDataSet(refDataSet2, KpmChangePageNoAllPages, surfaceSetCount) < 0) { LOGE("Error: kpmChangePageNoOfRefDataSet\n"); exit(-1); } if (kpmMergeRefDataSet(&refDataSet, &refDataSet2) < 0) { LOGE("Error: kpmMergeRefDataSet\n"); exit(-1); } LOGI(" Done.\n"); // Load AR2 data. LOGI("Reading %s.fset\n", markersNFT[i].datasetPathname); if ((surfaceSet[surfaceSetCount] = ar2ReadSurfaceSet(markersNFT[i].datasetPathname, "fset", NULL)) == NULL ) { LOGE("Error reading data from %s.fset\n", markersNFT[i].datasetPathname); } LOGI(" Done.\n"); surfaceSetCount++; if (surfaceSetCount == PAGES_MAX) break; } if (kpmSetRefDataSet(kpmHandle, refDataSet) < 0) { LOGE("Error: kpmSetRefDataSet"); exit(-1); } kpmDeleteRefDataSet(&refDataSet); // Start the KPM tracking thread. trackingThreadHandle = trackingInitInit(kpmHandle); if (!trackingThreadHandle) exit(-1); #ifdef DEBUG LOGI("Loading of NFT data complete."); #endif threadEndSignal(threadHandle); // Signal that we're done. } return (NULL); // Exit this thread. }
static int init( int argc, char *argv[] ) { ARGViewport viewport; char *filename = NULL; int xmax, ymax; float xzoom, yzoom; float zoom; int i, display_defaults = 1; for( i = 1; i < argc; i++ ) { if (strcmp(argv[i], "-fset") == 0) { display_defaults = 0; display_fset = 1; } else if( strcmp(argv[i], "-fset2") == 0 ) { display_defaults = 0; display_fset2 = 1; } else if( filename == NULL ) filename = argv[i]; else usage(argv[0] ); } if (!filename || !filename[0]) usage(argv[0]); if (display_defaults) display_fset = display_fset2 = 1; ARLOG("Read ImageSet.\n"); ar2UtilRemoveExt( filename ); imageSet = ar2ReadImageSet( filename ); if( imageSet == NULL ) { ARLOGe("file open error: %s.iset\n", filename ); exit(0); } ARLOG(" end.\n"); if (display_fset) { ARLOG("Read FeatureSet.\n"); featureSet = ar2ReadFeatureSet( filename, "fset" ); if( featureSet == NULL ) { ARLOGe("file open error: %s.fset\n", filename ); exit(0); } ARLOG(" end.\n"); } if (display_fset2) { ARLOG("Read FeatureSet2.\n"); kpmLoadRefDataSet( filename, "fset2", &refDataSet ); if( refDataSet == NULL ) { ARLOGe("file open error: %s.fset2\n", filename ); exit(0); } ARLOG(" end.\n"); ARLOG("num = %d\n", refDataSet->num); } arMalloc(vp, ARGViewportHandle *, imageSet->num); xmax = ymax = 0; for( i = 0; i < imageSet->num; i++ ) { if( imageSet->scale[i]->xsize > xmax ) xmax = imageSet->scale[i]->xsize; if( imageSet->scale[i]->ysize > ymax ) ymax = imageSet->scale[i]->ysize; } xzoom = yzoom = 1.0; while( xmax > winXsize*xzoom ) xzoom += 1.0; while( ymax > winYsize*yzoom ) yzoom += 1.0; if( xzoom > yzoom ) zoom = 1.0/xzoom; else zoom = 1.0/yzoom; winXsize = xmax * zoom; winYsize = ymax * zoom; ARLOG("Size = (%d,%d) Zoom = %f\n", xmax, ymax, zoom); argCreateWindow( winXsize, winYsize ); for( i = 0; i < imageSet->num; i++ ) { viewport.sx = viewport.sy = 0; viewport.xsize = imageSet->scale[i]->xsize * zoom; viewport.ysize = imageSet->scale[i]->ysize * zoom; vp[i] = argCreateViewport( &viewport ); argViewportSetImageSize( vp[i], imageSet->scale[i]->xsize, imageSet->scale[i]->ysize ); argViewportSetDispMethod( vp[i], AR_GL_DISP_METHOD_TEXTURE_MAPPING_FRAME ); //argViewportSetDispMethod( vp[i], AR_GL_DISP_METHOD_GL_DRAW_PIXELS ); argViewportSetDispMode( vp[i], AR_GL_DISP_MODE_FIT_TO_VIEWPORT ); argViewportSetDistortionMode( vp[i], AR_GL_DISTORTION_COMPENSATE_DISABLE ); } reportCurrentDPI(); return 0; }