PeriDyno 1.0.0
Loading...
Searching...
No Matches
VolumeOctreeGenerator.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
12#include "VolumeHelper.h"
13
14namespace dyno
15{
17
18 template<typename TDataType>
20 : VolumeOctree<TDataType>()
21 {
22 this->varSpacing()->setRange(0.001, 1.0);
23
24 auto connect = std::make_shared<FCallBackFunc>(
25 [=]() {
26 auto input = this->inTriangleSet();
27 Node* src = dynamic_cast<Node*>(input->getSource()->parent());
28 if (src != nullptr)
29 {
30 src->setVisible(false);
31 }
32 }
33 );
34
35 this->inTriangleSet()->attach(connect);
36 }
37
38 template<typename TDataType>
42
43 template<typename TDataType>
44 void VolumeOctreeGenerator<TDataType>::load(std::string filename, Coord rotate_value, Real scale_value, Coord translate_value)
45 {
46 std::shared_ptr<TriangleSet<TDataType>> triSet = std::make_shared<TriangleSet<TDataType>>();
47 triSet->loadObjFile(filename);
48
49 triSet->scale(scale_value);
50
51 triSet->translate(translate_value);
52
53 Quat<Real> q(rotate_value[0], rotate_value[1], rotate_value[2], 1.0f );
54 triSet->rotate(q);
55
56 this->inTriangleSet()->setDataPtr(triSet);
57
58 this->inTriangleSet()->getDataPtr()->update();
59
60 }
61
62 template<typename TDataType>
63 void VolumeOctreeGenerator<TDataType>::load(std::string filename)
64 {
65 std::shared_ptr<TriangleSet<TDataType>> triSet = std::make_shared<TriangleSet<TDataType>>();
66 triSet->loadObjFile(filename);
67
68 this->inTriangleSet()->setDataPtr(triSet);
69 }
70
71 template<typename TDataType>
73 {
74 // initialize data
75 auto triSet = this->inTriangleSet()->getDataPtr();
76 auto& points_pos = triSet->getPoints();
77
78 Reduction<Coord> reduce;
79 Coord min_box = reduce.minimum(points_pos.begin(), points_pos.size());
80 Coord max_box = reduce.maximum(points_pos.begin(), points_pos.size());
81
82 uint padding = this->varPadding()->getData();
83 Real dx = this->varSpacing()->getData();
84
85 Coord unit(1, 1, 1);
86 min_box -= padding * dx *unit;
87 max_box += padding * dx *unit;
88
89 int level = this->varLevelNumber()->getData();
90 int coef = std::floor(pow(float(2), int(level - 1)) + float(0.1));
91
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));
97 else
98 nx_offset = nx_offset - (nx_offset % coef);
99
100 if ((ny_offset % coef) < 0)
101 ny_offset = ny_offset - (coef - abs(ny_offset % coef));
102 else
103 ny_offset = ny_offset - (ny_offset % coef);
104
105 if ((nz_offset % coef) < 0)
106 nz_offset = nz_offset - (coef - abs(nz_offset % coef));
107 else
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;
112
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);
118 else
119 nx_offset1 = nx_offset1 + (coef - (nx_offset1 % coef));
120
121 if ((ny_offset1 % coef) < 0)
122 ny_offset1 = ny_offset1 - (ny_offset1 % coef);
123 else
124 ny_offset1 = ny_offset1 + (coef - (ny_offset1 % coef));
125
126 if ((nz_offset1 % coef) < 0)
127 nz_offset1 = nz_offset1 - (nz_offset1 % coef);
128 else
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;
133
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));
137
138 m_origin = min_box;
139
140 //std::printf("The origin, dx, nx, ny, nz are: %f %f %f, %f, %d %d %d \n", m_origin[0], m_origin[1], m_origin[2], m_dx, m_nx, m_ny, m_nz);
141 }
142
143 template<typename TDataType>
145 {
146 int level = this->varLevelNumber()->getData();
147
148 Real dx = this->varSpacing()->getData();
149
151
152 //std::clock_t Time0 = clock();
154 DArray<Real> grid0_value;
155 DArray<Coord> grid0_object;
156 DArray<Coord> grid0_normal;
158 grid0_value,
159 grid0_object,
160 grid0_normal,
161 this->inTriangleSet()->getDataPtr(),
162 m_origin,
163 m_nx,
164 m_ny,
165 m_nz,
166 this->varAABBPadding()->getData(),
167 m_level0,
168 dx);
169 //std::clock_t Time1 = clock();
170
172 DArray<Real> grid1_value;
173 DArray<Coord> grid1_object;
174 DArray<Coord> grid1_normal;
176 grid1_value,
177 grid1_object,
178 grid1_normal,
179 grid0,
180 grid0_object,
181 grid0_normal,
182 m_origin,
183 Level(1),
184 m_nx,
185 m_ny,
186 m_nz,
187 dx);
188 //std::clock_t Time2 = clock();
189
191 DArray<Real> gridT_value;
192 DArray<Coord> gridT_object, gridT_normal;
194 DArray<Real> grid_total_value;
195 int grid_total_num = 0;
196 if (level == 3)
197 {
199 gridT_value,
200 gridT_object,
201 gridT_normal,
202 grid1,
203 grid1_object,
204 grid1_normal,
205 m_origin,
206 Level(2),
207 m_nx,
208 m_ny,
209 m_nz,
210 dx);
211
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);
217
219 grid_total,
220 grid_total_value,
221 this->m_object,
222 this->m_normal,
223 grid0,
224 grid0_value,
225 grid0_object,
226 grid0_normal,
227 grid1,
228 grid1_value,
229 grid1_object,
230 grid1_normal,
231 gridT,
232 gridT_value,
233 gridT_object,
234 gridT_normal,
235 grid0.size(),
236 (grid0.size() + grid1.size()),
237 grid_total_num);
238
239// cuExecute(grid_total_num,
240// SO_CollectionGridsThree,
241// grid_total,
242// grid_total_value,
243// m_object,
244// m_normal,
245// grid0,
246// grid0_value,
247// grid0_object,
248// grid0_normal,
249// grid1,
250// grid1_value,
251// grid1_object,
252// grid1_normal,
253// gridT,
254// gridT_value,
255// gridT_object,
256// gridT_normal,
257// grid0.size(),
258// (grid0.size() + grid1.size()));
259 }
260
261 if (level == 4)
262 {
264 DArray<Real> grid2_value;
265 DArray<Coord> grid2_object;
266 DArray<Coord> grid2_normal;
268 grid2_value,
269 grid2_object,
270 grid2_normal,
271 grid1,
272 grid1_object,
273 grid1_normal,
274 m_origin,
275 Level(2),
276 m_nx,
277 m_ny,
278 m_nz,
279 dx);
280
282 gridT_value,
283 gridT_object,
284 gridT_normal,
285 grid2,
286 grid2_object,
287 grid2_normal,
288 m_origin,
289 Level(3),
290 m_nx,
291 m_ny,
292 m_nz,
293 dx);
294
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);
300
302 grid_total,
303 grid_total_value,
304 this->m_object,
305 this->m_normal,
306 grid0,
307 grid0_value,
308 grid0_object,
309 grid0_normal,
310 grid1,
311 grid1_value,
312 grid1_object,
313 grid1_normal,
314 grid2,
315 grid2_value,
316 grid2_object,
317 grid2_normal,
318 gridT,
319 gridT_value,
320 gridT_object,
321 gridT_normal,
322 grid0.size(),
323 (grid0.size() + grid1.size()),
324 (grid0.size() + grid1.size() + grid2.size()),
325 grid_total_num
326 );
327
328// cuExecute(grid_total_num,
329// SO_CollectionGridsFour,
330// grid_total,
331// grid_total_value,
332// m_object,
333// m_normal,
334// grid0,
335// grid0_value,
336// grid0_object,
337// grid0_normal,
338// grid1,
339// grid1_value,
340// grid1_object,
341// grid1_normal,
342// grid2,
343// grid2_value,
344// grid2_object,
345// grid2_normal,
346// gridT,
347// gridT_value,
348// gridT_object,
349// gridT_normal,
350// grid0.size(),
351// (grid0.size() + grid1.size()),
352// (grid0.size() + grid1.size() + grid2.size()));
353
354 grid2.clear();
355 grid2_value.clear();
356 grid2_object.clear();
357 grid2_normal.clear();
358 }
359
360 if (level == 5)
361 {
363 DArray<Real> grid2_value;
364 DArray<Coord> grid2_object;
365 DArray<Coord> grid2_normal;
367 grid2_value,
368 grid2_object,
369 grid2_normal,
370 grid1,
371 grid1_object,
372 grid1_normal,
373 m_origin,
374 Level(2),
375 m_nx,
376 m_ny,
377 m_nz,
378 dx);
379
381 DArray<Real> grid3_value;
382 DArray<Coord> grid3_object;
383 DArray<Coord> grid3_normal;
385 grid3_value,
386 grid3_object,
387 grid3_normal,
388 grid2,
389 grid2_object,
390 grid2_normal,
391 m_origin,
392 Level(3),
393 m_nx,
394 m_ny,
395 m_nz,
396 dx);
397
399 gridT_value,
400 gridT_object,
401 gridT_normal,
402 grid3,
403 grid3_object,
404 grid3_normal,
405 m_origin,
406 Level(4),
407 m_nx,
408 m_ny,
409 m_nz,
410 dx);
411
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);
417
419 grid_total,
420 grid_total_value,
421 this->m_object,
422 this->m_normal,
423 grid0,
424 grid0_value,
425 grid0_object,
426 grid0_normal,
427 grid1,
428 grid1_value,
429 grid1_object,
430 grid1_normal,
431 grid2,
432 grid2_value,
433 grid2_object,
434 grid2_normal,
435 grid3,
436 grid3_value,
437 grid3_object,
438 grid3_normal,
439 gridT,
440 gridT_value,
441 gridT_object,
442 gridT_normal,
443 grid0.size(),
444 (grid0.size() + grid1.size()),
445 (grid0.size() + grid1.size() + grid2.size()),
446 (grid0.size() + grid1.size() + grid2.size() + grid3.size()),
447 grid_total_num);
448
449// cuExecute(grid_total_num,
450// SO_CollectionGridsFive,
451// grid_total,
452// grid_total_value,
453// m_object,
454// m_normal,
455// grid0,
456// grid0_value,
457// grid0_object,
458// grid0_normal,
459// grid1,
460// grid1_value,
461// grid1_object,
462// grid1_normal,
463// grid2,
464// grid2_value,
465// grid2_object,
466// grid2_normal,
467// grid3,
468// grid3_value,
469// grid3_object,
470// grid3_normal,
471// gridT,
472// gridT_value,
473// gridT_object,
474// gridT_normal,
475// grid0.size(),
476// (grid0.size() + grid1.size()),
477// (grid0.size() + grid1.size() + grid2.size()),
478// (grid0.size() + grid1.size() + grid2.size() + grid3.size()));
479
480 grid2.clear();
481 grid2_value.clear();
482 grid2_object.clear();
483 grid2_normal.clear();
484 grid3.clear();
485 grid3_value.clear();
486 grid3_object.clear();
487 grid3_normal.clear();
488 }
489
490 //std::clock_t Time5 = clock();
491
492 auto sdf_oct = this->stateSDFTopology()->allocate();
493 sdf_oct->setLevelNum(level);
494 sdf_oct->setGrid(m_nx, m_ny, m_nz);
495 sdf_oct->setVoxelOctree(grid_total);
496 sdf_oct->setDx(dx);
497 sdf_oct->setOrigin(m_origin);
498 sdf_oct->setLevel0(m_level0);
499 sdf_oct->updateNeighbors();
500
501 sdf_oct->setSdfValues(grid_total_value);
502
503 grid_total.clear();
504 grid_total_value.clear();
505 grid0.clear();
506 grid0_value.clear();
507 grid0_object.clear();
508 grid0_normal.clear();
509 grid1.clear();
510 grid1_value.clear();
511 grid1_object.clear();
512 grid1_normal.clear();
513 gridT.clear();
514 gridT_value.clear();
515 gridT_object.clear();
516 gridT_normal.clear();
517
518 //std::clock_t Time6 = clock();
519 //std::printf("Generation time is: %d %d %d clocks \n", int(Time5 - Time0), int(Time6 - Time5), int(Time6 - Time0));
520
521 std::printf("Generated ASDF is: %d %d %d, %d %d %d, %f, %f %f %f \n",
522 grid_total_num, level, m_level0, m_nx, m_ny, m_nz, dx, m_origin[0], m_origin[1], m_origin[2]);
523
524// getLeafsValue();
525 }
526
527 template<typename TDataType>
529 {
530 Coord move_vector = this->varForwardVector()->getData();
531
532 if (move_vector.norm() > REAL_EPSILON)
533 {
534 auto triSet = this->inTriangleSet()->getDataPtr();
535
536 triSet->translate(move_vector);
537 }
538 }
539
540 template<typename TDataType>
542 {
543 //this->reset();
544 }
545
547}
#define DEFINE_CLASS(name)
Definition Object.h:140
#define IMPLEMENT_TCLASS(name, T1)
Definition Object.h:103
virtual void setVisible(bool visible)
Set the visibility of context.
Definition Node.cpp:88
bool connect(NodePort *nPort)
Depth-first tree traversal.
Definition Node.cpp:481
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 load(std::string filename)
DArray< Coord > m_object
virtual Real dx()
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
constexpr Real REAL_EPSILON
Definition Typedef.inl:43
unsigned int uint
Definition VkProgram.h:14