migrate ClipWithImplicitFunction
This commit is contained in:
parent
3c700259a1
commit
4eefdb3325
@ -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
|
||||
|
@ -10,104 +10,31 @@
|
||||
#ifndef vtk_m_filter_ClipWithImplicitFunction_h
|
||||
#define vtk_m_filter_ClipWithImplicitFunction_h
|
||||
|
||||
#include <vtkm/filter/vtkm_filter_extra_export.h>
|
||||
|
||||
#include <vtkm/ImplicitFunction.h>
|
||||
#include <vtkm/filter/FilterDataSet.h>
|
||||
#include <vtkm/filter/MapFieldPermutation.h>
|
||||
#include <vtkm/filter/contour/worklet/Clip.h>
|
||||
#include <vtkm/Deprecated.h>
|
||||
#include <vtkm/filter/contour/ClipWithImplicitFunction.h>
|
||||
|
||||
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<ClipWithImplicitFunction>
|
||||
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 <typename DerivedPolicy>
|
||||
vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& input,
|
||||
vtkm::filter::PolicyBase<DerivedPolicy> policy);
|
||||
|
||||
template <typename DerivedPolicy>
|
||||
VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result,
|
||||
const vtkm::cont::Field& field,
|
||||
vtkm::filter::PolicyBase<DerivedPolicy> 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<ClipWithImplicitFunction>::MapFieldOntoOutput(
|
||||
result, field, policy);
|
||||
}
|
||||
else if (field.IsFieldCell())
|
||||
{
|
||||
// Use the precompiled field permutation function.
|
||||
vtkm::cont::ArrayHandle<vtkm::Id> 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 <typename T, typename StorageType, typename DerivedPolicy>
|
||||
bool DoMapField(vtkm::cont::DataSet& result,
|
||||
const vtkm::cont::ArrayHandle<T, StorageType>& input,
|
||||
const vtkm::filter::FieldMetadata& fieldMeta,
|
||||
vtkm::filter::PolicyBase<DerivedPolicy>)
|
||||
{
|
||||
// All other conditions should be handled by MapFieldOntoOutput directly.
|
||||
VTKM_ASSERT(fieldMeta.IsPointField());
|
||||
|
||||
vtkm::cont::ArrayHandle<T> 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 <vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h>
|
||||
#endif
|
||||
|
||||
#ifndef vtk_m_filter_ClipWithImplicitFunction_hxx
|
||||
#include <vtkm/filter/ClipWithImplicitFunction.hxx>
|
||||
#endif
|
||||
|
||||
#endif // vtk_m_filter_ClipWithImplicitFunction_h
|
||||
#endif //vtk_m_filter_ClipWithImplicitFunction_h
|
||||
|
@ -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 <vtkm/filter/ClipWithImplicitFunction.h>
|
||||
|
||||
#include <vtkm/cont/ArrayHandlePermutation.h>
|
||||
#include <vtkm/cont/CellSetPermutation.h>
|
||||
#include <vtkm/cont/UnknownCellSet.h>
|
||||
|
||||
// Do not instantiation common concrete types unless we are compiling the
|
||||
// corresponding TU.
|
||||
#ifndef vtkm_filter_ClipWithImplicitFunction_cxx
|
||||
#include <vtkm/filter/ClipWithImplicitFunctionExternInstantiations.h>
|
||||
#endif
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace filter
|
||||
{
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
struct ClipWithImplicitFunctionProcessCoords
|
||||
{
|
||||
template <typename T, typename Storage>
|
||||
VTKM_CONT void operator()(const vtkm::cont::ArrayHandle<T, Storage>& inCoords,
|
||||
const std::string& coordsName,
|
||||
const vtkm::worklet::Clip& worklet,
|
||||
vtkm::cont::DataSet& output) const
|
||||
{
|
||||
vtkm::cont::ArrayHandle<T> outArray = worklet.ProcessPointField(inCoords);
|
||||
vtkm::cont::CoordinateSystem outCoords(coordsName, outArray);
|
||||
output.AddCoordinateSystem(outCoords);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <typename DerivedPolicy>
|
||||
vtkm::cont::DataSet ClipWithImplicitFunction::DoExecute(
|
||||
const vtkm::cont::DataSet& input,
|
||||
vtkm::filter::PolicyBase<DerivedPolicy> 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
|
@ -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 <vtkm/filter/ClipWithImplicitFunction.h>
|
||||
#include <vtkm/filter/ClipWithImplicitFunction.hxx>
|
||||
#include <vtkm/filter/Instantiations.h>
|
||||
|
||||
#include <vtkm/cont/ArrayHandlePermutation.h>
|
||||
#include <vtkm/cont/CellSetPermutation.h>
|
||||
#include <vtkm/cont/UnknownCellSet.h>
|
||||
|
||||
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<vtkm::UInt8>&,
|
||||
const vtkm::filter::FieldMetadata&,
|
||||
vtkm::filter::PolicyBase<vtkm::filter::PolicyDefault>);
|
||||
VTKM_INSTANTIATION_END
|
||||
|
||||
VTKM_INSTANTIATION_BEGIN
|
||||
extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField(
|
||||
vtkm::cont::DataSet&,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Int32>&,
|
||||
const vtkm::filter::FieldMetadata&,
|
||||
vtkm::filter::PolicyBase<vtkm::filter::PolicyDefault>);
|
||||
VTKM_INSTANTIATION_END
|
||||
|
||||
VTKM_INSTANTIATION_BEGIN
|
||||
extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField(
|
||||
vtkm::cont::DataSet&,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Int64>&,
|
||||
const vtkm::filter::FieldMetadata&,
|
||||
vtkm::filter::PolicyBase<vtkm::filter::PolicyDefault>);
|
||||
VTKM_INSTANTIATION_END
|
||||
|
||||
VTKM_INSTANTIATION_BEGIN
|
||||
extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField(
|
||||
vtkm::cont::DataSet&,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Float32>&,
|
||||
const vtkm::filter::FieldMetadata&,
|
||||
vtkm::filter::PolicyBase<vtkm::filter::PolicyDefault>);
|
||||
VTKM_INSTANTIATION_END
|
||||
|
||||
VTKM_INSTANTIATION_BEGIN
|
||||
extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField(
|
||||
vtkm::cont::DataSet&,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Float64>&,
|
||||
const vtkm::filter::FieldMetadata&,
|
||||
vtkm::filter::PolicyBase<vtkm::filter::PolicyDefault>);
|
||||
VTKM_INSTANTIATION_END
|
||||
|
||||
VTKM_INSTANTIATION_BEGIN
|
||||
extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField(
|
||||
vtkm::cont::DataSet&,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Vec3f_32>&,
|
||||
const vtkm::filter::FieldMetadata&,
|
||||
vtkm::filter::PolicyBase<vtkm::filter::PolicyDefault>);
|
||||
VTKM_INSTANTIATION_END
|
||||
|
||||
VTKM_INSTANTIATION_BEGIN
|
||||
extern template VTKM_FILTER_EXTRA_EXPORT bool ClipWithImplicitFunction::DoMapField(
|
||||
vtkm::cont::DataSet&,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Vec3f_64>&,
|
||||
const vtkm::filter::FieldMetadata&,
|
||||
vtkm::filter::PolicyBase<vtkm::filter::PolicyDefault>);
|
||||
VTKM_INSTANTIATION_END
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
@ -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 <vtkm/filter/ClipWithImplicitFunction.h>
|
||||
#include <vtkm/filter/ClipWithImplicitFunction.hxx>
|
||||
#include <vtkm/filter/Instantiations.h>
|
||||
|
||||
#include <vtkm/cont/ArrayHandlePermutation.h>
|
||||
#include <vtkm/cont/CellSetPermutation.h>
|
||||
#include <vtkm/cont/UnknownCellSet.h>
|
||||
|
||||
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::filter::PolicyDefault>);
|
||||
VTKM_INSTANTIATION_END
|
||||
|
||||
$endfor\
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
@ -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
|
||||
)
|
||||
|
@ -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<T> output;
|
||||
output = worklet.ProcessPointField(concrete);
|
||||
result.template AddPointField(field.GetName(), output);
|
||||
vtkm::cont::ArrayHandle<T> outputArray;
|
||||
outputArray = worklet.ProcessPointField(concrete);
|
||||
result.template AddPointField(field.GetName(), outputArray);
|
||||
};
|
||||
|
||||
array.CastAndCallForTypesWithFloatFallback<vtkm::TypeListScalarAll, VTKM_DEFAULT_STORAGE_LIST>(
|
||||
functor);
|
||||
auto inputArray = field.GetData();
|
||||
inputArray
|
||||
.CastAndCallForTypesWithFloatFallback<vtkm::TypeListScalarAll, VTKM_DEFAULT_STORAGE_LIST>(
|
||||
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<vtkm::TypeListScalarAll, VTKM_DEFAULT_STORAGE_LIST>(
|
||||
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
|
||||
|
@ -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;
|
||||
|
111
vtkm/filter/contour/ClipWithImplicitFunction.cxx
Normal file
111
vtkm/filter/contour/ClipWithImplicitFunction.cxx
Normal file
@ -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 <vtkm/cont/CoordinateSystem.h>
|
||||
#include <vtkm/cont/UnknownCellSet.h>
|
||||
#include <vtkm/filter/MapFieldPermutation.h>
|
||||
#include <vtkm/filter/contour/ClipWithImplicitFunction.h>
|
||||
#include <vtkm/filter/contour/worklet/Clip.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace filter
|
||||
{
|
||||
namespace contour
|
||||
{
|
||||
namespace
|
||||
{
|
||||
|
||||
struct ClipWithImplicitFunctionProcessCoords
|
||||
{
|
||||
template <typename T, typename Storage>
|
||||
VTKM_CONT void operator()(const vtkm::cont::ArrayHandle<T, Storage>& inCoords,
|
||||
const std::string& coordsName,
|
||||
const vtkm::worklet::Clip& worklet,
|
||||
vtkm::cont::DataSet& output) const
|
||||
{
|
||||
vtkm::cont::ArrayHandle<T> 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<T> outputArray;
|
||||
outputArray = Worklet.ProcessPointField(concrete);
|
||||
result.AddPointField(field.GetName(), outputArray);
|
||||
};
|
||||
|
||||
auto inputArray = field.GetData();
|
||||
inputArray
|
||||
.CastAndCallForTypesWithFloatFallback<vtkm::TypeListScalarAll, VTKM_DEFAULT_STORAGE_LIST>(
|
||||
resolve);
|
||||
return true;
|
||||
}
|
||||
else if (field.IsFieldCell())
|
||||
{
|
||||
// Use the precompiled field permutation function.
|
||||
vtkm::cont::ArrayHandle<vtkm::Id> 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
|
48
vtkm/filter/contour/ClipWithImplicitFunction.h
Normal file
48
vtkm/filter/contour/ClipWithImplicitFunction.h
Normal file
@ -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 <vtkm/ImplicitFunction.h>
|
||||
|
||||
#include <vtkm/filter/NewFilterField.h>
|
||||
#include <vtkm/filter/contour/vtkm_filter_contour_export.h>
|
||||
|
||||
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
|
@ -9,6 +9,7 @@
|
||||
##============================================================================
|
||||
set(unit_tests
|
||||
UnitTestClipWithFieldFilter.cxx
|
||||
UnitTestClipWithImplicitFunctionFilter.cxx
|
||||
UnitTestContourFilter.cxx
|
||||
UnitTestContourFilterNormals.cxx
|
||||
)
|
||||
|
@ -8,7 +8,7 @@
|
||||
// PURPOSE. See the above copyright notice for more information.
|
||||
//============================================================================
|
||||
|
||||
#include <vtkm/filter/ClipWithImplicitFunction.h>
|
||||
#include <vtkm/filter/contour/ClipWithImplicitFunction.h>
|
||||
|
||||
#include <vtkm/cont/DataSetBuilderUniform.h>
|
||||
#include <vtkm/cont/testing/Testing.h>
|
||||
@ -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);
|
@ -16,7 +16,6 @@ set(unit_tests
|
||||
UnitTestCellAverageFilter.cxx
|
||||
UnitTestCellMeasuresFilter.cxx
|
||||
UnitTestCellSetConnectivityFilter.cxx
|
||||
UnitTestClipWithImplicitFunctionFilter.cxx
|
||||
UnitTestContourTreeUniformFilter.cxx
|
||||
UnitTestContourTreeUniformAugmentedFilter.cxx
|
||||
UnitTestContourTreeUniformDistributedFilter.cxx
|
||||
|
Loading…
Reference in New Issue
Block a user