PeriDyno 1.0.0
Loading...
Searching...
No Matches
CalculateBoundingBox.cu
Go to the documentation of this file.
1#include "CalculateBoundingBox.h"
2#include "Primitive/Primitive3D.h"
3
4namespace dyno
5{
6 IMPLEMENT_TCLASS(CalculateBoundingBox, TDataType)
7
8 typedef typename ::dyno::TOrientedBox3D<Real> Box3D;
9
10 template<typename TDataType>
11 CalculateBoundingBox<TDataType>::CalculateBoundingBox()
12 : ComputeModule()
13 {
14 }
15
16 template<typename TDataType>
17 CalculateBoundingBox<TDataType>::~CalculateBoundingBox()
18 {
19 }
20
21
22 template<typename Box3D, typename AABB>
23 __global__ void CBB_SetupAABB(
24 DArray<AABB> boundingBox,
25 DArray<Box3D> boxes,
26 DArray<Sphere3D> spheres,
27 DArray<Tet3D> tets,
28 DArray<Capsule3D> caps,
29 DArray<Triangle3D> tris,
30 ElementOffset elementOffset,
31 Real boundary_expand)
32 {
33 uint tId = threadIdx.x + (blockIdx.x * blockDim.x);
34 if (tId >= boundingBox.size()) return;
35
36 ElementType eleType = elementOffset.checkElementType(tId);
37
38 boundary_expand = 0.0075f;
39
40 AABB box;
41 switch (eleType)
42 {
43 case ET_SPHERE:
44 {
45 box = spheres[tId].aabb();
46
47 break;
48 }
49 case ET_BOX:
50 {
51 box = boxes[tId - elementOffset.boxIndex()].aabb();
52 break;
53 }
54 case ET_TET:
55 {
56
57 box = tets[tId - elementOffset.tetIndex()].aabb();
58 break;
59 }
60 case ET_CAPSULE:
61 {
62 box = caps[tId - elementOffset.capsuleIndex()].aabb();
63 break;
64 }
65 case ET_TRI:
66 {
67 boundary_expand = 0.01;
68 box = tris[tId - elementOffset.triangleIndex()].aabb();
69 break;
70 }
71 default:
72 break;
73 }
74
75 boundingBox[tId] = box;
76 }
77
78 template<typename TDataType>
79 void CalculateBoundingBox<TDataType>::compute()
80 {
81 auto inTopo = this->inDiscreteElements()->getDataPtr();
82
83 if (this->outAABB()->isEmpty())
84 this->outAABB()->allocate();
85
86 auto& aabbs = this->outAABB()->getData();
87
88 int num = inTopo->totalSize();
89
90 aabbs.resize(num);
91
92 Real margin = Real(0);
93
94 ElementOffset elementOffset = inTopo->calculateElementOffset();
95
96 DArray<Box3D>& boxInGlobal = inTopo->boxesInGlobal();
97 DArray<Sphere3D>& sphereInGlobal = inTopo->spheresInGlobal();
98 DArray<Tet3D>& tetInGlobal = inTopo->tetsInGlobal();
99 DArray<Capsule3D>& capsuleInGlobal = inTopo->capsulesInGlobal();
100 DArray<Triangle3D>& triangleInGlobal = inTopo->trianglesInGlobal();
101
102 cuExecute(num,
103 CBB_SetupAABB,
104 aabbs,
105 boxInGlobal,
106 sphereInGlobal,
107 tetInGlobal,
108 capsuleInGlobal,
109 triangleInGlobal,
110 elementOffset,
111 margin);
112 }
113
114 DEFINE_CLASS(CalculateBoundingBox);
115}