1#include "SurfaceInteraction.h"
2#include <thrust/sort.h>
4#include <OrbitCamera.h>
8 __global__ void SI_SurfaceInitializeArray(
9 DArray<int> intersected)
11 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
12 if (pId >= intersected.size()) return;
17 __global__ void SI_SurfaceMergeIntersectedIndexOR(
18 DArray<int> intersected1,
19 DArray<int> intersected2,
20 DArray<int> outIntersected,
21 DArray<int> outUnintersected)
23 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
24 if (pId >= intersected1.size()) return;
26 if (intersected1[pId] == 0 && intersected2[pId] == 0)
27 outIntersected[pId] = 0;
29 outIntersected[pId] = 1;
31 outUnintersected[pId] = outIntersected[pId] == 1 ? 0 : 1;
34 __global__ void SI_SurfaceMergeIntersectedIndexXOR(
35 DArray<int> intersected1,
36 DArray<int> intersected2,
37 DArray<int> outIntersected,
38 DArray<int> outUnintersected)
40 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
41 if (pId >= intersected1.size()) return;
43 if (intersected1[pId] == intersected2[pId])
44 outIntersected[pId] = 0;
46 outIntersected[pId] = 1;
48 outUnintersected[pId] = outIntersected[pId] == 1 ? 0 : 1;
51 __global__ void SI_SurfaceMergeIntersectedIndexC(
52 DArray<int> intersected1,
53 DArray<int> intersected2,
54 DArray<int> outIntersected,
55 DArray<int> outUnintersected)
57 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
58 if (pId >= intersected1.size()) return;
60 if (intersected2[pId] == 1)
61 outIntersected[pId] = 0;
63 outIntersected[pId] = intersected1[pId];
65 outUnintersected[pId] = outIntersected[pId] == 1 ? 0 : 1;
68 template<typename TDataType>
69 SurfaceInteraction<TDataType>::SurfaceInteraction()
71 this->ray1 = TRay3D<Real>();
72 this->ray2 = TRay3D<Real>();
73 this->isPressed = false;
75 this->outOtherTriangleSet()->setDataPtr(std::make_shared<TriangleSet<TDataType>>());
76 this->outOtherTriangleSet()->getDataPtr()->getTriangles().resize(0);
77 this->outSelectedTriangleSet()->setDataPtr(std::make_shared<TriangleSet<TDataType>>());
78 this->outSelectedTriangleSet()->getDataPtr()->getTriangles().resize(0);
81 template<typename TDataType>
82 void SurfaceInteraction<TDataType>::onEvent(PMouseEvent event)
84 if (!event.altKeyPressed()) {
85 if (camera == nullptr)
87 this->camera = event.camera;
89 this->varToggleMultiSelect()->setValue(false);
90 if (event.shiftKeyPressed() || event.controlKeyPressed())
92 this->varToggleMultiSelect()->setValue(true);
93 if (event.shiftKeyPressed() && !event.controlKeyPressed())
95 this->varMultiSelectionType()->getDataPtr()->setCurrentKey(0);
97 else if (!event.shiftKeyPressed() && event.controlKeyPressed())
99 this->varMultiSelectionType()->getDataPtr()->setCurrentKey(1);
101 else if (event.shiftKeyPressed() && event.controlKeyPressed())
103 this->varMultiSelectionType()->getDataPtr()->setCurrentKey(2);;
106 if (event.actionType == AT_PRESS)
108 this->camera = event.camera;
109 this->isPressed = true;
110 //printf("Mouse pressed: Origin: %f %f %f; Direction: %f %f %f \n", event.ray.origin.x, event.ray.origin.y, event.ray.origin.z, event.ray.direction.x, event.ray.direction.y, event.ray.direction.z);
111 this->ray1.origin = event.ray.origin;
112 this->ray1.direction = event.ray.direction;
115 if (this->varSurfacePickingType()->getValue() == PickingTypeSelection::Both || this->varSurfacePickingType()->getValue() == PickingTypeSelection::Click)
117 this->calcIntersectClick();
118 this->printInfoClick();
121 else if (event.actionType == AT_RELEASE)
123 this->isPressed = false;
124 //printf("Mouse released: Origin: %f %f %f; Direction: %f %f %f \n", event.ray.origin.x, event.ray.origin.y, event.ray.origin.z, event.ray.direction.x, event.ray.direction.y, event.ray.direction.z);
125 this->ray2.origin = event.ray.origin;
126 this->ray2.direction = event.ray.direction;
129 if (this->varToggleMultiSelect()->getValue() && this->varTogglePicker()->getValue())
132 this->printInfoDragRelease();
137 //printf("Mouse repeated: Origin: %f %f %f; Direction: %f %f %f \n", event.ray.origin.x, event.ray.origin.y, event.ray.origin.z, event.ray.direction.x, event.ray.direction.y, event.ray.direction.z);
140 this->ray2.origin = event.ray.origin;
141 this->ray2.direction = event.ray.direction;
144 if (abs(this->x2 - this->x1) <= 3 && abs(this->y2 - this->y1) <= 3)
146 if (this->varSurfacePickingType()->getValue() == PickingTypeSelection::Both || this->varSurfacePickingType()->getValue() == PickingTypeSelection::Click)
147 this->calcIntersectClick();
151 if (this->varSurfacePickingType()->getValue() == PickingTypeSelection::Both || this->varSurfacePickingType()->getValue() == PickingTypeSelection::Drag)
153 this->calcIntersectDrag();
154 this->printInfoDragging();
162 template <typename Triangle, typename Real, typename Coord>
163 __global__ void SI_CalIntersectedTrisRay(
164 DArray<Coord> points,
165 DArray<Triangle> triangles,
166 DArray<int> intersected,
167 DArray<int> unintersected,
168 DArray<Real> triDistance,
169 TRay3D<Real> mouseray)
171 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
172 if (pId >= triangles.size()) return;
174 TTriangle3D<Real> t = TTriangle3D<Real>(points[triangles[pId][0]], points[triangles[pId][1]], points[triangles[pId][2]]);
178 temp = mouseray.intersect(t, p);
182 intersected[pId] = 1;
183 triDistance[pId] = (mouseray.origin - p.origin).norm();
187 intersected[pId] = 0;
188 triDistance[pId] = 3.4E38;
190 unintersected[pId] = (intersected[pId] == 1 ? 0 : 1);
193 __global__ void SI_CalTrisNearest(
195 DArray<int> intersected,
196 DArray<int> unintersected)
198 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
199 if (pId >= intersected.size()) return;
201 if (intersected[pId] == 1)
203 if (pId != min_index)
205 intersected[pId] = 0;
206 unintersected[pId] = 1;
211 template <typename Triangle, typename Real, typename Coord>
212 __global__ void SI_CalIntersectedTrisBox(
213 DArray<Coord> points,
214 DArray<Triangle> triangles,
215 DArray<int> intersected,
216 DArray<int> unintersected,
217 TPlane3D<Real> plane13,
218 TPlane3D<Real> plane42,
219 TPlane3D<Real> plane14,
220 TPlane3D<Real> plane32,
221 TRay3D<Real> mouseray)
223 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
224 if (pId >= triangles.size()) return;
226 TTriangle3D<Real> t = TTriangle3D<Real>(points[triangles[pId][0]], points[triangles[pId][1]], points[triangles[pId][2]]);
227 TSegment3D<Real> s1 = TSegment3D<Real>(points[triangles[pId][0]], points[triangles[pId][1]]);
228 TSegment3D<Real> s2 = TSegment3D<Real>(points[triangles[pId][1]], points[triangles[pId][2]]);
229 TSegment3D<Real> s3 = TSegment3D<Real>(points[triangles[pId][2]], points[triangles[pId][0]]);
233 bool temp11 = s1.intersect(plane13, p);
234 temp11 = temp11 && (((p.origin - plane14.origin).dot(plane14.normal)) * ((p.origin - plane32.origin).dot(plane32.normal))) > 0;
237 bool temp12 = s1.intersect(plane42, p);
238 temp12 = temp12 && (((p.origin - plane14.origin).dot(plane14.normal)) * ((p.origin - plane32.origin).dot(plane32.normal))) > 0;
241 bool temp13 = s1.intersect(plane14, p);
242 temp13 = temp13 && (((p.origin - plane13.origin).dot(plane13.normal)) * ((p.origin - plane42.origin).dot(plane42.normal))) > 0;
245 bool temp14 = s1.intersect(plane32, p);
246 temp14 = temp14 && (((p.origin - plane13.origin).dot(plane13.normal)) * ((p.origin - plane42.origin).dot(plane42.normal))) > 0;
249 bool temp21 = s2.intersect(plane13, p);
250 temp21 = temp21 && (((p.origin - plane14.origin).dot(plane14.normal)) * ((p.origin - plane32.origin).dot(plane32.normal))) > 0;
253 bool temp22 = s2.intersect(plane42, p);
254 temp22 = temp22 && (((p.origin - plane14.origin).dot(plane14.normal)) * ((p.origin - plane32.origin).dot(plane32.normal))) > 0;
257 bool temp23 = s2.intersect(plane14, p);
258 temp23 = temp23 && (((p.origin - plane13.origin).dot(plane13.normal)) * ((p.origin - plane42.origin).dot(plane42.normal))) > 0;
261 bool temp24 = s2.intersect(plane32, p);
262 temp24 = temp24 && (((p.origin - plane13.origin).dot(plane13.normal)) * ((p.origin - plane42.origin).dot(plane42.normal))) > 0;
265 bool temp31 = s3.intersect(plane13, p);
266 temp31 = temp31 && (((p.origin - plane14.origin).dot(plane14.normal)) * ((p.origin - plane32.origin).dot(plane32.normal))) > 0;
269 bool temp32 = s3.intersect(plane42, p);
270 temp32 = temp32 && (((p.origin - plane14.origin).dot(plane14.normal)) * ((p.origin - plane32.origin).dot(plane32.normal))) > 0;
273 bool temp33 = s3.intersect(plane14, p);
274 temp33 = temp33 && (((p.origin - plane13.origin).dot(plane13.normal)) * ((p.origin - plane42.origin).dot(plane42.normal))) > 0;
277 bool temp34 = s3.intersect(plane32, p);
278 temp34 = temp34 && (((p.origin - plane13.origin).dot(plane13.normal)) * ((p.origin - plane42.origin).dot(plane42.normal))) > 0;
282 for (int i = 0; i < 3; i++)
284 float temp1 = ((points[triangles[pId][i]] - plane13.origin).dot(plane13.normal)) * ((points[triangles[pId][i]] - plane42.origin).dot(plane42.normal));
285 float temp2 = ((points[triangles[pId][i]] - plane14.origin).dot(plane14.normal)) * ((points[triangles[pId][i]] - plane32.origin).dot(plane32.normal));
286 if (temp1 >= 0 && temp2 >= 0)
293 int temp = mouseray.intersect(t, p);
299 if (flag || intersected[pId] == 1)
300 intersected[pId] = 1;
302 intersected[pId] = 0;
303 unintersected[pId] = (intersected[pId] == 1 ? 0 : 1);
306 template <typename Triangle>
307 __global__ void SI_AssignOutTriangles(
308 DArray<Triangle> triangles,
309 DArray<Triangle> intersected_triangles,
310 DArray<Triangle> unintersected_triangles,
311 DArray<int> outTriangleIndex,
312 DArray<int> intersected,
313 DArray<int> unintersected,
314 DArray<int> intersected_o)
316 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
317 if (pId >= triangles.size()) return;
319 if (intersected_o[pId] == 1)
321 intersected_triangles[intersected[pId]] = triangles[pId];
322 outTriangleIndex[intersected[pId]] = pId;
326 unintersected_triangles[unintersected[pId]] = triangles[pId];
330 template <typename Triangle, typename Coord, typename Real>
331 __global__ void SI_NeighborTrisDiffuse(
332 DArray<Triangle> triangles,
333 DArray<Coord> points,
334 DArray<TopologyModule::Tri2Edg> tri2Edg,
335 DArray<TopologyModule::Edg2Tri> edg2Tri,
336 DArray<int> intersected,
337 DArray<int> unintersected,
340 int i = threadIdx.x + blockIdx.x * blockDim.x;
341 if (i >= triangles.size()) return;
343 if (intersected[i] == 1)
345 TTriangle3D<Real> t0, t1;
346 t0 = TTriangle3D<Real>(points[triangles[i][0]], points[triangles[i][1]], points[triangles[i][2]]);
347 for (int ii = 0; ii < 3; ii++)
349 for (int iii = 0; iii < 2; iii++)
351 if (intersected[edg2Tri[tri2Edg[i][ii]][iii]] != 1)
353 t1 = TTriangle3D<Real>(points[triangles[edg2Tri[tri2Edg[i][ii]][iii]][0]], points[triangles[edg2Tri[tri2Edg[i][ii]][iii]][1]], points[triangles[edg2Tri[tri2Edg[i][ii]][iii]][2]]);
354 if (abs(t0.normal().dot(t1.normal())) >= cosf(diffusionAngle))
356 intersected[edg2Tri[tri2Edg[i][ii]][iii]] = 1;
357 unintersected[edg2Tri[tri2Edg[i][ii]][iii]] = 0;
365 template <typename Triangle, typename Coord, typename Real>
366 __global__ void SI_VisibleFilter(
367 DArray<Triangle> triangles,
368 DArray<Coord> points,
369 DArray<int> intersected,
370 DArray<int> unintersected,
371 TRay3D<Real> mouseray)
373 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
374 if (pId >= triangles.size()) return;
376 if (intersected[pId] == 1)
378 TTriangle3D<Real> t = TTriangle3D<Real>(points[triangles[pId][0]], points[triangles[pId][1]], points[triangles[pId][2]]);
379 if (mouseray.direction.dot(t.normal()) >= 0)
381 intersected[pId] = 0;
382 unintersected[pId] = 1;
387 __global__ void SI_Tri2Quad(
388 DArray<int> intersected,
389 DArray<int> unintersected)
391 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
392 if (pId >= intersected.size()) return;
394 if (intersected[pId] == 1)
398 if (intersected[pId - 1] == 0)
400 intersected[pId - 1] = 1;
401 unintersected[pId - 1] = 0;
407 if (intersected[pId + 1] == 0)
409 intersected[pId + 1] = 1;
410 unintersected[pId + 1] = 0;
416 __global__ void SI_QuadOutput(
417 DArray<int> intersected_o,
418 DArray<int> intersected_q
421 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
422 if (pId >= intersected_q.size()) return;
424 intersected_q[pId] = 0;
425 if (intersected_o[pId*2] == 1||intersected_o[pId*2+1]==1)
427 intersected_q[pId] = 1;
431 __global__ void SI_QuadIndexOutput(
432 DArray<int> outTriangleIndex,
433 DArray<int> outQuadIndex
436 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
437 if (pId >= outQuadIndex.size()) return;
439 outQuadIndex[pId] = outTriangleIndex[pId * 2] / 2;
442 __global__ void SI_InitialS2PSelected(
443 DArray<int> s2PSelected)
445 int pId = threadIdx.x + blockIdx.x * blockDim.x;
446 if (pId >= s2PSelected.size()) return;
448 s2PSelected[pId] = 0;
451 template <typename Triangle>
452 __global__ void SI_Surface2Point(
453 DArray<Triangle> triangles,
454 DArray<int> outTriangleIndex,
455 DArray<int> s2PSelected)
457 int pId = threadIdx.x + blockIdx.x * blockDim.x;
458 if (pId >= outTriangleIndex.size()) return;
460 s2PSelected[triangles[outTriangleIndex[pId]][0]] = 1;
461 s2PSelected[triangles[outTriangleIndex[pId]][1]] = 1;
462 s2PSelected[triangles[outTriangleIndex[pId]][2]] = 1;
465 __global__ void SI_s2PIndexOut(
466 DArray<int> s2PIndex,
467 DArray<int> s2PIndex_o,
468 DArray<int> s2PIndexOut)
470 int pId = threadIdx.x + blockIdx.x * blockDim.x;
471 if (pId >= s2PIndex.size()) return;
473 if (s2PIndex_o[pId] == 1)
475 s2PIndexOut[s2PIndex[pId]] = pId;
480 template<typename TDataType>
481 void SurfaceInteraction<TDataType>::calcSurfaceIntersectClick()
483 auto& initialTriangleSet = this->inInitialTriangleSet()->getData();
484 auto& points = initialTriangleSet.getPoints();
485 auto& triangles = initialTriangleSet.getTriangles();
486 DArray<int> intersected;
487 intersected.resize(triangles.size());
488 cuExecute(triangles.size(),
489 SI_SurfaceInitializeArray,
492 DArray<int> unintersected;
493 unintersected.resize(triangles.size());
494 this->tempNumT = triangles.size();
496 DArray<Real> triDistance;
497 triDistance.resize(triangles.size());
499 cuExecute(triangles.size(),
500 SI_CalIntersectedTrisRay,
509 int min_index = thrust::min_element(thrust::device, triDistance.begin(), triDistance.begin() + triDistance.size()) - triDistance.begin();
511 cuExecute(intersected.size(),
518 if (this->varToggleFlood()->getValue())
520 auto& Tri2Edg = initialTriangleSet.getTriangle2Edge();
521 auto& Edge2Tri = initialTriangleSet.getEdge2Triangle();
523 initialTriangleSet.updateTriangle2Edge();
524 int intersected_size_t_o = 0;
525 int intersected_size_t = 1;
526 while (intersected_size_t > intersected_size_t_o && intersected_size_t < triangles.size())
528 intersected_size_t_o = intersected_size_t;
530 cuExecute(triangles.size(),
531 SI_NeighborTrisDiffuse,
538 Real(this->varFloodAngle()->getValue()/180.0f*M_PI));
540 intersected_size_t = thrust::reduce(thrust::device, intersected.begin(), intersected.begin() + intersected.size(), (int)0, thrust::plus<int>());
544 if (this->varToggleVisibleFilter()->getValue())
546 cuExecute(triangles.size(),
556 if (this->varToggleQuad()->getValue())
558 cuExecute(triangles.size(),
565 this->tempTriIntersectedIndex.assign(intersected);
567 if (this->varToggleMultiSelect()->getData())
569 if (this->triIntersectedIndex.size() == 0)
571 this->triIntersectedIndex.resize(triangles.size());
572 cuExecute(triangles.size(),
573 SI_SurfaceInitializeArray,
574 this->triIntersectedIndex
577 DArray<int> outIntersected;
578 outIntersected.resize(intersected.size());
579 DArray<int> outUnintersected;
580 outUnintersected.resize(unintersected.size());
581 if (this->varMultiSelectionType()->getValue() == MultiSelectionType::OR)
583 cuExecute(triangles.size(),
584 SI_SurfaceMergeIntersectedIndexOR,
585 this->triIntersectedIndex,
591 else if (this->varMultiSelectionType()->getValue() == MultiSelectionType::XOR)
593 cuExecute(triangles.size(),
594 SI_SurfaceMergeIntersectedIndexXOR,
595 this->triIntersectedIndex,
601 else if (this->varMultiSelectionType()->getValue() == MultiSelectionType::C)
603 cuExecute(triangles.size(),
604 SI_SurfaceMergeIntersectedIndexC,
605 this->triIntersectedIndex,
611 intersected.assign(outIntersected);
612 unintersected.assign(outUnintersected);
616 this->triIntersectedIndex.assign(intersected);
619 DArray<int> intersected_o;
620 intersected_o.assign(intersected);
622 int intersected_size = thrust::reduce(thrust::device, intersected.begin(), intersected.begin() + intersected.size(), (int)0, thrust::plus<int>());
623 DArray<int> outTriangleIndex;
624 outTriangleIndex.resize(intersected_size);
625 thrust::exclusive_scan(thrust::device, intersected.begin(), intersected.begin() + intersected.size(), intersected.begin());
626 DArray<Triangle> intersected_triangles;
627 intersected_triangles.resize(intersected_size);
629 int unintersected_size = thrust::reduce(thrust::device, unintersected.begin(), unintersected.begin() + unintersected.size(), (int)0, thrust::plus<int>());
630 thrust::exclusive_scan(thrust::device, unintersected.begin(), unintersected.begin() + unintersected.size(), unintersected.begin());
631 DArray<Triangle> unintersected_triangles;
632 unintersected_triangles.resize(unintersected_size);
634 cuExecute(triangles.size(),
635 SI_AssignOutTriangles,
637 intersected_triangles,
638 unintersected_triangles,
645 DArray<int> s2PSelected;
646 s2PSelected.resize(points.size());
648 cuExecute(points.size(),
649 SI_InitialS2PSelected,
653 cuExecute(outTriangleIndex.size(),
659 int s2PSelectedSize = thrust::reduce(thrust::device, s2PSelected.begin(), s2PSelected.begin() + s2PSelected.size(), (int)0, thrust::plus<int>());
660 DArray<int> s2PSelected_o;
661 s2PSelected_o.assign(s2PSelected);
663 thrust::exclusive_scan(thrust::device, s2PSelected.begin(), s2PSelected.begin() + s2PSelected.size(), s2PSelected.begin());
665 DArray<int> s2PSelectedIndex;
666 s2PSelectedIndex.resize(s2PSelectedSize);
667 cuExecute(s2PSelected.size(),
674 if (this->varToggleQuad()->getValue())
676 DArray<int> intersected_q;
677 intersected_q.resize(triangles.size() / 2);
678 cuExecute(triangles.size(),
683 intersected_o.assign(intersected_q);
685 DArray<int> outQuadIndex;
686 outQuadIndex.resize(outTriangleIndex.size()/2);
687 cuExecute(outQuadIndex.size(),
692 outTriangleIndex.assign(outQuadIndex);
695 this->tempNumS = intersected_size;
696 this->outSelectedTriangleSet()->getDataPtr()->copyFrom(initialTriangleSet);
697 this->outSelectedTriangleSet()->getDataPtr()->setTriangles(intersected_triangles);
698 this->outOtherTriangleSet()->getDataPtr()->copyFrom(initialTriangleSet);
699 this->outOtherTriangleSet()->getDataPtr()->setTriangles(unintersected_triangles);
700 if (this->varToggleIndexOutput()->getValue())
702 this->outTriangleIndex()->getDataPtr()->assign(outTriangleIndex);
703 this->outSur2PointIndex()->getDataPtr()->assign(s2PSelectedIndex);
707 this->outTriangleIndex()->getDataPtr()->assign(intersected_o);
708 this->outSur2PointIndex()->getDataPtr()->assign(s2PSelected_o);
712 template<typename TDataType>
713 void SurfaceInteraction<TDataType>::calcSurfaceIntersectDrag()
723 TRay3D<Real> ray1 = this->camera->castRayInWorldSpace((float)x1, (float)y1);
724 TRay3D<Real> ray2 = this->camera->castRayInWorldSpace((float)x2, (float)y2);
725 TRay3D<Real> ray3 = this->camera->castRayInWorldSpace((float)x1, (float)y2);
726 TRay3D<Real> ray4 = this->camera->castRayInWorldSpace((float)x2, (float)y1);
728 TPlane3D<Real> plane13 = TPlane3D<Real>(ray1.origin, ray1.direction.cross(ray3.direction));
729 TPlane3D<Real> plane42 = TPlane3D<Real>(ray2.origin, ray2.direction.cross(ray4.direction));
730 TPlane3D<Real> plane14 = TPlane3D<Real>(ray4.origin, ray1.direction.cross(ray4.direction));
731 TPlane3D<Real> plane32 = TPlane3D<Real>(ray3.origin, ray2.direction.cross(ray3.direction));
733 auto& initialTriangleSet = this->inInitialTriangleSet()->getData();
734 auto& points = initialTriangleSet.getPoints();
735 auto& triangles = initialTriangleSet.getTriangles();
736 DArray<int> intersected;
737 intersected.resize(triangles.size());
738 cuExecute(triangles.size(),
739 SI_SurfaceInitializeArray,
742 DArray<int> unintersected;
743 unintersected.resize(triangles.size());
744 this->tempNumT = triangles.size();
746 cuExecute(triangles.size(),
747 SI_CalIntersectedTrisBox,
759 if (this->varToggleVisibleFilter()->getValue())
761 cuExecute(triangles.size(),
771 if (this->varToggleQuad()->getValue())
773 cuExecute(triangles.size(),
780 this->tempTriIntersectedIndex.assign(intersected);
782 if (this->varToggleMultiSelect()->getData())
784 if (this->triIntersectedIndex.size() == 0)
786 this->triIntersectedIndex.resize(triangles.size());
787 cuExecute(triangles.size(),
788 SI_SurfaceInitializeArray,
789 this->triIntersectedIndex
792 DArray<int> outIntersected;
793 outIntersected.resize(intersected.size());
794 DArray<int> outUnintersected;
795 outUnintersected.resize(unintersected.size());
796 if (this->varMultiSelectionType()->getValue() == MultiSelectionType::OR)
798 cuExecute(triangles.size(),
799 SI_SurfaceMergeIntersectedIndexOR,
800 this->triIntersectedIndex,
806 else if (this->varMultiSelectionType()->getValue() == MultiSelectionType::XOR)
808 cuExecute(triangles.size(),
809 SI_SurfaceMergeIntersectedIndexXOR,
810 this->triIntersectedIndex,
816 else if (this->varMultiSelectionType()->getValue() == MultiSelectionType::C)
818 cuExecute(triangles.size(),
819 SI_SurfaceMergeIntersectedIndexC,
820 this->triIntersectedIndex,
826 intersected.assign(outIntersected);
827 unintersected.assign(outUnintersected);
828 //this->triIntersectedIndex.assign(intersected);
832 this->triIntersectedIndex.assign(intersected);
836 DArray<int> intersected_o;
837 intersected_o.assign(intersected);
839 int intersected_size = thrust::reduce(thrust::device, intersected.begin(), intersected.begin() + intersected.size(), (int)0, thrust::plus<int>());
840 DArray<int> outTriangleIndex;
841 outTriangleIndex.resize(intersected_size);
842 thrust::exclusive_scan(thrust::device, intersected.begin(), intersected.begin() + intersected.size(), intersected.begin());
843 DArray<Triangle> intersected_triangles;
844 intersected_triangles.resize(intersected_size);
846 int unintersected_size = thrust::reduce(thrust::device, unintersected.begin(), unintersected.begin() + unintersected.size(), (int)0, thrust::plus<int>());
847 thrust::exclusive_scan(thrust::device, unintersected.begin(), unintersected.begin() + unintersected.size(), unintersected.begin());
848 DArray<Triangle> unintersected_triangles;
849 unintersected_triangles.resize(unintersected_size);
851 cuExecute(triangles.size(),
852 SI_AssignOutTriangles,
854 intersected_triangles,
855 unintersected_triangles,
862 DArray<int> s2PSelected;
863 s2PSelected.resize(points.size());
865 cuExecute(points.size(),
866 SI_InitialS2PSelected,
870 cuExecute(outTriangleIndex.size(),
876 int s2PSelectedSize = thrust::reduce(thrust::device, s2PSelected.begin(), s2PSelected.begin() + s2PSelected.size(), (int)0, thrust::plus<int>());
877 DArray<int> s2PSelected_o;
878 s2PSelected_o.assign(s2PSelected);
880 thrust::exclusive_scan(thrust::device, s2PSelected.begin(), s2PSelected.begin() + s2PSelected.size(), s2PSelected.begin());
882 DArray<int> s2PSelectedIndex;
883 s2PSelectedIndex.resize(s2PSelectedSize);
884 cuExecute(s2PSelected.size(),
891 if (this->varToggleQuad()->getValue())
893 DArray<int> intersected_q;
894 intersected_q.resize(triangles.size() / 2);
895 cuExecute(triangles.size(),
900 intersected_o.assign(intersected_q);
902 DArray<int> outQuadIndex;
903 outQuadIndex.resize(outTriangleIndex.size() / 2);
904 cuExecute(outQuadIndex.size(),
909 outTriangleIndex.assign(outQuadIndex);
912 this->tempNumS = intersected_size;
913 this->outSelectedTriangleSet()->getDataPtr()->copyFrom(initialTriangleSet);
914 this->outSelectedTriangleSet()->getDataPtr()->setTriangles(intersected_triangles);
915 this->outOtherTriangleSet()->getDataPtr()->copyFrom(initialTriangleSet);
916 this->outOtherTriangleSet()->getDataPtr()->setTriangles(unintersected_triangles);
917 if (this->varToggleIndexOutput()->getValue())
919 this->outTriangleIndex()->getDataPtr()->assign(outTriangleIndex);
920 this->outSur2PointIndex()->getDataPtr()->assign(s2PSelectedIndex);
924 this->outTriangleIndex()->getDataPtr()->assign(intersected_o);
925 this->outSur2PointIndex()->getDataPtr()->assign(s2PSelected_o);
929 template<typename TDataType>
930 void SurfaceInteraction<TDataType>::mergeIndex()
932 auto& initialTriangleSet = this->inInitialTriangleSet()->getData();
933 auto& points = initialTriangleSet.getPoints();
934 auto& triangles = initialTriangleSet.getTriangles();
935 DArray<int> intersected;
936 intersected.resize(triangles.size());
937 cuExecute(triangles.size(),
938 SI_SurfaceInitializeArray,
941 DArray<int> unintersected;
942 unintersected.resize(triangles.size());
943 this->tempNumT = triangles.size();
945 DArray<int> outIntersected;
946 outIntersected.resize(intersected.size());
947 DArray<int> outUnintersected;
948 outUnintersected.resize(unintersected.size());
950 if (this->varMultiSelectionType()->getValue() == MultiSelectionType::OR)
952 cuExecute(triangles.size(),
953 SI_SurfaceMergeIntersectedIndexOR,
954 this->triIntersectedIndex,
955 this->tempTriIntersectedIndex,
960 else if (this->varMultiSelectionType()->getValue() == MultiSelectionType::XOR)
962 cuExecute(triangles.size(),
963 SI_SurfaceMergeIntersectedIndexXOR,
964 this->triIntersectedIndex,
965 this->tempTriIntersectedIndex,
970 else if (this->varMultiSelectionType()->getValue() == MultiSelectionType::C)
972 cuExecute(triangles.size(),
973 SI_SurfaceMergeIntersectedIndexC,
974 this->triIntersectedIndex,
975 this->tempTriIntersectedIndex,
981 intersected.assign(outIntersected);
982 unintersected.assign(outUnintersected);
983 this->triIntersectedIndex.assign(intersected);
985 DArray<int> intersected_o;
986 intersected_o.assign(intersected);
988 int intersected_size = thrust::reduce(thrust::device, intersected.begin(), intersected.begin() + intersected.size(), (int)0, thrust::plus<int>());
989 DArray<int> outTriangleIndex;
990 outTriangleIndex.resize(intersected_size);
991 thrust::exclusive_scan(thrust::device, intersected.begin(), intersected.begin() + intersected.size(), intersected.begin());
992 DArray<Triangle> intersected_triangles;
993 intersected_triangles.resize(intersected_size);
995 int unintersected_size = thrust::reduce(thrust::device, unintersected.begin(), unintersected.begin() + unintersected.size(), (int)0, thrust::plus<int>());
996 thrust::exclusive_scan(thrust::device, unintersected.begin(), unintersected.begin() + unintersected.size(), unintersected.begin());
997 DArray<Triangle> unintersected_triangles;
998 unintersected_triangles.resize(unintersected_size);
1000 cuExecute(triangles.size(),
1001 SI_AssignOutTriangles,
1003 intersected_triangles,
1004 unintersected_triangles,
1011 DArray<int> s2PSelected;
1012 s2PSelected.resize(points.size());
1014 cuExecute(points.size(),
1015 SI_InitialS2PSelected,
1019 cuExecute(outTriangleIndex.size(),
1025 int s2PSelectedSize = thrust::reduce(thrust::device, s2PSelected.begin(), s2PSelected.begin() + s2PSelected.size(), (int)0, thrust::plus<int>());
1026 DArray<int> s2PSelected_o;
1027 s2PSelected_o.assign(s2PSelected);
1029 thrust::exclusive_scan(thrust::device, s2PSelected.begin(), s2PSelected.begin() + s2PSelected.size(), s2PSelected.begin());
1031 DArray<int> s2PSelectedIndex;
1032 s2PSelectedIndex.resize(s2PSelectedSize);
1033 cuExecute(s2PSelected.size(),
1040 this->tempNumS = intersected_size;
1041 this->outSelectedTriangleSet()->getDataPtr()->copyFrom(initialTriangleSet);
1042 this->outSelectedTriangleSet()->getDataPtr()->setTriangles(intersected_triangles);
1043 this->outOtherTriangleSet()->getDataPtr()->copyFrom(initialTriangleSet);
1044 this->outOtherTriangleSet()->getDataPtr()->setTriangles(unintersected_triangles);
1045 if (this->varToggleIndexOutput()->getValue())
1047 this->outTriangleIndex()->getDataPtr()->assign(outTriangleIndex);
1048 this->outSur2PointIndex()->getDataPtr()->assign(s2PSelectedIndex);
1052 this->outTriangleIndex()->getDataPtr()->assign(intersected_o);
1053 this->outSur2PointIndex()->getDataPtr()->assign(s2PSelected_o);
1057 template<typename TDataType>
1058 void SurfaceInteraction<TDataType>::printInfoClick()
1060 std::cout << "----------surface picking: click----------" << std::endl;
1061 std::cout << "multiple picking: " << this->varToggleMultiSelect()->getValue() << std::endl;
1062 std::cout << "selected num/ total num:" << this->tempNumS << "/" << this->tempNumT << std::endl;
1065 template<typename TDataType>
1066 void SurfaceInteraction<TDataType>::printInfoDragging()
1068 std::cout << "----------surface picking: dragging----------" << std::endl;
1069 std::cout << "multiple picking: " << this->varToggleMultiSelect()->getValue() << std::endl;
1070 std::cout << "selected num/ total num:" << this->tempNumS << "/" << this->tempNumT << std::endl;
1073 template<typename TDataType>
1074 void SurfaceInteraction<TDataType>::printInfoDragRelease()
1076 std::cout << "----------surface picking: drag release----------" << std::endl;
1077 std::cout << "multiple picking: " << this->varToggleMultiSelect()->getValue() << std::endl;
1078 std::cout << "selected num/ total num:" << this->tempNumS << "/" << this->tempNumT << std::endl;
1081 template<typename TDataType>
1082 void SurfaceInteraction<TDataType>::calcIntersectClick()
1084 if (this->varTogglePicker()->getData())
1085 calcSurfaceIntersectClick();
1088 template<typename TDataType>
1089 void SurfaceInteraction<TDataType>::calcIntersectDrag()
1091 if (this->varTogglePicker()->getData())
1092 calcSurfaceIntersectDrag();
1095 DEFINE_CLASS(SurfaceInteraction);