18 #ifndef viskores_rendering_Triangulator_h
19 #define viskores_rendering_Triangulator_h
27 #include <viskores/rendering/raytracing/MeshConnectivityBuilder.h>
83 template <
typename ghostlArrayType>
85 ghostlArrayType& ghostField,
89 if (
int(ghostField) != 0)
107 template <
typename ghostlArrayType>
109 ghostlArrayType& ghostField,
113 if (
int(ghostField) != 0)
119 template <
typename ghostlArrayType>
121 ghostlArrayType& ghostField,
124 if (
int(ghostField) != 0)
130 template <
typename ghostlArrayType>
132 ghostlArrayType& ghostField,
135 if (
int(ghostField) != 0)
152 #if defined(VISKORES_MSVC)
153 #pragma warning(push)
154 #pragma warning(disable : 4127) //conditional expression is constant
156 template <
typename CellNodeVecType,
typename OutIndicesPortal>
159 OutIndicesPortal& outputIndices)
const
166 triangle[1] = cellIndices[0];
167 triangle[2] = cellIndices[1];
168 triangle[3] = cellIndices[2];
169 triangle[0] = cellIndex;
170 outputIndices.Set(triangleOffset, triangle);
172 triangle[2] = cellIndices[3];
173 outputIndices.Set(triangleOffset + 1, triangle);
179 triangle[1] = cellIndices[0];
180 triangle[2] = cellIndices[1];
181 triangle[3] = cellIndices[5];
182 triangle[0] = cellIndex;
183 outputIndices.Set(triangleOffset, triangle);
185 triangle[1] = cellIndices[0];
186 triangle[2] = cellIndices[5];
187 triangle[3] = cellIndices[4];
188 outputIndices.Set(triangleOffset + 1, triangle);
190 triangle[1] = cellIndices[1];
191 triangle[2] = cellIndices[2];
192 triangle[3] = cellIndices[6];
193 outputIndices.Set(triangleOffset + 2, triangle);
195 triangle[1] = cellIndices[1];
196 triangle[2] = cellIndices[6];
197 triangle[3] = cellIndices[5];
198 outputIndices.Set(triangleOffset + 3, triangle);
200 triangle[1] = cellIndices[3];
201 triangle[2] = cellIndices[7];
202 triangle[3] = cellIndices[6];
203 outputIndices.Set(triangleOffset + 4, triangle);
205 triangle[1] = cellIndices[3];
206 triangle[2] = cellIndices[6];
207 triangle[3] = cellIndices[2];
208 outputIndices.Set(triangleOffset + 5, triangle);
210 triangle[1] = cellIndices[0];
211 triangle[2] = cellIndices[4];
212 triangle[3] = cellIndices[7];
213 outputIndices.Set(triangleOffset + 6, triangle);
215 triangle[1] = cellIndices[0];
216 triangle[2] = cellIndices[7];
217 triangle[3] = cellIndices[3];
218 outputIndices.Set(triangleOffset + 7, triangle);
220 triangle[1] = cellIndices[0];
221 triangle[2] = cellIndices[3];
222 triangle[3] = cellIndices[2];
223 outputIndices.Set(triangleOffset + 8, triangle);
225 triangle[1] = cellIndices[0];
226 triangle[2] = cellIndices[2];
227 triangle[3] = cellIndices[1];
228 outputIndices.Set(triangleOffset + 9, triangle);
230 triangle[1] = cellIndices[4];
231 triangle[2] = cellIndices[5];
232 triangle[3] = cellIndices[6];
233 outputIndices.Set(triangleOffset + 10, triangle);
235 triangle[1] = cellIndices[4];
236 triangle[2] = cellIndices[6];
237 triangle[3] = cellIndices[7];
238 outputIndices.Set(triangleOffset + 11, triangle);
241 #if defined(VISKORES_MSVC)
260 if (triangleIndices[1] > triangleIndices[3])
262 temp = triangleIndices[1];
263 triangleIndices[1] = triangleIndices[3];
264 triangleIndices[3] = temp;
266 if (triangleIndices[1] > triangleIndices[2])
268 temp = triangleIndices[1];
269 triangleIndices[1] = triangleIndices[2];
270 triangleIndices[2] = temp;
272 if (triangleIndices[2] > triangleIndices[3])
274 temp = triangleIndices[2];
275 triangleIndices[2] = triangleIndices[3];
276 triangleIndices[3] = temp;
312 return (a[1] == b[1] && a[2] == b[2] && a[3] == b[3]);
315 template <
typename IndicesPortalType,
typename OutputFlagsPortalType>
317 OutputFlagsPortalType& outputFlags,
323 if (
IsTwin(indices.Get(index), indices.Get(index - 1)))
325 outputFlags.Set(index, 0);
326 outputFlags.Set(index - 1, 0);
340 template <
typename VecType,
typename OutputPortal>
343 const VecType& cellIndices,
345 OutputPortal& outputIndices)
const
349 triangle[1] = cellIndices[0];
350 triangle[2] = cellIndices[1];
351 triangle[3] = cellIndices[2];
352 triangle[0] = cellId;
353 outputIndices.Set(triangleOffset, triangle);
355 triangle[1] = cellIndices[3];
356 triangle[2] = cellIndices[5];
357 triangle[3] = cellIndices[4];
358 outputIndices.Set(triangleOffset + 1, triangle);
360 triangle[1] = cellIndices[3];
361 triangle[2] = cellIndices[0];
362 triangle[3] = cellIndices[2];
363 outputIndices.Set(triangleOffset + 2, triangle);
365 triangle[1] = cellIndices[3];
366 triangle[2] = cellIndices[2];
367 triangle[3] = cellIndices[5];
368 outputIndices.Set(triangleOffset + 3, triangle);
370 triangle[1] = cellIndices[1];
371 triangle[2] = cellIndices[4];
372 triangle[3] = cellIndices[5];
373 outputIndices.Set(triangleOffset + 4, triangle);
375 triangle[1] = cellIndices[1];
376 triangle[2] = cellIndices[5];
377 triangle[3] = cellIndices[2];
378 outputIndices.Set(triangleOffset + 5, triangle);
380 triangle[1] = cellIndices[0];
381 triangle[2] = cellIndices[3];
382 triangle[3] = cellIndices[4];
383 outputIndices.Set(triangleOffset + 6, triangle);
385 triangle[1] = cellIndices[0];
386 triangle[2] = cellIndices[4];
387 triangle[3] = cellIndices[1];
388 outputIndices.Set(triangleOffset + 7, triangle);
390 template <
typename VecType,
typename OutputPortal>
393 const VecType& cellIndices,
395 OutputPortal& outputIndices)
const
400 triangle[1] = cellIndices[0];
401 triangle[2] = cellIndices[1];
402 triangle[3] = cellIndices[2];
403 triangle[0] = cellId;
404 outputIndices.Set(triangleOffset, triangle);
406 triangle[2] = cellIndices[3];
407 outputIndices.Set(triangleOffset + 1, triangle);
410 template <
typename VecType,
typename OutputPortal>
413 const VecType& cellIndices,
415 OutputPortal& outputIndices)
const
419 triangle[1] = cellIndices[0];
420 triangle[2] = cellIndices[1];
421 triangle[3] = cellIndices[5];
422 triangle[0] = cellId;
423 outputIndices.Set(triangleOffset, triangle);
425 triangle[1] = cellIndices[0];
426 triangle[2] = cellIndices[5];
427 triangle[3] = cellIndices[4];
428 outputIndices.Set(triangleOffset + 1, triangle);
430 triangle[1] = cellIndices[1];
431 triangle[2] = cellIndices[2];
432 triangle[3] = cellIndices[6];
433 outputIndices.Set(triangleOffset + 2, triangle);
435 triangle[1] = cellIndices[1];
436 triangle[2] = cellIndices[6];
437 triangle[3] = cellIndices[5];
438 outputIndices.Set(triangleOffset + 3, triangle);
440 triangle[1] = cellIndices[3];
441 triangle[2] = cellIndices[7];
442 triangle[3] = cellIndices[6];
443 outputIndices.Set(triangleOffset + 4, triangle);
445 triangle[1] = cellIndices[3];
446 triangle[2] = cellIndices[6];
447 triangle[3] = cellIndices[2];
448 outputIndices.Set(triangleOffset + 5, triangle);
450 triangle[1] = cellIndices[0];
451 triangle[2] = cellIndices[4];
452 triangle[3] = cellIndices[7];
453 outputIndices.Set(triangleOffset + 6, triangle);
455 triangle[1] = cellIndices[0];
456 triangle[2] = cellIndices[7];
457 triangle[3] = cellIndices[3];
458 outputIndices.Set(triangleOffset + 7, triangle);
460 triangle[1] = cellIndices[0];
461 triangle[2] = cellIndices[3];
462 triangle[3] = cellIndices[2];
463 outputIndices.Set(triangleOffset + 8, triangle);
465 triangle[1] = cellIndices[0];
466 triangle[2] = cellIndices[2];
467 triangle[3] = cellIndices[1];
468 outputIndices.Set(triangleOffset + 9, triangle);
470 triangle[1] = cellIndices[4];
471 triangle[2] = cellIndices[5];
472 triangle[3] = cellIndices[6];
473 outputIndices.Set(triangleOffset + 10, triangle);
475 triangle[1] = cellIndices[4];
476 triangle[2] = cellIndices[6];
477 triangle[3] = cellIndices[7];
478 outputIndices.Set(triangleOffset + 11, triangle);
481 template <
typename VecType,
typename OutputPortal>
484 const VecType& cellIndices,
486 OutputPortal& outputIndices)
const
493 triangle[1] = cellIndices[0];
494 triangle[2] = cellIndices[1];
495 triangle[3] = cellIndices[2];
496 triangle[0] = cellId;
497 outputIndices.Set(triangleOffset, triangle);
502 triangle[1] = cellIndices[0];
503 triangle[2] = cellIndices[1];
504 triangle[3] = cellIndices[2];
505 triangle[0] = cellId;
506 outputIndices.Set(triangleOffset, triangle);
508 triangle[2] = cellIndices[3];
509 outputIndices.Set(triangleOffset + 1, triangle);
513 triangle[1] = cellIndices[0];
514 triangle[2] = cellIndices[3];
515 triangle[3] = cellIndices[1];
516 triangle[0] = cellId;
517 outputIndices.Set(triangleOffset, triangle);
519 triangle[1] = cellIndices[1];
520 triangle[2] = cellIndices[2];
521 triangle[3] = cellIndices[3];
522 outputIndices.Set(triangleOffset + 1, triangle);
524 triangle[1] = cellIndices[0];
525 triangle[2] = cellIndices[2];
526 triangle[3] = cellIndices[3];
527 outputIndices.Set(triangleOffset + 2, triangle);
529 triangle[1] = cellIndices[0];
530 triangle[2] = cellIndices[2];
531 triangle[3] = cellIndices[1];
532 outputIndices.Set(triangleOffset + 3, triangle);
536 triangle[1] = cellIndices[0];
537 triangle[2] = cellIndices[1];
538 triangle[3] = cellIndices[5];
539 triangle[0] = cellId;
540 outputIndices.Set(triangleOffset, triangle);
542 triangle[1] = cellIndices[0];
543 triangle[2] = cellIndices[5];
544 triangle[3] = cellIndices[4];
545 outputIndices.Set(triangleOffset + 1, triangle);
547 triangle[1] = cellIndices[1];
548 triangle[2] = cellIndices[2];
549 triangle[3] = cellIndices[6];
550 outputIndices.Set(triangleOffset + 2, triangle);
552 triangle[1] = cellIndices[1];
553 triangle[2] = cellIndices[6];
554 triangle[3] = cellIndices[5];
555 outputIndices.Set(triangleOffset + 3, triangle);
557 triangle[1] = cellIndices[3];
558 triangle[2] = cellIndices[7];
559 triangle[3] = cellIndices[6];
560 outputIndices.Set(triangleOffset + 4, triangle);
562 triangle[1] = cellIndices[3];
563 triangle[2] = cellIndices[6];
564 triangle[3] = cellIndices[2];
565 outputIndices.Set(triangleOffset + 5, triangle);
567 triangle[1] = cellIndices[0];
568 triangle[2] = cellIndices[4];
569 triangle[3] = cellIndices[7];
570 outputIndices.Set(triangleOffset + 6, triangle);
572 triangle[1] = cellIndices[0];
573 triangle[2] = cellIndices[7];
574 triangle[3] = cellIndices[3];
575 outputIndices.Set(triangleOffset + 7, triangle);
577 triangle[1] = cellIndices[0];
578 triangle[2] = cellIndices[3];
579 triangle[3] = cellIndices[2];
580 outputIndices.Set(triangleOffset + 8, triangle);
582 triangle[1] = cellIndices[0];
583 triangle[2] = cellIndices[2];
584 triangle[3] = cellIndices[1];
585 outputIndices.Set(triangleOffset + 9, triangle);
587 triangle[1] = cellIndices[4];
588 triangle[2] = cellIndices[5];
589 triangle[3] = cellIndices[6];
590 outputIndices.Set(triangleOffset + 10, triangle);
592 triangle[1] = cellIndices[4];
593 triangle[2] = cellIndices[6];
594 triangle[3] = cellIndices[7];
595 outputIndices.Set(triangleOffset + 11, triangle);
599 triangle[1] = cellIndices[0];
600 triangle[2] = cellIndices[1];
601 triangle[3] = cellIndices[2];
602 triangle[0] = cellId;
603 outputIndices.Set(triangleOffset, triangle);
605 triangle[1] = cellIndices[3];
606 triangle[2] = cellIndices[5];
607 triangle[3] = cellIndices[4];
608 outputIndices.Set(triangleOffset + 1, triangle);
610 triangle[1] = cellIndices[3];
611 triangle[2] = cellIndices[0];
612 triangle[3] = cellIndices[2];
613 outputIndices.Set(triangleOffset + 2, triangle);
615 triangle[1] = cellIndices[3];
616 triangle[2] = cellIndices[2];
617 triangle[3] = cellIndices[5];
618 outputIndices.Set(triangleOffset + 3, triangle);
620 triangle[1] = cellIndices[1];
621 triangle[2] = cellIndices[4];
622 triangle[3] = cellIndices[5];
623 outputIndices.Set(triangleOffset + 4, triangle);
625 triangle[1] = cellIndices[1];
626 triangle[2] = cellIndices[5];
627 triangle[3] = cellIndices[2];
628 outputIndices.Set(triangleOffset + 5, triangle);
630 triangle[1] = cellIndices[0];
631 triangle[2] = cellIndices[3];
632 triangle[3] = cellIndices[4];
633 outputIndices.Set(triangleOffset + 6, triangle);
635 triangle[1] = cellIndices[0];
636 triangle[2] = cellIndices[4];
637 triangle[3] = cellIndices[1];
638 outputIndices.Set(triangleOffset + 7, triangle);
642 triangle[1] = cellIndices[0];
643 triangle[2] = cellIndices[4];
644 triangle[3] = cellIndices[1];
645 triangle[0] = cellId;
646 outputIndices.Set(triangleOffset, triangle);
648 triangle[1] = cellIndices[1];
649 triangle[2] = cellIndices[2];
650 triangle[3] = cellIndices[4];
651 outputIndices.Set(triangleOffset + 1, triangle);
653 triangle[1] = cellIndices[2];
654 triangle[2] = cellIndices[3];
655 triangle[3] = cellIndices[4];
656 outputIndices.Set(triangleOffset + 2, triangle);
658 triangle[1] = cellIndices[0];
659 triangle[2] = cellIndices[4];
660 triangle[3] = cellIndices[3];
661 outputIndices.Set(triangleOffset + 3, triangle);
663 triangle[1] = cellIndices[3];
664 triangle[2] = cellIndices[2];
665 triangle[3] = cellIndices[1];
666 outputIndices.Set(triangleOffset + 4, triangle);
668 triangle[1] = cellIndices[3];
669 triangle[2] = cellIndices[1];
670 triangle[3] = cellIndices[0];
671 outputIndices.Set(triangleOffset + 5, triangle);
686 sortInvoker.Invoke(outputIndices);
699 outputIndices = subset;
709 bool fastPath =
false;
724 outputIndices.
Allocate(numCells * 12);
726 .Invoke(cellSetStructured3D, cellIdxs, outputIndices);
728 outputTriangles = numCells * 12;
735 triangleGhostArrayHandle);
740 outputIndices = nonGhostTriangles;
749 outputIndices.
Allocate(numCells * 2);
751 .Invoke(cellSetStructured2D, cellIdxs, outputIndices);
753 outputTriangles = numCells * 2;
760 triangleGhostArrayHandle);
765 outputIndices = nonGhostTriangles;
772 auto cellSetUnstructured =
777 .Invoke(cellSetUnstructured,
786 outputIndices.
Allocate(totalTriangles);
789 .Invoke(cellSetUnstructured, cellOffsets, outputIndices);
791 outputTriangles = totalTriangles;
803 #endif //viskores_rendering_Triangulator_h