//============================================================================ // 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. //============================================================================ #ifndef vtk_m_cont_DataSetBuilderExplicit_h #define vtk_m_cont_DataSetBuilderExplicit_h #include #include #include #include #include #include namespace vtkm { namespace cont { //Coordinates builder?? class VTKM_CONT_EXPORT DataSetBuilderExplicit { public: VTKM_CONT DataSetBuilderExplicit() {} //Single cell explicits. //TODO //Zoo explicit cell template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector& xVals, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm = "coords") { std::vector yVals(xVals.size(), 0), zVals(xVals.size(), 0); return DataSetBuilderExplicit::Create( xVals, yVals, zVals, shapes, numIndices, connectivity, coordsNm); } template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector& xVals, const std::vector& yVals, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm = "coords") { std::vector zVals(xVals.size(), 0); return DataSetBuilderExplicit::Create( xVals, yVals, zVals, shapes, numIndices, connectivity, coordsNm); } template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector& xVals, const std::vector& yVals, const std::vector& zVals, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm = "coords"); template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector>& coords, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm = "coords"); template VTKM_CONT static vtkm::cont::DataSet Create( const vtkm::cont::ArrayHandle>& coords, const vtkm::cont::ArrayHandle& shapes, const vtkm::cont::ArrayHandle& numIndices, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm = "coords") { auto offsets = vtkm::cont::ConvertNumComponentsToOffsets(numIndices); return DataSetBuilderExplicit::BuildDataSet(coords, shapes, offsets, connectivity, coordsNm); } template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const std::vector& connectivity, const std::string& coordsNm = "coords"); template VTKM_CONT static vtkm::cont::DataSet Create( const vtkm::cont::ArrayHandle>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm = "coords") { return DataSetBuilderExplicit::BuildDataSet( coords, tag, numberOfPointsPerCell, connectivity, coordsNm); } private: template VTKM_CONT static vtkm::cont::DataSet BuildDataSet( const vtkm::cont::ArrayHandle>& coords, const vtkm::cont::ArrayHandle& shapes, const vtkm::cont::ArrayHandle& offsets, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm); template VTKM_CONT static vtkm::cont::DataSet BuildDataSet( const vtkm::cont::ArrayHandle>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm); }; template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::Create( const std::vector& xVals, const std::vector& yVals, const std::vector& zVals, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm) { VTKM_ASSERT(xVals.size() == yVals.size() && yVals.size() == zVals.size() && xVals.size() > 0); vtkm::cont::ArrayHandle coordsArray; coordsArray.Allocate(static_cast(xVals.size())); auto coordsPortal = coordsArray.WritePortal(); for (std::size_t index = 0; index < xVals.size(); ++index) { coordsPortal.Set(static_cast(index), vtkm::make_Vec(static_cast(xVals[index]), static_cast(yVals[index]), static_cast(zVals[index]))); } auto shapesArray = vtkm::cont::make_ArrayHandle(shapes, vtkm::CopyFlag::On); auto connArray = vtkm::cont::make_ArrayHandle(connectivity, vtkm::CopyFlag::On); auto offsetsArray = vtkm::cont::ConvertNumComponentsToOffsets( vtkm::cont::make_ArrayHandle(numIndices, vtkm::CopyFlag::Off)); return DataSetBuilderExplicit::BuildDataSet( coordsArray, shapesArray, offsetsArray, connArray, coordsNm); } template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::Create( const std::vector>& coords, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm) { auto coordsArray = vtkm::cont::make_ArrayHandle(coords, vtkm::CopyFlag::On); auto shapesArray = vtkm::cont::make_ArrayHandle(shapes, vtkm::CopyFlag::On); auto connArray = vtkm::cont::make_ArrayHandle(connectivity, vtkm::CopyFlag::On); auto offsetsArray = vtkm::cont::ConvertNumComponentsToOffsets( vtkm::cont::make_ArrayHandle(numIndices, vtkm::CopyFlag::Off)); return DataSetBuilderExplicit::BuildDataSet( coordsArray, shapesArray, offsetsArray, connArray, coordsNm); } template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::BuildDataSet( const vtkm::cont::ArrayHandle>& coords, const vtkm::cont::ArrayHandle& shapes, const vtkm::cont::ArrayHandle& offsets, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm) { vtkm::cont::DataSet dataSet; dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem(coordsNm, coords)); vtkm::Id nPts = static_cast(coords.GetNumberOfValues()); vtkm::cont::CellSetExplicit<> cellSet; cellSet.Fill(nPts, shapes, connectivity, offsets); dataSet.SetCellSet(cellSet); return dataSet; } template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::Create( const std::vector>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const std::vector& connectivity, const std::string& coordsNm) { auto coordsArray = vtkm::cont::make_ArrayHandle(coords, vtkm::CopyFlag::On); auto connArray = vtkm::cont::make_ArrayHandle(connectivity, vtkm::CopyFlag::On); return DataSetBuilderExplicit::Create( coordsArray, tag, numberOfPointsPerCell, connArray, coordsNm); } template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::BuildDataSet( const vtkm::cont::ArrayHandle>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm) { (void)tag; //C4100 false positive workaround vtkm::cont::DataSet dataSet; dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem(coordsNm, coords)); vtkm::cont::CellSetSingleType<> cellSet; cellSet.Fill(coords.GetNumberOfValues(), tag.Id, numberOfPointsPerCell, connectivity); dataSet.SetCellSet(cellSet); return dataSet; } class VTKM_CONT_EXPORT DataSetBuilderExplicitIterative { public: VTKM_CONT DataSetBuilderExplicitIterative(); VTKM_CONT void Begin(const std::string& coordName = "coords"); //Define points. VTKM_CONT vtkm::cont::DataSet Create(); VTKM_CONT vtkm::Id AddPoint(const vtkm::Vec3f& pt); VTKM_CONT vtkm::Id AddPoint(const vtkm::FloatDefault& x, const vtkm::FloatDefault& y, const vtkm::FloatDefault& z = 0); template VTKM_CONT vtkm::Id AddPoint(const T& x, const T& y, const T& z = 0) { return AddPoint(static_cast(x), static_cast(y), static_cast(z)); } template VTKM_CONT vtkm::Id AddPoint(const vtkm::Vec& pt) { return AddPoint(static_cast(pt)); } //Define cells. VTKM_CONT void AddCell(vtkm::UInt8 shape); VTKM_CONT void AddCell(const vtkm::UInt8& shape, const std::vector& conn); VTKM_CONT void AddCell(const vtkm::UInt8& shape, const vtkm::Id* conn, const vtkm::IdComponent& n); VTKM_CONT void AddCellPoint(vtkm::Id pointIndex); private: std::string coordNm; std::vector points; std::vector shapes; std::vector numIdx; std::vector connectivity; }; } } #endif //vtk_m_cont_DataSetBuilderExplicit_h