const NameCollection CoordModelMapping::getFilenamesForCoordinate(unsigned int pMapId, int xPos, int yPos) { NameCollection result; Array<std::string> rawNames; CMappingEntry *entry = getCMappingEntry(CMappingEntry::getKeyString(pMapId, xPos, yPos)); if(entry != 0) { rawNames = entry->getFilenames(); int pos = 0; while(pos < rawNames.size()) { char namebuffer[500]; int noVerc; int startName = findPosChar(rawNames[pos].c_str(), ' ', 1) + 1; int endName = (int) rawNames[pos].length(); sscanf(rawNames[pos].c_str(), "%d", &noVerc); memcpy(namebuffer, &rawNames[pos].c_str()[startName], endName-startName); namebuffer[endName-startName] = 0; sscanf(rawNames[pos].c_str(), "%d", &noVerc); std::string modelPosFileName = std::string(namebuffer); if(noVerc > MIN_VERTICES_FOR_OWN_CONTAINER_FILE) { result.appendToSingle(modelPosFileName); } else { result.appendToMain(modelPosFileName); } ++pos; } } return result; }
//============================================================ bool CoordModelMapping::readCoordinateMapping(const std::string& pDirectoryFileName) { FILE *f = fopen(pDirectoryFileName.c_str(), "rb"); if(!f) { printf("ERROR: Can't open file: %s\n",pDirectoryFileName.c_str()); return false; } char buffer[500+1]; CMappingEntry* cMappingEntry; while(fgets(buffer, 500, f)) { //char namebuffer[500]; char positionbuffer[500]; int xpos, ypos, noVec; float scale; xpos = ypos = noVec = 0; //sscanf(buffer, "%d %d %s %s %f %d", &xpos, &ypos, namebuffer,positionbuffer, &scale, &noVec); // this is ugly, but the format has no read delimiter and a space could be in the first part of the name int nameStart = findPosChar(buffer, ' ', 2);// find the 2. space if(nameStart > -1 && (iFilterMethod == NULL || (*iFilterMethod)(buffer))) { ++nameStart; // find the 1. / (now a space only can be found at the end of the name) int nameEnd = nameStart + findPosChar(&buffer[nameStart], '/', 1); // find the 1. space (after the name) nameEnd += findPosChar(&buffer[nameEnd], ' ', 1); buffer[nameEnd] = 0; // terminate the name sscanf(buffer, "%d %d", &xpos, &ypos); sscanf(&buffer[nameEnd+1], "%s %f %d", positionbuffer, &scale, &noVec); unsigned int mapId = getMapIdFromFilename(std::string(&buffer[nameStart])); if(!iMapIds.contains(mapId)) { iMapIds.append(mapId); printf("Coords for map %u...\n",mapId); } if(!isWorldAreaMap(mapId)) { xpos = 0; // store all files under the groupKey ypos = 0; } std::string key = CMappingEntry::getKeyString(mapId, xpos, ypos); cMappingEntry = getCMappingEntry(key); if(cMappingEntry == 0) { cMappingEntry = new CMappingEntry(mapId, xpos, ypos); addCMappingEntry(cMappingEntry); } char namebuffer2[500]; sprintf(namebuffer2, "%d %s#%s_%f", noVec, &buffer[nameStart], positionbuffer, scale); cMappingEntry->addFilename(namebuffer2); //break; } } fclose(f); return true; }
bool CoordModelMapping::readCoordinateMapping (const std::string& pDirectoryFileName) { FILE *f = fopen (pDirectoryFileName.c_str (), "rb"); bool result = false; char buffer[500 + 1]; if (f) { result = true; CMappingEntry* cMappingEntry; while (fgets (buffer, 500, f)) { //char namebuffer[500]; char positionbuffer[500]; int xpos, ypos, noVec; float scale; xpos = ypos = noVec = 0; //sscanf(buffer, "%d %d %s %s %f %d", &xpos, &ypos, namebuffer,positionbuffer, &scale, &noVec); // this is ugly, but the format has no read delimiter and a space could be in the first part of the name int nameStart = findPosChar (buffer, '/', 1); // find the 2. space if (nameStart > -1 && (iFilterMethod == NULL || (*iFilterMethod)(buffer))) { ++nameStart; // find the 1. / (now a space only can be found at the end of the name) int nameEnd = nameStart + findPosChar (&buffer[nameStart], '/', 1); // find the 1. space (after the name) nameEnd += findPosChar (&buffer[nameEnd], ' ', 1); buffer[nameEnd] = 0; // terminate the name sscanf (buffer, "%d %d", &xpos, &ypos); sscanf (&buffer[nameEnd + 1], "%s %f %d", positionbuffer, &scale, &noVec); unsigned int mapId = getMapIdFromFilename (std::string (&buffer[nameStart])); // ignore DeeprunTram (369) it is too large for short vector and not important // ignore test (13), Test (29) , development (451) if (!iMapIds.contains (mapId) && mapId != 369 && mapId != 13 && mapId != 29 && mapId != 451) { iMapIds.append (mapId); } if (!isWorldAreaMap (mapId)) { xpos = 0; // store all files under the groupKey ypos = 0; } std::string key = CMappingEntry::getKeyString (mapId, xpos, ypos); cMappingEntry = getCMappingEntry (key); if (cMappingEntry == 0) { cMappingEntry = new CMappingEntry (mapId, xpos, ypos); addCMappingEntry (cMappingEntry); } char namebuffer2[500]; sprintf (namebuffer2, "%d %s#%s_%f", noVec, &buffer[nameStart], positionbuffer, scale); cMappingEntry->addFilename (namebuffer2); //break; } } fclose (f); } return result; }