diff --git a/Filters/Geometry/Testing/CMakeLists.txt b/Filters/Geometry/Testing/CMakeLists.txt index aa325aa5655ba4f512e580a7e8a21fcc847e063c..46c8bca72462be7f38983668368ea9dca601259a 100644 --- a/Filters/Geometry/Testing/CMakeLists.txt +++ b/Filters/Geometry/Testing/CMakeLists.txt @@ -1,4 +1,5 @@ vtk_module_test_data( + Data/degenerated-hexahedrons.vtu Data/explicitStructuredGrid.vtu Data/ghost_cells.vtu Data/quadraticTetra01.vtu diff --git a/Filters/Geometry/Testing/Cxx/CMakeLists.txt b/Filters/Geometry/Testing/Cxx/CMakeLists.txt index d3f266bccdab3be469b2c1e238e6bd5321dd96f4..c8dd778c71e837759e5c67b3f5fcd4a0a7c052f0 100644 --- a/Filters/Geometry/Testing/Cxx/CMakeLists.txt +++ b/Filters/Geometry/Testing/Cxx/CMakeLists.txt @@ -7,6 +7,7 @@ vtk_add_test_cxx(vtkFiltersGeometryCxxTests tests TestExplicitStructuredGridSurfaceFilter.cxx TestExtractSurfaceNonLinearSubdivision.cxx TestFastUnstructuredGridWithPolyDataGeometryFilter.cxx,NO_DATA + TestGeometryFilterDegeneratedCells.cxx TestImageDataToUniformGrid.cxx,NO_VALID TestLinearToQuadraticCellsFilter.cxx TestProjectSphereFilter.cxx,NO_VALID @@ -31,4 +32,6 @@ set(all_tests ${tests} ${no_data_tests} ) -vtk_test_cxx_executable(vtkFiltersGeometryCxxTests all_tests) +vtk_test_cxx_executable(vtkFiltersGeometryCxxTests all_tests + RENDERING_FACTORY +) diff --git a/Filters/Geometry/Testing/Cxx/TestGeometryFilterDegeneratedCells.cxx b/Filters/Geometry/Testing/Cxx/TestGeometryFilterDegeneratedCells.cxx new file mode 100644 index 0000000000000000000000000000000000000000..5d5765ebb6e33d415fa1fa755db922ee0815c85b --- /dev/null +++ b/Filters/Geometry/Testing/Cxx/TestGeometryFilterDegeneratedCells.cxx @@ -0,0 +1,82 @@ +// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen +// SPDX-License-Identifier: BSD-3-Clause + +/** + * Test the vtkGeometryFilter on degenerated cells. + * + * By degenerated cell we mean here a "cell that is defined using a same point several time". + * This was found as a community workaround to store tetrahedron as hexahedron. + * https://discourse.paraview.org/t/paraview-versions-greater-5-11-fail-to-display-all-mesh-elements/15810 + * + * While this is not supported in VTK, the vtkGeometryFilter used to provide + * an acceptable output when computing the external surface, as for Rendering purpose: + * external faces are correctly extracted (but a lot of *inner* faces too). + * + * This test uses a dataset made of 2 tetrahedron stored as hexahedron. + * They are rendered with white faces and red backfaces: a missing + * face should make some backface visible. Also test the number of produced faces. + * + * See more discussion on https://gitlab.kitware.com/vtk/vtk/-/issues/19600 + */ + +#include "vtkActor.h" +#include "vtkCamera.h" +#include "vtkGeometryFilter.h" +#include "vtkLogger.h" +#include "vtkNew.h" +#include "vtkPolyDataMapper.h" +#include "vtkProperty.h" +#include "vtkRenderWindow.h" +#include "vtkRenderWindowInteractor.h" +#include "vtkRenderer.h" +#include "vtkTestUtilities.h" +#include "vtkXMLUnstructuredGridReader.h" + +int TestGeometryFilterDegeneratedCells(int argc, char* argv[]) +{ + char* filename = + vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/degenerated-hexahedrons.vtu"); + + vtkNew<vtkXMLUnstructuredGridReader> reader; + reader->SetFileName(filename); + delete[] filename; + + vtkNew<vtkGeometryFilter> geomFilter; + geomFilter->SetInputConnection(reader->GetOutputPort()); + geomFilter->Update(); + + auto out = geomFilter->GetOutput(); + if (out->GetNumberOfCells() != 12) + { + vtkLog( + ERROR, "wrong number of output cells. Has " << out->GetNumberOfCells() << " but expects 12"); + } + + vtkNew<vtkPolyDataMapper> mapper; + mapper->SetInputConnection(geomFilter->GetOutputPort()); + + vtkNew<vtkActor> actor; + actor->SetMapper(mapper); + // red backfaces to detect missing external face. + vtkNew<vtkProperty> backfaceProp; + backfaceProp->SetColor(255, 0, 0); + actor->SetBackfaceProperty(backfaceProp); + + vtkNew<vtkRenderer> renderer; + renderer->AddActor(actor); + + vtkNew<vtkRenderWindow> win; + win->AddRenderer(renderer); + + vtkNew<vtkRenderWindowInteractor> interactor; + interactor->SetRenderWindow(win); + win->Render(); + + // orient to catch the regression from 4a46c5dd + vtkCamera* cam = renderer->GetActiveCamera(); + cam->Azimuth(-90); + + interactor->Start(); + + return EXIT_SUCCESS; +} diff --git a/Filters/Geometry/Testing/Data/Baseline/TestGeometryFilterDegeneratedCells.png.sha512 b/Filters/Geometry/Testing/Data/Baseline/TestGeometryFilterDegeneratedCells.png.sha512 new file mode 100644 index 0000000000000000000000000000000000000000..4156dd4fd63a8456b7bd95df66de9820cda7b267 --- /dev/null +++ b/Filters/Geometry/Testing/Data/Baseline/TestGeometryFilterDegeneratedCells.png.sha512 @@ -0,0 +1 @@ +390f1e583d1471378e78df5575c790e1be830794c95cf35ee4c11bf277cd458aaef0f7bc41077d400c3e73cc19b5fd4d19c7a27b0851ba542aa29c7c52d29f1b diff --git a/Testing/Data/degenerated-hexahedrons.vtu.sha512 b/Testing/Data/degenerated-hexahedrons.vtu.sha512 new file mode 100644 index 0000000000000000000000000000000000000000..e0ac81a544c24a78197675750a17704cc047770b --- /dev/null +++ b/Testing/Data/degenerated-hexahedrons.vtu.sha512 @@ -0,0 +1 @@ +fbd1fe5cc695ab886e88f0e8da2542cf973a09200957b27dd5c139696ce7e1f98323fb9d534613b98d885310ad9903088cb6ec64f9279a74b0994853a7da2cef