PeriDyno 1.0.0
Loading...
Searching...
No Matches
BoundingBoxToEdgeSet.cu
Go to the documentation of this file.
1#include "BoundingBoxToEdgeSet.h"
2
3namespace dyno
4{
5 IMPLEMENT_TCLASS(BoundingBoxToEdgeSet, TDataType)
6
7 template<typename TDataType>
8 BoundingBoxToEdgeSet<TDataType>::BoundingBoxToEdgeSet()
9 : TopologyMapping()
10 {
11 }
12
13 template<typename Coord, typename AABB>
14 __global__ void BBSS_SetupEdgeSet(
15 DArray<Coord> vertices,
16 DArray<TopologyModule::Edge> edges,
17 DArray<AABB> aabbs)
18 {
19 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
20 if (tId >= aabbs.size()) return;
21
22 auto aabb = aabbs[tId];
23 Coord v0 = aabb.v0;
24 Coord v1 = aabb.v1;
25
26 int id0 = 8 * tId;
27 int id1 = 8 * tId + 1;
28 int id2 = 8 * tId + 2;
29 int id3 = 8 * tId + 3;
30 int id4 = 8 * tId + 4;
31 int id5 = 8 * tId + 5;
32 int id6 = 8 * tId + 6;
33 int id7 = 8 * tId + 7;
34
35 vertices[id0] = v0;
36 vertices[id1] = Coord(v0.x, v0.y, v1.z);
37 vertices[id2] = Coord(v1.x, v0.y, v1.z);
38 vertices[id3] = Coord(v1.x, v0.y, v0.z);
39 vertices[id4] = Coord(v0.x, v1.y, v0.z);
40 vertices[id5] = Coord(v0.x, v1.y, v1.z);
41 vertices[id6] = Coord(v1.x, v1.y, v1.z);
42 vertices[id7] = Coord(v1.x, v1.y, v0.z);
43
44 edges[12 * tId] = TopologyModule::Edge(id0, id1);
45 edges[12 * tId + 1] = TopologyModule::Edge(id1, id2);
46 edges[12 * tId + 2] = TopologyModule::Edge(id2, id3);
47 edges[12 * tId + 3] = TopologyModule::Edge(id3, id0);
48 edges[12 * tId + 4] = TopologyModule::Edge(id0, id4);
49 edges[12 * tId + 5] = TopologyModule::Edge(id1, id5);
50 edges[12 * tId + 6] = TopologyModule::Edge(id2, id6);
51 edges[12 * tId + 7] = TopologyModule::Edge(id3, id7);
52 edges[12 * tId + 8] = TopologyModule::Edge(id4, id5);
53 edges[12 * tId + 9] = TopologyModule::Edge(id5, id6);
54 edges[12 * tId + 10] = TopologyModule::Edge(id6, id7);
55 edges[12 * tId + 11] = TopologyModule::Edge(id7, id4);
56 }
57
58 template<typename TDataType>
59 bool BoundingBoxToEdgeSet<TDataType>::apply()
60 {
61 if (this->outEdgeSet()->isEmpty())
62 this->outEdgeSet()->allocate();
63
64 auto& aabbs = this->inAABB()->getData();
65 auto outSet = this->outEdgeSet()->getDataPtr();
66
67 auto& vertices = outSet->getPoints();
68 auto& edges = outSet->getEdges();
69
70 uint num = aabbs.size();
71 vertices.resize(8 * num);
72 edges.resize(12 * num);
73
74 cuExecute(num,
75 BBSS_SetupEdgeSet,
76 vertices,
77 edges,
78 aabbs);
79
80 return true;
81 }
82
83 DEFINE_CLASS(BoundingBoxToEdgeSet);
84}