9#include <thrust/sort.h>
18 template<
typename TDataType>
22 this->varSpacing()->setRange(0.001, 1.0);
24 auto connect = std::make_shared<FCallBackFunc>(
26 auto input = this->inTriangleSet();
27 Node* src =
dynamic_cast<Node*
>(input->getSource()->parent());
35 this->inTriangleSet()->attach(
connect);
38 template<
typename TDataType>
43 template<
typename TDataType>
46 std::shared_ptr<TriangleSet<TDataType>> triSet = std::make_shared<TriangleSet<TDataType>>();
47 triSet->loadObjFile(filename);
49 triSet->scale(scale_value);
51 triSet->translate(translate_value);
53 Quat<Real> q(rotate_value[0], rotate_value[1], rotate_value[2], 1.0f );
56 this->inTriangleSet()->setDataPtr(triSet);
58 this->inTriangleSet()->getDataPtr()->update();
62 template<
typename TDataType>
65 std::shared_ptr<TriangleSet<TDataType>> triSet = std::make_shared<TriangleSet<TDataType>>();
66 triSet->loadObjFile(filename);
68 this->inTriangleSet()->setDataPtr(triSet);
71 template<
typename TDataType>
75 auto triSet = this->inTriangleSet()->getDataPtr();
76 auto& points_pos = triSet->getPoints();
79 Coord min_box = reduce.
minimum(points_pos.begin(), points_pos.size());
80 Coord max_box = reduce.
maximum(points_pos.begin(), points_pos.size());
82 uint padding = this->varPadding()->getData();
83 Real dx = this->varSpacing()->getData();
86 min_box -= padding *
dx *unit;
87 max_box += padding *
dx *unit;
89 int level = this->varLevelNumber()->getData();
90 int coef = std::floor(
pow(
float(2),
int(level - 1)) +
float(0.1));
92 int nx_offset = std::floor(min_box[0] /
dx + 1e-5);
93 int ny_offset = std::floor(min_box[1] /
dx + 1e-5);
94 int nz_offset = std::floor(min_box[2] /
dx + 1e-5);
95 if ((nx_offset % coef) < 0)
96 nx_offset = nx_offset - (coef -
abs(nx_offset % coef));
98 nx_offset = nx_offset - (nx_offset % coef);
100 if ((ny_offset % coef) < 0)
101 ny_offset = ny_offset - (coef -
abs(ny_offset % coef));
103 ny_offset = ny_offset - (ny_offset % coef);
105 if ((nz_offset % coef) < 0)
106 nz_offset = nz_offset - (coef -
abs(nz_offset % coef));
108 nz_offset = nz_offset - (nz_offset % coef);
109 min_box[0] = nx_offset *
dx;
110 min_box[1] = ny_offset *
dx;
111 min_box[2] = nz_offset *
dx;
113 int nx_offset1 = std::floor(max_box[0] /
dx + 1e-5);
114 int ny_offset1 = std::floor(max_box[1] /
dx + 1e-5);
115 int nz_offset1 = std::floor(max_box[2] /
dx + 1e-5);
116 if ((nx_offset1 % coef) < 0)
117 nx_offset1 = nx_offset1 - (nx_offset1 % coef);
119 nx_offset1 = nx_offset1 + (coef - (nx_offset1 % coef));
121 if ((ny_offset1 % coef) < 0)
122 ny_offset1 = ny_offset1 - (ny_offset1 % coef);
124 ny_offset1 = ny_offset1 + (coef - (ny_offset1 % coef));
126 if ((nz_offset1 % coef) < 0)
127 nz_offset1 = nz_offset1 - (nz_offset1 % coef);
129 nz_offset1 = nz_offset1 + (coef - (nz_offset1 % coef));
130 max_box[0] = nx_offset1 *
dx;
131 max_box[1] = ny_offset1 *
dx;
132 max_box[2] = nz_offset1 *
dx;
134 m_nx = std::ceil((max_box[0] - min_box[0]) /
dx -
float(0.1));
135 m_ny = std::ceil((max_box[1] - min_box[1]) /
dx -
float(0.1));
136 m_nz = std::ceil((max_box[2] - min_box[2]) /
dx -
float(0.1));
143 template<
typename TDataType>
146 int level = this->varLevelNumber()->getData();
148 Real dx = this->varSpacing()->getData();
161 this->inTriangleSet()->getDataPtr(),
166 this->varAABBPadding()->getData(),
195 int grid_total_num = 0;
212 grid_total_num = grid0.size() + grid1.size() + gridT.size();
213 grid_total.resize(grid_total_num);
214 grid_total_value.resize(grid_total_num);
215 this->
m_object.resize(grid_total_num);
216 this->
m_normal.resize(grid_total_num);
236 (grid0.size() + grid1.size()),
295 grid_total_num = grid0.size() + grid1.size() + grid2.size() + gridT.size();
296 grid_total.resize(grid_total_num);
297 grid_total_value.resize(grid_total_num);
298 this->
m_object.resize(grid_total_num);
299 this->
m_normal.resize(grid_total_num);
323 (grid0.size() + grid1.size()),
324 (grid0.size() + grid1.size() + grid2.size()),
356 grid2_object.clear();
357 grid2_normal.clear();
412 grid_total_num = grid0.size() + grid1.size() + grid2.size() + grid3.size() + gridT.size();
413 grid_total.resize(grid_total_num);
414 grid_total_value.resize(grid_total_num);
415 this->
m_object.resize(grid_total_num);
416 this->
m_normal.resize(grid_total_num);
444 (grid0.size() + grid1.size()),
445 (grid0.size() + grid1.size() + grid2.size()),
446 (grid0.size() + grid1.size() + grid2.size() + grid3.size()),
482 grid2_object.clear();
483 grid2_normal.clear();
486 grid3_object.clear();
487 grid3_normal.clear();
492 auto sdf_oct = this->stateSDFTopology()->allocate();
493 sdf_oct->setLevelNum(level);
495 sdf_oct->setVoxelOctree(grid_total);
499 sdf_oct->updateNeighbors();
501 sdf_oct->setSdfValues(grid_total_value);
504 grid_total_value.clear();
507 grid0_object.clear();
508 grid0_normal.clear();
511 grid1_object.clear();
512 grid1_normal.clear();
515 gridT_object.clear();
516 gridT_normal.clear();
521 std::printf(
"Generated ASDF is: %d %d %d, %d %d %d, %f, %f %f %f \n",
527 template<
typename TDataType>
530 Coord move_vector = this->varForwardVector()->getData();
534 auto triSet = this->inTriangleSet()->getDataPtr();
536 triSet->translate(move_vector);
540 template<
typename TDataType>
#define DEFINE_CLASS(name)
#define IMPLEMENT_TCLASS(name, T1)
virtual void setVisible(bool visible)
Set the visibility of context.
bool connect(NodePort *nPort)
Depth-first tree traversal.
T maximum(const T *val, const uint num)
T minimum(const T *val, const uint num)
static void levelBottom(DArray< VoxelOctreeNode< Coord > > &grid0, DArray< Real > &grid0_value, DArray< Coord > &grid0_object, DArray< Coord > &grid0_normal, std::shared_ptr< TriangleSet< TDataType > > triSet, Coord m_origin, int m_nx, int m_ny, int m_nz, int padding, int &m_level0, Real m_dx)
static void levelMiddle(DArray< VoxelOctreeNode< Coord > > &grid1, DArray< Real > &grid1_value, DArray< Coord > &grid1_object, DArray< Coord > &grid1_normal, DArray< VoxelOctreeNode< Coord > > &grid0, DArray< Coord > &grid0_object, DArray< Coord > &grid0_normal, Coord m_origin, Level multi_level, int m_nx, int m_ny, int m_nz, Real m_dx)
static void collectionGridsFour(DArray< VoxelOctreeNode< Coord > > &total_nodes, DArray< Real > &total_value, DArray< Coord > &total_object, DArray< Coord > &total_normal, DArray< VoxelOctreeNode< Coord > > &level0_nodes, DArray< Real > &level0_value, DArray< Coord > &level0_object, DArray< Coord > &level0_normal, DArray< VoxelOctreeNode< Coord > > &level1_nodes, DArray< Real > &level1_value, DArray< Coord > &level1_object, DArray< Coord > &level1_normal, DArray< VoxelOctreeNode< Coord > > &level2_nodes, DArray< Real > &level2_value, DArray< Coord > &level2_object, DArray< Coord > &level2_normal, DArray< VoxelOctreeNode< Coord > > &levelT_nodes, DArray< Real > &levelT_value, DArray< Coord > &levelT_object, DArray< Coord > &levelT_normal, int level0_num, int level1_num, int level2_num, int grid_total_num)
static void levelTop(DArray< VoxelOctreeNode< Coord > > &grid2, DArray< Real > &grid2_value, DArray< Coord > &grid2_object, DArray< Coord > &grid2_normal, DArray< VoxelOctreeNode< Coord > > &grid1, DArray< Coord > &grid1_object, DArray< Coord > &grid1_normal, Coord m_origin, Level multi_level, int m_nx, int m_ny, int m_nz, Real m_dx)
static void collectionGridsFive(DArray< VoxelOctreeNode< Coord > > &total_nodes, DArray< Real > &total_value, DArray< Coord > &total_object, DArray< Coord > &total_normal, DArray< VoxelOctreeNode< Coord > > &level0_nodes, DArray< Real > &level0_value, DArray< Coord > &level0_object, DArray< Coord > &level0_normal, DArray< VoxelOctreeNode< Coord > > &level1_nodes, DArray< Real > &level1_value, DArray< Coord > &level1_object, DArray< Coord > &level1_normal, DArray< VoxelOctreeNode< Coord > > &level2_nodes, DArray< Real > &level2_value, DArray< Coord > &level2_object, DArray< Coord > &level2_normal, DArray< VoxelOctreeNode< Coord > > &level3_nodes, DArray< Real > &level3_value, DArray< Coord > &level3_object, DArray< Coord > &level3_normal, DArray< VoxelOctreeNode< Coord > > &levelT_nodes, DArray< Real > &levelT_value, DArray< Coord > &levelT_object, DArray< Coord > &levelT_normal, int level0_num, int level1_num, int level2_num, int level3_num, int grid_total_num)
static void collectionGridsThree(DArray< VoxelOctreeNode< Coord > > &total_nodes, DArray< Real > &total_value, DArray< Coord > &total_object, DArray< Coord > &total_normal, DArray< VoxelOctreeNode< Coord > > &level0_nodes, DArray< Real > &level0_value, DArray< Coord > &level0_object, DArray< Coord > &level0_normal, DArray< VoxelOctreeNode< Coord > > &level1_nodes, DArray< Real > &level1_value, DArray< Coord > &level1_object, DArray< Coord > &level1_normal, DArray< VoxelOctreeNode< Coord > > &levelT_nodes, DArray< Real > &levelT_value, DArray< Coord > &levelT_object, DArray< Coord > &levelT_normal, int level0_num, int level1_num, int grid_total_num)
This is a GPU-based implementation of algebraic adaptive signed distance field (AASDF)....
void resetStates() override
void updateTopology() override
~VolumeOctreeGenerator() override
void updateStates() override
void load(std::string filename)
This is an implementation of AdditiveCCD based on peridyno.
Array< T, DeviceType::GPU > DArray
DYN_FUNC Complex< Real > pow(const Complex< Real > &, const Real &)
DYN_FUNC T abs(const T &v)
constexpr Real REAL_EPSILON