void PTexMesh::LoadMeshData()

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