2#include "Engine/Operator/Primitive.h"
3#include <CGAL/Surface_mesh/Surface_mesh.h>
4#include <CGAL/Simple_cartesian.h>
5#include <tbb/spin_mutex.h>
6#include <unordered_set>
10using Kernel = CGAL::Simple_cartesian<double>;
11using Point = Kernel::Point_3;
12using Vector = Kernel::Vector_3;
13using HeMesh = CGAL::Surface_mesh<Point>;
14using vertexDescriptor = HeMesh::Vertex_index;
15using faceDescriptor = HeMesh::Face_index;
16using V_index = HeMesh::Vertex_index;
17using F_index = HeMesh::Face_index;
27class Mesh :
public Primitive
31 Mesh(
const Mesh& other);
32 Mesh& operator=(
const Mesh& rhs);
33 ~Mesh()
override =
default;
35 PrimType getType()
const override {
return PrimType::MESH; }
36 std::shared_ptr<Primitive> clone()
const override {
return std::make_shared<Mesh>(*
this); }
37 TransformClass transformType()
const override {
return TransformClass::POINT | TransformClass::PRIMITIVE; }
38 void applyTransform(
const bt::Matrix4 &mat, TransformClass transformClass)
override;
39 bool canMerge()
const override {
return true; }
40 void merge(std::shared_ptr<Primitive> other)
override;
41 bool hasPoints()
const override {
return true; }
43 void addFace(
const std::vector<ga::Offset>& pointOffsets,
bool closed=
true);
44 ga::Offset addPoint(
const bt::Vector3& pos);
46 void merge(Mesh& other);
48 HeMesh computeHalfEdgeMesh();
50 std::unordered_set<ga::Offset>::const_iterator soloPointsBegin()
const;
51 std::unordered_set<ga::Offset>::const_iterator soloPointsEnd()
const;
53 void setPointPos(
const ga::Offset offset,
const bt::Vector3& pos);
54 ga::Offset getPrimStartVertex(ga::Offset primOffset)
const;
55 bt::Vector3 getPosFromVert(ga::Offset vertexOffset)
const;
56 bt::Vector3 getPointPos(ga::Offset pointOffset)
const;
57 unsigned int getPrimVertCount(ga::Offset primOffset)
const;
58 ga::Offset getVertexPrim(ga::Offset vertexOffset)
const;
60 ga::Offset getNumPrims()
const;
61 ga::Offset getNumVerts()
const;
62 ga::Offset getNumPoints()
const override;
63 ga::Offset getNumSoloPoints()
const;
65 bt::boolT isClosed(ga::Offset primOffset)
const;
67 void computePrimStartVertices()
const;
70 ga::attribVector& getAttributeStore(
const ga::AttributeOwner& owner)
override;
71 const ga::attribVector& getAttributeStore(
const ga::AttributeOwner& owner)
const override;
74 void mergeAppend(std::shared_ptr<ga::Attribute> dst, std::shared_ptr<ga::Attribute> src);
76 void mergeAppendImpl(std::shared_ptr<ga::Attribute> dst, std::shared_ptr<ga::Attribute> src)
78 auto dstHandle = ga::AttributeHandle<T>(dst);
79 auto srcHandle = ga::AttributeHandle<T>(src);
81 const ga::Offset srcCount = srcHandle.getSize();
82 const ga::Offset dstCount = dstHandle.getSize();
84 dstHandle.resize(dstCount + srcCount);
86 for(ga::Offset i = 0; i< srcCount; ++i)
88 const T value = srcHandle.getValue(i);
89 const ga::Offset dstOffset = dstCount+i;
90 dstHandle.setValue(dstOffset, value);
94 ga::attribVector vertexAttributes_;
95 ga::attribVector faceAttributes_;
97 std::unordered_set<ga::Offset> soloPoints_;
99 mutable std::vector<ga::Offset> primStarts_;
100 mutable std::vector<ga::Offset> vertexPrims_;
102 mutable std::atomic<bool> primStartsDirty_{
true};
103 mutable tbb::spin_mutex primStartsMutex_;
Read write accessor for enzo::ga::Attribute.