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;
}