9#include <thrust/sort.h>
16 template<
typename TDataType>
20 auto connect = std::make_shared<FCallBackFunc>(
22 auto vol0 = this->getOctreeA();
23 auto vol1 = this->getOctreeB();
24 if (vol0 !=
nullptr && vol1 !=
nullptr)
26 vol0->setVisible(
false);
27 vol1->setVisible(
false);
32 this->importOctreeA()->attach(
connect);
33 this->importOctreeB()->attach(
connect);
36 template<
typename TDataType>
41 template<
typename TDataType>
44 auto sdfOctree_a = this->getOctreeA()->stateSDFTopology()->getDataPtr();
45 auto sdfOctree_b = this->getOctreeB()->stateSDFTopology()->getDataPtr();
47 if (this->varMinDx()->getData() ==
true)
48 m_dx = std::min(sdfOctree_a->getDx(), sdfOctree_b->getDx());
50 m_dx = std::max(sdfOctree_a->getDx(), sdfOctree_b->getDx());
52 if ((sdfOctree_a->getDx()) == (sdfOctree_b->getDx()))
58 if (
m_dx == (sdfOctree_a->getDx()))
60 else if (
m_dx == (sdfOctree_b->getDx()))
64 int level = this->varLevelNumber()->getData();
65 int coef = std::floor(
pow(
float(2),
int(level - 1)) +
float(0.1));
66 Coord origin_a = sdfOctree_a->getOrigin();
67 Coord origin_b = sdfOctree_b->getOrigin();
68 m_origin[0] = std::min(origin_a[0], origin_b[0]);
69 m_origin[1] = std::min(origin_a[1], origin_b[1]);
70 m_origin[2] = std::min(origin_a[2], origin_b[2]);
72 auto torigin_a = sdfOctree_a->getTopOrigin();
73 auto torigin_b = sdfOctree_b->getTopOrigin();
74 torigin[0] = std::max(torigin_a[0], torigin_b[0]);
75 torigin[1] = std::max(torigin_a[1], torigin_b[1]);
76 torigin[2] = std::max(torigin_a[2], torigin_b[2]);
81 if ((nx_offset % coef) < 0)
82 nx_offset = nx_offset - (coef -
abs(nx_offset % coef));
84 nx_offset = nx_offset - (nx_offset % coef);
86 if ((ny_offset % coef) < 0)
87 ny_offset = ny_offset - (coef -
abs(ny_offset % coef));
89 ny_offset = ny_offset - (ny_offset % coef);
91 if ((nz_offset % coef) < 0)
92 nz_offset = nz_offset - (coef -
abs(nz_offset % coef));
94 nz_offset = nz_offset - (nz_offset % coef);
100 int nx_offset1 = std::floor(torigin[0] /
m_dx + 1e-5);
101 int ny_offset1 = std::floor(torigin[1] /
m_dx + 1e-5);
102 int nz_offset1 = std::floor(torigin[2] /
m_dx + 1e-5);
103 if ((nx_offset1 % coef) < 0)
104 nx_offset1 = nx_offset1 - (nx_offset1 % coef);
106 nx_offset1 = nx_offset1 + (coef - (nx_offset1 % coef));
108 if ((ny_offset1 % coef) < 0)
109 ny_offset1 = ny_offset1 - (ny_offset1 % coef);
111 ny_offset1 = ny_offset1 + (coef - (ny_offset1 % coef));
113 if ((nz_offset1 % coef) < 0)
114 nz_offset1 = nz_offset1 - (nz_offset1 % coef);
116 nz_offset1 = nz_offset1 + (coef - (nz_offset1 % coef));
117 torigin[0] = nx_offset1 *
m_dx;
118 torigin[1] = ny_offset1 *
m_dx;
119 torigin[2] = nz_offset1 *
m_dx;
154 template<
typename TDataType>
164 template<
typename TDataType>
172 auto m_octree_a = this->getOctreeA();
173 auto m_octree_b = this->getOctreeB();
175 auto& octree_inter_value = this->stateSDFTopology()->getDataPtr()->getSdfValues();
176 auto octree_inter = this->stateSDFTopology()->getDataPtr();
179 octree_inter->getLeafs(leaf_nodes, leaf_index);
180 m_octree_a->stateSDFTopology()->getDataPtr()->getSignDistance(leaf_nodes, leaf_value_a,leaf_normal_a);
181 m_octree_b->stateSDFTopology()->getDataPtr()->getSignDistance(leaf_nodes, leaf_value_b,leaf_normal_b);
182 leaf_normal_a.clear();
183 leaf_normal_b.clear();
185 auto booleanType = this->varBooleanType()->getDataPtr()->currentKey();
195 leaf_value_a.clear();
196 leaf_value_b.clear();
199 template<
typename TDataType>
202 auto booleanType = this->varBooleanType()->getDataPtr()->currentKey();
203 int level = this->varLevelNumber()->getData();
207 auto m_octree_a = this->getOctreeA();
208 auto m_octree_b = this->getOctreeB();
210 auto sdfOctree_a = m_octree_a->stateSDFTopology()->getDataPtr();
211 auto& sdfOctreeNode_a = sdfOctree_a->getVoxelOctree();
212 auto& sdfValue_a = sdfOctree_a->getSdfValues();
213 auto& object_a = m_octree_a->m_object;
214 auto& normal_a = m_octree_a->m_normal;
216 auto sdfOctree_b = m_octree_b->stateSDFTopology()->getDataPtr();
217 auto& sdfOctreeNode_b = sdfOctree_b->getVoxelOctree();
218 auto& sdfValue_b = sdfOctree_b->getSdfValues();
219 auto& object_b = m_octree_b->m_object;
220 auto& normal_b = m_octree_b->m_normal;
222 int level0_a = sdfOctree_a->getLevel0();
223 int level0_b = sdfOctree_b->getLevel0();
281 sdfOctree_a->getDx(),
313 recon_level0.clear();
315 recon_object.clear();
316 recon_normal.clear();
337 sdfOctree_b->getDx(),
341 if (booleanType == 2) booleanType = 3;
370 recon_level0.clear();
372 recon_object.clear();
373 recon_normal.clear();
386 int grid_total_num = 0;
405 grid_total_num = grid0.size() + gridT.size();
406 grid_total.resize(grid_total_num);
407 grid_total_value.resize(grid_total_num);
408 this->
m_object.resize(grid_total_num);
409 this->
m_normal.resize(grid_total_num);
464 grid_total_num = grid0.size() + grid1.size() + gridT.size();
465 grid_total.resize(grid_total_num);
466 grid_total_value.resize(grid_total_num);
467 this->
m_object.resize(grid_total_num);
468 this->
m_normal.resize(grid_total_num);
488 (grid0.size() + grid1.size()),
493 grid1_object.clear();
494 grid1_normal.clear();
551 grid_total_num = grid0.size() + grid1.size() + grid2.size() + gridT.size();
552 grid_total.resize(grid_total_num);
553 grid_total_value.resize(grid_total_num);
554 this->
m_object.resize(grid_total_num);
555 this->
m_normal.resize(grid_total_num);
580 (grid0.size() + grid1.size()),
581 (grid0.size() + grid1.size() + grid2.size()),
586 grid1_object.clear();
587 grid1_normal.clear();
590 grid2_object.clear();
591 grid2_normal.clear();
666 grid_total_num = grid0.size() + grid1.size() + grid2.size() + grid3.size() + gridT.size();
667 grid_total.resize(grid_total_num);
668 grid_total_value.resize(grid_total_num);
669 this->
m_object.resize(grid_total_num);
670 this->
m_normal.resize(grid_total_num);
698 (grid0.size() + grid1.size()),
699 (grid0.size() + grid1.size() + grid2.size()),
700 (grid0.size() + grid1.size() + grid2.size() + grid3.size()),
706 grid1_object.clear();
707 grid1_normal.clear();
710 grid2_object.clear();
711 grid2_normal.clear();
714 grid3_object.clear();
715 grid3_normal.clear();
718 auto sdf_oct = this->stateSDFTopology()->allocate();
719 sdf_oct->setLevelNum(level);
721 sdf_oct->setVoxelOctree(grid_total);
722 sdf_oct->setDx(
m_dx);
725 sdf_oct->updateNeighbors();
726 sdf_oct->setSdfValues(grid_total_value);
729 grid_total_value.clear();
732 grid0_object.clear();
733 grid0_normal.clear();
736 gridT_object.clear();
737 gridT_normal.clear();
742 template<
typename TDataType>
745 if (this->getOctreeA() ==
nullptr || this->getOctreeB() ==
nullptr) {
#define DEFINE_CLASS(name)
#define IMPLEMENT_TCLASS(name, T1)
virtual bool validateInputs()
bool connect(NodePort *nPort)
Depth-first tree traversal.
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 collectionGridsTwo(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 > > &levelT_nodes, DArray< Real > &levelT_value, DArray< Coord > &levelT_object, DArray< Coord > &levelT_normal, int level0_num, int grid_total_num)
static void finestLevelReconstBoolean(DArray< VoxelOctreeNode< Coord > > &grid0, DArray< Real > &grid0_value, DArray< Coord > &grid0_object, DArray< Coord > &grid0_normal, DArray< PositionNode > &recon_node, DArray< Real > &recon_sdf, DArray< Coord > &recon_object, DArray< Coord > &recon_normal, DArray< VoxelOctreeNode< Coord > > &sdfOctreeNode_2, DArray< Real > &sdfValue_2, DArray< Coord > &object_2, DArray< Coord > &normal_2, std::shared_ptr< VoxelOctree< TDataType > > sdfOctree_a, std::shared_ptr< VoxelOctree< TDataType > > sdfOctree_b, int level0_1, int level0_2, int &m_level0, int offset_nx, int offset_ny, int offset_nz, Coord m_origin, Real m_dx, int m_nx, int m_ny, int m_nz, int boolean)
static void finestLevelBoolean(DArray< VoxelOctreeNode< Coord > > &grid0, DArray< Real > &grid0_value, DArray< Coord > &grid0_object, DArray< Coord > &grid0_normal, DArray< VoxelOctreeNode< Coord > > &sdfOctreeNode_a, DArray< Real > &sdfValue_a, DArray< Coord > &object_a, DArray< Coord > &normal_a, DArray< VoxelOctreeNode< Coord > > &sdfOctreeNode_b, DArray< Real > &sdfValue_b, DArray< Coord > &object_b, DArray< Coord > &normal_b, std::shared_ptr< VoxelOctree< TDataType > > sdfOctree_a, std::shared_ptr< VoxelOctree< TDataType > > sdfOctree_b, int offset_ax, int offset_ay, int offset_az, int offset_bx, int offset_by, int offset_bz, int level0_a, int level0_b, int &m_level0, Coord m_origin, Real m_dx, int m_nx, int m_ny, int m_nz, int boolean)
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 updateBooleanSigned(DArray< Real > &leaf_value, DArray< int > &leaf_index, DArray< Real > &leaf_value_a, DArray< Real > &leaf_value_b, int boolean)
static void finestLevelReconstruction(DArray< PositionNode > &recon_node, DArray< Real > &recon_sdf, DArray< Coord > &recon_object, DArray< Coord > &recon_normal, DArray< VoxelOctreeNode< Coord > > &grid, DArray< Coord > &grid_object, DArray< Coord > &grid_normal, Coord m_origin, Real m_dx, int m_nx, int m_ny, int m_nz, Real m_dx_old, int level_0, int &level_0_recon)
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)
bool validateInputs() override
void resetStates() override
~VolumeOctreeBoolean() override
int m_reconstructed_model
void updateSignOperation()
void updateStates() override
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)