in ReplicaSDK/ptex/PTexLib.cpp [435:493]
void PTexMesh::LoadMeshData(const std::string& meshFile) {
// Load the meshes
MeshData originalMesh;
PLYParse(originalMesh, meshFile);
ASSERT(originalMesh.polygonStride == 4, "Must be a quad mesh!");
// Split into sub-meshes
std::vector<MeshData> splitMeshData;
if (splitSize > 0.0f) {
std::cout << "Splitting mesh... ";
std::cout.flush();
splitMeshData = SplitMesh(originalMesh, splitSize);
std::cout << "done" << std::endl;
} else {
splitMeshData.emplace_back(std::move(originalMesh));
}
// Upload mesh data to GPU
for (size_t i = 0; i < splitMeshData.size(); i++) {
std::cout << "\rLoading mesh " << i + 1 << "/" << splitMeshData.size() << "... ";
std::cout.flush();
meshes.emplace_back(new Mesh);
meshes.back()->vbo.Reinitialise(
pangolin::GlArrayBuffer, splitMeshData[i].vbo.Area(), GL_FLOAT, 4, GL_STATIC_DRAW);
meshes.back()->vbo.Upload(
splitMeshData[i].vbo.ptr, splitMeshData[i].vbo.Area() * sizeof(Eigen::Vector4f));
meshes.back()->ibo.Reinitialise(
pangolin::GlElementArrayBuffer,
splitMeshData[i].ibo.Area(),
GL_UNSIGNED_INT,
1,
GL_STATIC_DRAW);
meshes.back()->ibo.Upload(
splitMeshData[i].ibo.ptr, splitMeshData[i].ibo.Area() * sizeof(unsigned int));
}
std::cout << "\rLoading mesh " << splitMeshData.size() << "/" << splitMeshData.size()
<< "... done" << std::endl;
std::cout << "Calculating mesh adjacency... ";
std::cout.flush();
std::vector<std::vector<uint32_t>> adjFaces(splitMeshData.size());
#pragma omp parallel for
for (size_t i = 0; i < splitMeshData.size(); i++) {
CalculateAdjacency(splitMeshData[i], adjFaces[i]);
}
for (size_t i = 0; i < splitMeshData.size(); i++) {
meshes[i]->abo.Reinitialise(
pangolin::GlShaderStorageBuffer, adjFaces[i].size(), GL_INT, 1, GL_STATIC_DRAW);
meshes[i]->abo.Upload(adjFaces[i].data(), sizeof(uint32_t) * adjFaces[i].size());
}
std::cout << "done" << std::endl;
}