PeriDyno 1.0.0
Loading...
Searching...
No Matches
PolyExtrude.cu
Go to the documentation of this file.
1#include "PolyExtrude.h"
2#include "Topology/PointSet.h"
3#include "GLSurfaceVisualModule.h"
4#include "GLWireframeVisualModule.h"
5#include "GLPointVisualModule.h"
6#include <sstream>
7
8
9namespace dyno
10{
11 template<typename TDataType>
12 PolyExtrude<TDataType>::PolyExtrude()
13 {
14 this->stateTriangleSet()->setDataPtr(std::make_shared<TriangleSet<TDataType>>());
15
16 auto glModule = std::make_shared<GLSurfaceVisualModule>();
17 glModule->setColor(Color(0.8f, 0.52f, 0.25f));
18 glModule->setVisible(true);
19 this->stateTriangleSet()->connect(glModule->inTriangleSet());
20 this->graphicsPipeline()->pushModule(glModule);
21
22 auto glModule2 = std::make_shared<GLPointVisualModule>();
23 glModule2->setColor(Color(1, 0.1, 0.1));
24 glModule2->varPointSize()->setValue(0.001);
25 this->stateTriangleSet()->connect(glModule2->inPointSet());
26 this->graphicsPipeline()->pushModule(glModule2);
27
28
29 glModule3 = std::make_shared<GLWireframeVisualModule>();
30 glModule3->setColor(Color(1, 1, 1));
31 glModule3->varLineWidth()->setValue(0.1);
32 glModule3->varForceUpdate()->setValue(true);
33
34 this->stateTriangleSet()->connect(glModule3->inEdgeSet());
35 this->graphicsPipeline()->pushModule(glModule3);
36
37 this->varDistance()->setRange(-2,2);
38 this->varDivisions()->setRange(1,50);
39
40 auto callback = std::make_shared<FCallBackFunc>(std::bind(&PolyExtrude<TDataType>::varChanged, this));
41
42 this->varDistance()->attach(callback);
43 this->varDivisions()->attach(callback);
44 this->varReverseNormal()->attach(callback);
45
46
47 }
48
49 template<typename TDataType>
50 void PolyExtrude<TDataType>::resetStates()
51 {
52 varChanged();
53 }
54
55
56 template<typename TDataType>
57 void PolyExtrude<TDataType>::varChanged()
58 {
59 auto triangleSet = this->stateTriangleSet()->getDataPtr();
60
61 std::vector<Coord> vertices;
62 std::vector<TopologyModule::Triangle> triangles;
63 extrude(vertices, triangles);
64
65 triangleSet->setPoints(vertices);
66 triangleSet->setTriangles(triangles);
67
68 vertices.clear();
69 triangles.clear();
70 glModule3->update();
71 triangleSet->update();
72 }
73
74 template<typename TDataType>
75 void PolyExtrude<TDataType>::extrude(std::vector<Vec3f>& vertices, std::vector<TopologyModule::Triangle>& triangles)
76 {
77 auto triangleSet = this->stateTriangleSet()->getDataPtr();
78 auto distance = this->varDistance()->getData();
79 auto divisions = this->varDivisions()->getData();
80
81 std::string primString = this->varPrimitiveId()->getData();
82
83 if (divisions == 0) { divisions = 1; }
84 TriangleSet<TDataType>trilist;
85
86 trilist.copyFrom(this->inTriangleSet()->getData());
87
88 DArray<TopologyModule::Triangle> d_triangle = trilist.getTriangles();
89 CArray<TopologyModule::Triangle> c_triangle;
90
91 if (d_triangle.size())
92 {
93 c_triangle.assign(d_triangle);
94 }
95 else { return; }
96
97 auto& sa = trilist.vertex2Edge();
98
99 auto ss = trilist.getVertex2Triangles();
100
101 DArray<Coord> d_point = trilist.getPoints();
102 CArray<Coord> c_point;
103 if (d_point.size())
104 {
105 c_point.assign(d_point);
106 }
107
108 DArray<TopologyModule::Edge> d_edges = trilist.getEdges();
109 CArray<TopologyModule::Edge> c_edges;
110 if (d_edges.size())
111 {
112 c_edges.assign(d_edges);
113 }
114
115 int n_point = this->inTriangleSet()->getDataPtr()->getPoints().size();
116 int n_triangle = this->inTriangleSet()->getDataPtr()->getTriangles().size();
117 int n_edges = this->inTriangleSet()->getDataPtr()->getEdges().size();
118
119 CArray<uint> c_selected_primid;
120 if (this->inPrimitiveId()->isEmpty()== false)
121 {
122 auto d_selected_primid = this->inPrimitiveId()->getData();
123 c_selected_primid.assign(d_selected_primid);
124 }
125
126
127
128 std::vector<int> tempPrimArray;
129 if (primString.size())
130 {
131 for (size_t i = 0; i < this->selectedPrimitiveID.size(); i++)
132 {
133 tempPrimArray.push_back(this->selectedPrimitiveID[i]);
134 }
135 }
136 else
137 {
138 for (size_t i = 0; i < c_selected_primid.size(); i++)
139 {
140 tempPrimArray.push_back(c_selected_primid[i]);
141 }
142 if (tempPrimArray.empty())
143 {
144 printf("selected empty \n");
145 return;
146 }
147 }
148
149 std::vector<int> selectedPtNum;
150
151 for (int i = 0; i < tempPrimArray.size(); i++)
152 {
153 for (int j = 0; j < 3; j++)
154 {
155 for (int ptN = 0; ptN < selectedPtNum.size(); ptN++)
156 {
157 if (std::find(selectedPtNum.begin(), selectedPtNum.end(), c_triangle[i][ptN]) == selectedPtNum.end())
158 {
159 }
160 else
161 {
162 selectedPtNum.push_back(c_triangle[i][ptN]);
163 }
164 }
165 }
166 }
167
168 for (int i = 0; i < n_point; i++)
169 {
170 vertices.push_back(c_point[i]);
171 }
172
173 for (int i = 0; i < n_triangle; i++)
174 {
175 triangles.push_back(c_triangle[i]);
176 }
177
178 std::vector<int> tempid;
179 std::map<int, int> ptid_count;
180 std::map<int, int> ptid_allTri;
181
182 for (int i = 0; i < tempPrimArray.size(); i++)
183 {
184 int n = tempPrimArray[i];
185 int Tid;
186
187 std::vector<int> idArray = { c_triangle[n][0] ,c_triangle[n][1] ,c_triangle[n][2] };
188
189 for (int i = 0; i < idArray.size(); i++)
190 {
191 Tid = idArray[i];
192 if (ptid_count.count(Tid))
193 {
194 ptid_count[Tid] = ptid_count.at(Tid) + 1;
195 }
196 else
197 {
198 ptid_count[Tid] = 1;
199 }
200 }
201 }
202
203
204 for (int i = 0; i < n_triangle; i++)
205 {
206 int Tid;
207 std::vector<int> idArray = { c_triangle[i][0] ,c_triangle[i][1] ,c_triangle[i][2] };
208
209 for (int k = 0; k < idArray.size(); k++)
210 {
211 Tid = idArray[k];
212 if (ptid_count.count(Tid))
213 {
214 if (ptid_allTri.count(Tid))
215 {
216 ptid_allTri[Tid] = ptid_allTri.at(Tid) + 1;
217 }
218 else
219 {
220 ptid_allTri[Tid] = 1;
221 }
222 }
223 }
224 }
225
226
227
228 std::vector<int> replace_id;
229 std::vector<int> border_id;
230 std::vector<int> select_ptid;
231
232 for (auto it : ptid_count)
233 {
234 select_ptid.push_back(it.first);
235
236 if (it.second == ptid_allTri.at(it.first))
237 {
238 replace_id.push_back(it.first);
239 }
240 else
241 {
242 border_id.push_back(it.first);
243 }
244
245 }
246
247
248 auto d_normal = this->inTriangleSet()->getDataPtr()->getVertexNormals();
249
250 std::map<int, Coord> map_vertexID_tNormal;
251
252
253
254 CArray<Coord> c_normal;
255 c_normal.assign(d_normal);
256 for (size_t i = 0; i < c_normal.size(); i++)
257 {
258 map_vertexID_tNormal[i] = c_normal[i];
259 }
260
261 std::vector<TopologyModule::Edge> normalDisplay;
262 std::vector<Coord> normalCoord;
263 float normalsize = 0.1f;
264 for (size_t i = 0; i < c_point.size(); i++)
265 {
266 normalCoord.push_back(c_point[i]);
267 Vec3f N = c_normal[i];
268 Vec3f P = Coord(c_point[i][0], c_point[i][1], c_point[i][2]);
269 Vec3f nP = P + N * normalsize;
270 normalCoord.push_back(Coord(nP[0],nP[1],nP[2]));
271 normalDisplay.push_back(TopologyModule::Edge(normalCoord.size(), normalCoord.size()-1));
272 }
273
274
275 std::map<point_layer, int> oriP_newP;
276
277 for (size_t i = 0; i < border_id.size(); i++)
278 {
279 oriP_newP[point_layer(border_id[i], 0)] = border_id[i];
280 }
281
282
283 for (size_t k = 1; k < divisions; k++)
284 {
285 float tempdistance = float(k) /divisions * distance;
286
287 for (int i = 0; i < border_id.size(); i++)
288 {
289 int temp = -1;
290
291 Coord pt = vertices[border_id[i]];
292 Coord N = map_vertexID_tNormal.at(border_id[i]);
293
294 point_layer lp = point_layer(border_id[i], k);
295
296 vertices.push_back(Coord(pt[0] + N[0] * tempdistance, pt[1] + N[1] * tempdistance, pt[2] + N[2] * tempdistance));
297
298 oriP_newP[lp] = vertices.size() - 1;
299 temp = vertices.size() - 1;
300 }
301
302 }
303
304 for (int i = 0; i < select_ptid.size(); i++)
305 {
306 int temp = -1;
307
308 Coord pt = vertices[select_ptid[i]];
309 Coord N = map_vertexID_tNormal.at(select_ptid[i]);
310
311 point_layer lp = point_layer(select_ptid[i], divisions);
312
313 if (i < border_id.size())
314 {
315 vertices.push_back(Coord(pt[0] + N[0] * distance, pt[1] + N[1] * distance, pt[2] + N[2] * distance));
316
317 oriP_newP[lp] = vertices.size() - 1;
318 temp = vertices.size() - 1;
319 }
320 else
321 {
322
323 int tempi = i - border_id.size();
324 vertices[replace_id[tempi]] = Coord(pt[0] + N[0] * distance, pt[1] + N[1] * distance, pt[2] + N[2] * distance);
325
326 oriP_newP[lp] = replace_id[tempi];
327 temp = replace_id[tempi];
328 }
329
330
331 }
332
333
334
335
336 std::map<int, int> borderP_countInLine;
337 std::vector<TopologyModule::Edge> borderLine;
338
339 for (int i = 0; i < tempPrimArray.size(); i++)
340 {
341 bool one = std::count(border_id.begin(), border_id.end(), triangles[tempPrimArray[i]][0]);
342 bool two = std::count(border_id.begin(), border_id.end(), triangles[tempPrimArray[i]][1]);
343 bool three = std::count(border_id.begin(), border_id.end(), triangles[tempPrimArray[i]][2]);
344
345 if (one && two)
346 {
347 borderLine.push_back(TopologyModule::Edge(triangles[tempPrimArray[i]][0], triangles[tempPrimArray[i]][1]));
348 }
349 if (two && three)
350 {
351 borderLine.push_back(TopologyModule::Edge(triangles[tempPrimArray[i]][1], triangles[tempPrimArray[i]][2]));
352 }
353 if (three && one)
354 {
355 borderLine.push_back(TopologyModule::Edge(triangles[tempPrimArray[i]][2], triangles[tempPrimArray[i]][0]));
356 }
357 }
358
359
360 std::vector<TopologyModule::Edge> tempLine = borderLine;
361 for (size_t i = 0; i < tempLine.size(); i++)
362 {
363 int k = tempLine.size() - i - 1;
364 int row1_1 = tempLine[k][0];
365 int row1_2 = tempLine[k][1];
366 for (size_t j = 0; j < tempLine.size(); j++)
367 {
368 int row2_1 = tempLine[j][0];
369 int row2_2 = tempLine[j][1];
370 if (row1_1 == row2_2 && row1_2 == row2_1)
371 {
372 borderLine.erase(borderLine.begin() + k);
373 }
374 }
375 }
376
377 for (int i = 0; i < tempPrimArray.size(); i++)
378 {
379 triangles[tempPrimArray[i]][0] = oriP_newP.at(point_layer(triangles[tempPrimArray[i]][0],divisions));
380 triangles[tempPrimArray[i]][1] = oriP_newP.at(point_layer(triangles[tempPrimArray[i]][1],divisions));
381 triangles[tempPrimArray[i]][2] = oriP_newP.at(point_layer(triangles[tempPrimArray[i]][2],divisions));
382 }
383
384 for (size_t k = 0; k < divisions; k++)
385 {
386 for (size_t i = 0; i < borderLine.size(); i++)
387 {
388 point_layer pt_o1 = point_layer(borderLine[i][0],k);
389 point_layer pt_o2 = point_layer(borderLine[i][1],k);
390
391 point_layer pt_n1 = point_layer(borderLine[i][0],k + 1);
392 point_layer pt_n2 = point_layer(borderLine[i][1],k + 1);
393
394 triangles.push_back(TopologyModule::Triangle(oriP_newP.at(pt_o1), oriP_newP.at(pt_o2), oriP_newP.at(pt_n2)));
395 triangles.push_back(TopologyModule::Triangle(oriP_newP.at(pt_o1), oriP_newP.at(pt_n2), oriP_newP.at(pt_n1)));
396 }
397 }
398
399
400
401
402 }
403
404 template<typename TDataType>
405 void PolyExtrude<TDataType>::substrFromTwoString(std::string& first, std::string& Second, std::string& line, std::string& myStr, int& index)
406 {
407 if (index < int(line.size()))
408 {
409 size_t posStart = line.find(first, index);
410 size_t posEnd = line.find(Second, posStart + 1);
411
412
413 myStr = line.substr(posStart, posEnd - posStart);
414 index = posEnd - 1;
415
416 std::stringstream ss2(line);
417
418 }
419 else
420 {
421 return;
422 }
423
424 }
425
426
427 DEFINE_CLASS(PolyExtrude);
428}