bool GfTrack::load() const { // Check if the track loader is ready. ITrackLoader* piTrackLoader = GfTracks::self()->getTrackLoader(); if (!piTrackLoader) { GfLogError("Track loader not yet initialized ; failed to load any track\n"); return false; } // Load track data from the XML file. tTrack* pTrack = piTrackLoader->load(_strDescFile.c_str()); if (!pTrack) { GfLogWarning("Unusable track %s : failed to build track data from %s\n", _strId.c_str(), _strDescFile.c_str()); return false; } // Check if the track 3D model file exists. std::ostringstream ossFileName; ossFileName << "tracks/" << _strCatId << '/' << _strId << '/' << (pTrack->graphic.model3d ? pTrack->graphic.model3d : "track.ac"); if (!GfFileExists(ossFileName.str().c_str())) { GfLogWarning("Unusable track %s : could not find 3D model %s\n", _strId.c_str(), ossFileName.str().c_str()); return false; } // All right now : let's read last needed infos. _strName = pTrack->name; _strDesc = pTrack->descr; _strAuthors = pTrack->authors; _fLength = pTrack->length; _fWidth = pTrack->width; _nMaxPitSlots = pTrack->pits.nMaxPits; // Unload track data. piTrackLoader->unload(); // Now, the track seems usable (hm ... OK, we didn't check the 3D file contents ...). _bUsable = true; return true; }
void Application::generate() { const char *extName; FILE *outfd = NULL; // Get the trackgen paramaters. sprintf(buf, "%s", CFG_FILE); CfgHandle = GfParmReadFile(buf, GFPARM_RMODE_STD | GFPARM_RMODE_CREAT); // Load and initialize the track loader module. GfLogInfo("Loading Track Loader ...\n"); std::ostringstream ossModLibName; ossModLibName << GfLibDir() << "modules/track/" << "track" << '.' << DLLEXT; GfModule* pmodTrkLoader = GfModule::load(ossModLibName.str()); // Check that it implements ITrackLoader. ITrackLoader* PiTrackLoader = 0; if (pmodTrkLoader) PiTrackLoader = pmodTrkLoader->getInterface<ITrackLoader>(); if (!PiTrackLoader) return; // This is the track definition. sprintf(trackdef, "%stracks/%s/%s/%s.xml", GfDataDir(), TrackCategory, TrackName, TrackName); TrackHandle = GfParmReadFile(trackdef, GFPARM_RMODE_STD); if (!TrackHandle) { fprintf(stderr, "Cannot find %s\n", trackdef); ::exit(1); } // Build the track structure with graphic extensions. Track = PiTrackLoader->load(trackdef, true); if (!JustCalculate) { // Get the output file radix. sprintf(buf2, "%stracks/%s/%s/%s", GfDataDir(), Track->category, Track->internalname, Track->internalname); OutputFileName = strdup(buf2); // Number of groups for the complete track. if (TrackOnly) { sprintf(buf2, "%s.ac", OutputFileName); // Track. outfd = Ac3dOpen(buf2, 1); } else if (MergeAll) { sprintf(buf2, "%s.ac", OutputFileName); // track + terrain + objects. outfd = Ac3dOpen(buf2, 2 + GetObjectsNb(TrackHandle)); } // Main Track. if (Bump) { extName = "trk-bump"; } else { extName = "trk"; } sprintf(buf2, "%s-%s.ac", OutputFileName, extName); OutTrackName = strdup(buf2); } if (JustCalculate){ CalculateTrack(Track, TrackHandle, Bump); return; } GenerateTrack(Track, TrackHandle, OutTrackName, outfd, Bump); if (TrackOnly) { return; } // Terrain. if (MergeTerrain && !MergeAll) { sprintf(buf2, "%s.ac", OutputFileName); /* terrain + objects */ outfd = Ac3dOpen(buf2, 1 + GetObjectsNb(TrackHandle)); } extName = "msh"; sprintf(buf2, "%s-%s.ac", OutputFileName, extName); OutMeshName = strdup(buf2); GenerateTerrain(Track, TrackHandle, OutMeshName, outfd, DoSaveElevation); if (DoSaveElevation != -1) { if (outfd) { Ac3dClose(outfd); } switch (DoSaveElevation) { case 0: case 1: sprintf(buf2, "%s.ac", OutputFileName); sprintf(buf, "%s-elv.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, buf2, 1); if (DoSaveElevation) { break; } case 2: sprintf(buf, "%s-elv2.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, OutMeshName, 1); if (DoSaveElevation) { break; } case 3: sprintf(buf, "%s-elv3.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, OutMeshName, 0); if (DoSaveElevation) { break; } case 4: sprintf(buf, "%s-elv4.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, OutTrackName, 2); break; } return; } GenerateObjects(Track, TrackHandle, CfgHandle, outfd, OutMeshName); }