//============================================================================ // 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. //============================================================================ #include #include #include #include #include class SineWave : public vtkm::worklet::WorkletMapField { public: using ControlSignature = void(FieldIn coord, FieldOut v); using ExecutionSignature = void(_1, _2); using InputDomain = _1; VTKM_EXEC void operator()(const vtkm::Vec coord, vtkm::Float32& v) const { v = vtkm::MagnitudeSquared(coord); } }; vtkm::cont::DataSet MakeSineWaveDataSet(vtkm::Id3 dims) { vtkm::cont::DataSet dataset; // create a point coordinate system const vtkm::Id3 vdims{ dims[0] + 1, dims[1] + 1, dims[2] + 1 }; vtkm::cont::ArrayHandleUniformPointCoordinates coordinates{ vdims, vtkm::Vec(-1.0, -1.0, 0), vtkm::Vec(2.0f / vdims[0], 2.0f / vdims[1], 0.0) }; dataset.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates)); // generate point field from point coordinates. vtkm::cont::ArrayHandle pointFieldArray; vtkm::worklet::DispatcherMapField dispatcherMapField(SineWave{}); dispatcherMapField.Invoke(coordinates, pointFieldArray); dataset.AddField( vtkm::cont::Field("nodevar", vtkm::cont::Field::Association::POINTS, pointFieldArray)); // add cell set vtkm::cont::CellSetStructured<2> cellSet("cells"); cellSet.SetPointDimensions({ vdims[0], vdims[1] }); dataset.AddCellSet(cellSet); return dataset; } void TestMarchingSquares() { vtkm::cont::DataSet input = MakeSineWaveDataSet({ 2, 2, 0 }); vtkm::cont::ArrayHandle pointFieldArray; input.GetField("nodevar").GetData().CopyTo(pointFieldArray); vtkm::Float32 isoValue = 0.5; vtkm::cont::ArrayHandle> verticesArray; vtkm::cont::ArrayHandle> normalsArray; vtkm::cont::ArrayHandle scalarsArray; vtkm::worklet::MarchingCubes isosurfaceFilter; isosurfaceFilter.SetMergeDuplicatePoints(false); auto result = isosurfaceFilter.Run(&isoValue, 1, input.GetCellSet(0), input.GetCoordinateSystem(), pointFieldArray, verticesArray, normalsArray); } int UnitTestMarchingSquares(int argc, char* argv[]) { return vtkm::cont::testing::Testing::Run(TestMarchingSquares, argc, argv); }