PeriDyno 1.0.0
Loading...
Searching...
No Matches
VolumeOctreeBoolean.cpp
Go to the documentation of this file.
2#include "VoxelOctree.h"
4
5#include <fstream>
6#include <iostream>
7#include <sstream>
8#include <limits>
9#include <thrust/sort.h>
10#include <ctime>
11
12namespace dyno
13{
15
16 template<typename TDataType>
18 : VolumeOctree<TDataType>()
19 {
20 auto connect = std::make_shared<FCallBackFunc>(
21 [=]() {
22 auto vol0 = this->getOctreeA();
23 auto vol1 = this->getOctreeB();
24 if (vol0 != nullptr && vol1 != nullptr)
25 {
26 vol0->setVisible(false);
27 vol1->setVisible(false);
28 }
29 }
30 );
31
32 this->importOctreeA()->attach(connect);
33 this->importOctreeB()->attach(connect);
34 }
35
36 template<typename TDataType>
40
41 template<typename TDataType>
43 {
44 auto sdfOctree_a = this->getOctreeA()->stateSDFTopology()->getDataPtr();
45 auto sdfOctree_b = this->getOctreeB()->stateSDFTopology()->getDataPtr();
46
47 if (this->varMinDx()->getData() == true)
48 m_dx = std::min(sdfOctree_a->getDx(), sdfOctree_b->getDx());
49 else
50 m_dx = std::max(sdfOctree_a->getDx(), sdfOctree_b->getDx());
51
52 if ((sdfOctree_a->getDx()) == (sdfOctree_b->getDx()))
53 {
55 }
56 else
57 {
58 if (m_dx == (sdfOctree_a->getDx()))
60 else if (m_dx == (sdfOctree_b->getDx()))
62 }
63
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]);
71 Coord torigin;
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]);
77
78 int nx_offset = std::floor(m_origin[0] / m_dx + 1e-5);
79 int ny_offset = std::floor(m_origin[1] / m_dx + 1e-5);
80 int nz_offset = std::floor(m_origin[2] / m_dx + 1e-5);
81 if ((nx_offset % coef) < 0)
82 nx_offset = nx_offset - (coef - abs(nx_offset % coef));
83 else
84 nx_offset = nx_offset - (nx_offset % coef);
85
86 if ((ny_offset % coef) < 0)
87 ny_offset = ny_offset - (coef - abs(ny_offset % coef));
88 else
89 ny_offset = ny_offset - (ny_offset % coef);
90
91 if ((nz_offset % coef) < 0)
92 nz_offset = nz_offset - (coef - abs(nz_offset % coef));
93 else
94 nz_offset = nz_offset - (nz_offset % coef);
95 m_origin[0] = nx_offset * m_dx;
96 m_origin[1] = ny_offset * m_dx;
97 m_origin[2] = nz_offset * m_dx;
98
99
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);
105 else
106 nx_offset1 = nx_offset1 + (coef - (nx_offset1 % coef));
107
108 if ((ny_offset1 % coef) < 0)
109 ny_offset1 = ny_offset1 - (ny_offset1 % coef);
110 else
111 ny_offset1 = ny_offset1 + (coef - (ny_offset1 % coef));
112
113 if ((nz_offset1 % coef) < 0)
114 nz_offset1 = nz_offset1 - (nz_offset1 % coef);
115 else
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;
120
121 m_nx = std::ceil((torigin[0] - m_origin[0]) / m_dx - float(0.1));
122 m_ny = std::ceil((torigin[1] - m_origin[1]) / m_dx - float(0.1));
123 m_nz = std::ceil((torigin[2] - m_origin[2]) / m_dx - float(0.1));
124
125 if (m_reconstructed_model == 0)
126 {
127 m_offset_ax = std::round((origin_a[0] - m_origin[0]) / m_dx - 1e-5);
128 m_offset_ay = std::round((origin_a[1] - m_origin[1]) / m_dx - 1e-5);
129 m_offset_az = std::round((origin_a[2] - m_origin[2]) / m_dx - 1e-5);
130
131 m_offset_bx = std::round((origin_b[0] - m_origin[0]) / m_dx - 1e-5);
132 m_offset_by = std::round((origin_b[1] - m_origin[1]) / m_dx - 1e-5);
133 m_offset_bz = std::round((origin_b[2] - m_origin[2]) / m_dx - 1e-5);
134 }
135 else if (m_reconstructed_model == 1)
136 {
137 m_offset_bx = std::ceil((origin_b[0] - m_origin[0]) / m_dx - 1e-5);
138 m_offset_by = std::ceil((origin_b[1] - m_origin[1]) / m_dx - 1e-5);
139 m_offset_bz = std::ceil((origin_b[2] - m_origin[2]) / m_dx - 1e-5);
140 }
141 else if (m_reconstructed_model == 2)
142 {
143 m_offset_ax = std::ceil((origin_a[0] - m_origin[0]) / m_dx - 1e-5);
144 m_offset_ay = std::ceil((origin_a[1] - m_origin[1]) / m_dx - 1e-5);
145 m_offset_az = std::ceil((origin_a[2] - m_origin[2]) / m_dx - 1e-5);
146 }
147
148 printf("octree union: %d \n", m_reconstructed_model);
149 //std::printf("The origin, dx, nx, ny, nz are: %f %f %f, %f, %d %d %d, %d %d %d, %d %d %d \n",
150 // m_origin[0], m_origin[1], m_origin[2], m_dx, m_nx, m_ny, m_nz,
151 // m_offset_ax, m_offset_ay, m_offset_az, m_offset_bx, m_offset_by, m_offset_bz);
152 }
153
154 template<typename TDataType>
156 {
157
158// getLeafsValue();
159 }
160
161
162
163
164 template<typename TDataType>
166 {
167 DArray<Coord> leaf_nodes;
168 DArray<int> leaf_index;
169 DArray<Real> leaf_value_a;
170 DArray<Real> leaf_value_b;
171
172 auto m_octree_a = this->getOctreeA();
173 auto m_octree_b = this->getOctreeB();
174
175 auto& octree_inter_value = this->stateSDFTopology()->getDataPtr()->getSdfValues();
176 auto octree_inter = this->stateSDFTopology()->getDataPtr();
177
178 DArray<Coord> leaf_normal_a,leaf_normal_b;
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();
184
185 auto booleanType = this->varBooleanType()->getDataPtr()->currentKey();
187 octree_inter_value,
188 leaf_index,
189 leaf_value_a,
190 leaf_value_b,
191 booleanType);
192
193 leaf_nodes.clear();
194 leaf_index.clear();
195 leaf_value_a.clear();
196 leaf_value_b.clear();
197 }
198
199 template<typename TDataType>
201 {
202 auto booleanType = this->varBooleanType()->getDataPtr()->currentKey();
203 int level = this->varLevelNumber()->getData();
205
206 // initialize data
207 auto m_octree_a = this->getOctreeA();
208 auto m_octree_b = this->getOctreeB();
209
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;
215
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;
221
222 int level0_a = sdfOctree_a->getLevel0();
223 int level0_b = sdfOctree_b->getLevel0();
224
226 DArray<Real> grid0_value;
227 DArray<Coord> grid0_object;
228 DArray<Coord> grid0_normal;
229 if (m_reconstructed_model == 0)
230 {
232 grid0,
233 grid0_value,
234 grid0_object,
235 grid0_normal,
236 sdfOctreeNode_a,
237 sdfValue_a,
238 object_a,
239 normal_a,
240 sdfOctreeNode_b,
241 sdfValue_b,
242 object_b,
243 normal_b,
244 sdfOctree_a,
245 sdfOctree_b,
252 level0_a,
253 level0_b,
254 m_level0,
255 m_origin,
256 m_dx,
257 m_nx,
258 m_ny,
259 m_nz,
260 booleanType);
261 }
262 else if (m_reconstructed_model == 1)
263 {
264 DArray<PositionNode> recon_level0;
265 DArray<Real> recon_sdf;
266 DArray<Coord> recon_object, recon_normal;
267 int level0_a_recon;
269 recon_level0,
270 recon_sdf,
271 recon_object,
272 recon_normal,
273 sdfOctreeNode_a,
274 object_a,
275 normal_a,
276 m_origin,
277 m_dx,
278 m_nx,
279 m_ny,
280 m_nz,
281 sdfOctree_a->getDx(),
282 level0_a,
283 level0_a_recon);
284
286 grid0,
287 grid0_value,
288 grid0_object,
289 grid0_normal,
290 recon_level0,
291 recon_sdf,
292 recon_object,
293 recon_normal,
294 sdfOctreeNode_b,
295 sdfValue_b,
296 object_b,
297 normal_b,
298 sdfOctree_a,
299 sdfOctree_b,
300 level0_a_recon,
301 level0_b,
302 m_level0,
306 m_origin,
307 m_dx,
308 m_nx,
309 m_ny,
310 m_nz,
311 booleanType);
312
313 recon_level0.clear();
314 recon_sdf.clear();
315 recon_object.clear();
316 recon_normal.clear();
317 }
318 else if (m_reconstructed_model == 2)
319 {
320 DArray<PositionNode> recon_level0;
321 DArray<Real> recon_sdf;
322 DArray<Coord> recon_object, recon_normal;
323 int level0_b_recon;
325 recon_level0,
326 recon_sdf,
327 recon_object,
328 recon_normal,
329 sdfOctreeNode_b,
330 object_b,
331 normal_b,
332 m_origin,
333 m_dx,
334 m_nx,
335 m_ny,
336 m_nz,
337 sdfOctree_b->getDx(),
338 level0_b,
339 level0_b_recon);
340
341 if (booleanType == 2) booleanType = 3;
343 grid0,
344 grid0_value,
345 grid0_object,
346 grid0_normal,
347 recon_level0,
348 recon_sdf,
349 recon_object,
350 recon_normal,
351 sdfOctreeNode_a,
352 sdfValue_a,
353 object_a,
354 normal_b,
355 sdfOctree_b,
356 sdfOctree_a,
357 level0_b_recon,
358 level0_a,
359 m_level0,
363 m_origin,
364 m_dx,
365 m_nx,
366 m_ny,
367 m_nz,
368 booleanType);
369
370 recon_level0.clear();
371 recon_sdf.clear();
372 recon_object.clear();
373 recon_normal.clear();
374 }
375
376 if (grid0.isEmpty())
377 {
378 return;
379 }
380
382 DArray<Real> gridT_value;
383 DArray<Coord> gridT_object, gridT_normal;
385 DArray<Real> grid_total_value;
386 int grid_total_num = 0;
387
388 if (level == 2)
389 {
391 gridT,
392 gridT_value,
393 gridT_object,
394 gridT_normal,
395 grid0,
396 grid0_object,
397 grid0_normal,
398 m_origin,
399 Level(1),
400 m_nx,
401 m_ny,
402 m_nz,
403 m_dx);
404
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);
410
412 grid_total,
413 grid_total_value,
414 this->m_object,
415 this->m_normal,
416 grid0,
417 grid0_value,
418 grid0_object,
419 grid0_normal,
420 gridT,
421 gridT_value,
422 gridT_object,
423 gridT_normal,
424 grid0.size(),
425 grid_total_num);
426 }
427
428 if (level == 3)
429 {
431 DArray<Real> grid1_value;
432 DArray<Coord> grid1_object;
433 DArray<Coord> grid1_normal;
435 grid1,
436 grid1_value,
437 grid1_object,
438 grid1_normal,
439 grid0,
440 grid0_object,
441 grid0_normal,
442 m_origin,
443 Level(1),
444 m_nx,
445 m_ny,
446 m_nz,
447 m_dx);
448
450 gridT,
451 gridT_value,
452 gridT_object,
453 gridT_normal,
454 grid1,
455 grid1_object,
456 grid1_normal,
457 m_origin,
458 Level(2),
459 m_nx,
460 m_ny,
461 m_nz,
462 m_dx);
463
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);
469
471 grid_total,
472 grid_total_value,
473 this->m_object,
474 this->m_normal,
475 grid0,
476 grid0_value,
477 grid0_object,
478 grid0_normal,
479 grid1,
480 grid1_value,
481 grid1_object,
482 grid1_normal,
483 gridT,
484 gridT_value,
485 gridT_object,
486 gridT_normal,
487 grid0.size(),
488 (grid0.size() + grid1.size()),
489 grid_total_num);
490
491 grid1.clear();
492 grid1_value.clear();
493 grid1_object.clear();
494 grid1_normal.clear();
495 }
496
497 if (level == 4)
498 {
500 DArray<Real> grid1_value;
501 DArray<Coord> grid1_object;
502 DArray<Coord> grid1_normal;
504 grid1,
505 grid1_value,
506 grid1_object,
507 grid1_normal,
508 grid0,
509 grid0_object,
510 grid0_normal,
511 m_origin,
512 Level(1),
513 m_nx,
514 m_ny,
515 m_nz,
516 m_dx);
517
519 DArray<Real> grid2_value;
520 DArray<Coord> grid2_object;
521 DArray<Coord> grid2_normal;
523 grid2_value,
524 grid2_object,
525 grid2_normal,
526 grid1,
527 grid1_object,
528 grid1_normal,
529 m_origin,
530 Level(2),
531 m_nx,
532 m_ny,
533 m_nz,
534 m_dx);
535
537 gridT,
538 gridT_value,
539 gridT_object,
540 gridT_normal,
541 grid2,
542 grid2_object,
543 grid2_normal,
544 m_origin,
545 Level(3),
546 m_nx,
547 m_ny,
548 m_nz,
549 m_dx);
550
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);
556
557
559 grid_total,
560 grid_total_value,
561 this->m_object,
562 this->m_normal,
563 grid0,
564 grid0_value,
565 grid0_object,
566 grid0_normal,
567 grid1,
568 grid1_value,
569 grid1_object,
570 grid1_normal,
571 grid2,
572 grid2_value,
573 grid2_object,
574 grid2_normal,
575 gridT,
576 gridT_value,
577 gridT_object,
578 gridT_normal,
579 grid0.size(),
580 (grid0.size() + grid1.size()),
581 (grid0.size() + grid1.size() + grid2.size()),
582 grid_total_num);
583
584 grid1.clear();
585 grid1_value.clear();
586 grid1_object.clear();
587 grid1_normal.clear();
588 grid2.clear();
589 grid2_value.clear();
590 grid2_object.clear();
591 grid2_normal.clear();
592 }
593
594 if (level == 5)
595 {
597 DArray<Real> grid1_value;
598 DArray<Coord> grid1_object;
599 DArray<Coord> grid1_normal;
601 grid1,
602 grid1_value,
603 grid1_object,
604 grid1_normal,
605 grid0,
606 grid0_object,
607 grid0_normal,
608 m_origin,
609 Level(1),
610 m_nx,
611 m_ny,
612 m_nz,
613 m_dx);
614
616 DArray<Real> grid2_value;
617 DArray<Coord> grid2_object;
618 DArray<Coord> grid2_normal;
620 grid2_value,
621 grid2_object,
622 grid2_normal,
623 grid1,
624 grid1_object,
625 grid1_normal,
626 m_origin,
627 Level(2),
628 m_nx,
629 m_ny,
630 m_nz,
631 m_dx);
632
634 DArray<Real> grid3_value;
635 DArray<Coord> grid3_object;
636 DArray<Coord> grid3_normal;
638 grid3_value,
639 grid3_object,
640 grid3_normal,
641 grid2,
642 grid2_object,
643 grid2_normal,
644 m_origin,
645 Level(3),
646 m_nx,
647 m_ny,
648 m_nz,
649 m_dx);
650
652 gridT,
653 gridT_value,
654 gridT_object,
655 gridT_normal,
656 grid3,
657 grid3_object,
658 grid3_normal,
659 m_origin,
660 Level(4),
661 m_nx,
662 m_ny,
663 m_nz,
664 m_dx);
665
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);
671
673 grid_total,
674 grid_total_value,
675 this->m_object,
676 this->m_normal,
677 grid0,
678 grid0_value,
679 grid0_object,
680 grid0_normal,
681 grid1,
682 grid1_value,
683 grid1_object,
684 grid1_normal,
685 grid2,
686 grid2_value,
687 grid2_object,
688 grid2_normal,
689 grid3,
690 grid3_value,
691 grid3_object,
692 grid3_normal,
693 gridT,
694 gridT_value,
695 gridT_object,
696 gridT_normal,
697 grid0.size(),
698 (grid0.size() + grid1.size()),
699 (grid0.size() + grid1.size() + grid2.size()),
700 (grid0.size() + grid1.size() + grid2.size() + grid3.size()),
701 grid_total_num
702 );
703
704 grid1.clear();
705 grid1_value.clear();
706 grid1_object.clear();
707 grid1_normal.clear();
708 grid2.clear();
709 grid2_value.clear();
710 grid2_object.clear();
711 grid2_normal.clear();
712 grid3.clear();
713 grid3_value.clear();
714 grid3_object.clear();
715 grid3_normal.clear();
716 }
717
718 auto sdf_oct = this->stateSDFTopology()->allocate();
719 sdf_oct->setLevelNum(level);
720 sdf_oct->setGrid(m_nx, m_ny, m_nz);
721 sdf_oct->setVoxelOctree(grid_total);
722 sdf_oct->setDx(m_dx);
723 sdf_oct->setOrigin(m_origin);
724 sdf_oct->setLevel0(m_level0);
725 sdf_oct->updateNeighbors();
726 sdf_oct->setSdfValues(grid_total_value);
727
728 grid_total.clear();
729 grid_total_value.clear();
730 grid0.clear();
731 grid0_value.clear();
732 grid0_object.clear();
733 grid0_normal.clear();
734 gridT.clear();
735 gridT_value.clear();
736 gridT_object.clear();
737 gridT_normal.clear();
738
740 }
741
742 template<typename TDataType>
744 {
745 if (this->getOctreeA() == nullptr || this->getOctreeB() == nullptr) {
746 return false;
747 }
748
750 }
751
753}
#define DEFINE_CLASS(name)
Definition Object.h:140
#define IMPLEMENT_TCLASS(name, T1)
Definition Object.h:103
virtual bool validateInputs()
Definition Node.cpp:219
bool connect(NodePort *nPort)
Depth-first tree traversal.
Definition Node.cpp:481
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)
DArray< Coord > m_object
DArray< Coord > m_normal
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Array< T, DeviceType::GPU > DArray
Definition Array.inl:89
DYN_FUNC Complex< Real > pow(const Complex< Real > &, const Real &)
Definition Complex.inl:370
DYN_FUNC T abs(const T &v)
Definition SimpleMath.h:81