diff --git a/vtkm/filter/CleanGrid.cxx b/vtkm/filter/CleanGrid.cxx index 19448cfa8..5fb40064c 100644 --- a/vtkm/filter/CleanGrid.cxx +++ b/vtkm/filter/CleanGrid.cxx @@ -12,6 +12,9 @@ #include #include +#include +#include + namespace vtkm { namespace filter @@ -116,6 +119,46 @@ vtkm::cont::DataSet CleanGrid::GenerateOutput(const vtkm::cont::DataSet& inData, return outData; } +bool CleanGrid::MapFieldOntoOutput(vtkm::cont::DataSet& result, const vtkm::cont::Field& field) +{ + if (field.IsFieldPoint() && (this->GetCompactPointFields() || this->GetMergePoints())) + { + vtkm::cont::Field compactedField; + if (this->GetCompactPointFields()) + { + bool success = vtkm::filter::MapFieldPermutation( + field, this->PointCompactor.GetPointScatter().GetOutputToInputMap(), compactedField); + if (!success) + { + return false; + } + } + else + { + compactedField = field; + } + if (this->GetMergePoints()) + { + return vtkm::filter::MapFieldMergeAverage( + compactedField, this->PointMerger.GetMergeKeys(), result); + } + else + { + result.AddField(compactedField); + return true; + } + } + else if (field.IsFieldCell() && this->GetRemoveDegenerateCells()) + { + return vtkm::filter::MapFieldPermutation(field, this->CellCompactor.GetValidCellIds(), result); + } + else + { + result.AddField(field); + return true; + } +} + //----------------------------------------------------------------------------- VTKM_FILTER_INSTANTIATE_EXECUTE_METHOD(CleanGrid); } diff --git a/vtkm/filter/CleanGrid.h b/vtkm/filter/CleanGrid.h index 879d1ed3e..99f48b13c 100644 --- a/vtkm/filter/CleanGrid.h +++ b/vtkm/filter/CleanGrid.h @@ -87,40 +87,15 @@ public: VTKM_CONT vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& inData, vtkm::filter::PolicyBase policy); + VTKM_FILTER_EXPORT + VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result, const vtkm::cont::Field& field); - template - VTKM_CONT bool DoMapField(vtkm::cont::DataSet& result, - const vtkm::cont::ArrayHandle& input, - const vtkm::filter::FieldMetadata& fieldMeta, - vtkm::filter::PolicyBase) + template + VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result, + const vtkm::cont::Field& field, + vtkm::filter::PolicyBase) { - if (fieldMeta.IsPointField() && (this->GetCompactPointFields() || this->GetMergePoints())) - { - vtkm::cont::ArrayHandle compactedArray; - if (this->GetCompactPointFields()) - { - compactedArray = this->PointCompactor.MapPointFieldDeep(input); - if (this->GetMergePoints()) - { - compactedArray = this->PointMerger.MapPointField(compactedArray); - } - } - else if (this->GetMergePoints()) - { - compactedArray = this->PointMerger.MapPointField(input); - } - result.AddField(fieldMeta.AsField(compactedArray)); - } - else if (fieldMeta.IsCellField() && this->GetRemoveDegenerateCells()) - { - result.AddField(fieldMeta.AsField(this->CellCompactor.ProcessCellField(input))); - } - else - { - result.AddField(fieldMeta.AsField(input)); - } - - return true; + return this->MapFieldOntoOutput(result, field); } private: diff --git a/vtkm/filter/ExternalFaces.cxx b/vtkm/filter/ExternalFaces.cxx index caafe4f06..2edb74a7b 100644 --- a/vtkm/filter/ExternalFaces.cxx +++ b/vtkm/filter/ExternalFaces.cxx @@ -64,6 +64,28 @@ vtkm::cont::DataSet ExternalFaces::GenerateOutput(const vtkm::cont::DataSet& inp } } +bool ExternalFaces::MapFieldOntoOutput(vtkm::cont::DataSet& result, const vtkm::cont::Field& field) +{ + if (field.IsFieldPoint()) + { + if (this->CompactPoints) + { + return this->Compactor.MapFieldOntoOutput(result, field); + } + else + { + result.AddField(field); + return true; + } + } + else if (field.IsFieldCell()) + { + return vtkm::filter::MapFieldPermutation(field, this->Worklet.GetCellIdMap(), result); + } + + return false; +} + //----------------------------------------------------------------------------- VTKM_FILTER_INSTANTIATE_EXECUTE_METHOD(ExternalFaces); } diff --git a/vtkm/filter/ExternalFaces.h b/vtkm/filter/ExternalFaces.h index 10d1a960e..8f4a6007a 100644 --- a/vtkm/filter/ExternalFaces.h +++ b/vtkm/filter/ExternalFaces.h @@ -15,6 +15,7 @@ #include #include +#include #include namespace vtkm @@ -59,35 +60,15 @@ public: VTKM_CONT vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& input, vtkm::filter::PolicyBase policy); - //Map a new field onto the resulting dataset after running the filter - //this call is only valid - template - VTKM_CONT bool DoMapField(vtkm::cont::DataSet& result, - const vtkm::cont::ArrayHandle& input, - const vtkm::filter::FieldMetadata& fieldMeta, - vtkm::filter::PolicyBase policy) - { - if (fieldMeta.IsPointField()) - { - if (this->CompactPoints) - { - return this->Compactor.DoMapField(result, input, fieldMeta, policy); - } - else - { - result.AddField(fieldMeta.AsField(input)); - return true; - } - } - else if (fieldMeta.IsCellField()) - { - vtkm::cont::ArrayHandle fieldArray; - fieldArray = this->Worklet.ProcessCellField(input); - result.AddField(fieldMeta.AsField(fieldArray)); - return true; - } + VTKM_FILTER_EXPORT VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result, + const vtkm::cont::Field& field); - return false; + template + VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result, + const vtkm::cont::Field& field, + vtkm::filter::PolicyBase) + { + return this->MapFieldOntoOutput(result, field); } private: diff --git a/vtkm/filter/ExtractPoints.h b/vtkm/filter/ExtractPoints.h index 6f0388066..30fc8ea26 100644 --- a/vtkm/filter/ExtractPoints.h +++ b/vtkm/filter/ExtractPoints.h @@ -64,11 +64,10 @@ public: vtkm::filter::PolicyBase policy); //Map a new field onto the resulting dataset after running the filter - template - bool DoMapField(vtkm::cont::DataSet& result, - const vtkm::cont::ArrayHandle& input, - const vtkm::filter::FieldMetadata& fieldMeta, - vtkm::filter::PolicyBase policy); + template + VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result, + const vtkm::cont::Field& field, + vtkm::filter::PolicyBase); private: bool ExtractInside; diff --git a/vtkm/filter/ExtractPoints.hxx b/vtkm/filter/ExtractPoints.hxx index b06c49900..b657da9a9 100644 --- a/vtkm/filter/ExtractPoints.hxx +++ b/vtkm/filter/ExtractPoints.hxx @@ -65,23 +65,22 @@ inline vtkm::cont::DataSet ExtractPoints::DoExecute(const vtkm::cont::DataSet& i } //----------------------------------------------------------------------------- -template -inline VTKM_CONT bool ExtractPoints::DoMapField( +template +inline VTKM_CONT bool ExtractPoints::MapFieldOntoOutput( vtkm::cont::DataSet& result, - const vtkm::cont::ArrayHandle& input, - const vtkm::filter::FieldMetadata& fieldMeta, + const vtkm::cont::Field& field, vtkm::filter::PolicyBase policy) { // point data is copied as is because it was not collapsed - if (fieldMeta.IsPointField()) + if (field.IsFieldPoint()) { if (this->CompactPoints) { - return this->Compactor.DoMapField(result, input, fieldMeta, policy); + return this->Compactor.MapFieldOntoOutput(result, field, policy); } else { - result.AddField(fieldMeta.AsField(input)); + result.AddField(field); return true; } } diff --git a/vtkm/filter/MapFieldPermutation.cxx b/vtkm/filter/MapFieldPermutation.cxx index ac3f24b5a..62a908763 100644 --- a/vtkm/filter/MapFieldPermutation.cxx +++ b/vtkm/filter/MapFieldPermutation.cxx @@ -59,9 +59,9 @@ bool vtkm::filter::MapFieldPermutation(const vtkm::cont::Field& inputField, return functor.CalledMap; } -bool MapFieldPermutation(const vtkm::cont::Field& inputField, - const vtkm::cont::ArrayHandle& permutation, - vtkm::cont::DataSet& outputData) +bool vtkm::filter::MapFieldPermutation(const vtkm::cont::Field& inputField, + const vtkm::cont::ArrayHandle& permutation, + vtkm::cont::DataSet& outputData) { vtkm::cont::Field outputField; bool success = vtkm::filter::MapFieldPermutation(inputField, permutation, outputField); diff --git a/vtkm/filter/MaskPoints.h b/vtkm/filter/MaskPoints.h index a58e609b0..39c61a750 100644 --- a/vtkm/filter/MaskPoints.h +++ b/vtkm/filter/MaskPoints.h @@ -46,11 +46,10 @@ public: vtkm::filter::PolicyBase policy); //Map a new field onto the resulting dataset after running the filter - template - VTKM_CONT bool DoMapField(vtkm::cont::DataSet& result, - const vtkm::cont::ArrayHandle& input, - const vtkm::filter::FieldMetadata& fieldMeta, - vtkm::filter::PolicyBase policy); + template + VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result, + const vtkm::cont::Field& field, + vtkm::filter::PolicyBase); private: vtkm::Id Stride; diff --git a/vtkm/filter/MaskPoints.hxx b/vtkm/filter/MaskPoints.hxx index 1134aef6f..0dd877e5c 100644 --- a/vtkm/filter/MaskPoints.hxx +++ b/vtkm/filter/MaskPoints.hxx @@ -58,22 +58,21 @@ inline VTKM_CONT vtkm::cont::DataSet MaskPoints::DoExecute( } //----------------------------------------------------------------------------- -template -inline VTKM_CONT bool MaskPoints::DoMapField(vtkm::cont::DataSet& result, - const vtkm::cont::ArrayHandle& input, - const vtkm::filter::FieldMetadata& fieldMeta, - vtkm::filter::PolicyBase policy) +template +inline VTKM_CONT bool MaskPoints::MapFieldOntoOutput(vtkm::cont::DataSet& result, + const vtkm::cont::Field& field, + vtkm::filter::PolicyBase policy) { // point data is copied as is because it was not collapsed - if (fieldMeta.IsPointField()) + if (field.IsFieldPoint()) { if (this->CompactPoints) { - return this->Compactor.DoMapField(result, input, fieldMeta, policy); + return this->Compactor.MapFieldOntoOutput(result, field, policy); } else { - result.AddField(fieldMeta.AsField(input)); + result.AddField(field); return true; } } diff --git a/vtkm/filter/ThresholdPoints.h b/vtkm/filter/ThresholdPoints.h index 3efb01211..d30f164f3 100644 --- a/vtkm/filter/ThresholdPoints.h +++ b/vtkm/filter/ThresholdPoints.h @@ -58,13 +58,10 @@ public: const vtkm::filter::FieldMetadata& fieldMeta, vtkm::filter::PolicyBase policy); - //Map a new field onto the resulting dataset after running the filter - //this call is only valid - template - VTKM_CONT bool DoMapField(vtkm::cont::DataSet& result, - const vtkm::cont::ArrayHandle& input, - const vtkm::filter::FieldMetadata& fieldMeta, - vtkm::filter::PolicyBase policy); + template + VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result, + const vtkm::cont::Field& field, + vtkm::filter::PolicyBase); private: double LowerValue; diff --git a/vtkm/filter/ThresholdPoints.hxx b/vtkm/filter/ThresholdPoints.hxx index ada6c8a5f..4ebddbdde 100644 --- a/vtkm/filter/ThresholdPoints.hxx +++ b/vtkm/filter/ThresholdPoints.hxx @@ -187,23 +187,22 @@ inline VTKM_CONT vtkm::cont::DataSet ThresholdPoints::DoExecute( } //----------------------------------------------------------------------------- -template -inline VTKM_CONT bool ThresholdPoints::DoMapField( +template +inline VTKM_CONT bool ThresholdPoints::MapFieldOntoOutput( vtkm::cont::DataSet& result, - const vtkm::cont::ArrayHandle& input, - const vtkm::filter::FieldMetadata& fieldMeta, + const vtkm::cont::Field& field, vtkm::filter::PolicyBase policy) { // point data is copied as is because it was not collapsed - if (fieldMeta.IsPointField()) + if (field.IsFieldPoint()) { if (this->CompactPoints) { - return this->Compactor.DoMapField(result, input, fieldMeta, policy); + return this->Compactor.MapFieldOntoOutput(result, field, policy); } else { - result.AddField(fieldMeta.AsField(input)); + result.AddField(field); return true; } } diff --git a/vtkm/worklet/ExternalFaces.h b/vtkm/worklet/ExternalFaces.h index 57b1be245..d6e4de895 100644 --- a/vtkm/worklet/ExternalFaces.h +++ b/vtkm/worklet/ExternalFaces.h @@ -953,6 +953,8 @@ public: } } + vtkm::cont::ArrayHandle GetCellIdMap() const { return this->CellIdMap; } + private: vtkm::cont::ArrayHandle CellIdMap; bool PassPolyData; diff --git a/vtkm/worklet/PointMerge.h b/vtkm/worklet/PointMerge.h index 939dde941..1575f1043 100644 --- a/vtkm/worklet/PointMerge.h +++ b/vtkm/worklet/PointMerge.h @@ -473,6 +473,8 @@ public: return outArray; } + vtkm::worklet::Keys GetMergeKeys() const { return this->MergeKeys; } + private: vtkm::worklet::Keys MergeKeys; vtkm::cont::ArrayHandle PointInputToOutputMap; diff --git a/vtkm/worklet/RemoveDegenerateCells.h b/vtkm/worklet/RemoveDegenerateCells.h index 3a86b2a58..0a3f5a3fd 100644 --- a/vtkm/worklet/RemoveDegenerateCells.h +++ b/vtkm/worklet/RemoveDegenerateCells.h @@ -166,6 +166,8 @@ struct RemoveDegenerateCells return result; } + vtkm::cont::ArrayHandle GetValidCellIds() const { return this->ValidCellIds; } + private: vtkm::cont::ArrayHandle ValidCellIds; }; diff --git a/vtkm/worklet/RemoveUnusedPoints.h b/vtkm/worklet/RemoveUnusedPoints.h index fa4b9dbca..1979da67d 100644 --- a/vtkm/worklet/RemoveUnusedPoints.h +++ b/vtkm/worklet/RemoveUnusedPoints.h @@ -239,6 +239,11 @@ public: return outArray; } + const vtkm::worklet::ScatterCounting& GetPointScatter() const + { + return *this->PointScatter.get(); + } + private: vtkm::cont::ArrayHandle MaskArray;