vtk-m/vtkm/rendering/Triangulator.h

715 lines
23 KiB
C
Raw Normal View History

2016-01-20 22:40:54 +00:00
//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
2019-04-15 23:24:21 +00:00
//
2016-01-20 22:40:54 +00:00
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//============================================================================
#ifndef vtk_m_rendering_Triangulator_h
#define vtk_m_rendering_Triangulator_h
2018-09-11 02:25:42 +00:00
#include <typeinfo>
#include <vtkm/cont/Algorithm.h>
2016-01-20 22:40:54 +00:00
#include <vtkm/cont/ArrayHandleCounting.h>
#include <vtkm/cont/CellSetPermutation.h>
2016-01-20 22:40:54 +00:00
#include <vtkm/cont/DataSet.h>
#include <vtkm/cont/UncertainCellSet.h>
#include <vtkm/rendering/raytracing/MeshConnectivityBuilder.h>
#include <vtkm/worklet/DispatcherMapField.h>
2016-01-20 22:40:54 +00:00
#include <vtkm/worklet/DispatcherMapTopology.h>
#include <vtkm/worklet/WorkletMapField.h>
#include <vtkm/worklet/WorkletMapTopology.h>
2017-05-18 14:29:41 +00:00
namespace vtkm
{
namespace rendering
{
2016-01-20 22:40:54 +00:00
/// \brief Triangulator creates a minimal set of triangles from a cell set.
///
/// This class creates a array of triangle indices from both 3D and 2D
/// explicit cell sets. This list can serve as input to opengl and the
2018-09-11 02:25:42 +00:00
/// ray tracer scene renderers.
2016-01-20 22:40:54 +00:00
///
class Triangulator
{
public:
class CountTriangles : public vtkm::worklet::WorkletVisitCellsWithPoints
2016-01-20 22:40:54 +00:00
{
public:
VTKM_CONT
2017-05-18 14:29:41 +00:00
CountTriangles() {}
using ControlSignature = void(CellSetIn cellset, FieldOut);
using ExecutionSignature = void(CellShape, _2);
2017-10-06 23:08:29 +00:00
VTKM_EXEC
2017-10-06 23:08:29 +00:00
void operator()(vtkm::CellShapeTagGeneric shapeType, vtkm::Id& triangles) const
2016-01-20 22:40:54 +00:00
{
2017-10-06 23:08:29 +00:00
if (shapeType.Id == vtkm::CELL_SHAPE_TRIANGLE)
2017-05-18 14:29:41 +00:00
triangles = 1;
2017-10-06 23:08:29 +00:00
else if (shapeType.Id == vtkm::CELL_SHAPE_QUAD)
2017-05-18 14:29:41 +00:00
triangles = 2;
2017-10-06 23:08:29 +00:00
else if (shapeType.Id == vtkm::CELL_SHAPE_TETRA)
2017-05-18 14:29:41 +00:00
triangles = 4;
2017-10-06 23:08:29 +00:00
else if (shapeType.Id == vtkm::CELL_SHAPE_HEXAHEDRON)
2017-05-18 14:29:41 +00:00
triangles = 12;
2017-10-06 23:08:29 +00:00
else if (shapeType.Id == vtkm::CELL_SHAPE_WEDGE)
2017-05-18 14:29:41 +00:00
triangles = 8;
2017-10-06 23:08:29 +00:00
else if (shapeType.Id == vtkm::CELL_SHAPE_PYRAMID)
2017-05-18 14:29:41 +00:00
triangles = 6;
else
triangles = 0;
2016-01-20 22:40:54 +00:00
}
2017-10-06 23:08:29 +00:00
VTKM_EXEC
void operator()(vtkm::CellShapeTagHexahedron vtkmNotUsed(shapeType), vtkm::Id& triangles) const
{
triangles = 12;
}
VTKM_EXEC
void operator()(vtkm::CellShapeTagQuad vtkmNotUsed(shapeType), vtkm::Id& triangles) const
{
triangles = 2;
}
VTKM_EXEC
void operator()(vtkm::CellShapeTagWedge vtkmNotUsed(shapeType), vtkm::Id& triangles) const
{
triangles = 8;
}
2016-01-20 22:40:54 +00:00
}; //class CountTriangles
2016-04-14 21:04:58 +00:00
template <int DIM>
2020-05-08 14:07:32 +00:00
class TriangulateStructured : public vtkm::worklet::WorkletVisitCellsWithPoints
2016-01-20 22:40:54 +00:00
{
2017-05-18 14:29:41 +00:00
2016-01-20 22:40:54 +00:00
public:
using ControlSignature = void(CellSetIn cellset, FieldInCell, WholeArrayOut);
using ExecutionSignature = void(IncidentElementIndices, _2, _3);
VTKM_CONT
2020-05-08 14:07:32 +00:00
TriangulateStructured() {}
2016-04-14 21:04:58 +00:00
#if defined(VTKM_MSVC)
#pragma warning(push)
#pragma warning(disable : 4127) //conditional expression is constant
#endif
2018-09-11 02:25:42 +00:00
template <typename CellNodeVecType, typename OutIndicesPortal>
VTKM_EXEC void operator()(const CellNodeVecType& cellIndices,
const vtkm::Id& cellIndex,
OutIndicesPortal& outputIndices) const
2016-01-20 22:40:54 +00:00
{
vtkm::Id4 triangle;
2016-06-01 17:37:03 +00:00
if (DIM == 2)
{
const vtkm::Id triangleOffset = cellIndex * 2;
// 0-1-2
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[2];
triangle[0] = cellIndex;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
2016-06-01 17:37:03 +00:00
// 0-3-2
triangle[2] = cellIndices[3];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 1, triangle);
2016-06-01 17:37:03 +00:00
}
else if (DIM == 3)
{
const vtkm::Id triangleOffset = cellIndex * 12;
2016-06-01 17:37:03 +00:00
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[5];
2016-06-01 17:37:03 +00:00
triangle[0] = cellIndex;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[4];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 1, triangle);
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[6];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 2, triangle);
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[6];
triangle[3] = cellIndices[5];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 3, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[7];
triangle[3] = cellIndices[6];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 4, triangle);
triangle[1] = cellIndices[3];
2016-06-01 17:37:03 +00:00
triangle[2] = cellIndices[6];
triangle[3] = cellIndices[2];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 5, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[4];
triangle[3] = cellIndices[7];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 6, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[7];
triangle[3] = cellIndices[3];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 7, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[3];
triangle[3] = cellIndices[2];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 8, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[1];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 9, triangle);
triangle[1] = cellIndices[4];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[6];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 10, triangle);
triangle[1] = cellIndices[4];
triangle[2] = cellIndices[6];
triangle[3] = cellIndices[7];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 11, triangle);
2016-06-01 17:37:03 +00:00
}
2016-01-20 22:40:54 +00:00
}
#if defined(VTKM_MSVC)
#pragma warning(pop)
#endif
2016-01-20 22:40:54 +00:00
};
2016-01-20 22:40:54 +00:00
class IndicesSort : public vtkm::worklet::WorkletMapField
{
public:
VTKM_CONT
2017-05-18 14:29:41 +00:00
IndicesSort() {}
using ControlSignature = void(FieldInOut);
using ExecutionSignature = void(_1);
VTKM_EXEC
void operator()(vtkm::Id4& triangleIndices) const
2016-01-20 22:40:54 +00:00
{
// first field contains the id of the cell the
// trianlge belongs to
vtkm::Id temp;
if (triangleIndices[1] > triangleIndices[3])
{
2017-05-18 14:29:41 +00:00
temp = triangleIndices[1];
triangleIndices[1] = triangleIndices[3];
triangleIndices[3] = temp;
2016-01-20 22:40:54 +00:00
}
if (triangleIndices[1] > triangleIndices[2])
{
2017-05-18 14:29:41 +00:00
temp = triangleIndices[1];
triangleIndices[1] = triangleIndices[2];
triangleIndices[2] = temp;
2016-01-20 22:40:54 +00:00
}
if (triangleIndices[2] > triangleIndices[3])
{
2017-05-18 14:29:41 +00:00
temp = triangleIndices[2];
triangleIndices[2] = triangleIndices[3];
triangleIndices[3] = temp;
2016-01-20 22:40:54 +00:00
}
}
}; //class IndicesSort
struct IndicesLessThan
{
VTKM_EXEC_CONT
bool operator()(const vtkm::Id4& a, const vtkm::Id4& b) const
2016-01-20 22:40:54 +00:00
{
2017-05-18 14:29:41 +00:00
if (a[1] < b[1])
return true;
if (a[1] > b[1])
return false;
if (a[2] < b[2])
return true;
if (a[2] > b[2])
return false;
if (a[3] < b[3])
return true;
2016-01-20 22:40:54 +00:00
return false;
}
};
class UniqueTriangles : public vtkm::worklet::WorkletMapField
{
public:
VTKM_CONT
2017-05-18 14:29:41 +00:00
UniqueTriangles() {}
using ControlSignature = void(WholeArrayIn, WholeArrayOut);
using ExecutionSignature = void(_1, _2, WorkIndex);
VTKM_EXEC
bool IsTwin(const vtkm::Id4& a, const vtkm::Id4& b) const
2016-01-20 22:40:54 +00:00
{
return (a[1] == b[1] && a[2] == b[2] && a[3] == b[3]);
}
template <typename IndicesPortalType, typename OutputFlagsPortalType>
VTKM_EXEC void operator()(const IndicesPortalType& indices,
OutputFlagsPortalType& outputFlags,
const vtkm::Id& index) const
2016-01-20 22:40:54 +00:00
{
2017-05-18 14:29:41 +00:00
if (index == 0)
return;
//if we are a shared face, mark ourself and neighbor for destruction
2017-05-18 14:29:41 +00:00
if (IsTwin(indices.Get(index), indices.Get(index - 1)))
2016-01-20 22:40:54 +00:00
{
outputFlags.Set(index, 0);
outputFlags.Set(index - 1, 0);
}
}
}; //class UniqueTriangles
2020-05-08 14:07:32 +00:00
class Triangulate : public vtkm::worklet::WorkletVisitCellsWithPoints
2016-01-20 22:40:54 +00:00
{
public:
VTKM_CONT
2020-05-08 14:07:32 +00:00
Triangulate() {}
using ControlSignature = void(CellSetIn cellset, FieldInCell, WholeArrayOut);
2018-09-11 02:25:42 +00:00
using ExecutionSignature = void(_2, CellShape, PointIndices, WorkIndex, _3);
2017-10-06 23:08:29 +00:00
template <typename VecType, typename OutputPortal>
VTKM_EXEC void operator()(const vtkm::Id& triangleOffset,
vtkm::CellShapeTagWedge vtkmNotUsed(shapeType),
const VecType& cellIndices,
const vtkm::Id& cellId,
OutputPortal& outputIndices) const
{
vtkm::Id4 triangle;
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[2];
triangle[0] = cellId;
outputIndices.Set(triangleOffset, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[4];
outputIndices.Set(triangleOffset + 1, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[0];
triangle[3] = cellIndices[2];
outputIndices.Set(triangleOffset + 2, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[5];
outputIndices.Set(triangleOffset + 3, triangle);
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[4];
triangle[3] = cellIndices[5];
outputIndices.Set(triangleOffset + 4, triangle);
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[2];
outputIndices.Set(triangleOffset + 5, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[3];
triangle[3] = cellIndices[4];
outputIndices.Set(triangleOffset + 6, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[4];
triangle[3] = cellIndices[1];
outputIndices.Set(triangleOffset + 7, triangle);
}
2018-09-11 02:25:42 +00:00
template <typename VecType, typename OutputPortal>
2017-10-06 23:08:29 +00:00
VTKM_EXEC void operator()(const vtkm::Id& triangleOffset,
vtkm::CellShapeTagQuad vtkmNotUsed(shapeType),
const VecType& cellIndices,
2018-09-11 02:25:42 +00:00
const vtkm::Id& cellId,
OutputPortal& outputIndices) const
2016-01-20 22:40:54 +00:00
{
vtkm::Id4 triangle;
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[2];
triangle[0] = cellId;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
2017-10-06 23:08:29 +00:00
triangle[2] = cellIndices[3];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 1, triangle);
2017-10-06 23:08:29 +00:00
}
2018-09-11 02:25:42 +00:00
template <typename VecType, typename OutputPortal>
2017-10-06 23:08:29 +00:00
VTKM_EXEC void operator()(const vtkm::Id& triangleOffset,
vtkm::CellShapeTagHexahedron vtkmNotUsed(shapeType),
const VecType& cellIndices,
2018-09-11 02:25:42 +00:00
const vtkm::Id& cellId,
OutputPortal& outputIndices) const
2017-10-06 23:08:29 +00:00
{
vtkm::Id4 triangle;
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[5];
triangle[0] = cellId;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[4];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 1, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[6];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 2, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[6];
triangle[3] = cellIndices[5];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 3, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[7];
triangle[3] = cellIndices[6];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 4, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[6];
triangle[3] = cellIndices[2];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 5, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[4];
triangle[3] = cellIndices[7];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 6, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[7];
triangle[3] = cellIndices[3];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 7, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[3];
triangle[3] = cellIndices[2];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 8, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[1];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 9, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[4];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[6];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 10, triangle);
2017-10-06 23:08:29 +00:00
triangle[1] = cellIndices[4];
triangle[2] = cellIndices[6];
triangle[3] = cellIndices[7];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 11, triangle);
2017-10-06 23:08:29 +00:00
}
2018-09-11 02:25:42 +00:00
template <typename VecType, typename OutputPortal>
2017-10-06 23:08:29 +00:00
VTKM_EXEC void operator()(const vtkm::Id& triangleOffset,
vtkm::CellShapeTagGeneric shapeType,
const VecType& cellIndices,
2018-09-11 02:25:42 +00:00
const vtkm::Id& cellId,
OutputPortal& outputIndices) const
2017-10-06 23:08:29 +00:00
{
vtkm::Id4 triangle;
2017-10-06 23:08:29 +00:00
if (shapeType.Id == vtkm::CELL_SHAPE_TRIANGLE)
2016-01-20 22:40:54 +00:00
{
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[2];
2017-05-18 14:29:41 +00:00
triangle[0] = cellId;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
2016-01-20 22:40:54 +00:00
}
2017-10-06 23:08:29 +00:00
if (shapeType.Id == vtkm::CELL_SHAPE_QUAD)
2016-01-20 22:40:54 +00:00
{
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[2];
2016-01-20 22:40:54 +00:00
triangle[0] = cellId;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
2016-01-20 22:40:54 +00:00
triangle[2] = cellIndices[3];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 1, triangle);
2016-01-20 22:40:54 +00:00
}
2017-10-06 23:08:29 +00:00
if (shapeType.Id == vtkm::CELL_SHAPE_TETRA)
2016-01-20 22:40:54 +00:00
{
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[3];
triangle[3] = cellIndices[1];
2016-01-20 22:40:54 +00:00
triangle[0] = cellId;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
2016-01-20 22:40:54 +00:00
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[3];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 1, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[3];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 2, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[1];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 3, triangle);
2016-01-20 22:40:54 +00:00
}
2017-10-06 23:08:29 +00:00
if (shapeType.Id == vtkm::CELL_SHAPE_HEXAHEDRON)
2016-01-20 22:40:54 +00:00
{
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[5];
2016-01-20 22:40:54 +00:00
triangle[0] = cellId;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[4];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 1, triangle);
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[6];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 2, triangle);
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[6];
triangle[3] = cellIndices[5];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 3, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[7];
triangle[3] = cellIndices[6];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 4, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[6];
triangle[3] = cellIndices[2];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 5, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[4];
triangle[3] = cellIndices[7];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 6, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[7];
triangle[3] = cellIndices[3];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 7, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[3];
triangle[3] = cellIndices[2];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 8, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[1];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 9, triangle);
triangle[1] = cellIndices[4];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[6];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 10, triangle);
triangle[1] = cellIndices[4];
triangle[2] = cellIndices[6];
triangle[3] = cellIndices[7];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 11, triangle);
2016-01-20 22:40:54 +00:00
}
2017-10-06 23:08:29 +00:00
if (shapeType.Id == vtkm::CELL_SHAPE_WEDGE)
2016-01-20 22:40:54 +00:00
{
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[2];
2016-01-20 22:40:54 +00:00
triangle[0] = cellId;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[4];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 1, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[0];
triangle[3] = cellIndices[2];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 2, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[5];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 3, triangle);
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[4];
triangle[3] = cellIndices[5];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 4, triangle);
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[5];
triangle[3] = cellIndices[2];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 5, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[3];
triangle[3] = cellIndices[4];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 6, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[4];
triangle[3] = cellIndices[1];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 7, triangle);
2016-01-20 22:40:54 +00:00
}
2017-10-06 23:08:29 +00:00
if (shapeType.Id == vtkm::CELL_SHAPE_PYRAMID)
2016-01-20 22:40:54 +00:00
{
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[4];
triangle[3] = cellIndices[1];
2016-01-20 22:40:54 +00:00
triangle[0] = cellId;
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset, triangle);
triangle[1] = cellIndices[1];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[4];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 1, triangle);
triangle[1] = cellIndices[2];
triangle[2] = cellIndices[3];
triangle[3] = cellIndices[4];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 2, triangle);
triangle[1] = cellIndices[0];
triangle[2] = cellIndices[4];
triangle[3] = cellIndices[3];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 3, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[2];
triangle[3] = cellIndices[1];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 4, triangle);
triangle[1] = cellIndices[3];
triangle[2] = cellIndices[1];
triangle[3] = cellIndices[0];
2018-09-11 02:25:42 +00:00
outputIndices.Set(triangleOffset + 5, triangle);
2016-01-20 22:40:54 +00:00
}
}
2020-05-08 14:07:32 +00:00
}; //class Triangulate
2016-01-20 22:40:54 +00:00
public:
VTKM_CONT
2016-01-20 22:40:54 +00:00
Triangulator() {}
VTKM_CONT
2020-05-08 14:07:32 +00:00
void ExternalTriangles(vtkm::cont::ArrayHandle<vtkm::Id4>& outputIndices,
2017-05-18 14:29:41 +00:00
vtkm::Id& outputTriangles)
2016-01-20 22:40:54 +00:00
{
//Eliminate unseen triangles
2018-09-11 02:25:42 +00:00
vtkm::worklet::DispatcherMapField<IndicesSort> sortInvoker;
sortInvoker.Invoke(outputIndices);
vtkm::cont::Algorithm::Sort(outputIndices, IndicesLessThan());
2016-01-20 22:40:54 +00:00
vtkm::cont::ArrayHandle<vtkm::UInt8> flags;
flags.Allocate(outputTriangles);
2018-09-11 02:25:42 +00:00
vtkm::cont::ArrayHandleConstant<vtkm::Id> one(1, outputTriangles);
vtkm::cont::Algorithm::Copy(one, flags);
2016-01-20 22:40:54 +00:00
//Unique triangles will have a flag = 1
vtkm::worklet::DispatcherMapField<UniqueTriangles>().Invoke(outputIndices, flags);
2017-05-18 14:29:41 +00:00
vtkm::cont::ArrayHandle<vtkm::Id4> subset;
2018-09-11 02:25:42 +00:00
vtkm::cont::Algorithm::CopyIf(outputIndices, flags, subset);
2016-02-12 17:14:19 +00:00
outputIndices = subset;
outputTriangles = subset.GetNumberOfValues();
2016-01-20 22:40:54 +00:00
}
VTKM_CONT
void Run(const vtkm::cont::UnknownCellSet& cellset,
vtkm::cont::ArrayHandle<vtkm::Id4>& outputIndices,
2017-05-18 14:29:41 +00:00
vtkm::Id& outputTriangles)
2016-01-20 22:40:54 +00:00
{
bool fastPath = false;
if (cellset.CanConvert<vtkm::cont::CellSetStructured<3>>())
2016-01-20 22:40:54 +00:00
{
2018-09-11 02:25:42 +00:00
//vtkm::cont::CellSetStructured<3> cellSetStructured3D =
// cellset.Cast<vtkm::cont::CellSetStructured<3>>();
//raytracing::MeshConnectivityBuilder<Device> builder;
//outputIndices = builder.ExternalTrianglesStructured(cellSetStructured3D);
//outputTriangles = outputIndices.GetNumberOfValues();
//fastPath = true;
2017-05-18 14:29:41 +00:00
vtkm::cont::CellSetStructured<3> cellSetStructured3D =
cellset.AsCellSet<vtkm::cont::CellSetStructured<3>>();
2018-09-11 02:25:42 +00:00
const vtkm::Id numCells = cellSetStructured3D.GetNumberOfCells();
2018-09-11 02:25:42 +00:00
vtkm::cont::ArrayHandleCounting<vtkm::Id> cellIdxs(0, 1, numCells);
outputIndices.Allocate(numCells * 12);
2020-05-08 14:07:32 +00:00
vtkm::worklet::DispatcherMapTopology<TriangulateStructured<3>>(TriangulateStructured<3>())
2018-09-11 02:25:42 +00:00
.Invoke(cellSetStructured3D, cellIdxs, outputIndices);
outputTriangles = numCells * 12;
2016-01-20 22:40:54 +00:00
}
else if (cellset.CanConvert<vtkm::cont::CellSetStructured<2>>())
2016-04-14 21:04:58 +00:00
{
2017-05-18 14:29:41 +00:00
vtkm::cont::CellSetStructured<2> cellSetStructured2D =
cellset.AsCellSet<vtkm::cont::CellSetStructured<2>>();
2017-05-18 14:29:41 +00:00
const vtkm::Id numCells = cellSetStructured2D.GetNumberOfCells();
2016-04-14 21:04:58 +00:00
2017-05-18 14:29:41 +00:00
vtkm::cont::ArrayHandleCounting<vtkm::Id> cellIdxs(0, 1, numCells);
outputIndices.Allocate(numCells * 2);
2020-05-08 14:07:32 +00:00
vtkm::worklet::DispatcherMapTopology<TriangulateStructured<2>>(TriangulateStructured<2>())
2018-09-11 02:25:42 +00:00
.Invoke(cellSetStructured2D, cellIdxs, outputIndices);
2016-04-14 21:04:58 +00:00
2017-05-18 14:29:41 +00:00
outputTriangles = numCells * 2;
2018-09-11 02:25:42 +00:00
// no need to do external faces on 2D cell set
fastPath = true;
2016-04-14 21:04:58 +00:00
}
2017-10-06 23:08:29 +00:00
else
2016-01-20 22:40:54 +00:00
{
auto cellSetUnstructured =
cellset.ResetCellSetList(VTKM_DEFAULT_CELL_SET_LIST_UNSTRUCTURED{});
2016-01-20 22:40:54 +00:00
vtkm::cont::ArrayHandle<vtkm::Id> trianglesPerCell;
2017-10-06 23:08:29 +00:00
vtkm::worklet::DispatcherMapTopology<CountTriangles>(CountTriangles())
.Invoke(cellSetUnstructured, trianglesPerCell);
2016-01-20 22:40:54 +00:00
vtkm::Id totalTriangles = 0;
2018-09-11 02:25:42 +00:00
totalTriangles = vtkm::cont::Algorithm::Reduce(trianglesPerCell, vtkm::Id(0));
2016-01-20 22:40:54 +00:00
vtkm::cont::ArrayHandle<vtkm::Id> cellOffsets;
2018-09-11 02:25:42 +00:00
vtkm::cont::Algorithm::ScanExclusive(trianglesPerCell, cellOffsets);
2016-01-20 22:40:54 +00:00
outputIndices.Allocate(totalTriangles);
2020-05-08 14:07:32 +00:00
vtkm::worklet::DispatcherMapTopology<Triangulate>(Triangulate())
.Invoke(cellSetUnstructured, cellOffsets, outputIndices);
2017-10-06 23:08:29 +00:00
outputTriangles = totalTriangles;
}
2016-01-20 22:40:54 +00:00
//get rid of any triagles we cannot see
if (!fastPath)
{
2020-05-08 14:07:32 +00:00
ExternalTriangles(outputIndices, outputTriangles);
}
2016-01-20 22:40:54 +00:00
}
}; // class Triangulator
2017-05-18 14:29:41 +00:00
}
} //namespace vtkm::rendering
2016-03-02 17:20:09 +00:00
#endif //vtk_m_rendering_Triangulator_h