Enzo
Loading...
Searching...
No Matches
Mesh.h
1#pragma once
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>
7
8namespace enzo::geo
9{
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;
18
27class Mesh : public Primitive
28{
29public:
30 Mesh();
31 Mesh(const Mesh& other);
32 Mesh& operator=(const Mesh& rhs);
33 ~Mesh() override = default;
34
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; }
42
43 void addFace(const std::vector<ga::Offset>& pointOffsets, bool closed=true);
44 ga::Offset addPoint(const bt::Vector3& pos);
45
46 void merge(Mesh& other);
47
48 HeMesh computeHalfEdgeMesh();
49
50 std::unordered_set<ga::Offset>::const_iterator soloPointsBegin() const;
51 std::unordered_set<ga::Offset>::const_iterator soloPointsEnd() const;
52
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;
59
60 ga::Offset getNumPrims() const;
61 ga::Offset getNumVerts() const;
62 ga::Offset getNumPoints() const override;
63 ga::Offset getNumSoloPoints() const;
64
65 bt::boolT isClosed(ga::Offset primOffset) const;
66
67 void computePrimStartVertices() const;
68
69protected:
70 ga::attribVector& getAttributeStore(const ga::AttributeOwner& owner) override;
71 const ga::attribVector& getAttributeStore(const ga::AttributeOwner& owner) const override;
72
73private:
74 void mergeAppend(std::shared_ptr<ga::Attribute> dst, std::shared_ptr<ga::Attribute> src);
75 template <typename T>
76 void mergeAppendImpl(std::shared_ptr<ga::Attribute> dst, std::shared_ptr<ga::Attribute> src)
77 {
78 auto dstHandle = ga::AttributeHandle<T>(dst);
79 auto srcHandle = ga::AttributeHandle<T>(src);
80
81 const ga::Offset srcCount = srcHandle.getSize();
82 const ga::Offset dstCount = dstHandle.getSize();
83
84 dstHandle.resize(dstCount + srcCount);
85
86 for(ga::Offset i = 0; i< srcCount; ++i)
87 {
88 const T value = srcHandle.getValue(i);
89 const ga::Offset dstOffset = dstCount+i;
90 dstHandle.setValue(dstOffset, value);
91 }
92 };
93
94 ga::attribVector vertexAttributes_;
95 ga::attribVector faceAttributes_;
96
97 std::unordered_set<ga::Offset> soloPoints_;
98
99 mutable std::vector<ga::Offset> primStarts_;
100 mutable std::vector<ga::Offset> vertexPrims_;
101
102 mutable std::atomic<bool> primStartsDirty_{true};
103 mutable tbb::spin_mutex primStartsMutex_;
104
105 // intrinsic handles
106 enzo::ga::AttributeHandleInt vertexCountHandlePrim_;
107 enzo::ga::AttributeHandleBool closedHandlePrim_;
108 enzo::ga::AttributeHandleInt pointOffsetHandleVert_;
109 enzo::ga::AttributeHandleVector3 posHandlePoint_;
110};
111}
Read write accessor for enzo::ga::Attribute.