PeriDyno 1.0.0
Loading...
Searching...
No Matches
MarchingCubes.cpp
Go to the documentation of this file.
1#include "MarchingCubes.h"
2
4
6
7namespace dyno
8{
9 template<typename TDataType>
11 : Node()
12 {
13 this->varGridSpacing()->setRange(0.001, 1.0);
14
15 auto renderer = std::make_shared<GLSurfaceVisualModule>();
16 this->stateTriangleSet()->connect(renderer->inTriangleSet());
17 this->graphicsPipeline()->pushModule(renderer);
18 }
19
20 template<typename TDataType>
24
25
26 template<typename TDataType>
28 {
29
30 auto sdfTopo = this->inLevelSet()->getDataPtr();
31 auto isoValue = this->varIsoValue()->getData();
32
33 auto& sdf = sdfTopo->getSDF();
34
35 Coord lowerBound = sdf.lowerBound();
36 Coord upperBound = sdf.upperBound();
37
38 Real h = this->varGridSpacing()->getData();
39
40 int nx = (upperBound[0] - lowerBound[0]) / h;
41 int ny = (upperBound[1] - lowerBound[1]) / h;
42 int nz = (upperBound[2] - lowerBound[2]) / h;
43
44 DArray3D<Real> distances(nx + 1, ny + 1, nz + 1);
45 DArray<int> voxelVertNum(nx * ny * nz);
46
48 distances,
49 lowerBound,
50 h,
51 sdf);
52
54 voxelVertNum,
55 distances,
56 isoValue);
57
58 Reduction<int> reduce;
59 int totalVNum = reduce.accumulate(voxelVertNum.begin(), voxelVertNum.size());
60
61 Scan<int> scan;
62 scan.exclusive(voxelVertNum.begin(), voxelVertNum.size());
63
64 DArray<Coord> vertices(totalVNum);
65
66 DArray<TopologyModule::Triangle> triangles(totalVNum / 3);
67
69 vertices,
70 triangles,
71 voxelVertNum,
72 distances,
73 lowerBound,
74 isoValue,
75 h);
76
77 if (this->stateTriangleSet()->isEmpty()) {
78 this->stateTriangleSet()->setDataPtr(std::make_shared<TriangleSet<TDataType>>());
79 }
80
81 auto triSet = this->stateTriangleSet()->getDataPtr();
82 triSet->setPoints(vertices);
83 triSet->setTriangles(triangles);
84 triSet->update();
85
86 distances.clear();
87 voxelVertNum.clear();
88 vertices.clear();
89 triangles.clear();
90 }
91
92
93 template<typename TDataType>
98
99
100 template<typename TDataType>
105
107}
#define DEFINE_CLASS(name)
Definition Object.h:140
static void reconstructSDF(DArray3D< Real > &distances, Coord origin, Real h, DistanceField3D< TDataType > &sdf)
static void countVerticeNumber(DArray< int > &num, DArray3D< Real > &distances, Real isoValue)
static void constructTriangles(DArray< Coord > &vertices, DArray< TopologyModule::Triangle > &triangles, DArray< int > &vertNum, DArray3D< Real > &distances, Coord origin, Real isoValue, Real h)
void resetStates() override
void updateStates() override
TDataType::Real Real
TDataType::Coord Coord
std::shared_ptr< GraphicsPipeline > graphicsPipeline()
Definition Node.cpp:320
T accumulate(const T *val, const uint num)
void exclusive(T *output, const T *input, size_t length, bool bcao=true)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Array< T, DeviceType::GPU > DArray
Definition Array.inl:89
Array3D< T, DeviceType::GPU > DArray3D
Definition Array3D.inl:90