void PTexMesh::LoadAtlasData()

in ReplicaSDK/ptex/PTexLib.cpp [495:588]


void PTexMesh::LoadAtlasData(const std::string& atlasFolder) {
  isHdr = false;
  // Upload atlas data to GPU
  for (size_t i = 0; i < meshes.size(); i++) {
    const std::string dxtFile = atlasFolder + "/" + std::to_string(i) + "-color-ptex.dxt1";
    const std::string rgbFile = atlasFolder + "/" + std::to_string(i) + "-color-ptex.rgb";
    const std::string hdrFile = atlasFolder + "/" + std::to_string(i) + "-color-ptex.hdr";

    if (pangolin::FileExists(dxtFile)) {
      const size_t numBytes = std::experimental::filesystem::file_size(dxtFile);

      // We know it's square
      const size_t dim = std::sqrt(numBytes * 2);

      meshes[i]->atlas.Reinitialise(
          dim, dim, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, false, 0, GL_RGBA, GL_UNSIGNED_BYTE);
    } else if (pangolin::FileExists(rgbFile)) {
      const size_t numBytes = std::experimental::filesystem::file_size(rgbFile);

      // We know it's square
      const size_t dim = std::sqrt(numBytes / 3);

      meshes[i]->atlas.Reinitialise(dim, dim, GL_RGBA8, true, 0, GL_RGB, GL_UNSIGNED_BYTE);
    } else if (pangolin::FileExists(hdrFile)) {
      const size_t numBytes = std::experimental::filesystem::file_size(hdrFile);

      // We know it's square
      const size_t dim = std::sqrt(numBytes / 6);

      meshes[i]->atlas.Reinitialise(dim, dim, GL_RGBA16F, false, 0, GL_RGB, GL_HALF_FLOAT);
      isHdr = true;
    } else {
      ASSERT(false, "Can't parse texture filename " + atlasFolder + "/" + std::to_string(i));
    }
  }

  for (size_t i = 0; i < meshes.size(); i++) {
    std::cout << "\rLoading atlas " << i + 1 << "/" << meshes.size() << "... ";
    std::cout.flush();
    const std::string dxtFile = atlasFolder + "/" + std::to_string(i) + "-color-ptex.dxt1";
    const std::string rgbFile = atlasFolder + "/" + std::to_string(i) + "-color-ptex.rgb";
    const std::string hdrFile = atlasFolder + "/" + std::to_string(i) + "-color-ptex.hdr";

    if (pangolin::FileExists(dxtFile)) {
      const size_t numBytes = std::experimental::filesystem::file_size(dxtFile);

      // Open file
      int fd = open(std::string(dxtFile).c_str(), O_RDONLY, 0);
      void* mmappedData = mmap(NULL, numBytes, PROT_READ, MAP_PRIVATE | MAP_POPULATE, fd, 0);

      meshes[i]->atlas.Bind();
      glCompressedTexSubImage2D(
          GL_TEXTURE_2D,
          0,
          0,
          0,
          meshes[i]->atlas.width,
          meshes[i]->atlas.height,
          GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
          numBytes,
          mmappedData);
      CheckGlDieOnError();

      munmap(mmappedData, numBytes);
      close(fd);
    } else if (pangolin::FileExists(rgbFile)) {
      const size_t numBytes = std::experimental::filesystem::file_size(rgbFile);

      // Open file
      int fd = open(std::string(rgbFile).c_str(), O_RDONLY, 0);
      void* mmappedData = mmap(NULL, numBytes, PROT_READ, MAP_PRIVATE | MAP_POPULATE, fd, 0);

      meshes[i]->atlas.Upload(mmappedData, GL_RGB, GL_UNSIGNED_BYTE);

      munmap(mmappedData, numBytes);
      close(fd);
    } else if (pangolin::FileExists(hdrFile)) {
      const size_t numBytes = std::experimental::filesystem::file_size(hdrFile);

      // Open file
      int fd = open(std::string(hdrFile).c_str(), O_RDONLY, 0);
      void* mmappedData = mmap(NULL, numBytes, PROT_READ, MAP_PRIVATE | MAP_POPULATE, fd, 0);

      meshes[i]->atlas.Upload(mmappedData, GL_RGB, GL_HALF_FLOAT);

      munmap(mmappedData, numBytes);
      close(fd);
    } else {
      ASSERT(false, "Can't parse texture filename " + atlasFolder + "/" + std::to_string(i));
    }
  }
  std::cout << "\rLoading atlas " << meshes.size() << "/" << meshes.size() << "... done"
            << std::endl;
}