Program Listing for File BaseMesh.hpp

Return to documentation for file (include/lvr2/geometry/BaseMesh.hpp)

/*
 * BaseMesh.hpp
 *
 *  @date 02.06.2017
 *  @author Lukas Kalbertodt <lukas.kalbertodt@gmail.com>
 */

#ifndef LVR2_GEOMETRY_BASEMESH_H_
#define LVR2_GEOMETRY_BASEMESH_H_

#include <cstdint>
#include <array>
#include <vector>
#include <type_traits>
#include <memory>
#include <boost/optional.hpp>



#include "Handles.hpp"

namespace lvr2
{

// Forward declaration
template <typename> class FaceIteratorProxy;
template <typename> class EdgeIteratorProxy;
template <typename> class VertexIteratorProxy;

struct EdgeCollapseResult;
struct EdgeCollapseRemovedFace;

template<typename BaseVecT>
class BaseMesh
{
public:

    virtual ~BaseMesh() {}

    // =======================================================================
    // Pure virtual methods (need to be implemented)
    // =======================================================================

    virtual VertexHandle addVertex(BaseVecT pos) = 0;

    virtual FaceHandle addFace(VertexHandle v1, VertexHandle v2, VertexHandle v3) = 0;

    virtual void removeFace(FaceHandle handle) = 0;

    virtual EdgeCollapseResult collapseEdge(EdgeHandle edgeH) = 0;

    virtual void flipEdge(EdgeHandle edgeH) = 0;

    virtual size_t numVertices() const = 0;

    virtual size_t numFaces() const = 0;

    virtual size_t numEdges() const = 0;

    virtual bool containsVertex(VertexHandle vH) const = 0;

    virtual bool containsFace(FaceHandle vH) const = 0;

    virtual bool containsEdge(EdgeHandle vH) const = 0;

    virtual Index nextVertexIndex() const = 0;

    virtual Index nextFaceIndex() const = 0;

    virtual Index nextEdgeIndex() const = 0;

    virtual BaseVecT getVertexPosition(VertexHandle handle) const = 0;

    virtual BaseVecT& getVertexPosition(VertexHandle handle) = 0;

    virtual std::array<VertexHandle, 3> getVerticesOfFace(FaceHandle handle) const = 0;

    virtual std::array<EdgeHandle, 3> getEdgesOfFace(FaceHandle handle) const = 0;

    virtual void getNeighboursOfFace(FaceHandle handle, std::vector<FaceHandle>& facesOut) const = 0;

    virtual std::array<VertexHandle, 2> getVerticesOfEdge(EdgeHandle edgeH) const = 0;

    virtual std::array<OptionalFaceHandle, 2> getFacesOfEdge(EdgeHandle edgeH) const = 0;

    virtual void getFacesOfVertex(VertexHandle handle, std::vector<FaceHandle>& facesOut) const = 0;

    virtual void getEdgesOfVertex(VertexHandle handle, std::vector<EdgeHandle>& edgesOut) const = 0;

    virtual void getNeighboursOfVertex(VertexHandle handle, std::vector<VertexHandle>& verticesOut) const = 0;

    virtual OptionalFaceHandle getOppositeFace(FaceHandle faceH, VertexHandle vertexH) const = 0;

    virtual OptionalEdgeHandle getOppositeEdge(FaceHandle faceH, VertexHandle vertexH) const = 0;

    virtual OptionalVertexHandle getOppositeVertex(FaceHandle faceH, EdgeHandle edgeH) const = 0;

    virtual MeshHandleIteratorPtr<VertexHandle> verticesBegin() const = 0;

    virtual MeshHandleIteratorPtr<VertexHandle> verticesEnd() const = 0;

    virtual MeshHandleIteratorPtr<FaceHandle> facesBegin() const = 0;

    virtual MeshHandleIteratorPtr<FaceHandle> facesEnd() const = 0;

    virtual MeshHandleIteratorPtr<EdgeHandle> edgesBegin() const = 0;

    virtual MeshHandleIteratorPtr<EdgeHandle> edgesEnd() const = 0;

    // =======================================================================
    // Provided methods (already implemented)
    // =======================================================================

    virtual std::array<BaseVecT, 3> getVertexPositionsOfFace(FaceHandle handle) const;

    BaseVecT calcFaceCentroid(FaceHandle handle) const;

    typename BaseVecT::CoordType calcFaceArea(FaceHandle handle) const;

    virtual std::vector<FaceHandle> getNeighboursOfFace(FaceHandle handle) const;

    virtual bool isCollapsable(EdgeHandle handle) const;

    virtual bool isFlippable(EdgeHandle handle) const;

    virtual bool isBorderEdge(EdgeHandle handle) const = 0;

    virtual bool isFaceInsertionValid(VertexHandle v1, VertexHandle v2, VertexHandle v3) const;

    virtual OptionalFaceHandle getFaceBetween(VertexHandle aH, VertexHandle bH, VertexHandle cH) const;

    virtual uint8_t numAdjacentFaces(EdgeHandle handle) const;

    virtual std::vector<FaceHandle> getFacesOfVertex(VertexHandle handle) const;

    virtual std::vector<EdgeHandle> getEdgesOfVertex(VertexHandle handle) const;

    virtual std::vector<VertexHandle> getNeighboursOfVertex(VertexHandle handle) const;

    virtual OptionalVertexHandle getVertexBetween(EdgeHandle aH, EdgeHandle bH) const;

    virtual OptionalEdgeHandle getEdgeBetween(VertexHandle aH, VertexHandle bH) const;

    virtual FaceIteratorProxy<BaseVecT> faces() const;

    virtual EdgeIteratorProxy<BaseVecT> edges() const;

    virtual VertexIteratorProxy<BaseVecT> vertices() const;

};

template <typename BaseVecT>
class FaceIteratorProxy
{
public:
    MeshHandleIteratorPtr<FaceHandle> begin() const;
    MeshHandleIteratorPtr<FaceHandle> end() const;

    FaceIteratorProxy(const BaseMesh<BaseVecT>& mesh) : m_mesh(mesh) {}
 private:
    const BaseMesh<BaseVecT>& m_mesh;
    friend BaseMesh<BaseVecT>;
};

template <typename BaseVecT>
class EdgeIteratorProxy
{
public:
    MeshHandleIteratorPtr<EdgeHandle> begin() const;
    MeshHandleIteratorPtr<EdgeHandle> end() const;

    EdgeIteratorProxy(const BaseMesh<BaseVecT>& mesh) : m_mesh(mesh) {}
 private:
    const BaseMesh<BaseVecT>& m_mesh;
    friend BaseMesh<BaseVecT>;
};

template <typename BaseVecT>
class VertexIteratorProxy
{
public:
    MeshHandleIteratorPtr<VertexHandle> begin() const;
    MeshHandleIteratorPtr<VertexHandle> end() const;

    VertexIteratorProxy(const BaseMesh<BaseVecT>& mesh) : m_mesh(mesh) {}
 private:
    const BaseMesh<BaseVecT>& m_mesh;
    friend BaseMesh<BaseVecT>;
};

struct EdgeCollapseRemovedFace
{
    FaceHandle removedFace;

    std::array<EdgeHandle, 2> removedEdges;

    EdgeHandle newEdge;

    EdgeCollapseRemovedFace(
        FaceHandle removedFace,
        std::array<EdgeHandle, 2> removedEdges,
        EdgeHandle newEdge
    ) : removedFace(removedFace), removedEdges(removedEdges), newEdge(newEdge) {};
};

struct EdgeCollapseResult
{
    VertexHandle midPoint;

    VertexHandle removedPoint;

    std::array<boost::optional<EdgeCollapseRemovedFace>, 2> neighbors;

    EdgeCollapseResult(VertexHandle midPoint, VertexHandle removedPoint) : midPoint(midPoint), removedPoint(removedPoint) {};
};


struct VertexSplitResult
{

    VertexHandle edgeCenter;
    std::vector<FaceHandle> addedFaces;

    VertexSplitResult(VertexHandle longestEdgeCenter) : edgeCenter(longestEdgeCenter) {};
};

struct EdgeSplitResult
{

    VertexHandle edgeCenter;
    std::vector<FaceHandle> addedFaces;

    EdgeSplitResult(VertexHandle longestEdgeCenter) : edgeCenter(longestEdgeCenter) {};
};

} // namespace lvr2

#include "lvr2/geometry/BaseMesh.tcc"

#endif /* LVR2_GEOMETRY_BASEMESH_H_ */