//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // 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. // // Copyright 2015 Sandia Corporation. // Copyright 2015 UT-Battelle, LLC. // Copyright 2015 Los Alamos National Security. // // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. // // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National // Laboratory (LANL), the U.S. Government retains certain rights in // this software. //============================================================================ #ifndef vtk_m_worklet_TriangulateStructured_h #define vtk_m_worklet_TriangulateStructured_h #include #include #include #include #include #include #include #include #include #include #include #include namespace vtkm { namespace worklet { namespace detail { VTKM_EXEC_CONSTANT const static vtkm::IdComponent StructuredTriangleIndices[2][3] = { { 0, 1, 2 }, { 0, 2, 3 } }; } // namespace detail /// \brief Compute the triangulate cells for a uniform grid data set template class TriangulateStructured { public: TriangulateStructured() {} // // Worklet to turn quads into triangles // Vertices remain the same and each cell is processed with needing topology // class TriangulateCell : public vtkm::worklet::WorkletMapPointToCell { public: typedef void ControlSignature(CellSetIn cellset, FieldOutCell<> connectivityOut); typedef void ExecutionSignature(PointIndices, _2, VisitIndex); typedef _1 InputDomain; typedef vtkm::worklet::ScatterUniform ScatterType; VTKM_CONT ScatterType GetScatter() const { return ScatterType(2); } VTKM_CONT TriangulateCell() { } // Each quad cell produces 2 triangle cells template VTKM_EXEC void operator()(const ConnectivityInVec &connectivityIn, ConnectivityOutVec &connectivityOut, vtkm::IdComponent visitIndex) const { connectivityOut[0] = connectivityIn[detail::StructuredTriangleIndices[visitIndex][0]]; connectivityOut[1] = connectivityIn[detail::StructuredTriangleIndices[visitIndex][1]]; connectivityOut[2] = connectivityIn[detail::StructuredTriangleIndices[visitIndex][2]]; } }; template vtkm::cont::CellSetSingleType<> Run(const CellSetType &cellSet) { vtkm::cont::CellSetSingleType<> outCellSet(cellSet.GetName()); vtkm::cont::ArrayHandle connectivity; vtkm::worklet::DispatcherMapTopology dispatcher; dispatcher.Invoke(cellSet, vtkm::cont::make_ArrayHandleGroupVec<3>(connectivity)); // Add cells to output cellset outCellSet.Fill( cellSet.GetNumberOfPoints(), vtkm::CellShapeTagTriangle::Id, 3, connectivity); return outCellSet; } }; } } // namespace vtkm::worklet #endif // vtk_m_worklet_TriangulateStructured_h