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;
    }
Beispiel #3
0
  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;
  }