PeriDyno 1.0.0
Loading...
Searching...
No Matches
SparseVolumeClipper.cpp
Go to the documentation of this file.
2
4
5#include "VolumeHelper.h"
6
7namespace dyno
8{
9 template<typename TDataType>
14
15 template<typename TDataType>
19
20 template<typename TDataType>
22 {
23 auto sv = this->getSparseVolume();
24
25 if (sv->stateSDFTopology()->isEmpty())
26 {
27 printf("SparseMarchingCubes: The import is empty! \n");
28 return;
29 }
30
31 auto center = this->varTranslation()->getData();
32 auto eulerAngles = this->varRotation()->getData();
33
34 Quat<Real> q = Quat<Real>::fromEulerAngles(eulerAngles[0], eulerAngles[1], eulerAngles[2]);
35
36 auto octree = sv->stateSDFTopology()->getDataPtr();
37
38 DArray<Coord> ceilVertices;
39
40 octree->getCellVertices(ceilVertices);
41
42 DArray<Real> sdfs;
43 DArray<Coord> normals;
44
45 octree->getSignDistance(ceilVertices, sdfs, normals);
46 //sv->getSignDistanceMLS(ceilVertices, sdfs, normals);
47 //sv->getSignDistanceKernel(ceilVertices, sdfs);
48
49 //DArray3D<Real> distances(nx + 1, ny + 1, nz + 1);
50 DArray<uint> voxelVertNum(ceilVertices.size() / 8);
51
53 voxelVertNum,
54 ceilVertices,
55 TPlane3D<Real>(center, q.rotate(Coord(0, 1, 0))));
56
57 Reduction<uint> reduce;
58 uint totalVNum = reduce.accumulate(voxelVertNum.begin(), voxelVertNum.size());
59
60 Scan<uint> scan;
61 scan.exclusive(voxelVertNum.begin(), voxelVertNum.size());
62
63 DArray<Coord> triangleVertices(totalVNum);
64
65 DArray<TopologyModule::Triangle> triangles(totalVNum / 3);
66
67 this->stateField()->resize(totalVNum);
68
70 this->stateField()->getData(),
71 triangleVertices,
72 triangles,
73 voxelVertNum,
74 ceilVertices,
75 sdfs,
76 TPlane3D<Real>(center, q.rotate(Coord(0, 1, 0))));
77
78 if (this->stateTriangleSet()->isEmpty()) {
79 this->stateTriangleSet()->setDataPtr(std::make_shared<TriangleSet<TDataType>>());
80 }
81
82 auto triSet = this->stateTriangleSet()->getDataPtr();
83 triSet->setPoints(triangleVertices);
84 triSet->setTriangles(triangles);
85
86 this->stateVertices()->assign(triangleVertices);
87
88 sdfs.clear();
89 normals.clear();
90 voxelVertNum.clear();
91 ceilVertices.clear();
92 triangleVertices.clear();
93 triangles.clear();
94 }
95
96 template<typename TDataType>
101
103}
#define DEFINE_CLASS(name)
Definition Object.h:140
static void countVerticeNumberForOctreeClipper(DArray< uint > &num, DArray< Coord > &vertices, TPlane3D< Real > plane)
static void constructTrianglesForOctreeClipper(DArray< Real > &vertSDFs, DArray< Coord > &triangleVertices, DArray< TopologyModule::Triangle > &triangles, DArray< uint > &num, DArray< Coord > &cellVertices, DArray< Real > &sdfs, TPlane3D< Real > plane)
void reset()
Definition Node.cpp:183
static DYN_FUNC Quat< Real > fromEulerAngles(const Real &yaw, const Real &pitch, const Real &roll)
Definition Quat.h:105
DYN_FUNC Vector< Real, 3 > rotate(const Vector< Real, 3 > &v) const
Rotate a vector by the quaternion, guarantee the quaternion is normalized before rotating the vector.
Definition Quat.inl:259
T accumulate(const T *val, const uint num)
void exclusive(T *output, const T *input, size_t length, bool bcao=true)
2D geometric primitives in three-dimensional space
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Array< T, DeviceType::GPU > DArray
Definition Array.inl:89
unsigned int uint
Definition VkProgram.h:14