From 4eefdb33255e1271972d1cb17b85dd6b80f33c40 Mon Sep 17 00:00:00 2001 From: Li-Ta Lo Date: Tue, 11 Jan 2022 05:58:47 -0700 Subject: [PATCH] migrate ClipWithImplicitFunction --- vtkm/filter/CMakeLists.txt | 11 +- vtkm/filter/ClipWithImplicitFunction.h | 103 +++------------- vtkm/filter/ClipWithImplicitFunction.hxx | 86 -------------- ...WithImplicitFunctionExternInstantiations.h | 94 --------------- ...hImplicitFunctionExternInstantiations.h.in | 67 ----------- vtkm/filter/contour/CMakeLists.txt | 2 + vtkm/filter/contour/ClipWithField.cxx | 28 ++--- vtkm/filter/contour/ClipWithField.h | 2 +- .../contour/ClipWithImplicitFunction.cxx | 111 ++++++++++++++++++ .../filter/contour/ClipWithImplicitFunction.h | 48 ++++++++ vtkm/filter/contour/testing/CMakeLists.txt | 1 + ...UnitTestClipWithImplicitFunctionFilter.cxx | 13 +- vtkm/filter/testing/CMakeLists.txt | 1 - 13 files changed, 199 insertions(+), 368 deletions(-) delete mode 100644 vtkm/filter/ClipWithImplicitFunction.hxx delete mode 100644 vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h delete mode 100644 vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h.in create mode 100644 vtkm/filter/contour/ClipWithImplicitFunction.cxx create mode 100644 vtkm/filter/contour/ClipWithImplicitFunction.h rename vtkm/filter/{ => contour}/testing/UnitTestClipWithImplicitFunctionFilter.cxx (93%) diff --git a/vtkm/filter/CMakeLists.txt b/vtkm/filter/CMakeLists.txt index 467738794..83d847f6e 100644 --- a/vtkm/filter/CMakeLists.txt +++ b/vtkm/filter/CMakeLists.txt @@ -10,14 +10,10 @@ vtkm_add_instantiations(GradientInstantiations FILTER Gradient) -vtkm_add_instantiations(ClipWithImplicitFunctionInstantiations - FILTER ClipWithImplicitFunction - INSTANTIATIONS_FILE ClipWithImplicitFunctionExternInstantiations.h - ) - set(deprecated_headers CleanGrid.h ClipWithField.h + ClipWithImplicitFunction.h Contour.h DotProduct.h ExternalFaces.h @@ -77,7 +73,6 @@ set(common_sources_device set(extra_headers AmrArrays.h CellSetConnectivity.h - ClipWithImplicitFunction.h ComputeMoments.h ContourTreeUniformAugmented.h ContourTreeUniformDistributed.h @@ -133,8 +128,6 @@ set(extra_headers set(extra_header_template_sources AmrArrays.hxx CellSetConnectivity.hxx - ClipWithImplicitFunction.hxx - ClipWithImplicitFunctionExternInstantiations.h ComputeMoments.hxx ContourTreeUniformAugmented.hxx ContourTreeUniformDistributed.hxx @@ -184,7 +177,6 @@ set(extra_header_template_sources ) set(extra_sources_device - ${ClipWithImplicitFunctionInstantiations} VectorMagnitude.cxx particleadvection/Messenger.cxx particleadvection/ParticleMessenger.cxx @@ -202,7 +194,6 @@ set(gradient_sources_device ${GradientInstantiations} ) -vtkm_pyexpander_generated_file(ClipWithImplicitFunctionExternInstantiations.h) set(core_headers NewFilter.h diff --git a/vtkm/filter/ClipWithImplicitFunction.h b/vtkm/filter/ClipWithImplicitFunction.h index 4d57bbd1f..f1c7ff375 100644 --- a/vtkm/filter/ClipWithImplicitFunction.h +++ b/vtkm/filter/ClipWithImplicitFunction.h @@ -10,104 +10,31 @@ #ifndef vtk_m_filter_ClipWithImplicitFunction_h #define vtk_m_filter_ClipWithImplicitFunction_h -#include - -#include -#include -#include -#include +#include +#include namespace vtkm { namespace filter { -/// \brief Clip a dataset using an implicit function -/// -/// Clip a dataset using a given implicit function value, such as vtkm::Sphere -/// or vtkm::Frustum. -/// The resulting geometry will not be water tight. -class VTKM_FILTER_EXTRA_EXPORT ClipWithImplicitFunction - : public vtkm::filter::FilterDataSet +VTKM_DEPRECATED(1.8, + "Use vtkm/filter/contour/ClipWithImplicitFunction.h instead of " + "vtkm/filter/ClipWithImplicitFunction.h.") +inline void ClipWithImplicitFunction_deprecated() {} + +inline void ClipWithImplicitFunction_deprecated_warning() { -public: - void SetImplicitFunction(const vtkm::ImplicitFunctionGeneral& func) { this->Function = func; } + ClipWithImplicitFunction_deprecated(); +} - void SetInvertClip(bool invert) { this->Invert = invert; } - - const vtkm::ImplicitFunctionGeneral& GetImplicitFunction() const { return this->Function; } - - template - vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& input, - vtkm::filter::PolicyBase policy); - - template - VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result, - const vtkm::cont::Field& field, - vtkm::filter::PolicyBase policy) - { - if (field.IsFieldPoint()) - { - // If the field is a point field, then we need to do a custom interpolation of the points. - // In this case, we need to call the superclass's MapFieldOntoOutput, which will in turn - // call our DoMapField. - return this->FilterDataSet::MapFieldOntoOutput( - result, field, policy); - } - else if (field.IsFieldCell()) - { - // Use the precompiled field permutation function. - vtkm::cont::ArrayHandle permutation = this->Worklet.GetCellMapOutputToInput(); - return vtkm::filter::MapFieldPermutation(field, permutation, result); - } - else if (field.IsFieldGlobal()) - { - result.AddField(field); - return true; - } - else - { - return false; - } - } - - //Map a new field onto the resulting dataset after running the filter. - //This call is only valid after Execute has been called. - template - bool DoMapField(vtkm::cont::DataSet& result, - const vtkm::cont::ArrayHandle& input, - const vtkm::filter::FieldMetadata& fieldMeta, - vtkm::filter::PolicyBase) - { - // All other conditions should be handled by MapFieldOntoOutput directly. - VTKM_ASSERT(fieldMeta.IsPointField()); - - vtkm::cont::ArrayHandle output; - output = this->Worklet.ProcessPointField(input); - - //use the same meta data as the input so we get the same field name, etc. - result.AddField(fieldMeta.AsField(output)); - return true; - } - -private: - vtkm::ImplicitFunctionGeneral Function; - vtkm::worklet::Clip Worklet; - bool Invert = false; +class VTKM_DEPRECATED(1.8, "Use vtkm::filter::contour::ClipWithImplicitFunction.") + ClipWithImplicitFunction : public vtkm::filter::contour::ClipWithImplicitFunction +{ + using contour::ClipWithImplicitFunction::ClipWithImplicitFunction; }; -#ifndef vtkm_filter_ClipWithImplicitFunction_cxx -VTKM_FILTER_EXTRA_EXPORT_EXECUTE_METHOD(ClipWithImplicitFunction); -#endif } } // namespace vtkm::filter -#ifndef vtk_m_filter_ClipWithImplicitFunctionExternInstantiations_h -#include -#endif - -#ifndef vtk_m_filter_ClipWithImplicitFunction_hxx -#include -#endif - -#endif // vtk_m_filter_ClipWithImplicitFunction_h +#endif //vtk_m_filter_ClipWithImplicitFunction_h diff --git a/vtkm/filter/ClipWithImplicitFunction.hxx b/vtkm/filter/ClipWithImplicitFunction.hxx deleted file mode 100644 index cd91f6a94..000000000 --- a/vtkm/filter/ClipWithImplicitFunction.hxx +++ /dev/null @@ -1,86 +0,0 @@ -//============================================================================ -// 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_filter_ClipWithImplicitFunction_hxx -#define vtk_m_filter_ClipWithImplicitFunction_hxx - -#include - -#include -#include -#include - -// Do not instantiation common concrete types unless we are compiling the -// corresponding TU. -#ifndef vtkm_filter_ClipWithImplicitFunction_cxx -#include -#endif - -namespace vtkm -{ -namespace filter -{ - -namespace detail -{ - -struct ClipWithImplicitFunctionProcessCoords -{ - template - VTKM_CONT void operator()(const vtkm::cont::ArrayHandle& inCoords, - const std::string& coordsName, - const vtkm::worklet::Clip& worklet, - vtkm::cont::DataSet& output) const - { - vtkm::cont::ArrayHandle outArray = worklet.ProcessPointField(inCoords); - vtkm::cont::CoordinateSystem outCoords(coordsName, outArray); - output.AddCoordinateSystem(outCoords); - } -}; - -} // namespace detail - -//----------------------------------------------------------------------------- -template -vtkm::cont::DataSet ClipWithImplicitFunction::DoExecute( - const vtkm::cont::DataSet& input, - vtkm::filter::PolicyBase policy) -{ - //get the cells and coordinates of the dataset - const vtkm::cont::UnknownCellSet& cells = input.GetCellSet(); - - const vtkm::cont::CoordinateSystem& inputCoords = - input.GetCoordinateSystem(this->GetActiveCoordinateSystemIndex()); - - vtkm::cont::CellSetExplicit<> outputCellSet = - this->Worklet.Run(vtkm::filter::ApplyPolicyCellSet(cells, policy, *this), - this->Function, - inputCoords, - this->Invert); - - //create the output data - vtkm::cont::DataSet output; - output.SetCellSet(outputCellSet); - - // compute output coordinates - for (vtkm::IdComponent coordSystemId = 0; coordSystemId < input.GetNumberOfCoordinateSystems(); - ++coordSystemId) - { - vtkm::cont::CoordinateSystem coords = input.GetCoordinateSystem(coordSystemId); - coords.GetData().CastAndCall( - detail::ClipWithImplicitFunctionProcessCoords{}, coords.GetName(), this->Worklet, output); - } - - return output; -} -} -} // end namespace vtkm::filter - -#endif diff --git a/vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h b/vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h deleted file mode 100644 index ce70c12e2..000000000 --- a/vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h +++ /dev/null @@ -1,94 +0,0 @@ -//============================================================================ -// 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. -//============================================================================ -////////////////////////// **** DO NOT EDIT THIS FILE!!! **** -// This file is automatically generated by ClipWithImplicitFunctionExternInstantiations.h.in -// clang-format off - -#ifndef vtk_m_filter_ClipWithImplicitFunctionExternInstantiations_h -#define vtk_m_filter_ClipWithImplicitFunctionExternInstantiations_h - -#include -#include -#include - -#include -#include -#include - -namespace vtkm -{ -namespace filter -{ - -#ifndef vtkm_filter_ClipWithImplicitFunction_cxx - -VTKM_INSTANTIATION_BEGIN -extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField( - vtkm::cont::DataSet&, - const vtkm::cont::ArrayHandle&, - const vtkm::filter::FieldMetadata&, - vtkm::filter::PolicyBase); -VTKM_INSTANTIATION_END - -VTKM_INSTANTIATION_BEGIN -extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField( - vtkm::cont::DataSet&, - const vtkm::cont::ArrayHandle&, - const vtkm::filter::FieldMetadata&, - vtkm::filter::PolicyBase); -VTKM_INSTANTIATION_END - -VTKM_INSTANTIATION_BEGIN -extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField( - vtkm::cont::DataSet&, - const vtkm::cont::ArrayHandle&, - const vtkm::filter::FieldMetadata&, - vtkm::filter::PolicyBase); -VTKM_INSTANTIATION_END - -VTKM_INSTANTIATION_BEGIN -extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField( - vtkm::cont::DataSet&, - const vtkm::cont::ArrayHandle&, - const vtkm::filter::FieldMetadata&, - vtkm::filter::PolicyBase); -VTKM_INSTANTIATION_END - -VTKM_INSTANTIATION_BEGIN -extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField( - vtkm::cont::DataSet&, - const vtkm::cont::ArrayHandle&, - const vtkm::filter::FieldMetadata&, - vtkm::filter::PolicyBase); -VTKM_INSTANTIATION_END - -VTKM_INSTANTIATION_BEGIN -extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField( - vtkm::cont::DataSet&, - const vtkm::cont::ArrayHandle&, - const vtkm::filter::FieldMetadata&, - vtkm::filter::PolicyBase); -VTKM_INSTANTIATION_END - -VTKM_INSTANTIATION_BEGIN -extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField( - vtkm::cont::DataSet&, - const vtkm::cont::ArrayHandle&, - const vtkm::filter::FieldMetadata&, - vtkm::filter::PolicyBase); -VTKM_INSTANTIATION_END - - -#endif - -} -} - -#endif diff --git a/vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h.in b/vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h.in deleted file mode 100644 index a531039de..000000000 --- a/vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h.in +++ /dev/null @@ -1,67 +0,0 @@ -//============================================================================ -// 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. -//============================================================================ -//$# This file uses the pyexpander macro processing utility to build the -//$# FunctionInterface facilities that use a variable number of arguments. -//$# Information, documentation, and downloads for pyexpander can be found at: -//$# -//$# http://pyexpander.sourceforge.net/ -//$# -//$# To build the source code, execute the following (after installing -//$# pyexpander, of course): -//$# -//$# expander.py ClipWithImplicitFunctionExternInstantiations.h.in > ClipWithImplicitFunctionExternInstantiations.h -//$# -//$# Ignore the following comment. It is meant for the generated file. -// **** DO NOT EDIT THIS FILE!!! **** -// This file is automatically generated by ClipWithImplicitFunctionExternInstantiations.h.in -// clang-format off - -#ifndef vtk_m_filter_ClipWithImplicitFunctionExternInstantiations_h -#define vtk_m_filter_ClipWithImplicitFunctionExternInstantiations_h - -#include -#include -#include - -#include -#include -#include - -namespace vtkm -{ -namespace filter -{ - -#ifndef vtkm_filter_ClipWithImplicitFunction_cxx - -$py( -# These values are taken from vtkm/TypeList.h -types = [ "vtkm::UInt8", "vtkm::Int32", "vtkm::Int64", "vtkm::Float32", - "vtkm::Float64", "vtkm::Vec3f_32", "vtkm::Vec3f_64" ] -)\ -\ -\ -$for(TYPE in types)\ -VTKM_INSTANTIATION_BEGIN -extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField( - vtkm::cont::DataSet&, - const vtkm::cont::ArrayHandle<$(TYPE)>&, - const vtkm::filter::FieldMetadata&, - vtkm::filter::PolicyBase); -VTKM_INSTANTIATION_END - -$endfor\ - -#endif - -} -} - -#endif diff --git a/vtkm/filter/contour/CMakeLists.txt b/vtkm/filter/contour/CMakeLists.txt index d95ba9677..8384f336a 100644 --- a/vtkm/filter/contour/CMakeLists.txt +++ b/vtkm/filter/contour/CMakeLists.txt @@ -10,12 +10,14 @@ set(contour_headers ClipWithField.h + ClipWithImplicitFunction.h Contour.h Slice.h ) set(contour_sources_device ClipWithField.cxx + ClipWithImplicitFunction.cxx Contour.cxx Slice.cxx ) diff --git a/vtkm/filter/contour/ClipWithField.cxx b/vtkm/filter/contour/ClipWithField.cxx index acd39fe3f..e9c08c097 100644 --- a/vtkm/filter/contour/ClipWithField.cxx +++ b/vtkm/filter/contour/ClipWithField.cxx @@ -19,6 +19,8 @@ namespace vtkm { namespace filter { +namespace contour +{ namespace { struct ClipWithFieldProcessCoords @@ -41,16 +43,17 @@ bool DoMapField(vtkm::cont::DataSet& result, { if (field.IsFieldPoint()) { - auto array = field.GetData(); - auto functor = [&](auto concrete) { + auto resolve = [&](auto concrete) { using T = typename decltype(concrete)::ValueType; - vtkm::cont::ArrayHandle output; - output = worklet.ProcessPointField(concrete); - result.template AddPointField(field.GetName(), output); + vtkm::cont::ArrayHandle outputArray; + outputArray = worklet.ProcessPointField(concrete); + result.template AddPointField(field.GetName(), outputArray); }; - array.CastAndCallForTypesWithFloatFallback( - functor); + auto inputArray = field.GetData(); + inputArray + .CastAndCallForTypesWithFloatFallback( + resolve); return true; } else if (field.IsFieldCell()) @@ -71,8 +74,6 @@ bool DoMapField(vtkm::cont::DataSet& result, } } // anonymous -namespace contour -{ //----------------------------------------------------------------------------- vtkm::cont::DataSet ClipWithField::DoExecute(const vtkm::cont::DataSet& input) { @@ -86,8 +87,6 @@ vtkm::cont::DataSet ClipWithField::DoExecute(const vtkm::cont::DataSet& input) //get the cells and coordinates of the dataset const vtkm::cont::UnknownCellSet& cells = input.GetCellSet(); - - const auto& inArray = this->GetFieldFromDataSet(input).GetData(); vtkm::cont::DataSet output; auto ResolveFieldType = [&, this](auto concrete) { @@ -105,6 +104,7 @@ vtkm::cont::DataSet ClipWithField::DoExecute(const vtkm::cont::DataSet& input) } }; + const auto& inArray = this->GetFieldFromDataSet(input).GetData(); inArray.CastAndCallForTypesWithFloatFallback( ResolveFieldType); @@ -113,6 +113,6 @@ vtkm::cont::DataSet ClipWithField::DoExecute(const vtkm::cont::DataSet& input) return output; } -} -} -} // end namespace vtkm::filter +} // namespace contour +} // namespace filter +} // namespace vtkm diff --git a/vtkm/filter/contour/ClipWithField.h b/vtkm/filter/contour/ClipWithField.h index bd0051b5a..b0bc3375c 100644 --- a/vtkm/filter/contour/ClipWithField.h +++ b/vtkm/filter/contour/ClipWithField.h @@ -39,7 +39,7 @@ public: vtkm::Float64 GetClipValue() const { return this->ClipValue; } private: - vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& result) override; + vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& input) override; vtkm::Float64 ClipValue = 0; bool Invert = false; diff --git a/vtkm/filter/contour/ClipWithImplicitFunction.cxx b/vtkm/filter/contour/ClipWithImplicitFunction.cxx new file mode 100644 index 000000000..b82e5135b --- /dev/null +++ b/vtkm/filter/contour/ClipWithImplicitFunction.cxx @@ -0,0 +1,111 @@ +//============================================================================ +// 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 + +namespace vtkm +{ +namespace filter +{ +namespace contour +{ +namespace +{ + +struct ClipWithImplicitFunctionProcessCoords +{ + template + VTKM_CONT void operator()(const vtkm::cont::ArrayHandle& inCoords, + const std::string& coordsName, + const vtkm::worklet::Clip& worklet, + vtkm::cont::DataSet& output) const + { + vtkm::cont::ArrayHandle outArray = worklet.ProcessPointField(inCoords); + vtkm::cont::CoordinateSystem outCoords(coordsName, outArray); + output.AddCoordinateSystem(outCoords); + } +}; + +bool DoMapField(vtkm::cont::DataSet& result, + const vtkm::cont::Field& field, + const vtkm::worklet::Clip& Worklet) +{ + if (field.IsFieldPoint()) + { + auto resolve = [&](auto concrete) { + using T = typename decltype(concrete)::ValueType; + vtkm::cont::ArrayHandle outputArray; + outputArray = Worklet.ProcessPointField(concrete); + result.AddPointField(field.GetName(), outputArray); + }; + + auto inputArray = field.GetData(); + inputArray + .CastAndCallForTypesWithFloatFallback( + resolve); + return true; + } + else if (field.IsFieldCell()) + { + // Use the precompiled field permutation function. + vtkm::cont::ArrayHandle permutation = Worklet.GetCellMapOutputToInput(); + return vtkm::filter::MapFieldPermutation(field, permutation, result); + } + else if (field.IsFieldGlobal()) + { + result.AddField(field); + return true; + } + else + { + return false; + } +} +} // anonymous namespace + +//----------------------------------------------------------------------------- +vtkm::cont::DataSet ClipWithImplicitFunction::DoExecute(const vtkm::cont::DataSet& input) +{ + //get the cells and coordinates of the dataset + const vtkm::cont::UnknownCellSet& cells = input.GetCellSet(); + + const vtkm::cont::CoordinateSystem& inputCoords = + input.GetCoordinateSystem(this->GetActiveCoordinateSystemIndex()); + + vtkm::worklet::Clip Worklet; + + vtkm::cont::CellSetExplicit<> outputCellSet = + Worklet.Run(cells, this->Function, inputCoords, this->Invert); + + //create the output data + vtkm::cont::DataSet output; + output.SetCellSet(outputCellSet); + + // compute output coordinates + for (vtkm::IdComponent coordSystemId = 0; coordSystemId < input.GetNumberOfCoordinateSystems(); + ++coordSystemId) + { + const vtkm::cont::CoordinateSystem& coords = input.GetCoordinateSystem(coordSystemId); + coords.GetData().CastAndCall( + ClipWithImplicitFunctionProcessCoords{}, coords.GetName(), Worklet, output); + } + + auto mapper = [&](auto& result, const auto& f) { DoMapField(result, f, Worklet); }; + MapFieldsOntoOutput(input, output, mapper); + + return output; +} +} // namespace contour +} // namespace filter +} // namespace vtkm diff --git a/vtkm/filter/contour/ClipWithImplicitFunction.h b/vtkm/filter/contour/ClipWithImplicitFunction.h new file mode 100644 index 000000000..cdb0119a8 --- /dev/null +++ b/vtkm/filter/contour/ClipWithImplicitFunction.h @@ -0,0 +1,48 @@ +//============================================================================ +// 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_filter_contour_ClipWithImplicitFunction_h +#define vtk_m_filter_contour_ClipWithImplicitFunction_h + +#include + +#include +#include + +namespace vtkm +{ +namespace filter +{ +namespace contour +{ +/// \brief Clip a dataset using an implicit function +/// +/// Clip a dataset using a given implicit function value, such as vtkm::Sphere +/// or vtkm::Frustum. +/// The resulting geometry will not be water tight. +class VTKM_FILTER_CONTOUR_EXPORT ClipWithImplicitFunction : public vtkm::filter::NewFilterField +{ +public: + void SetImplicitFunction(const vtkm::ImplicitFunctionGeneral& func) { this->Function = func; } + + void SetInvertClip(bool invert) { this->Invert = invert; } + + const vtkm::ImplicitFunctionGeneral& GetImplicitFunction() const { return this->Function; } + +private: + vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& input) override; + + vtkm::ImplicitFunctionGeneral Function; + bool Invert = false; +}; +} // namespace contour +} // namespace filter +} // namespace vtkm + +#endif // vtk_m_filter_contour_ClipWithImplicitFunction_h diff --git a/vtkm/filter/contour/testing/CMakeLists.txt b/vtkm/filter/contour/testing/CMakeLists.txt index 27037ee0d..f803a8a94 100644 --- a/vtkm/filter/contour/testing/CMakeLists.txt +++ b/vtkm/filter/contour/testing/CMakeLists.txt @@ -9,6 +9,7 @@ ##============================================================================ set(unit_tests UnitTestClipWithFieldFilter.cxx + UnitTestClipWithImplicitFunctionFilter.cxx UnitTestContourFilter.cxx UnitTestContourFilterNormals.cxx ) diff --git a/vtkm/filter/testing/UnitTestClipWithImplicitFunctionFilter.cxx b/vtkm/filter/contour/testing/UnitTestClipWithImplicitFunctionFilter.cxx similarity index 93% rename from vtkm/filter/testing/UnitTestClipWithImplicitFunctionFilter.cxx rename to vtkm/filter/contour/testing/UnitTestClipWithImplicitFunctionFilter.cxx index ec9199b73..2bf68de96 100644 --- a/vtkm/filter/testing/UnitTestClipWithImplicitFunctionFilter.cxx +++ b/vtkm/filter/contour/testing/UnitTestClipWithImplicitFunctionFilter.cxx @@ -8,7 +8,7 @@ // PURPOSE. See the above copyright notice for more information. //============================================================================ -#include +#include #include #include @@ -25,15 +25,14 @@ vtkm::cont::DataSet MakeTestDatasetStructured() static constexpr vtkm::Id numVerts = xdim * ydim; vtkm::Float32 scalars[numVerts]; - for (vtkm::Id i = 0; i < numVerts; ++i) + for (float& scalar : scalars) { - scalars[i] = 1.0f; + scalar = 1.0f; } scalars[4] = 0.0f; vtkm::cont::DataSet ds; - vtkm::cont::DataSetBuilderUniform builder; - ds = builder.Create(dim); + ds = vtkm::cont::DataSetBuilderUniform::Create(dim); ds.AddPointField("scalars", scalars, numVerts); @@ -49,7 +48,7 @@ void TestClipStructured() vtkm::Vec3f center(1, 1, 0); vtkm::FloatDefault radius(0.5); - vtkm::filter::ClipWithImplicitFunction clip; + vtkm::filter::contour::ClipWithImplicitFunction clip; clip.SetImplicitFunction(vtkm::Sphere(center, radius)); clip.SetFieldsToPass("scalars"); @@ -86,7 +85,7 @@ void TestClipStructuredInverted() vtkm::Vec3f center(1, 1, 0); vtkm::FloatDefault radius(0.5); - vtkm::filter::ClipWithImplicitFunction clip; + vtkm::filter::contour::ClipWithImplicitFunction clip; clip.SetImplicitFunction(vtkm::Sphere(center, radius)); bool invert = true; clip.SetInvertClip(invert); diff --git a/vtkm/filter/testing/CMakeLists.txt b/vtkm/filter/testing/CMakeLists.txt index d3e53665e..82407349a 100644 --- a/vtkm/filter/testing/CMakeLists.txt +++ b/vtkm/filter/testing/CMakeLists.txt @@ -16,7 +16,6 @@ set(unit_tests UnitTestCellAverageFilter.cxx UnitTestCellMeasuresFilter.cxx UnitTestCellSetConnectivityFilter.cxx - UnitTestClipWithImplicitFunctionFilter.cxx UnitTestContourTreeUniformFilter.cxx UnitTestContourTreeUniformAugmentedFilter.cxx UnitTestContourTreeUniformDistributedFilter.cxx