Program Listing for File LazyMesh.hpp
↰ Return to documentation for file (include/lvr2/geometry/LazyMesh.hpp)
#pragma once
#include "lvr2/geometry/PMPMesh.hpp"
#include "lvr2/util/Hdf5Util.hpp"
#include <memory>
namespace lvr2
{
constexpr const char* LAZY_MESH_TEMP_DIR = "/temp_lazy_meshes";
template<typename BaseVecT>
class LazyMesh
{
public:
LazyMesh(PMPMesh<BaseVecT>&& src, std::shared_ptr<HighFive::File> file, bool keepLoaded = false);
LazyMesh(LazyMesh&&);
LazyMesh& operator=(LazyMesh&&);
virtual ~LazyMesh();
std::shared_ptr<const PMPMesh<BaseVecT>> get();
std::shared_ptr<PMPMesh<BaseVecT>> modify();
bool isLoaded() const
{
return !m_weakPtr.expired();
}
void keepLoaded()
{
m_keepLoadedHelper = getInternal();
}
bool isKeptLoaded() const
{
return m_keepLoadedHelper != nullptr;
}
void allowUnload()
{
m_keepLoadedHelper.reset();
}
size_t numFaces() const
{
return m_mesh->numFaces();
}
size_t numVertices() const
{
return m_mesh->numVertices();
}
size_t numEdges() const
{
return m_mesh->numEdges();
}
std::shared_ptr<HighFive::File> getFile() const
{
return m_file;
}
static void removeTempDir(std::shared_ptr<HighFive::File> file)
{
file->getGroup("/").unlink(LAZY_MESH_TEMP_DIR + 1); // +1 to skip the leading '/'
}
private:
// delete unwanted constructors/assignments
LazyMesh() = delete;
LazyMesh(const LazyMesh&) = delete;
LazyMesh& operator=(const LazyMesh&) = delete;
std::shared_ptr<PMPMesh<BaseVecT>> getInternal();
void unload();
PMPMesh<BaseVecT>* m_mesh;
std::weak_ptr<PMPMesh<BaseVecT>> m_weakPtr;
std::shared_ptr<PMPMesh<BaseVecT>> m_keepLoadedHelper;
bool m_modified = false;
std::unique_ptr<HighFive::Group> m_source;
std::string m_groupName;
std::shared_ptr<HighFive::File> m_file;
struct Unloader
{
Unloader(LazyMesh* owner) : m_owner(owner) {}
void operator()(PMPMesh<BaseVecT>* mesh);
LazyMesh* m_owner;
};
};
} // namespace lvr2
#include "lvr2/geometry/LazyMesh.tcc"