#pragma once #include "modelFactoryMesh_fwd.h" #include #include #include #include #include namespace OpenMesh { template struct glmvec : public VectorT { using VectorT::VectorT; glmvec(const VectorT & v) : VectorT {v} { } operator glm::vec() const { glm::vec out; std::copy(this->begin(), this->end(), &out[0]); return out; } }; } struct ModelFactoryTraits : public OpenMesh::DefaultTraits { FaceAttributes(OpenMesh::Attributes::Normal | OpenMesh::Attributes::Status | OpenMesh::Attributes::Color); EdgeAttributes(OpenMesh::Attributes::Status); VertexAttributes(OpenMesh::Attributes::Normal | OpenMesh::Attributes::Status); using Point = OpenMesh::glmvec; using Normal = OpenMesh::glmvec; using Color = glm::vec4; }; struct ModelFactoryMesh : public OpenMesh::PolyMesh_ArrayKernelT { ModelFactoryMesh(); OpenMesh::FPropHandleT smoothFaceProperty; OpenMesh::FPropHandleT nameFaceProperty; template std::pair add_namedFace(std::string name, Vs &&... vs) { const auto handle = add_face(std::forward(vs)...); property(nameFaceProperty, handle) = name; return std::make_pair(name, handle); } };