2#include "PolygonSetToTriangleSet.h"
3#include "cuda_runtime.h"
4#include <thrust/sort.h>
5#include "GLSurfaceVisualModule.h"
6#include "GLWireframeVisualModule.h"
11 __global__ void extractPolyIndices(
17 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
18 if (tId >= input.size()) return;
20 if (input[tId] == 1) {
21 int index = atomicAdd(arrayIndex, 1);
26 __global__ void PolygonEdgeCounting(
27 DArray<uint> counter3,
28 DArray<uint> counter4,
29 DArray<uint> counter5,
30 DArrayList<uint> polygonIndices)
32 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
33 if (tId >= polygonIndices.size()) return;
35 counter3[tId] = polygonIndices[tId].size() == 3 ? 1 : 0;
36 counter4[tId] = polygonIndices[tId].size() == 4 ? 1 : 0;
37 counter5[tId] = polygonIndices[tId].size() >= 5 ? 1 : 0;
40 __global__ void PolygonSet_CountPoly2TriangleNumber(
42 DArrayList<uint> polygonIndices)
44 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
45 if (tId >= counter.size()) return;
47 counter[tId] = polygonIndices[tId].size() - 2;
50 template<typename Triangle>
51 __global__ void Edge4_ExtractTriangleIndices(
52 DArray<Triangle> triangles,
53 DArrayList<uint> polygonIndices,
56 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
57 if (tId >= radix.size()) return;
59 uint offset = radix[tId];
61 auto& index = polygonIndices[tId];
63 if (index.size() == 3)
68 triangles[offset] = Triangle(v0, v1, v2);
72 template<typename Triangle>
73 __global__ void CopyTriangles(
74 DArray<Triangle> outTriangles,
75 DArrayList<uint> polygonIndices,
76 DArray<uint> triIndex,
77 DArrayList<uint> poly2tri
80 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
81 if (tId >= triIndex.size()) return;
83 auto& index = polygonIndices[tId];
84 if (index.size() == 3)
86 uint offset = triIndex[tId];
87 outTriangles[offset] = Triangle(index[0], index[1], index[2]);
88 poly2tri[tId][0] = offset;
93 template<typename Triangle>
94 __global__ void Quads2Triangles(
95 DArray<Triangle> outTriangles,
96 DArrayList<uint> polygonIndices,
98 DArray<uint> quadIndex,
99 DArrayList<uint> poly2tri,
102 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
103 if (tId >= quadIndex.size()) return;
105 auto& index = polygonIndices[tId];
106 printf("poly list :%d\n",index.size());
107 if (index.size() == 4)
109 uint id = 2 * quadIndex[tId] + offset;
131 Vec3f cross1 = AB.cross(AP).normalize();
132 Vec3f cross2 = BC.cross(BP).normalize();
133 Vec3f cross3 = CA.cross(CP).normalize();
136 float dot1 = cross1.dot(cross2);
137 float dot2 = cross1.dot(cross3);
138 float dot3 = cross2.dot(cross3);
140 if ((dot1 >= 0 && dot2 >= 0 && dot3 >= 0) || (dot1 <= 0 && dot2 <= 0 && dot3 <= 0))
142 outTriangles[id] = Triangle(v0, v1, v3);
143 outTriangles[id + 1] = Triangle(v1, v2, v3);
147 outTriangles[id] = Triangle(v0, v1, v2);
148 outTriangles[id + 1] = Triangle(v0, v2, v3);
151 poly2tri[tId][0] = id;
152 poly2tri[tId][1] = id + 1;
158 template<typename Triangle>
159 __global__ void CopyTriangles2Triangles(
160 DArray<Triangle> outTriangles,
161 DArray<Triangle> inTriangles,
164 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
165 if (tId >= inTriangles.size()) return;
167 outTriangles[tId + offset] = inTriangles[tId];
171 __global__ void CounterLarger5Edges(
175 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
176 if (tId >= counter.size()) return;
178 if (counter[tId] <= 2)
183 __global__ void updatepoly2triangleId_moreThan5Edge(
184 DArrayList<uint> poly2tri,
185 DArrayList<uint> polygonIndex,
186 DArray<uint> scanResult,
187 DArray<uint> edgeNum,
190 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
191 if (tId >= polygonIndex.size()) return;
193 uint count = edgeNum[tId];
194 uint start = scanResult[tId];
196 if (polygonIndex[tId].size() >= 5)
198 //printf("tId- d% start: %d i: %d count: %d\n", tId, start, i, count);
200 for (uint i = 0; i < count; i++)
202 auto& list = poly2tri[tId];
203 list[i] = offset + start + i;
204 printf("tId- %d , start: %d, i: %d, result: %d , listsize: %d\n",tId, start,i,poly2tri[tId][i], list.size());
211 template<typename TDataType>
212 void PolygonSetToTriangleSetModule<TDataType>:: convert(std::shared_ptr<PolygonSet<TDataType>> polygonset, std::shared_ptr<TriangleSet<TDataType>> triset,DArrayList<uint>& poly2tri)
216 auto& polylist = polygonset->polygonIndices();
218 auto lists = polylist.lists();
221 DArray<uint> edge3(lists.size());
222 DArray<uint> edge4(lists.size());
223 DArray<uint> edge5(lists.size());
225 uint polyNum = polygonset->polygonIndices().size();
227 DArray<uint> poly2triCounter(polyNum);
229 PolygonSet_CountPoly2TriangleNumber,
231 polygonset->polygonIndices());
233 poly2tri.resize(poly2triCounter);
235 int tNum = thrust::reduce(thrust::device, poly2triCounter.begin(), poly2triCounter.begin() + poly2triCounter.size());
239 auto& triangles = triset->getTriangles();
240 triangles.resize(tNum);
247 polygonset->polygonIndices()
250 uint total_num3 = thrust::reduce(thrust::device, edge3.begin(), edge3.begin() + edge3.size());
251 thrust::exclusive_scan(thrust::device, edge3.begin(), edge3.begin() + edge3.size(), edge3.begin());
256 polygonset->polygonIndices(),
261 uint total_num4 = thrust::reduce(thrust::device, edge4.begin(), edge4.begin() + edge4.size());
262 thrust::exclusive_scan(thrust::device, edge4.begin(), edge4.begin() + edge4.size(), edge4.begin());
270 polygonset->polygonIndices(),
271 polygonset->getPoints(),
277 uint total_num5 = thrust::reduce(thrust::device, edge5.begin(), edge5.begin() + edge5.size());
281 c_p2t.assign(poly2triCounter);
282 for (size_t i = 0; i < c_p2t.size(); i++)
284 printf("poly2triCounter: %d\n", c_p2t[i]);
291 DArray<uint> startId;
292 startId.assign(poly2triCounter);
294 printf("************\n");
295 c_p2t.assign(poly2triCounter);
296 for (size_t i = 0; i < c_p2t.size(); i++)
298 printf("poly2triCounter: %d\n", c_p2t[i]);
301 thrust::exclusive_scan(thrust::device, startId.begin(), startId.begin() + startId.size(), startId.begin());
303 printf("*******SCAN*****\n");
304 c_p2t.assign(startId);
305 for (size_t i = 0; i < c_p2t.size(); i++)
307 printf("startId: %d\n", c_p2t[i]);
311 updatepoly2triangleId_moreThan5Edge,
313 polygonset->polygonIndices(),
316 total_num3 + total_num4
322 cudaMalloc((void**)&arrayIndex, sizeof(int));
323 cudaMemset(arrayIndex, 0, sizeof(int));
325 DArray<uint> d_v5_faceIds(total_num5);
327 cuExecute(edge5.size(),
334 CArray<uint> c_v5_faceIds;
335 c_v5_faceIds.assign(d_v5_faceIds);
337 EarClipper<DataType3f> earClip;
339 CArrayList<uint> c_polygons;
340 c_polygons.assign(polylist);
341 CArray<Vec3f> c_points;
342 c_points.assign(polygonset->getPoints());
344 int poly2triOffset = 0;
345 for (size_t i = 0; i < c_v5_faceIds.size(); i++)
348 auto ptIndexList = c_polygons[c_v5_faceIds[i]];
349 std::vector<Vec3f> pts;
350 for (size_t j = 0; j < ptIndexList.size(); j++)
352 auto pt = ptIndexList[j];
353 pts.push_back(c_points[pt]);
356 std::vector<TopologyModule::Triangle> c_earTriangles;
357 earClip.polyClip(pts, c_earTriangles);//
358 if (c_earTriangles.size() != (pts.size() - 2))
360 printf("EarClip Error!!\n");
361 std::vector<TopologyModule::Triangle> c_earTest;
362 earClip.polyClip(pts, c_earTest);//
365 for (size_t k = 0; k < c_earTriangles.size(); k++)
367 c_earTriangles[k][0] = ptIndexList[c_earTriangles[k][0]];
368 c_earTriangles[k][1] = ptIndexList[c_earTriangles[k][1]];
369 c_earTriangles[k][2] = ptIndexList[c_earTriangles[k][2]];
374 DArray<TopologyModule::Triangle> d_earTriangles;
375 d_earTriangles.assign(c_earTriangles);
377 cuExecute(d_earTriangles.size(),
378 CopyTriangles2Triangles,
381 total_num3 + total_num4*2 + poly2triOffset
383 d_earTriangles.clear();
385 poly2triOffset += (ptIndexList.size() - 2);
388 triset->setPoints(polygonset->getPoints());
394 poly2triCounter.clear();
396 d_v5_faceIds.clear();
398 CArrayList<uint> c_poly2tri;
399 c_poly2tri.assign(poly2tri);
400 for (size_t i = 0; i < c_poly2tri.size(); i++)
403 auto& list = c_poly2tri[i];
404 printf("size %d: ", list.size());
406 for (size_t j = 0; j < list.size(); j++)
408 printf("%d - ",list[j]);
414 DEFINE_CLASS(PolygonSetToTriangleSetModule);
416 template<typename TDataType>
417 PolygonSetToTriangleSetNode<TDataType>::PolygonSetToTriangleSetNode()
419 mPolygonSetToTriangleSetMoudle = std::make_shared<PolygonSetToTriangleSetModule<DataType3f>>();
420 this->inPolygonSet()->connect(mPolygonSetToTriangleSetMoudle->inPolygonSet());
422 this->stateTriangleSet()->setDataPtr(std::make_shared<TriangleSet<DataType3f>>());
424 this->stateTriangleSet()->promoteOuput();
426 auto surfaceRender = std::make_shared<GLSurfaceVisualModule>();
427 auto wireRender = std::make_shared<GLWireframeVisualModule>();
428 this->stateTriangleSet()->connect(surfaceRender->inTriangleSet());
429 this->stateTriangleSet()->connect(wireRender->inEdgeSet());
430 this->graphicsPipeline()->pushModule(surfaceRender);
431 this->graphicsPipeline()->pushModule(wireRender);
434 DEFINE_CLASS(PolygonSetToTriangleSetNode);