From 4f19ac6082219a91832b0cee6274ff3c99d0e8de Mon Sep 17 00:00:00 2001 From: Kenneth Moreland Date: Wed, 30 Aug 2023 09:25:55 -0500 Subject: [PATCH 1/2] Fix interpolation of cell fields with flying edges The flying edges algorithm (used when contouring uniform structured cell sets) was not interpolating cell fields correctly. There was an indexing issue where a shortcut in the stepping was not incrementing the cell index. --- docs/changelog/flying-edges-cell-fields.md | 5 +++++ .../worklet/contour/FlyingEdgesPass4Common.h | 13 +++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 docs/changelog/flying-edges-cell-fields.md diff --git a/docs/changelog/flying-edges-cell-fields.md b/docs/changelog/flying-edges-cell-fields.md new file mode 100644 index 000000000..f3175c81a --- /dev/null +++ b/docs/changelog/flying-edges-cell-fields.md @@ -0,0 +1,5 @@ +# Fix interpolation of cell fields with flying edges + +The flying edges algorithm (used when contouring uniform structured cell +sets) was not interpolating cell fields correctly. There was an indexing +issue where a shortcut in the stepping was not incrementing the cell index. diff --git a/vtkm/filter/contour/worklet/contour/FlyingEdgesPass4Common.h b/vtkm/filter/contour/worklet/contour/FlyingEdgesPass4Common.h index 059eb63d0..96aaf95ac 100644 --- a/vtkm/filter/contour/worklet/contour/FlyingEdgesPass4Common.h +++ b/vtkm/filter/contour/worklet/contour/FlyingEdgesPass4Common.h @@ -28,15 +28,19 @@ VTKM_EXEC inline vtkm::Id3 compute_incs3d(const vtkm::Id3& dims) return vtkm::Id3{ 1, dims[0], (dims[0] * dims[1]) }; } -VTKM_EXEC inline constexpr vtkm::Id increment_cellId(SumXAxis, vtkm::Id cellId, vtkm::Id) +VTKM_EXEC inline constexpr vtkm::Id increment_cellId(SumXAxis, + vtkm::Id cellId, + vtkm::Id, + vtkm::Id numToIncrement = 1) { - return cellId + 1; + return cellId + numToIncrement; } VTKM_EXEC inline constexpr vtkm::Id increment_cellId(SumYAxis, vtkm::Id cellId, - vtkm::Id y_point_axis_inc) + vtkm::Id y_point_axis_inc, + vtkm::Id numToIncrement = 1) { - return cellId + (y_point_axis_inc - 1); + return cellId + ((y_point_axis_inc - 1) * numToIncrement); } VTKM_EXEC inline bool case_includes_axes(vtkm::UInt8 const* const edgeUses) @@ -159,6 +163,7 @@ struct Pass4TrimState cellId = compute_start(AxisToSum{}, ijk, pdims - vtkm::Id3{ 1, 1, 1 }); //update our ijk + cellId = increment_cellId(AxisToSum{}, cellId, axis_inc, left - ijk[AxisToSum::xindex]); ijk[AxisToSum::xindex] = left; boundaryStatus[0] = FlyingEdges3D::Interior; From 8a988702310978288fea113c3c255c2a25a48c18 Mon Sep 17 00:00:00 2001 From: Kenneth Moreland Date: Wed, 30 Aug 2023 13:12:55 -0500 Subject: [PATCH 2/2] Add regression test for flying edges interpolating cell fields --- .../filter/contour-uniform-cellfield.png | 3 ++ .../testing/RenderTestContourFilter.cxx | 32 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 data/baseline/filter/contour-uniform-cellfield.png diff --git a/data/baseline/filter/contour-uniform-cellfield.png b/data/baseline/filter/contour-uniform-cellfield.png new file mode 100644 index 000000000..80fd9cf1a --- /dev/null +++ b/data/baseline/filter/contour-uniform-cellfield.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d4ecc87a7d69d32eb5a7ade1ce0daac57a3a09902accb2c3bba62f00c25b62f +size 58412 diff --git a/vtkm/filter/contour/testing/RenderTestContourFilter.cxx b/vtkm/filter/contour/testing/RenderTestContourFilter.cxx index d20f804aa..607abbd6f 100644 --- a/vtkm/filter/contour/testing/RenderTestContourFilter.cxx +++ b/vtkm/filter/contour/testing/RenderTestContourFilter.cxx @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -61,7 +62,6 @@ void TestContourFilterUniform() contour.SetMergeDuplicatePoints(true); contour.SetIsoValues({ 50, 100, 150 }); contour.SetActiveField(fieldName); - contour.SetFieldsToPass(fieldName); vtkm::cont::DataSet result = contour.Execute(inputData); result.PrintSummary(std::cout); @@ -70,6 +70,36 @@ void TestContourFilterUniform() vtkm::rendering::testing::RenderTestOptions testOptions; vtkm::rendering::testing::RenderTest( result, "pointvar", "filter/contour-uniform.png", testOptions); + + std::cout << "Generate image for contour filter on a uniform grid with a cell field" << std::endl; + inputData = maker.Make3DUniformDataSet2(); + VTKM_TEST_ASSERT(inputData.HasField(fieldName)); + + std::string cellFieldName = "elevation"; + vtkm::filter::field_transform::PointElevation elevation; + vtkm::Bounds bounds = inputData.GetCoordinateSystem().GetBounds(); + elevation.SetLowPoint(bounds.MinCorner()); + elevation.SetHighPoint(bounds.MaxCorner()); + elevation.SetRange(0, 1); + elevation.SetOutputFieldName(cellFieldName); + elevation.SetUseCoordinateSystemAsField(true); + inputData = elevation.Execute(inputData); + + vtkm::filter::field_conversion::CellAverage point2cell; + point2cell.SetActiveField(cellFieldName); + point2cell.SetFieldsToPass(fieldName); + inputData = point2cell.Execute(inputData); + + VTKM_TEST_ASSERT(inputData.HasPointField(fieldName)); + VTKM_TEST_ASSERT(inputData.HasCellField(cellFieldName)); + + contour.SetIsoValues({ 80 }); + result = contour.Execute(inputData); + + result.PrintSummary(std::cout); + + vtkm::rendering::testing::RenderTest( + result, cellFieldName, "filter/contour-uniform-cellfield.png", testOptions); } void TestContourFilterUniformBoundaries()