From a09df1beb0f7ed9b5c23e0c42d92cc6cf4fa7c06 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 17:02:11 -0400 Subject: [PATCH 01/24] TEST: add surface meshing test helpers for cylinder-in-box and watertightness --- src/Plugins/SimplnxCore/test/CMakeLists.txt | 1 + .../test/SurfaceMeshingTestUtils.hpp | 178 ++++++++++++++++++ .../test/SurfaceMeshingTestUtilsTest.cpp | 102 ++++++++++ 3 files changed, 281 insertions(+) create mode 100644 src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp create mode 100644 src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp diff --git a/src/Plugins/SimplnxCore/test/CMakeLists.txt b/src/Plugins/SimplnxCore/test/CMakeLists.txt index 23fe986f96..f00b0eb2a0 100644 --- a/src/Plugins/SimplnxCore/test/CMakeLists.txt +++ b/src/Plugins/SimplnxCore/test/CMakeLists.txt @@ -148,6 +148,7 @@ set(${PLUGIN_NAME}UnitTest_SRCS SliceTriangleGeometryTest.cpp SplitDataArrayByComponentTest.cpp SplitDataArrayByTupleTest.cpp + SurfaceMeshingTestUtilsTest.cpp SurfaceNetsTest.cpp TriangleCentroidTest.cpp TriangleDihedralAngleFilterTest.cpp diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp new file mode 100644 index 0000000000..eaa48f21fd --- /dev/null +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -0,0 +1,178 @@ +#pragma once + +#include "simplnx/DataStructure/AttributeMatrix.hpp" +#include "simplnx/DataStructure/DataArray.hpp" +#include "simplnx/DataStructure/DataStructure.hpp" +#include "simplnx/DataStructure/Geometry/ImageGeom.hpp" +#include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" + +#include +#include +#include + +namespace SurfaceMeshingTest +{ +using namespace nx::core; + +inline constexpr usize k_BoxDim = 12; +inline constexpr usize k_CylinderRadius = 3; +inline constexpr usize k_CylinderCenter = 6; +inline constexpr usize k_CylinderTopZ = 8; + +/** + * @brief Builds a 12x12x12 ImageGeom holding a Z-axis cylinder (Feature Id 1) in a + * background of Feature Id 0. The cylinder is always inset from the four X/Y walls and + * from the top; flushWithBottom controls whether it touches the z == 0 wall. + * @param flushWithBottom When true the cylinder spans z = 0..8, otherwise z = 2..8. + * @return A DataStructure containing ImageGeom/CellData/FeatureIds. + */ +inline DataStructure CreateCylinderInBox(bool flushWithBottom) +{ + DataStructure dataStructure; + + auto* imageGeomPtr = ImageGeom::Create(dataStructure, "ImageGeom"); + const std::vector dims = {k_BoxDim, k_BoxDim, k_BoxDim}; + imageGeomPtr->setDimensions(dims); + imageGeomPtr->setSpacing({1.0F, 1.0F, 1.0F}); + imageGeomPtr->setOrigin({0.0F, 0.0F, 0.0F}); + + auto* cellAMPtr = AttributeMatrix::Create(dataStructure, "CellData", {dims[2], dims[1], dims[0]}, imageGeomPtr->getId()); + auto* featureIdsPtr = Int32Array::CreateWithStore(dataStructure, "FeatureIds", {dims[2], dims[1], dims[0]}, {1}, cellAMPtr->getId()); + featureIdsPtr->fill(0); + + const usize minZ = flushWithBottom ? 0 : 2; + auto& featureIdsRef = featureIdsPtr->getDataStoreRef(); + + for(usize z = minZ; z <= k_CylinderTopZ; z++) + { + for(usize y = 0; y < k_BoxDim; y++) + { + for(usize x = 0; x < k_BoxDim; x++) + { + const float64 dx = static_cast(x) + 0.5 - static_cast(k_CylinderCenter); + const float64 dy = static_cast(y) + 0.5 - static_cast(k_CylinderCenter); + if((dx * dx) + (dy * dy) <= static_cast(k_CylinderRadius * k_CylinderRadius)) + { + featureIdsRef[(z * k_BoxDim * k_BoxDim) + (y * k_BoxDim) + x] = 1; + } + } + } + } + + return dataStructure; +} + +/** + * @brief Builds a 12x12x12 ImageGeom with NO background: eight octant Features numbered + * 1..8 fill the volume. Omitting the bounding box skin must be a no-op on this data. + */ +inline DataStructure CreateFullyIndexedPolycrystal() +{ + DataStructure dataStructure; + + auto* imageGeomPtr = ImageGeom::Create(dataStructure, "ImageGeom"); + const std::vector dims = {k_BoxDim, k_BoxDim, k_BoxDim}; + imageGeomPtr->setDimensions(dims); + imageGeomPtr->setSpacing({1.0F, 1.0F, 1.0F}); + imageGeomPtr->setOrigin({0.0F, 0.0F, 0.0F}); + + auto* cellAMPtr = AttributeMatrix::Create(dataStructure, "CellData", {dims[2], dims[1], dims[0]}, imageGeomPtr->getId()); + auto* featureIdsPtr = Int32Array::CreateWithStore(dataStructure, "FeatureIds", {dims[2], dims[1], dims[0]}, {1}, cellAMPtr->getId()); + + auto& featureIdsRef = featureIdsPtr->getDataStoreRef(); + const usize half = k_BoxDim / 2; + for(usize z = 0; z < k_BoxDim; z++) + { + for(usize y = 0; y < k_BoxDim; y++) + { + for(usize x = 0; x < k_BoxDim; x++) + { + const int32 octant = static_cast((x >= half ? 1 : 0) + (y >= half ? 2 : 0) + (z >= half ? 4 : 0)); + featureIdsRef[(z * k_BoxDim * k_BoxDim) + (y * k_BoxDim) + x] = octant + 1; + } + } + } + + return dataStructure; +} + +/** + * @brief Builds a 12x12x12 ImageGeom in which every voxel is background (Feature Id 0). + * Omitting the bounding box skin must yield an empty mesh plus a warning. + */ +inline DataStructure CreateAllBackground() +{ + DataStructure dataStructure; + + auto* imageGeomPtr = ImageGeom::Create(dataStructure, "ImageGeom"); + const std::vector dims = {k_BoxDim, k_BoxDim, k_BoxDim}; + imageGeomPtr->setDimensions(dims); + imageGeomPtr->setSpacing({1.0F, 1.0F, 1.0F}); + imageGeomPtr->setOrigin({0.0F, 0.0F, 0.0F}); + + auto* cellAMPtr = AttributeMatrix::Create(dataStructure, "CellData", {dims[2], dims[1], dims[0]}, imageGeomPtr->getId()); + auto* featureIdsPtr = Int32Array::CreateWithStore(dataStructure, "FeatureIds", {dims[2], dims[1], dims[0]}, {1}, cellAMPtr->getId()); + featureIdsPtr->fill(0); + + return dataStructure; +} + +struct EdgeUseCounts +{ + usize TotalEdges = 0; + usize EdgesUsedOnce = 0; + usize EdgesUsedTwice = 0; + usize EdgesUsedMoreThanTwice = 0; +}; + +/** + * @brief Counts how many triangles use each undirected edge of the mesh. + */ +inline EdgeUseCounts CountEdgeUses(const TriangleGeom& triangleGeom) +{ + using VertexPair = std::pair; + std::map edgeUses; + + const auto& facesRef = triangleGeom.getFaces()->getDataStoreRef(); + const usize numFaces = triangleGeom.getNumberOfFaces(); + + for(usize faceIdx = 0; faceIdx < numFaces; faceIdx++) + { + const std::array vertIds = {static_cast(facesRef[faceIdx * 3 + 0]), static_cast(facesRef[faceIdx * 3 + 1]), static_cast(facesRef[faceIdx * 3 + 2])}; + for(usize edgeIdx = 0; edgeIdx < 3; edgeIdx++) + { + const usize vertA = vertIds[edgeIdx]; + const usize vertB = vertIds[(edgeIdx + 1) % 3]; + edgeUses[VertexPair{std::min(vertA, vertB), std::max(vertA, vertB)}]++; + } + } + + EdgeUseCounts counts; + counts.TotalEdges = edgeUses.size(); + for(const auto& [edge, useCount] : edgeUses) + { + if(useCount == 1) + { + counts.EdgesUsedOnce++; + } + else if(useCount == 2) + { + counts.EdgesUsedTwice++; + } + else + { + counts.EdgesUsedMoreThanTwice++; + } + } + return counts; +} + +/** + * @brief A mesh is watertight when every edge is shared by exactly two triangles. + */ +inline bool IsWatertight(const TriangleGeom& triangleGeom) +{ + const EdgeUseCounts counts = CountEdgeUses(triangleGeom); + return counts.TotalEdges > 0 && counts.EdgesUsedOnce == 0 && counts.EdgesUsedMoreThanTwice == 0; +} +} // namespace SurfaceMeshingTest diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp new file mode 100644 index 0000000000..7e408cece4 --- /dev/null +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp @@ -0,0 +1,102 @@ +#include "SurfaceMeshingTestUtils.hpp" + +#include "simplnx/DataStructure/DataArray.hpp" +#include "simplnx/DataStructure/DataStructure.hpp" +#include "simplnx/DataStructure/Geometry/ImageGeom.hpp" +#include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" +#include "simplnx/UnitTest/UnitTestCommon.hpp" + +#include + +using namespace nx::core; + +TEST_CASE("SimplnxCore::SurfaceMeshingTestUtils", "[SimplnxCore][SurfaceMeshingTestUtils]") +{ + SECTION("CreateCylinderInBox inset builds the expected volume") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateCylinderInBox(false); + + REQUIRE_NOTHROW(dataStructure.getDataRefAs(DataPath({"ImageGeom"}))); + const auto& imageGeom = dataStructure.getDataRefAs(DataPath({"ImageGeom"})); + REQUIRE(imageGeom.getDimensions() == SizeVec3{12, 12, 12}); + + const DataPath featureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(featureIdsPath)); + const auto& featureIdsRef = dataStructure.getDataRefAs(featureIdsPath).getDataStoreRef(); + + // Every voxel in the z == 0 plane is background when inset. + for(usize y = 0; y < 12; y++) + { + for(usize x = 0; x < 12; x++) + { + REQUIRE(featureIdsRef[(0 * 12 * 12) + (y * 12) + x] == 0); + } + } + // The cylinder axis voxel is Feature 1 at z == 4. + REQUIRE(featureIdsRef[(4 * 12 * 12) + (6 * 12) + 6] == 1); + } + + SECTION("CreateCylinderInBox flush touches the z == 0 plane") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateCylinderInBox(true); + const DataPath featureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); + const auto& featureIdsRef = dataStructure.getDataRefAs(featureIdsPath).getDataStoreRef(); + + REQUIRE(featureIdsRef[(0 * 12 * 12) + (6 * 12) + 6] == 1); + // Still inset from the x/y walls. + REQUIRE(featureIdsRef[(0 * 12 * 12) + (6 * 12) + 0] == 0); + } + + SECTION("IsWatertight rejects an open mesh and accepts a closed one") + { + // A single triangle: 3 edges, each used once -> not watertight. + DataStructure dataStructure; + auto* openGeomPtr = TriangleGeom::Create(dataStructure, "OpenTri"); + auto* openVertsPtr = Float32Array::CreateWithStore(dataStructure, "Vertices", {3}, {3}, openGeomPtr->getId()); + openGeomPtr->setVertices(*openVertsPtr); + auto* openFacesPtr = IGeometry::MeshIndexArrayType::CreateWithStore>(dataStructure, "Faces", {1}, {3}, openGeomPtr->getId()); + openGeomPtr->setFaceList(*openFacesPtr); + + auto& openVertsRef = openGeomPtr->getVertices()->getDataStoreRef(); + const std::array openCoords = {0.0F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.0F, 1.0F, 0.0F}; + for(usize i = 0; i < 9; i++) + { + openVertsRef[i] = openCoords[i]; + } + auto& openFacesRef = openGeomPtr->getFaces()->getDataStoreRef(); + openFacesRef[0] = 0; + openFacesRef[1] = 1; + openFacesRef[2] = 2; + + REQUIRE_FALSE(SurfaceMeshingTest::IsWatertight(*openGeomPtr)); + + // A tetrahedron: 4 triangles, 6 edges, each used twice -> watertight. + auto* closedGeomPtr = TriangleGeom::Create(dataStructure, "ClosedTet"); + auto* closedVertsPtr = Float32Array::CreateWithStore(dataStructure, "Vertices", {4}, {3}, closedGeomPtr->getId()); + closedGeomPtr->setVertices(*closedVertsPtr); + auto* closedFacesPtr = IGeometry::MeshIndexArrayType::CreateWithStore>(dataStructure, "Faces", {4}, {3}, closedGeomPtr->getId()); + closedGeomPtr->setFaceList(*closedFacesPtr); + + auto& closedVertsRef = closedGeomPtr->getVertices()->getDataStoreRef(); + const std::array tetCoords = {0.0F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.0F, 1.0F}; + for(usize i = 0; i < 12; i++) + { + closedVertsRef[i] = tetCoords[i]; + } + auto& closedFacesRef = closedGeomPtr->getFaces()->getDataStoreRef(); + const std::array tetFaces = {0, 2, 1, 0, 1, 3, 0, 3, 2, 1, 2, 3}; + for(usize i = 0; i < 12; i++) + { + closedFacesRef[i] = tetFaces[i]; + } + + REQUIRE(SurfaceMeshingTest::IsWatertight(*closedGeomPtr)); + + const auto counts = SurfaceMeshingTest::CountEdgeUses(*closedGeomPtr); + REQUIRE(counts.TotalEdges == 6); + REQUIRE(counts.EdgesUsedTwice == 6); + REQUIRE(counts.EdgesUsedOnce == 0); + } + + UnitTest::CheckArraysInheritTupleDims(DataStructure{}); +} From f24529e5604e412a37a1fe065facd6f08cd3f38a Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 17:07:27 -0400 Subject: [PATCH 02/24] TEST: add coverage for CreateFullyIndexedPolycrystal and CreateAllBackground helpers Add two SECTION blocks to exercise CreateFullyIndexedPolycrystal() and CreateAllBackground() to ensure they work correctly before being used by Task 8 to validate no-op behavior. - CreateFullyIndexedPolycrystal verifies 8 distinct features (1-8), no background - CreateAllBackground verifies all 1728 voxels are feature ID 0 --- .../test/SurfaceMeshingTestUtilsTest.cpp | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp index 7e408cece4..177fc2a70a 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp @@ -8,6 +8,8 @@ #include +#include + using namespace nx::core; TEST_CASE("SimplnxCore::SurfaceMeshingTestUtils", "[SimplnxCore][SurfaceMeshingTestUtils]") @@ -98,5 +100,53 @@ TEST_CASE("SimplnxCore::SurfaceMeshingTestUtils", "[SimplnxCore][SurfaceMeshingT REQUIRE(counts.EdgesUsedOnce == 0); } + SECTION("CreateFullyIndexedPolycrystal has no background and eight distinct Features") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + + REQUIRE_NOTHROW(dataStructure.getDataRefAs(DataPath({"ImageGeom"}))); + const auto& imageGeom = dataStructure.getDataRefAs(DataPath({"ImageGeom"})); + REQUIRE(imageGeom.getDimensions() == SizeVec3{12, 12, 12}); + + const DataPath featureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(featureIdsPath)); + const auto& featureIdsRef = dataStructure.getDataRefAs(featureIdsPath).getDataStoreRef(); + + std::set distinctFeatures; + for(usize i = 0; i < featureIdsRef.getNumberOfTuples(); i++) + { + distinctFeatures.insert(featureIdsRef[i]); + } + + REQUIRE(distinctFeatures.size() == 8); + REQUIRE(distinctFeatures.count(0) == 0); + REQUIRE(distinctFeatures.count(1) == 1); + REQUIRE(distinctFeatures.count(2) == 1); + REQUIRE(distinctFeatures.count(3) == 1); + REQUIRE(distinctFeatures.count(4) == 1); + REQUIRE(distinctFeatures.count(5) == 1); + REQUIRE(distinctFeatures.count(6) == 1); + REQUIRE(distinctFeatures.count(7) == 1); + REQUIRE(distinctFeatures.count(8) == 1); + } + + SECTION("CreateAllBackground is entirely Feature Id 0") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + + REQUIRE_NOTHROW(dataStructure.getDataRefAs(DataPath({"ImageGeom"}))); + const auto& imageGeom = dataStructure.getDataRefAs(DataPath({"ImageGeom"})); + REQUIRE(imageGeom.getDimensions() == SizeVec3{12, 12, 12}); + + const DataPath featureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(featureIdsPath)); + const auto& featureIdsRef = dataStructure.getDataRefAs(featureIdsPath).getDataStoreRef(); + + for(usize i = 0; i < featureIdsRef.getNumberOfTuples(); i++) + { + REQUIRE(featureIdsRef[i] == 0); + } + } + UnitTest::CheckArraysInheritTupleDims(DataStructure{}); } From 4f5e37ba8ecd923d899850867f02d284de9b7a3d Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 17:11:53 -0400 Subject: [PATCH 03/24] TEST: reproduce SurfaceNets Face Label conflation of Feature 0 with exterior Co-Authored-By: Claude Opus 5 --- src/Plugins/SimplnxCore/test/CMakeLists.txt | 1 + .../test/SurfaceNetsFaceLabelsTest.cpp | 73 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp diff --git a/src/Plugins/SimplnxCore/test/CMakeLists.txt b/src/Plugins/SimplnxCore/test/CMakeLists.txt index f00b0eb2a0..89b80a258f 100644 --- a/src/Plugins/SimplnxCore/test/CMakeLists.txt +++ b/src/Plugins/SimplnxCore/test/CMakeLists.txt @@ -149,6 +149,7 @@ set(${PLUGIN_NAME}UnitTest_SRCS SplitDataArrayByComponentTest.cpp SplitDataArrayByTupleTest.cpp SurfaceMeshingTestUtilsTest.cpp + SurfaceNetsFaceLabelsTest.cpp SurfaceNetsTest.cpp TriangleCentroidTest.cpp TriangleDihedralAngleFilterTest.cpp diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp new file mode 100644 index 0000000000..eb252a77c5 --- /dev/null +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp @@ -0,0 +1,73 @@ +#include "SimplnxCore/Filters/SurfaceNetsFilter.hpp" +#include "SurfaceMeshingTestUtils.hpp" + +#include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" +#include "simplnx/Parameters/BoolParameter.hpp" +#include "simplnx/Parameters/MultiArraySelectionParameter.hpp" +#include "simplnx/UnitTest/UnitTestCommon.hpp" + +#include + +#include +#include + +using namespace nx::core; + +namespace +{ +const DataPath k_ImageGeomPath({"ImageGeom"}); +const DataPath k_FeatureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); +const DataPath k_TriangleGeomPath({"SurfaceNets"}); + +// Runs SurfaceNets on the flush cylinder and returns the distinct {comp0, comp1} label pairs. +std::set> RunAndCollectLabelPairs() +{ + DataStructure dataStructure = SurfaceMeshingTest::CreateCylinderInBox(true); + + SurfaceNetsFilter filter; + Arguments args; + args.insertOrAssign(SurfaceNetsFilter::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); + args.insertOrAssign(SurfaceNetsFilter::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); + args.insertOrAssign(SurfaceNetsFilter::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(SurfaceNetsFilter::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(SurfaceNetsFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(k_TriangleGeomPath)); + args.insertOrAssign(SurfaceNetsFilter::k_VertexDataGroupName_Key, std::make_any("Vertex Data")); + args.insertOrAssign(SurfaceNetsFilter::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); + args.insertOrAssign(SurfaceNetsFilter::k_FaceDataGroupName_Key, std::make_any("Face Data")); + args.insertOrAssign(SurfaceNetsFilter::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_RepairTriangleWinding_Key, std::make_any(false)); + + auto preflightResult = filter.preflight(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); + auto executeResult = filter.execute(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); + + const DataPath faceLabelsPath = k_TriangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(faceLabelsPath)); + const auto& faceLabelsRef = dataStructure.getDataRefAs(faceLabelsPath).getDataStoreRef(); + + std::set> labelPairs; + for(usize i = 0; i < faceLabelsRef.getNumberOfTuples(); i++) + { + labelPairs.insert({faceLabelsRef[i * 2], faceLabelsRef[i * 2 + 1]}); + } + return labelPairs; +} +} // namespace + +TEST_CASE("SimplnxCore::SurfaceNetsFilter: Face Label conventions", "[SimplnxCore][SurfaceNetsFilter]") +{ + UnitTest::LoadPlugins(); + + const std::set> labelPairs = RunAndCollectLabelPairs(); + + // The cylinder wall separates background (0) from the cylinder (1). + REQUIRE(labelPairs.count({0, 1}) == 1); + // The box wall backed by background must be distinguishable from a feature cap. + REQUIRE(labelPairs.count({-1, 0}) == 1); + // The cylinder's bottom cap: box wall backed by the cylinder. + REQUIRE(labelPairs.count({-1, 1}) == 1); + // The buggy {-1,-1} pair must not appear. + REQUIRE(labelPairs.count({-1, -1}) == 0); +} From 5ab2faa3cd9863b5e02d8a29efd91fce4e61a092 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 18:00:01 -0400 Subject: [PATCH 04/24] TEST: report all Face Label pairs in the SurfaceNets reproduction REQUIRE aborts the test case on first failure, so the reproduction only ever demonstrated one of the two symptoms it documents. CHECK records each failure and continues, so a single run reports all four label-pair outcomes. Co-Authored-By: Claude Opus 5 --- .../SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp index eb252a77c5..4768c5be06 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp @@ -63,11 +63,11 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Face Label conventions", "[SimplnxCor const std::set> labelPairs = RunAndCollectLabelPairs(); // The cylinder wall separates background (0) from the cylinder (1). - REQUIRE(labelPairs.count({0, 1}) == 1); + CHECK(labelPairs.count({0, 1}) == 1); // The box wall backed by background must be distinguishable from a feature cap. - REQUIRE(labelPairs.count({-1, 0}) == 1); + CHECK(labelPairs.count({-1, 0}) == 1); // The cylinder's bottom cap: box wall backed by the cylinder. - REQUIRE(labelPairs.count({-1, 1}) == 1); + CHECK(labelPairs.count({-1, 1}) == 1); // The buggy {-1,-1} pair must not appear. - REQUIRE(labelPairs.count({-1, -1}) == 0); + CHECK(labelPairs.count({-1, -1}) == 0); } From f8b0e92980b70bd7af75009031d8ae186a3055aa Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 18:04:17 -0400 Subject: [PATCH 05/24] FIX: stop SurfaceNets conflating Feature Id 0 with the exterior Face Label Padding was remapped to 0 and then every 0 was rewritten to -1, so real Feature 0 interfaces became {-1, k} and box skin over background became {-1, -1}. Map Padding directly to -1 instead. Winding is unchanged: isQuadFrontFacing is computed before the remap. The SurfaceNets exemplar tests are unaffected because the Small IN100 test dataset has no Feature Id 0 voxels (min=1, max=219), so {Padding, k} faces are byte-identical either way. Co-Authored-By: Claude Opus 5 --- .../Filters/Algorithms/SurfaceNets.cpp | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp index ac95808ad2..996b3fc968 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp @@ -246,13 +246,15 @@ Result<> SurfaceNets::operator()() vData[3] = {vertexIndices[3], 00.0f, 0.0f, 0.0f}; const bool isQuadFrontFacing = (quadLabels[0] < quadLabels[1]); + // Map the exterior padding sentinel straight to the shared exterior Face Label (-1). + // Going through 0 as an intermediate would collide with real Feature Id 0. if(quadLabels[0] == MMSurfaceNet::Padding) { - quadLabels[0] = 0; + quadLabels[0] = -1; } if(quadLabels[1] == MMSurfaceNet::Padding) { - quadLabels[1] = 0; + quadLabels[1] = -1; } getQuadTriangleIDs(vData, isQuadFrontFacing, triangleVtxIDs); @@ -306,13 +308,15 @@ Result<> SurfaceNets::operator()() vData[3] = {vertexIndices[3], 00.0f, 0.0f, 0.0f}; const bool isQuadFrontFacing = (quadLabels[0] < quadLabels[1]); /// + // Map the exterior padding sentinel straight to the shared exterior Face Label (-1). + // Going through 0 as an intermediate would collide with real Feature Id 0. if(quadLabels[0] == MMSurfaceNet::Padding) { - quadLabels[0] = 0; + quadLabels[0] = -1; } if(quadLabels[1] == MMSurfaceNet::Padding) { - quadLabels[1] = 0; + quadLabels[1] = -1; } getQuadTriangleIDs(vData, isQuadFrontFacing, triangleVtxIDs); t1 = {static_cast(triangleVtxIDs[0]), static_cast(triangleVtxIDs[1]), static_cast(triangleVtxIDs[2])}; @@ -364,13 +368,15 @@ Result<> SurfaceNets::operator()() vData[3] = {vertexIndices[3], 00.0f, 0.0f, 0.0f}; const bool isQuadFrontFacing = (quadLabels[0] < quadLabels[1]); + // Map the exterior padding sentinel straight to the shared exterior Face Label (-1). + // Going through 0 as an intermediate would collide with real Feature Id 0. if(quadLabels[0] == MMSurfaceNet::Padding) { - quadLabels[0] = 0; + quadLabels[0] = -1; } if(quadLabels[1] == MMSurfaceNet::Padding) { - quadLabels[1] = 0; + quadLabels[1] = -1; } getQuadTriangleIDs(vData, isQuadFrontFacing, triangleVtxIDs); t1 = {static_cast(triangleVtxIDs[0]), static_cast(triangleVtxIDs[1]), static_cast(triangleVtxIDs[2])}; @@ -414,15 +420,6 @@ Result<> SurfaceNets::operator()() } } - // Now run through the FaceLabels to make them consistent with Quick Surface Mesh - for(usize tIdx = 0; tIdx < triangleCount * 2; tIdx++) - { - if(faceLabels[tIdx] == 0) - { - faceLabels[tIdx] = -1; - } - } - // Scoped because we invalidate connectivity at the end Result<> windingResult = {}; if(m_InputValues->RepairTriangleWinding) From 68246727242ee75746b86b5dc8a72f336344a166 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 18:22:57 -0400 Subject: [PATCH 06/24] FIX: emit SurfaceNets Node Types in the shared NodeType convention numJunctions() counts junction face-crossings (0-6), not features meeting at a node, so a normal SurfaceNets node was 0 -- colliding with NodeType::Unused. Compute min(distinct corner labels, 4) + 10 if padding instead, which is the same quantity QuickSurfaceMesh derives from its owner lists over the same 8 voxels. Also removes the non-idempotent CalculatePadding (which turned a twice-visited node from 2 into 12 then 13) and the dead, incorrect getCellLabels. Vertex positions and smoothing are unchanged. Also fixes SurfaceMeshingTest's ImageGeom builders, which created a "CellData" AttributeMatrix but never called setCellData() to register it with the geometry. This left IGridGeometry::getCellData() returning nullptr, which QuickSurfaceMeshFilter::preflightImpl dereferences -- a latent crash that only surfaced once this task's new test exercised QuickSurfaceMesh against the shared cylinder-in-box helper. Co-Authored-By: Claude Opus 5 --- .../Filters/Algorithms/SurfaceNets.cpp | 27 +-- .../src/SimplnxCore/SurfaceNets/MMCellMap.cpp | 148 ++++++++-------- .../src/SimplnxCore/SurfaceNets/MMCellMap.h | 7 +- src/Plugins/SimplnxCore/test/CMakeLists.txt | 1 + .../test/SurfaceMeshingTestUtils.hpp | 3 + .../test/SurfaceNetsNodeTypesTest.cpp | 167 ++++++++++++++++++ 6 files changed, 253 insertions(+), 100 deletions(-) create mode 100644 src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp index 996b3fc968..90dde7ebfa 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp @@ -18,18 +18,6 @@ using namespace nx::core; namespace { using LabelType = int32; -constexpr inline int8 CalculatePadding(int8 value) -{ - return value + ((9 * static_cast(value < 10)) + 1); -} - -inline void HandlePadding(std::array vertexIndices, AbstractDataStore& nodeTypes) -{ - nodeTypes.setValue(vertexIndices[0], CalculatePadding(nodeTypes.getValue(vertexIndices[0]))); - nodeTypes.setValue(vertexIndices[1], CalculatePadding(nodeTypes.getValue(vertexIndices[1]))); - nodeTypes.setValue(vertexIndices[2], CalculatePadding(nodeTypes.getValue(vertexIndices[2]))); - nodeTypes.setValue(vertexIndices[3], CalculatePadding(nodeTypes.getValue(vertexIndices[3]))); -}; struct VertexData { @@ -159,8 +147,7 @@ Result<> SurfaceNets::operator()() triangleGeom.setVertexCoordinate(static_cast(vertIndex), position); cellMapPtr->getVertexCellIndex(vertIndex, vertCellIndex.data()); - MMCellMap::Cell* currentCellPtr = cellMapPtr->getCell(vertCellIndex.data()); - nodeTypes[static_cast(vertIndex)] = static_cast(currentCellPtr->flag.numJunctions()); + nodeTypes[static_cast(vertIndex)] = cellMapPtr->nodeType(vertCellIndex.data()); } usize triangleCount = 0; @@ -173,26 +160,14 @@ Result<> SurfaceNets::operator()() if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::BackBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - if(quadLabels[0] == MMSurfaceNet::Padding || quadLabels[1] == MMSurfaceNet::Padding) - { - HandlePadding(vertexIndices, nodeTypes); - } triangleCount += 2; } if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - if(quadLabels[0] == MMSurfaceNet::Padding || quadLabels[1] == MMSurfaceNet::Padding) - { - HandlePadding(vertexIndices, nodeTypes); - } triangleCount += 2; } if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBackEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - if(quadLabels[0] == MMSurfaceNet::Padding || quadLabels[1] == MMSurfaceNet::Padding) - { - HandlePadding(vertexIndices, nodeTypes); - } triangleCount += 2; } } diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/SurfaceNets/MMCellMap.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/SurfaceNets/MMCellMap.cpp index 0b080194a4..0efc4f685b 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/SurfaceNets/MMCellMap.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/SurfaceNets/MMCellMap.cpp @@ -139,7 +139,6 @@ bool MMCellMap::setCellVertices() // Set cell type and count cell vertices. There are no vertices in right, front, // top faces. size_t numVertices = 0; - int32 cellIndex[3] = {0, 0, 0}; for(int k = 0; k < m_arraySize[2] - 1; k++) { for(int j = 0; j < m_arraySize[1] - 1; j++) @@ -148,51 +147,8 @@ bool MMCellMap::setCellVertices() { Cell* pCell = getCell(i, j, k); int32_t cellLabels[8]; - - cellIndex[0] = i; - cellIndex[1] = j; - cellIndex[2] = k; - // Label[0] - cellLabels[0] = label(cellIndex); - - // Label[1] - cellIndex[0] = i + 1; - cellLabels[1] = label(cellIndex); - - // Label[2] - cellIndex[0] = i + 1; - cellIndex[1] = j + 1; - cellLabels[2] = label(cellIndex); - - // Label[3] - cellIndex[0] = i; - cellIndex[1] = j + 1; - cellLabels[3] = label(cellIndex); - - // Label[4] - cellIndex[0] = i; - cellIndex[1] = j; - cellIndex[2] = k + 1; - cellLabels[4] = label(cellIndex); - - // Label[5] - cellIndex[0] = i + 1; - cellIndex[1] = j; - cellIndex[2] = k + 1; - cellLabels[5] = label(cellIndex); - - // Label[6] - cellIndex[0] = i + 1; - cellIndex[1] = j + 1; - cellIndex[2] = k + 1; - cellLabels[6] = label(cellIndex); - - // Label[7] - cellIndex[0] = i; - cellIndex[1] = j + 1; - cellIndex[2] = k + 1; - cellLabels[7] = label(cellIndex); - + const int cornerCellIndex[3] = {i, j, k}; + getCornerLabels(cornerCellIndex, cellLabels); pCell->flag.set(cellLabels); if(pCell->flag.vertexType() != MMCellFlag::VertexType::NoVertex) { @@ -665,41 +621,87 @@ size_t MMCellMap::cellArrayIndex(int i, int j, int k) const return (ii + m_arraySize[0] * jj + m_arraySize[0] * m_arraySize[1] * kk); } -void MMCellMap::getCellLabels(Cell* pCell, int32_t labels[8]) const +void MMCellMap::getCornerLabels(const int cellIndex[3], int32_t labels[8]) const { - // Labels of cell's 8 corner vertices. This ordering is used when computing cell - // flags. - Cell* cellPtr = pCell; - usize vertIdx = cellPtr->vertexIndex; - labels[0] = label(m_VertexArray.at(vertIdx).cellIndex); + // The cell's 8 corners are the 8 voxels surrounding a grid corner, ordered + // left-to-right, back-to-front, bottom-to-top. Must match the gather in setCellVertices(). + const int i = cellIndex[0]; + const int j = cellIndex[1]; + const int k = cellIndex[2]; + + int32 corner[3] = {i, j, k}; + labels[0] = label(corner); + + corner[0] = i + 1; + labels[1] = label(corner); + + corner[0] = i + 1; + corner[1] = j + 1; + labels[2] = label(corner); - cellPtr = pCell + 1; - vertIdx = cellPtr->vertexIndex; - labels[1] = label(m_VertexArray.at(vertIdx).cellIndex); + corner[0] = i; + corner[1] = j + 1; + labels[3] = label(corner); - cellPtr = (pCell + 1 + m_arraySize[0]); - vertIdx = cellPtr->vertexIndex; - labels[2] = label(m_VertexArray.at(vertIdx).cellIndex); + corner[0] = i; + corner[1] = j; + corner[2] = k + 1; + labels[4] = label(corner); - cellPtr = (pCell + m_arraySize[0]); - vertIdx = cellPtr->vertexIndex; - labels[3] = label(m_VertexArray.at(vertIdx).cellIndex); + corner[0] = i + 1; + corner[1] = j; + corner[2] = k + 1; + labels[5] = label(corner); - cellPtr = (pCell + m_arraySize[0] * m_arraySize[1]); - vertIdx = cellPtr->vertexIndex; - labels[4] = label(m_VertexArray.at(vertIdx).cellIndex); + corner[0] = i + 1; + corner[1] = j + 1; + corner[2] = k + 1; + labels[6] = label(corner); - cellPtr = (pCell + 1 + m_arraySize[0] * m_arraySize[1]); - vertIdx = cellPtr->vertexIndex; - labels[5] = label(m_VertexArray.at(vertIdx).cellIndex); + corner[0] = i; + corner[1] = j + 1; + corner[2] = k + 1; + labels[7] = label(corner); +} + +int8_t MMCellMap::nodeType(const int cellIndex[3]) const +{ + int32_t labels[8]; + getCornerLabels(cellIndex, labels); - cellPtr = (pCell + 1 + m_arraySize[0] + m_arraySize[0] * m_arraySize[1]); - vertIdx = cellPtr->vertexIndex; - labels[6] = label(m_VertexArray.at(vertIdx).cellIndex); + // Distinct-label count with Padding counted as one member, exactly as QuickSurfaceMesh + // counts -1 as a member of its owner list. + int32_t distinct[8]; + int numDistinct = 0; + bool hasPadding = false; + for(int idx = 0; idx < 8; idx++) + { + if(labels[idx] == MMSurfaceNet::ReservedLabel::Padding) + { + hasPadding = true; + } + bool alreadySeen = false; + for(int seenIdx = 0; seenIdx < numDistinct; seenIdx++) + { + if(distinct[seenIdx] == labels[idx]) + { + alreadySeen = true; + break; + } + } + if(!alreadySeen) + { + distinct[numDistinct] = labels[idx]; + numDistinct++; + } + } - cellPtr = (pCell + m_arraySize[0] + m_arraySize[0] * m_arraySize[1]); - vertIdx = cellPtr->vertexIndex; - labels[7] = label(m_VertexArray.at(vertIdx).cellIndex); + int8_t result = static_cast(numDistinct > 4 ? 4 : numDistinct); + if(hasPadding) + { + result = static_cast(result + 10); + } + return result; } bool MMCellMap::isEdgeCrossing(size_t cellMapIndex, MMCellFlag::Edge edge) const diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/SurfaceNets/MMCellMap.h b/src/Plugins/SimplnxCore/src/SimplnxCore/SurfaceNets/MMCellMap.h index 71cf6ce598..16c25ead8f 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/SurfaceNets/MMCellMap.h +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/SurfaceNets/MMCellMap.h @@ -41,6 +41,11 @@ class MMCellMap MMCellFlag::VertexType cellVertexType(size_t cellArrayIndex) const; + // Node type in the shared simplnx NodeType convention: min(distinct corner labels, 4), + // plus 10 when any corner is exterior padding. This is the same quantity QuickSurfaceMesh + // computes from its per-node owner list, over the same 8 surrounding voxels. + int8_t nodeType(const int cellIndex[3]) const; + struct Vertex { int32_t cellIndex[3]; @@ -76,7 +81,7 @@ class MMCellMap // Access cell map size_t cellArrayIndex(int i, int j, int k) const; - void getCellLabels(Cell* cell, int32_t labels[8]) const; + void getCornerLabels(const int cellIndex[3], int32_t labels[8]) const; bool isEdgeCrossing(size_t cellArrayIndex, MMCellFlag::Edge edge) const; void getEdgeLabels(int cellIndex[3], MMCellFlag::Edge edge, int32_t quadLabels[2], size_t quadNxArrayIndices[2]) const; void getEdgeQuadPositions(int cellIndex[3], MMCellFlag::Edge edge, float quadCorners[12]) const; diff --git a/src/Plugins/SimplnxCore/test/CMakeLists.txt b/src/Plugins/SimplnxCore/test/CMakeLists.txt index 89b80a258f..faf2d3bcc6 100644 --- a/src/Plugins/SimplnxCore/test/CMakeLists.txt +++ b/src/Plugins/SimplnxCore/test/CMakeLists.txt @@ -150,6 +150,7 @@ set(${PLUGIN_NAME}UnitTest_SRCS SplitDataArrayByTupleTest.cpp SurfaceMeshingTestUtilsTest.cpp SurfaceNetsFaceLabelsTest.cpp + SurfaceNetsNodeTypesTest.cpp SurfaceNetsTest.cpp TriangleCentroidTest.cpp TriangleDihedralAngleFilterTest.cpp diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp index eaa48f21fd..0f607f666c 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -37,6 +37,7 @@ inline DataStructure CreateCylinderInBox(bool flushWithBottom) imageGeomPtr->setOrigin({0.0F, 0.0F, 0.0F}); auto* cellAMPtr = AttributeMatrix::Create(dataStructure, "CellData", {dims[2], dims[1], dims[0]}, imageGeomPtr->getId()); + imageGeomPtr->setCellData(*cellAMPtr); auto* featureIdsPtr = Int32Array::CreateWithStore(dataStructure, "FeatureIds", {dims[2], dims[1], dims[0]}, {1}, cellAMPtr->getId()); featureIdsPtr->fill(0); @@ -77,6 +78,7 @@ inline DataStructure CreateFullyIndexedPolycrystal() imageGeomPtr->setOrigin({0.0F, 0.0F, 0.0F}); auto* cellAMPtr = AttributeMatrix::Create(dataStructure, "CellData", {dims[2], dims[1], dims[0]}, imageGeomPtr->getId()); + imageGeomPtr->setCellData(*cellAMPtr); auto* featureIdsPtr = Int32Array::CreateWithStore(dataStructure, "FeatureIds", {dims[2], dims[1], dims[0]}, {1}, cellAMPtr->getId()); auto& featureIdsRef = featureIdsPtr->getDataStoreRef(); @@ -111,6 +113,7 @@ inline DataStructure CreateAllBackground() imageGeomPtr->setOrigin({0.0F, 0.0F, 0.0F}); auto* cellAMPtr = AttributeMatrix::Create(dataStructure, "CellData", {dims[2], dims[1], dims[0]}, imageGeomPtr->getId()); + imageGeomPtr->setCellData(*cellAMPtr); auto* featureIdsPtr = Int32Array::CreateWithStore(dataStructure, "FeatureIds", {dims[2], dims[1], dims[0]}, {1}, cellAMPtr->getId()); featureIdsPtr->fill(0); diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp new file mode 100644 index 0000000000..8078dbe80c --- /dev/null +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp @@ -0,0 +1,167 @@ +#include "SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp" +#include "SimplnxCore/Filters/SurfaceNetsFilter.hpp" +#include "SurfaceMeshingTestUtils.hpp" + +#include "simplnx/DataStructure/Geometry/INodeGeometry2D.hpp" +#include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" +#include "simplnx/Parameters/BoolParameter.hpp" +#include "simplnx/Parameters/MultiArraySelectionParameter.hpp" +#include "simplnx/UnitTest/UnitTestCommon.hpp" + +#include + +#include +#include + +using namespace nx::core; + +namespace +{ +const DataPath k_ImageGeomPath({"ImageGeom"}); +const DataPath k_FeatureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); + +// Returns the set of distinct Node Type values produced by SurfaceNets on the flush cylinder. +std::set RunSurfaceNetsNodeTypes() +{ + DataStructure dataStructure = SurfaceMeshingTest::CreateCylinderInBox(true); + const DataPath triangleGeomPath({"SurfaceNets"}); + + SurfaceNetsFilter filter; + Arguments args; + args.insertOrAssign(SurfaceNetsFilter::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); + args.insertOrAssign(SurfaceNetsFilter::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); + args.insertOrAssign(SurfaceNetsFilter::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(SurfaceNetsFilter::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(SurfaceNetsFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(triangleGeomPath)); + args.insertOrAssign(SurfaceNetsFilter::k_VertexDataGroupName_Key, std::make_any("Vertex Data")); + args.insertOrAssign(SurfaceNetsFilter::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); + args.insertOrAssign(SurfaceNetsFilter::k_FaceDataGroupName_Key, std::make_any("Face Data")); + args.insertOrAssign(SurfaceNetsFilter::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_RepairTriangleWinding_Key, std::make_any(false)); + + auto preflightResult = filter.preflight(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); + auto executeResult = filter.execute(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); + + const DataPath nodeTypesPath = triangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(nodeTypesPath)); + const auto& nodeTypesRef = dataStructure.getDataRefAs(nodeTypesPath).getDataStoreRef(); + + std::set distinctValues; + for(usize i = 0; i < nodeTypesRef.getNumberOfTuples(); i++) + { + distinctValues.insert(nodeTypesRef[i]); + } + return distinctValues; +} +} // namespace + +TEST_CASE("SimplnxCore::SurfaceNetsFilter: Node Types follow the NodeType convention", "[SimplnxCore][SurfaceNetsFilter]") +{ + UnitTest::LoadPlugins(); + + const std::set distinctValues = RunSurfaceNetsNodeTypes(); + + // Only the shared convention values may appear: 2/3/4 interior, 12/13/14 on the box wall. + const std::set allowedValues = {NodeType::Default, NodeType::TriplePoint, NodeType::QuadPoint, NodeType::SurfaceDefault, NodeType::SurfaceTriplePoint, NodeType::SurfaceQuadPoint}; + for(const int8 value : distinctValues) + { + INFO("Unexpected Node Type value: " << static_cast(value)); + REQUIRE(allowedValues.count(value) == 1); + } + + // The flush cylinder guarantees both an interior node and a box-wall node exist. + REQUIRE(distinctValues.count(NodeType::Default) == 1); + REQUIRE(distinctValues.count(NodeType::SurfaceDefault) == 1); + + // 0 must never appear -- it means NodeType::Unused. + REQUIRE(distinctValues.count(0) == 0); +} + +TEST_CASE("SimplnxCore::SurfaceNetsFilter: Node Types agree with QuickSurfaceMesh", "[SimplnxCore][SurfaceNetsFilter]") +{ + UnitTest::LoadPlugins(); + + // Both meshers place a node near each grid corner where two or more Features meet, and + // both derive the node type from the same 8 surrounding voxels. With smoothing disabled + // the values must agree corner-for-corner. This is the check that proves the equivalence + // argument in the design spec rather than trusting it. + DataStructure surfaceNetsStructure = SurfaceMeshingTest::CreateCylinderInBox(true); + DataStructure quickMeshStructure = SurfaceMeshingTest::CreateCylinderInBox(true); + + const DataPath surfaceNetsPath({"SurfaceNets"}); + const DataPath quickMeshPath({"QuickMesh"}); + + { + SurfaceNetsFilter filter; + Arguments args; + args.insertOrAssign(SurfaceNetsFilter::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); + args.insertOrAssign(SurfaceNetsFilter::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); + args.insertOrAssign(SurfaceNetsFilter::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(SurfaceNetsFilter::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(SurfaceNetsFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(surfaceNetsPath)); + args.insertOrAssign(SurfaceNetsFilter::k_VertexDataGroupName_Key, std::make_any("Vertex Data")); + args.insertOrAssign(SurfaceNetsFilter::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); + args.insertOrAssign(SurfaceNetsFilter::k_FaceDataGroupName_Key, std::make_any("Face Data")); + args.insertOrAssign(SurfaceNetsFilter::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_RepairTriangleWinding_Key, std::make_any(false)); + + auto preflightResult = filter.preflight(surfaceNetsStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); + auto executeResult = filter.execute(surfaceNetsStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); + } + + { + QuickSurfaceMeshFilter filter; + Arguments args; + args.insertOrAssign(QuickSurfaceMeshFilter::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); + args.insertOrAssign(QuickSurfaceMeshFilter::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); + args.insertOrAssign(QuickSurfaceMeshFilter::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(QuickSurfaceMeshFilter::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(QuickSurfaceMeshFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(quickMeshPath)); + args.insertOrAssign(QuickSurfaceMeshFilter::k_VertexDataGroupName_Key, std::make_any("Vertex Data")); + args.insertOrAssign(QuickSurfaceMeshFilter::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); + args.insertOrAssign(QuickSurfaceMeshFilter::k_FaceDataGroupName_Key, std::make_any("Face Data")); + args.insertOrAssign(QuickSurfaceMeshFilter::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); + args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); + args.insertOrAssign(QuickSurfaceMeshFilter::k_RepairTriangleWinding_Key, std::make_any(false)); + + auto preflightResult = filter.preflight(quickMeshStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); + auto executeResult = filter.execute(quickMeshStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); + } + + // Both meshers should produce the same number of nodes, since both emit one per grid + // corner where two or more Features meet. + const auto& snGeom = surfaceNetsStructure.getDataRefAs(surfaceNetsPath); + const auto& qsmGeom = quickMeshStructure.getDataRefAs(quickMeshPath); + REQUIRE(snGeom.getNumberOfVertices() == qsmGeom.getNumberOfVertices()); + + const auto& snTypesRef = surfaceNetsStructure.getDataRefAs(surfaceNetsPath.createChildPath("Vertex Data").createChildPath("NodeTypes")).getDataStoreRef(); + const auto& qsmTypesRef = quickMeshStructure.getDataRefAs(quickMeshPath.createChildPath("Vertex Data").createChildPath("NodeTypes")).getDataStoreRef(); + + // Compare as histograms: the two meshers number their nodes in different orders, but a + // corner-for-corner equivalence implies identical value counts. + std::map snHistogram; + std::map qsmHistogram; + for(usize i = 0; i < snTypesRef.getNumberOfTuples(); i++) + { + snHistogram[snTypesRef[i]]++; + } + for(usize i = 0; i < qsmTypesRef.getNumberOfTuples(); i++) + { + qsmHistogram[qsmTypesRef[i]]++; + } + + for(const auto& [value, count] : qsmHistogram) + { + INFO("Node Type " << static_cast(value) << ": QuickSurfaceMesh has " << count << ", SurfaceNets has " << snHistogram[value]); + REQUIRE(snHistogram[value] == count); + } + REQUIRE(snHistogram.size() == qsmHistogram.size()); +} From 3db4a1f3ea2d35c1a7f89dabc2caac5729de0b54 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 18:48:12 -0400 Subject: [PATCH 07/24] FEAT: add Omit Bounding Box Skin to QuickSurfaceMesh Skips wall faces whose Face Labels would be {-1, 0} in both the counting and emit passes. Wall faces capping a real Feature are still generated, so a Feature flush with the box stays closed. Node registration sits inside the same guard, so orphan vertices are never created. Also factors a shared, templated RunMesher() test helper (plus MeshResult and CollectLabelPairs) into SurfaceMeshingTestUtils.hpp so the SurfaceNets and M3C omit-skin tasks can reuse it instead of duplicating a per-filter runner. Co-Authored-By: Claude Opus 5 --- .../Filters/Algorithms/QuickSurfaceMesh.cpp | 768 ++++++++++-------- .../Filters/Algorithms/QuickSurfaceMesh.hpp | 1 + .../Filters/QuickSurfaceMeshFilter.cpp | 5 + .../Filters/QuickSurfaceMeshFilter.hpp | 1 + src/Plugins/SimplnxCore/test/CMakeLists.txt | 1 + .../test/OmitBoundingBoxSkinTest.cpp | 102 +++ .../test/SurfaceMeshingTestUtils.hpp | 77 ++ 7 files changed, 595 insertions(+), 360 deletions(-) create mode 100644 src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp index e0016d3d54..933e3d0a43 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp @@ -233,6 +233,18 @@ void GetGridCoordinates(const IGridGeometry* grid, size_t x, size_t y, size_t z, verts[nodeIndex + 2] = static_cast(tmpCoords[2]); } +/** + * @brief True when a bounding-box wall face backed by this Feature Id must be skipped. + * A wall face always gets Face Labels {-1, featureId}, so the {-1, 0} rule reduces to + * "the voxel behind the wall is background". Both the counting pass and the emit pass + * MUST call this same function -- if they disagree, node ids go unassigned and + * ownerLists is indexed out of bounds. + */ +inline bool SkipWallFace(bool omitBoundingBoxSkin, int32 featureId) +{ + return omitBoundingBoxSkin && featureId == 0; +} + // ----------------------------------------------------------------------------- void FlipProblemVoxelCase1(Int32AbstractDataStore& featureIds, QuickSurfaceMesh::MeshIndexType v1, QuickSurfaceMesh::MeshIndexType v2, QuickSurfaceMesh::MeshIndexType v3, QuickSurfaceMesh::MeshIndexType v4, QuickSurfaceMesh::MeshIndexType v5, QuickSurfaceMesh::MeshIndexType v6) @@ -689,119 +701,131 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, if(i == 0) { - nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - if(nodeIds[nodeId1] == std::numeric_limits::max()) + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) { - nodeIds[nodeId1] = nodeCount; - nodeCount++; - } - nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - if(nodeIds[nodeId2] == std::numeric_limits::max()) - { - nodeIds[nodeId2] = nodeCount; - nodeCount++; - } - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - if(nodeIds[nodeId3] == std::numeric_limits::max()) - { - nodeIds[nodeId3] = nodeCount; - nodeCount++; - } - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - if(nodeIds[nodeId4] == std::numeric_limits::max()) - { - nodeIds[nodeId4] = nodeCount; - nodeCount++; + nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + if(nodeIds[nodeId1] == std::numeric_limits::max()) + { + nodeIds[nodeId1] = nodeCount; + nodeCount++; + } + nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + if(nodeIds[nodeId2] == std::numeric_limits::max()) + { + nodeIds[nodeId2] = nodeCount; + nodeCount++; + } + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + if(nodeIds[nodeId3] == std::numeric_limits::max()) + { + nodeIds[nodeId3] = nodeCount; + nodeCount++; + } + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + if(nodeIds[nodeId4] == std::numeric_limits::max()) + { + nodeIds[nodeId4] = nodeCount; + nodeCount++; + } + triangleCount++; + triangleCount++; } - triangleCount++; - triangleCount++; } if(j == 0) { - nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - if(nodeIds[nodeId1] == std::numeric_limits::max()) + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) { - nodeIds[nodeId1] = nodeCount; - nodeCount++; - } - nodeId2 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - if(nodeIds[nodeId2] == std::numeric_limits::max()) - { - nodeIds[nodeId2] = nodeCount; - nodeCount++; - } - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - if(nodeIds[nodeId3] == std::numeric_limits::max()) - { - nodeIds[nodeId3] = nodeCount; - nodeCount++; - } - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - if(nodeIds[nodeId4] == std::numeric_limits::max()) - { - nodeIds[nodeId4] = nodeCount; - nodeCount++; + nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + if(nodeIds[nodeId1] == std::numeric_limits::max()) + { + nodeIds[nodeId1] = nodeCount; + nodeCount++; + } + nodeId2 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + if(nodeIds[nodeId2] == std::numeric_limits::max()) + { + nodeIds[nodeId2] = nodeCount; + nodeCount++; + } + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + if(nodeIds[nodeId3] == std::numeric_limits::max()) + { + nodeIds[nodeId3] = nodeCount; + nodeCount++; + } + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + if(nodeIds[nodeId4] == std::numeric_limits::max()) + { + nodeIds[nodeId4] = nodeCount; + nodeCount++; + } + triangleCount++; + triangleCount++; } - triangleCount++; - triangleCount++; } if(k == 0) { - nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - if(nodeIds[nodeId1] == std::numeric_limits::max()) + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) { - nodeIds[nodeId1] = nodeCount; - nodeCount++; - } - nodeId2 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - if(nodeIds[nodeId2] == std::numeric_limits::max()) - { - nodeIds[nodeId2] = nodeCount; - nodeCount++; - } - nodeId3 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - if(nodeIds[nodeId3] == std::numeric_limits::max()) - { - nodeIds[nodeId3] = nodeCount; - nodeCount++; - } - nodeId4 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - if(nodeIds[nodeId4] == std::numeric_limits::max()) - { - nodeIds[nodeId4] = nodeCount; - nodeCount++; + nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + if(nodeIds[nodeId1] == std::numeric_limits::max()) + { + nodeIds[nodeId1] = nodeCount; + nodeCount++; + } + nodeId2 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + if(nodeIds[nodeId2] == std::numeric_limits::max()) + { + nodeIds[nodeId2] = nodeCount; + nodeCount++; + } + nodeId3 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + if(nodeIds[nodeId3] == std::numeric_limits::max()) + { + nodeIds[nodeId3] = nodeCount; + nodeCount++; + } + nodeId4 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + if(nodeIds[nodeId4] == std::numeric_limits::max()) + { + nodeIds[nodeId4] = nodeCount; + nodeCount++; + } + triangleCount++; + triangleCount++; } - triangleCount++; - triangleCount++; } if(i == (xP - 1)) { - nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - if(nodeIds[nodeId1] == std::numeric_limits::max()) - { - nodeIds[nodeId1] = nodeCount; - nodeCount++; - } - nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - if(nodeIds[nodeId2] == std::numeric_limits::max()) + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) { - nodeIds[nodeId2] = nodeCount; - nodeCount++; - } - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - if(nodeIds[nodeId3] == std::numeric_limits::max()) - { - nodeIds[nodeId3] = nodeCount; - nodeCount++; - } - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - if(nodeIds[nodeId4] == std::numeric_limits::max()) - { - nodeIds[nodeId4] = nodeCount; - nodeCount++; + nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + if(nodeIds[nodeId1] == std::numeric_limits::max()) + { + nodeIds[nodeId1] = nodeCount; + nodeCount++; + } + nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + if(nodeIds[nodeId2] == std::numeric_limits::max()) + { + nodeIds[nodeId2] = nodeCount; + nodeCount++; + } + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + if(nodeIds[nodeId3] == std::numeric_limits::max()) + { + nodeIds[nodeId3] = nodeCount; + nodeCount++; + } + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + if(nodeIds[nodeId4] == std::numeric_limits::max()) + { + nodeIds[nodeId4] = nodeCount; + nodeCount++; + } + triangleCount++; + triangleCount++; } - triangleCount++; - triangleCount++; } else if(featureIds[point] != featureIds[neigh1]) { @@ -834,32 +858,35 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(j == (yP - 1)) { - nodeId1 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - if(nodeIds[nodeId1] == std::numeric_limits::max()) + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) { - nodeIds[nodeId1] = nodeCount; - nodeCount++; - } - nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - if(nodeIds[nodeId2] == std::numeric_limits::max()) - { - nodeIds[nodeId2] = nodeCount; - nodeCount++; - } - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - if(nodeIds[nodeId3] == std::numeric_limits::max()) - { - nodeIds[nodeId3] = nodeCount; - nodeCount++; - } - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - if(nodeIds[nodeId4] == std::numeric_limits::max()) - { - nodeIds[nodeId4] = nodeCount; - nodeCount++; + nodeId1 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + if(nodeIds[nodeId1] == std::numeric_limits::max()) + { + nodeIds[nodeId1] = nodeCount; + nodeCount++; + } + nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + if(nodeIds[nodeId2] == std::numeric_limits::max()) + { + nodeIds[nodeId2] = nodeCount; + nodeCount++; + } + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + if(nodeIds[nodeId3] == std::numeric_limits::max()) + { + nodeIds[nodeId3] = nodeCount; + nodeCount++; + } + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + if(nodeIds[nodeId4] == std::numeric_limits::max()) + { + nodeIds[nodeId4] = nodeCount; + nodeCount++; + } + triangleCount++; + triangleCount++; } - triangleCount++; - triangleCount++; } else if(featureIds[point] != featureIds[neigh2]) { @@ -892,32 +919,35 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(k == (zP - 1)) { - nodeId1 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - if(nodeIds[nodeId1] == std::numeric_limits::max()) - { - nodeIds[nodeId1] = nodeCount; - nodeCount++; - } - nodeId2 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - if(nodeIds[nodeId2] == std::numeric_limits::max()) - { - nodeIds[nodeId2] = nodeCount; - nodeCount++; - } - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - if(nodeIds[nodeId3] == std::numeric_limits::max()) - { - nodeIds[nodeId3] = nodeCount; - nodeCount++; - } - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - if(nodeIds[nodeId4] == std::numeric_limits::max()) + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) { - nodeIds[nodeId4] = nodeCount; - nodeCount++; + nodeId1 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + if(nodeIds[nodeId1] == std::numeric_limits::max()) + { + nodeIds[nodeId1] = nodeCount; + nodeCount++; + } + nodeId2 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + if(nodeIds[nodeId2] == std::numeric_limits::max()) + { + nodeIds[nodeId2] = nodeCount; + nodeCount++; + } + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + if(nodeIds[nodeId3] == std::numeric_limits::max()) + { + nodeIds[nodeId3] = nodeCount; + nodeCount++; + } + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + if(nodeIds[nodeId4] == std::numeric_limits::max()) + { + nodeIds[nodeId4] = nodeCount; + nodeCount++; + } + triangleCount++; + triangleCount++; } - triangleCount++; - triangleCount++; } else if(k < zP - 1 && featureIds[point] != featureIds[neigh3]) { @@ -1049,199 +1079,211 @@ void QuickSurfaceMesh::createNodesAndTriangles(std::vector& m_Nod if(i == 0) { - nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j, k, vertex, (m_NodeIds[nodeId1] * 3)); + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + { + nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j, k, vertex, (m_NodeIds[nodeId1] * 3)); - nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j + 1, k, vertex, (m_NodeIds[nodeId2] * 3)); + nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j + 1, k, vertex, (m_NodeIds[nodeId2] * 3)); - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - ::GetGridCoordinates(grid, i + 1, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + ::GetGridCoordinates(grid, i + 1, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId2]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId2]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId4]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId4]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId1]].insert(-1); - ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId2]].insert(-1); - ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId3]].insert(-1); - ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId4]].insert(-1); + ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId1]].insert(-1); + ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId2]].insert(-1); + ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId3]].insert(-1); + ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId4]].insert(-1); + } } if(j == 0) { - nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j, k, vertex, (m_NodeIds[nodeId1] * 3)); + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + { + nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j, k, vertex, (m_NodeIds[nodeId1] * 3)); - nodeId2 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j, k, vertex, (m_NodeIds[nodeId2] * 3)); + nodeId2 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j, k, vertex, (m_NodeIds[nodeId2] * 3)); - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId2]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId2]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId4]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId4]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId1]].insert(-1); - ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId2]].insert(-1); - ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId3]].insert(-1); - ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId4]].insert(-1); + ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId1]].insert(-1); + ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId2]].insert(-1); + ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId3]].insert(-1); + ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId4]].insert(-1); + } } if(k == 0) { - nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j, k, vertex, (m_NodeIds[nodeId1] * 3)); + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + { + nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j, k, vertex, (m_NodeIds[nodeId1] * 3)); - nodeId2 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j, k, vertex, (m_NodeIds[nodeId2] * 3)); + nodeId2 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j, k, vertex, (m_NodeIds[nodeId2] * 3)); - nodeId3 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j + 1, k, vertex, (m_NodeIds[nodeId3] * 3)); + nodeId3 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j + 1, k, vertex, (m_NodeIds[nodeId3] * 3)); - nodeId4 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j + 1, k, vertex, (m_NodeIds[nodeId4] * 3)); + nodeId4 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j + 1, k, vertex, (m_NodeIds[nodeId4] * 3)); - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId2]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId2]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId4]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId4]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId1]].insert(-1); - ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId2]].insert(-1); - ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId3]].insert(-1); - ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId4]].insert(-1); + ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId1]].insert(-1); + ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId2]].insert(-1); + ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId3]].insert(-1); + ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId4]].insert(-1); + } } if(i == (xP - 1)) // Takes care of the end of a Row... { - nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j, k, vertex, (m_NodeIds[nodeId1] * 3)); + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + { + nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j, k, vertex, (m_NodeIds[nodeId1] * 3)); - nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j + 1, k, vertex, (m_NodeIds[nodeId2] * 3)); + nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j + 1, k, vertex, (m_NodeIds[nodeId2] * 3)); - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId2]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId2]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId4]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId4]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId1]].insert(-1); - ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId2]].insert(-1); - ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId3]].insert(-1); - ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId4]].insert(-1); + ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId1]].insert(-1); + ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId2]].insert(-1); + ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId3]].insert(-1); + ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId4]].insert(-1); + } } else if(featureIds[point] != featureIds[neigh1]) { @@ -1309,52 +1351,55 @@ void QuickSurfaceMesh::createNodesAndTriangles(std::vector& m_Nod } if(j == (yP - 1)) // Takes care of the end of a column { - nodeId1 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j + 1, k, vertex, (m_NodeIds[nodeId1] * 3)); + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + { + nodeId1 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j + 1, k, vertex, (m_NodeIds[nodeId1] * 3)); - nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j + 1, k, vertex, (m_NodeIds[nodeId2] * 3)); + nodeId2 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j + 1, k, vertex, (m_NodeIds[nodeId2] * 3)); - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j + 1, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j + 1, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId2]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId2]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId4]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId4]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId3]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId1]].insert(-1); - ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId2]].insert(-1); - ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId3]].insert(-1); - ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId4]].insert(-1); + ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId1]].insert(-1); + ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId2]].insert(-1); + ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId3]].insert(-1); + ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId4]].insert(-1); + } } else if(featureIds[point] != featureIds[neigh2]) { @@ -1421,52 +1466,55 @@ void QuickSurfaceMesh::createNodesAndTriangles(std::vector& m_Nod } if(k == (zP - 1)) // Takes care of the end of a Pillar { - nodeId1 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j, k + 1, vertex, (m_NodeIds[nodeId1] * 3)); + if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + { + nodeId1 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j, k + 1, vertex, (m_NodeIds[nodeId1] * 3)); - nodeId2 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j, k + 1, vertex, (m_NodeIds[nodeId2] * 3)); + nodeId2 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j, k + 1, vertex, (m_NodeIds[nodeId2] * 3)); - nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); - ::GetGridCoordinates(grid, i + 1, j + 1, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); + nodeId3 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); + ::GetGridCoordinates(grid, i + 1, j + 1, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); - nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - ::GetGridCoordinates(grid, i, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); + nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; + ::GetGridCoordinates(grid, i, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId2]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId2]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; - triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; - triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId4]; - faceLabelsStore[triangleIndex * 2] = -1; - faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; + triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId2]; + triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; + triangle[triangleIndex * 3 + 2] = m_NodeIds[nodeId4]; + faceLabelsStore[triangleIndex * 2] = -1; + faceLabelsStore[triangleIndex * 2 + 1] = featureIds[point]; - for(const auto& tupleTransferFunction : tupleTransferFunctions) - { - tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); - } + for(const auto& tupleTransferFunction : tupleTransferFunctions) + { + tupleTransferFunction->quickSurfaceTransfer(triangleIndex, point, point, faceLabelsStore); + } - triangleIndex++; + triangleIndex++; - ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId1]].insert(-1); - ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId2]].insert(-1); - ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId3]].insert(-1); - ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); - ownerLists[m_NodeIds[nodeId4]].insert(-1); + ownerLists[m_NodeIds[nodeId1]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId1]].insert(-1); + ownerLists[m_NodeIds[nodeId2]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId2]].insert(-1); + ownerLists[m_NodeIds[nodeId3]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId3]].insert(-1); + ownerLists[m_NodeIds[nodeId4]].insert(featureIds[point]); + ownerLists[m_NodeIds[nodeId4]].insert(-1); + } } else if(featureIds[point] != featureIds[neigh3]) { diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp index 27bf7da0fa..e8f958f9d5 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp @@ -19,6 +19,7 @@ struct SIMPLNXCORE_EXPORT QuickSurfaceMeshInputValues bool FixProblemVoxels; bool RepairTriangleWinding; bool GenerateTripleLines; + bool OmitBoundingBoxSkin; DataPath GridGeomDataPath; DataPath FeatureIdsArrayPath; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp index bc0fba90bc..b937c8ff30 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp @@ -62,6 +62,10 @@ Parameters QuickSurfaceMeshFilter::parameters() const params.insert(std::make_unique(k_FixProblemVoxels_Key, "Attempt to Fix Problem Voxels", "See help page.", false)); params.insert(std::make_unique(k_RepairTriangleWinding_Key, "Attempt to Make Windings Consistent", "If true, attempts to repair the windings for the mesh. This may not be possible. See help page.", true)); + params.insert(std::make_unique(k_OmitBoundingBoxSkin_Key, "Omit Bounding Box Skin", + "Do not generate triangles that lie on the outer wall of the bounding box where the wall borders the background (Feature Id 0). Faces where the " + "wall caps a real Feature ARE still generated, so Features flush with the box stay closed.", + false)); // params.insert(std::make_unique(k_GenerateTripleLines_Key, "Generate Triple Lines", "Experimental feature. May not work.", false)); params.insert(std::make_unique(k_GridGeometryDataPath_Key, "Grid Geometry", "The complete path to the Grid Geometry from which to create a Triangle Geometry", DataPath{}, @@ -211,6 +215,7 @@ Result<> QuickSurfaceMeshFilter::executeImpl(DataStructure& dataStructure, const // inputValues.GenerateTripleLines = filterArgs.value(k_GenerateTripleLines_Key); inputValues.FixProblemVoxels = filterArgs.value(k_FixProblemVoxels_Key); inputValues.RepairTriangleWinding = filterArgs.value(k_RepairTriangleWinding_Key); + inputValues.OmitBoundingBoxSkin = filterArgs.value(k_OmitBoundingBoxSkin_Key); inputValues.GridGeomDataPath = filterArgs.value(k_GridGeometryDataPath_Key); inputValues.FeatureIdsArrayPath = filterArgs.value(k_CellFeatureIdsArrayPath_Key); diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp index a9dcc96f39..2420d0df37 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp @@ -28,6 +28,7 @@ class SIMPLNXCORE_EXPORT QuickSurfaceMeshFilter : public IFilter // static constexpr StringLiteral k_GenerateTripleLines_Key = "generate_triple_lines"; static constexpr StringLiteral k_RepairTriangleWinding_Key = "repair_triangle_winding"; static constexpr StringLiteral k_FixProblemVoxels_Key = "fix_problem_voxels"; + static constexpr StringLiteral k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; static constexpr StringLiteral k_GridGeometryDataPath_Key = "input_grid_geometry_path"; static constexpr StringLiteral k_CellFeatureIdsArrayPath_Key = "feature_ids_path"; static constexpr StringLiteral k_SelectedDataArrayPaths_Key = "input_data_array_paths"; diff --git a/src/Plugins/SimplnxCore/test/CMakeLists.txt b/src/Plugins/SimplnxCore/test/CMakeLists.txt index faf2d3bcc6..9f5646ab29 100644 --- a/src/Plugins/SimplnxCore/test/CMakeLists.txt +++ b/src/Plugins/SimplnxCore/test/CMakeLists.txt @@ -105,6 +105,7 @@ set(${PLUGIN_NAME}UnitTest_SRCS MoveDataTest.cpp MultiThresholdObjectsTest.cpp NearestPointFuseRegularGridsTest.cpp + OmitBoundingBoxSkinTest.cpp PadImageGeometryTest.cpp PartitionGeometryTest.cpp PipelineTest.cpp diff --git a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp new file mode 100644 index 0000000000..d947da7edb --- /dev/null +++ b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp @@ -0,0 +1,102 @@ +#include "SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp" +#include "SurfaceMeshingTestUtils.hpp" + +#include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" +#include "simplnx/Parameters/BoolParameter.hpp" +#include "simplnx/Parameters/MultiArraySelectionParameter.hpp" +#include "simplnx/UnitTest/UnitTestCommon.hpp" + +#include + +#include +#include +#include +#include + +using namespace nx::core; + +namespace +{ +const DataPath k_TriangleGeomPath({"QuickMesh"}); + +SurfaceMeshingTest::MeshResult RunQuickSurfaceMesh(bool flushWithBottom, bool omitSkin) +{ + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(flushWithBottom), k_TriangleGeomPath, omitSkin, + [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); +} +} // namespace + +TEST_CASE("SimplnxCore::QuickSurfaceMeshFilter: Omit Bounding Box Skin", "[SimplnxCore][QuickSurfaceMeshFilter]") +{ + UnitTest::LoadPlugins(); + + SECTION("Option off leaves the box skin over background in place") + { + SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMesh(true, false); + const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); + REQUIRE(labelPairs.count({-1, 0}) == 1); + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } + + SECTION("Option on removes only the background skin and keeps the cylinder closed") + { + SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMesh(true, true); + const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); + + // The artificial background skin is gone. + REQUIRE(labelPairs.count({-1, 0}) == 0); + // The cylinder's bottom cap survives -- this is the issue-2 fix. + REQUIRE(labelPairs.count({-1, 1}) == 1); + // The cylinder wall is untouched. + REQUIRE(labelPairs.count({0, 1}) == 1); + + // With the cap kept, the cylinder is a closed surface. + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); + const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); + REQUIRE(SurfaceMeshingTest::IsWatertight(triangleGeom)); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } + + SECTION("Option on is a no-op when nothing touches the wall except background") + { + // Inset cylinder: the whole box wall is background, so ALL skin is dropped and only + // the cylinder surface remains -- which is closed on its own. + SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMesh(false, true); + const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); + REQUIRE(labelPairs.count({-1, 0}) == 0); + REQUIRE(labelPairs.count({-1, 1}) == 0); + REQUIRE(labelPairs.count({0, 1}) == 1); + + const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); + REQUIRE(SurfaceMeshingTest::IsWatertight(triangleGeom)); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } + + SECTION("Node Types of surviving nodes match the full mesh") + { + SurfaceMeshingTest::MeshResult fullMesh = RunQuickSurfaceMesh(true, false); + SurfaceMeshingTest::MeshResult prunedMesh = RunQuickSurfaceMesh(true, true); + + const DataPath nodeTypesPath = k_TriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + const auto& fullVertsRef = fullMesh.Structure.getDataRefAs(k_TriangleGeomPath).getVertices()->getDataStoreRef(); + const auto& fullTypesRef = fullMesh.Structure.getDataRefAs(nodeTypesPath).getDataStoreRef(); + const auto& prunedVertsRef = prunedMesh.Structure.getDataRefAs(k_TriangleGeomPath).getVertices()->getDataStoreRef(); + const auto& prunedTypesRef = prunedMesh.Structure.getDataRefAs(nodeTypesPath).getDataStoreRef(); + + // Map full-mesh vertex coordinate -> node type, then check every surviving vertex agrees. + std::map, int8> fullTypeByCoord; + for(usize i = 0; i < fullTypesRef.getNumberOfTuples(); i++) + { + fullTypeByCoord[{fullVertsRef[i * 3], fullVertsRef[i * 3 + 1], fullVertsRef[i * 3 + 2]}] = fullTypesRef[i]; + } + + for(usize i = 0; i < prunedTypesRef.getNumberOfTuples(); i++) + { + const std::tuple coord = {prunedVertsRef[i * 3], prunedVertsRef[i * 3 + 1], prunedVertsRef[i * 3 + 2]}; + REQUIRE(fullTypeByCoord.count(coord) == 1); + REQUIRE(fullTypeByCoord[coord] == prunedTypesRef[i]); + } + } +} diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp index 0f607f666c..0cef2769f8 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -2,12 +2,17 @@ #include "simplnx/DataStructure/AttributeMatrix.hpp" #include "simplnx/DataStructure/DataArray.hpp" +#include "simplnx/DataStructure/DataPath.hpp" #include "simplnx/DataStructure/DataStructure.hpp" #include "simplnx/DataStructure/Geometry/ImageGeom.hpp" #include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" +#include "simplnx/Filter/Arguments.hpp" +#include "simplnx/Parameters/MultiArraySelectionParameter.hpp" +#include "simplnx/UnitTest/UnitTestCommon.hpp" #include #include +#include #include namespace SurfaceMeshingTest @@ -19,6 +24,10 @@ inline constexpr usize k_CylinderRadius = 3; inline constexpr usize k_CylinderCenter = 6; inline constexpr usize k_CylinderTopZ = 8; +// The ImageGeom/CellData/FeatureIds layout every builder in this file produces. +inline const DataPath k_ImageGeomPath({"ImageGeom"}); +inline const DataPath k_FeatureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); + /** * @brief Builds a 12x12x12 ImageGeom holding a Z-axis cylinder (Feature Id 1) in a * background of Feature Id 0. The cylinder is always inset from the four X/Y walls and @@ -178,4 +187,72 @@ inline bool IsWatertight(const TriangleGeom& triangleGeom) const EdgeUseCounts counts = CountEdgeUses(triangleGeom); return counts.TotalEdges > 0 && counts.EdgesUsedOnce == 0 && counts.EdgesUsedMoreThanTwice == 0; } + +/** + * @brief Result of running a surface meshing filter: the DataStructure it produced, plus the + * paths to the created Triangle Geometry and its Face Labels array. + */ +struct MeshResult +{ + DataStructure Structure; + DataPath TriangleGeomPath; + DataPath FaceLabelsPath; +}; + +/** + * @brief Runs a surface meshing filter (QuickSurfaceMeshFilter, SurfaceNetsFilter, or + * M3CSurfaceMeshingFilter) on the given DataStructure, setting every argument that is common to + * all three meshers, then invoking addExtraArgs to set the mesher-specific ones (e.g. Fix Problem + * Voxels, smoothing options). Every mesher shares the same parameter key names for the arguments + * set here, so callers only need to supply the pieces that differ. + * @param dataStructure Input DataStructure, e.g. from CreateCylinderInBox(). + * @param triangleGeomPath Path at which to create the Triangle Geometry. + * @param omitSkin Value for the Omit Bounding Box Skin parameter. + * @param addExtraArgs Callback that inserts the mesher-specific arguments into the Arguments object. + */ +template +inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs) +{ + MeshResult meshResult; + meshResult.Structure = std::move(dataStructure); + meshResult.TriangleGeomPath = triangleGeomPath; + meshResult.FaceLabelsPath = triangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); + + FilterT filter; + Arguments args; + args.insertOrAssign(FilterT::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); + args.insertOrAssign(FilterT::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); + args.insertOrAssign(FilterT::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(FilterT::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(FilterT::k_CreatedTriangleGeometryPath_Key, std::make_any(triangleGeomPath)); + args.insertOrAssign(FilterT::k_VertexDataGroupName_Key, std::make_any("Vertex Data")); + args.insertOrAssign(FilterT::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); + args.insertOrAssign(FilterT::k_FaceDataGroupName_Key, std::make_any("Face Data")); + args.insertOrAssign(FilterT::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); + args.insertOrAssign(FilterT::k_RepairTriangleWinding_Key, std::make_any(false)); + args.insertOrAssign(FilterT::k_OmitBoundingBoxSkin_Key, std::make_any(omitSkin)); + + addExtraArgs(args); + + auto preflightResult = filter.preflight(meshResult.Structure, args); + SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); + auto executeResult = filter.execute(meshResult.Structure, args); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); + + return meshResult; +} + +/** + * @brief Collects the distinct {comp0, comp1} Face Labels pairs present in a mesh result. + */ +inline std::set> CollectLabelPairs(const MeshResult& meshResult) +{ + const auto& faceLabelsRef = meshResult.Structure.getDataRefAs(meshResult.FaceLabelsPath).getDataStoreRef(); + std::set> labelPairs; + for(usize i = 0; i < faceLabelsRef.getNumberOfTuples(); i++) + { + labelPairs.insert({faceLabelsRef[i * 2], faceLabelsRef[i * 2 + 1]}); + } + return labelPairs; +} } // namespace SurfaceMeshingTest From 662dd61647d71274c780bbcc26929c021fe1beb4 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 18:56:17 -0400 Subject: [PATCH 08/24] FIX: bump QuickSurfaceMeshFilter parametersVersion for new bool key Adding k_OmitBoundingBoxSkin_Key without bumping parametersVersion() would cause every saved pipeline predating this change to emit a "Parameter key not found in JSON" warning on load, per the existing 1->2 precedent in this same file. Bump 2->3 and document the migration inline. Co-Authored-By: Claude Opus 5 --- .../src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp index b937c8ff30..f2a4723c3b 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp @@ -104,7 +104,12 @@ Parameters QuickSurfaceMeshFilter::parameters() const //------------------------------------------------------------------------------ IFilter::VersionType QuickSurfaceMeshFilter::parametersVersion() const { - return 2; + return 3; + // Version 2 -> 3 + // Change 1: + // Added - k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; + // Solution - set the value to false (preserves prior behavior); + // // Version 1 -> 2 // Change 1: // Added - k_RepairTriangleWinding_Key = "repair_triangle_winding"; From 6fd218afb4c6374ca9cc029e026c7cef83140dcd Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 19:11:42 -0400 Subject: [PATCH 09/24] FEAT: add Omit Bounding Box Skin to SurfaceNets The predicate runs on raw quadLabels in both the counting and emit passes, where MMSurfaceNet::Padding is still distinct from Feature Id 0. Because SurfaceNets vertices come from the cell map before triangles exist, add an explicit vertex compaction pass for vertices orphaned by dropped faces. --- .../Filters/Algorithms/SurfaceNets.cpp | 106 +++++++++++++++++- .../Filters/Algorithms/SurfaceNets.hpp | 1 + .../SimplnxCore/Filters/SurfaceNetsFilter.cpp | 12 +- .../SimplnxCore/Filters/SurfaceNetsFilter.hpp | 1 + .../test/OmitBoundingBoxSkinTest.cpp | 65 +++++++++++ 5 files changed, 178 insertions(+), 7 deletions(-) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp index 90dde7ebfa..5c944fd78b 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp @@ -13,6 +13,9 @@ #include "SimplnxCore/SurfaceNets/MMGeometryOBJ.h" #include "SimplnxCore/SurfaceNets/MMSurfaceNet.h" +#include +#include + using namespace nx::core; namespace @@ -74,6 +77,21 @@ void getQuadTriangleIDs(std::array& vData, bool isQuadFrontFacing triangleVtxIDs[4] = vData[2].VertexId; triangleVtxIDs[5] = vData[3].VertexId; } + +/** + * @brief True when this quad is bounding-box wall backed by background and must be skipped. + * Called from both the counting pass and the emit pass -- they must agree exactly. + * Note this reads the RAW quadLabels, where MMSurfaceNet::Padding is still distinct from a + * real Feature Id 0. Do not call it after the Padding -> -1 remap. + */ +inline bool SkipPaddingQuad(bool omitBoundingBoxSkin, const std::array& quadLabels) +{ + if(!omitBoundingBoxSkin) + { + return false; + } + return (quadLabels[0] == MMSurfaceNet::Padding && quadLabels[1] == 0) || (quadLabels[1] == MMSurfaceNet::Padding && quadLabels[0] == 0); +} } // namespace // ----------------------------------------------------------------------------- SurfaceNets::SurfaceNets(DataStructure& dataStructure, const IFilter::MessageHandler& mesgHandler, const std::atomic_bool& shouldCancel, SurfaceNetsInputValues* inputValues) @@ -160,15 +178,24 @@ Result<> SurfaceNets::operator()() if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::BackBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - triangleCount += 2; + if(!::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) + { + triangleCount += 2; + } } if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - triangleCount += 2; + if(!::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) + { + triangleCount += 2; + } } if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBackEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - triangleCount += 2; + if(!::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) + { + triangleCount += 2; + } } } @@ -213,7 +240,8 @@ Result<> SurfaceNets::operator()() { cellMapPtr->getVertexCellIndex(idxVtx, cellIndex.data()); // Back-bottom edge - if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::BackBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) + if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::BackBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data()) && + !::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) { vData[0] = {vertexIndices[0], 00.0f, 0.0f, 0.0f}; vData[1] = {vertexIndices[1], 00.0f, 0.0f, 0.0f}; @@ -275,7 +303,8 @@ Result<> SurfaceNets::operator()() } // Left-bottom edge - if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) + if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data()) && + !::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) { vData[0] = {vertexIndices[0], 00.0f, 0.0f, 0.0f}; vData[1] = {vertexIndices[1], 00.0f, 0.0f, 0.0f}; @@ -335,7 +364,8 @@ Result<> SurfaceNets::operator()() } // Left-back edge - if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBackEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) + if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBackEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data()) && + !::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) { vData[0] = {vertexIndices[0], 00.0f, 0.0f, 0.0f}; vData[1] = {vertexIndices[1], 00.0f, 0.0f, 0.0f}; @@ -395,6 +425,70 @@ Result<> SurfaceNets::operator()() } } + // Dropping faces can orphan vertices, which come from the cell map before any triangle + // exists. Compact them so the vertex list, Node Types and vertex AttributeMatrix agree. + // Skipped entirely when the option is off, because then no face was dropped. + if(m_InputValues->OmitBoundingBoxSkin) + { + m_MessageHandler("Removing vertices orphaned by omitted bounding box faces..."); + + auto& facesRef = triangleGeom.getFaces()->getDataStoreRef(); + const usize numFaceIndices = triangleCount * 3; + + // First pass: find which of the nodeCount vertices are actually referenced by a face. + std::vector isReferenced(nodeCount, false); + for(usize i = 0; i < numFaceIndices; i++) + { + isReferenced[static_cast(facesRef[i])] = true; + } + + // Second pass: assign new indices in ascending order of OLD index (not order of first + // use in the face list). This guarantees newVertexIndex[oldIndex] <= oldIndex for every + // referenced vertex, which is what makes the in-place compaction below safe -- a + // destination slot is always at or before its source slot, so writing it never clobbers + // data that a later iteration still needs to read. + constexpr usize k_NotUsed = std::numeric_limits::max(); + std::vector newVertexIndex(nodeCount, k_NotUsed); + usize survivingVertexCount = 0; + for(usize oldIndex = 0; oldIndex < nodeCount; oldIndex++) + { + if(isReferenced[oldIndex]) + { + newVertexIndex[oldIndex] = survivingVertexCount; + survivingVertexCount++; + } + } + + if(survivingVertexCount < nodeCount) + { + auto& verticesRef = triangleGeom.getVertices()->getDataStoreRef(); + // Compact in place. Safe because newVertexIndex[oldIndex] <= oldIndex (see above). + for(usize oldIndex = 0; oldIndex < nodeCount; oldIndex++) + { + const usize destIndex = newVertexIndex[oldIndex]; + if(destIndex == k_NotUsed) + { + continue; + } + for(usize comp = 0; comp < 3; comp++) + { + verticesRef[destIndex * 3 + comp] = verticesRef[oldIndex * 3 + comp]; + } + nodeTypes[destIndex] = nodeTypes[oldIndex]; + } + + // Remap the face indices to the compacted vertex ids. + for(usize i = 0; i < numFaceIndices; i++) + { + facesRef[i] = static_cast(newVertexIndex[static_cast(facesRef[i])]); + } + + triangleGeom.resizeVertexList(survivingVertexCount); + triangleGeom.getVertexAttributeMatrix()->resizeTuples({survivingVertexCount}); + nodeTypes.resizeTuples({survivingVertexCount}); + } + } + // Scoped because we invalidate connectivity at the end Result<> windingResult = {}; if(m_InputValues->RepairTriangleWinding) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.hpp index 27a7c621ef..7e6be588a6 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.hpp @@ -14,6 +14,7 @@ struct SIMPLNXCORE_EXPORT SurfaceNetsInputValues { bool ApplySmoothing; bool RepairTriangleWinding; + bool OmitBoundingBoxSkin; int32 SmoothingIterations; float32 MaxDistanceFromVoxel; float32 RelaxationFactor; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.cpp index c9fb9862b7..ccccbd3fc7 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.cpp @@ -59,6 +59,10 @@ Parameters SurfaceNetsFilter::parameters() const params.insertSeparator(Parameters::Separator{"Input Parameter(s)"}); params.insert(std::make_unique(k_RepairTriangleWinding_Key, "Attempt to Make Windings Consistent", "If true, attempts to repair the windings for the mesh. This may not be possible. See help page.", true)); + params.insert(std::make_unique(k_OmitBoundingBoxSkin_Key, "Omit Bounding Box Skin", + "Do not generate triangles that lie on the outer wall of the bounding box where the wall borders the background (Feature Id 0). Faces where the " + "wall caps a real Feature ARE still generated, so Features flush with the box stay closed.", + false)); params.insertLinkableParameter(std::make_unique(k_ApplySmoothing_Key, "Apply smoothing operations", "Use the built in smoothing operation.", false)); params.insert(std::make_unique(k_SmoothingIterations_Key, "Relaxation Iterations", "Number of relaxation iterations to perform. More iterations causes more smoothing.", 20)); @@ -108,7 +112,12 @@ Parameters SurfaceNetsFilter::parameters() const //------------------------------------------------------------------------------ IFilter::VersionType SurfaceNetsFilter::parametersVersion() const { - return 1; + return 2; + // Version 1 -> 2 + // Change 1: + // Added - k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; + // Solution - set the value to false (preserves prior behavior); + // } //------------------------------------------------------------------------------ @@ -201,6 +210,7 @@ Result<> SurfaceNetsFilter::executeImpl(DataStructure& dataStructure, const Argu inputValues.ApplySmoothing = filterArgs.value(k_ApplySmoothing_Key); inputValues.RepairTriangleWinding = filterArgs.value(k_RepairTriangleWinding_Key); + inputValues.OmitBoundingBoxSkin = filterArgs.value(k_OmitBoundingBoxSkin_Key); inputValues.SmoothingIterations = filterArgs.value(k_SmoothingIterations_Key); inputValues.MaxDistanceFromVoxel = filterArgs.value(k_MaxDistanceFromVoxelCenter_Key); inputValues.RelaxationFactor = filterArgs.value(k_RelaxationFactor_Key); diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.hpp index e0fa0f1f8f..bd8e1df597 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.hpp @@ -40,6 +40,7 @@ class SIMPLNXCORE_EXPORT SurfaceNetsFilter : public IFilter static constexpr StringLiteral k_ApplySmoothing_Key = "apply_smoothing"; static constexpr StringLiteral k_RepairTriangleWinding_Key = "repair_triangle_winding"; + static constexpr StringLiteral k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; static constexpr StringLiteral k_SmoothingIterations_Key = "smoothing_iterations"; static constexpr StringLiteral k_MaxDistanceFromVoxelCenter_Key = "max_distance_from_voxel"; static constexpr StringLiteral k_RelaxationFactor_Key = "relaxation_factor"; diff --git a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp index d947da7edb..aa71896951 100644 --- a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp +++ b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp @@ -1,4 +1,5 @@ #include "SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp" +#include "SimplnxCore/Filters/SurfaceNetsFilter.hpp" #include "SurfaceMeshingTestUtils.hpp" #include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" @@ -100,3 +101,67 @@ TEST_CASE("SimplnxCore::QuickSurfaceMeshFilter: Omit Bounding Box Skin", "[Simpl } } } + +namespace +{ +const DataPath k_SurfaceNetsTriangleGeomPath({"SurfaceNets"}); + +SurfaceMeshingTest::MeshResult RunSurfaceNets(bool flushWithBottom, bool omitSkin) +{ + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(flushWithBottom), k_SurfaceNetsTriangleGeomPath, omitSkin, [](Arguments& args) { + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); + args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); + args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); + }); +} +} // namespace + +TEST_CASE("SimplnxCore::SurfaceNetsFilter: Omit Bounding Box Skin", "[SimplnxCore][SurfaceNetsFilter]") +{ + UnitTest::LoadPlugins(); + + SECTION("Option off leaves the box skin over background in place") + { + SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNets(true, false); + REQUIRE(SurfaceMeshingTest::CollectLabelPairs(meshResult).count({-1, 0}) == 1); + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } + + SECTION("Option on removes only the background skin and keeps the cylinder closed") + { + SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNets(true, true); + const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); + REQUIRE(labelPairs.count({-1, 0}) == 0); + REQUIRE(labelPairs.count({-1, 1}) == 1); + REQUIRE(labelPairs.count({0, 1}) == 1); + + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); + const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); + REQUIRE(SurfaceMeshingTest::IsWatertight(triangleGeom)); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } + + SECTION("Option on leaves no orphan vertices") + { + SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNets(true, true); + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); + const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); + const auto& facesRef = triangleGeom.getFaces()->getDataStoreRef(); + + std::set referencedVertices; + for(usize i = 0; i < triangleGeom.getNumberOfFaces() * 3; i++) + { + referencedVertices.insert(static_cast(facesRef[i])); + } + REQUIRE(referencedVertices.size() == triangleGeom.getNumberOfVertices()); + + const DataPath nodeTypesPath = meshResult.TriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(nodeTypesPath)); + const auto& nodeTypesRef = meshResult.Structure.getDataRefAs(nodeTypesPath).getDataStoreRef(); + REQUIRE(nodeTypesRef.getNumberOfTuples() == triangleGeom.getNumberOfVertices()); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } +} From b92813dfe8b0548681d3b73d328bf9c093ef60fb Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Mon, 10 Aug 2026 19:56:32 -0400 Subject: [PATCH 10/24] FEAT: add Omit Bounding Box Skin to M3CSurfaceMeshing M3C's counting pass is topology-only and never derives per-triangle labels, so the skip cannot happen there without duplicating case-generator logic across three byte-identical sweep paths. Prune the scratch triangle/mCubeID vectors at the top of finalizeMesh instead -- before the +10 promotion and before any output array is sized, so the output geometry is still exactly sized. Orphaned candidate nodes are cleared from nodeType so the existing nodeType > 0 prefix-scan compaction drops them from the vertex list. Node Types after omitting the skin were verified to match the full mesh exactly (divergentCount == 0 on the standard test cylinder), unlike SurfaceNets/QuickSurfaceMesh which make no such claim for M3C but happen to satisfy it here. Generalized SurfaceMeshingTestUtils' RunMesher to work with M3C's differently named Cell Feature Ids parameter key via a FeatureIdsKeyTrait specialization, without forking the helper or touching QuickSurfaceMesh/SurfaceNets call sites. Co-Authored-By: Claude Opus 5 --- .../Filters/Algorithms/M3CSurfaceMeshing.cpp | 59 +++++++- .../Filters/Algorithms/M3CSurfaceMeshing.hpp | 1 + .../Filters/M3CSurfaceMeshingFilter.cpp | 12 +- .../Filters/M3CSurfaceMeshingFilter.hpp | 1 + .../test/M3CSurfaceMeshingTest.cpp | 135 ++++++++++++++++-- .../test/OmitBoundingBoxSkinTest.cpp | 96 +++++++++++++ .../test/SurfaceMeshingTestUtils.hpp | 25 +++- 7 files changed, 310 insertions(+), 19 deletions(-) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp index 226dee276c..3fc1fab6c2 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp @@ -2535,13 +2535,60 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput { const int64 nTriangle = static_cast(triangles.size()); + // Omit Bounding Box Skin: drop faces whose output Face Labels would be {-1, 0}. In the + // internal representation that is one negative ghost label paired with maxGrainId, which + // is the renumbered zero-feature (see toFaceLabel below). Pruning the scratch vectors here + // means the output TriangleGeom is sized from the surviving count and never over-allocated. + if(inputValues->OmitBoundingBoxSkin) + { + messageHandler("Omitting bounding box skin faces..."); + + const auto isBackgroundSkin = [maxGrainId](const Triangle& triangle) -> bool { + const int spinA = triangle.nSpin[0]; + const int spinB = triangle.nSpin[1]; + return (spinA < 0 && spinB == maxGrainId) || (spinB < 0 && spinA == maxGrainId); + }; + + int64 survivingCount = 0; + for(int64 i = 0; i < nTriangle; i++) + { + if(!isBackgroundSkin(triangles[static_cast(i)])) + { + triangles[static_cast(survivingCount)] = triangles[static_cast(i)]; + mCubeID[static_cast(survivingCount)] = mCubeID[static_cast(i)]; + survivingCount++; + } + } + triangles.resize(static_cast(survivingCount)); + mCubeID.resize(static_cast(survivingCount)); + + // Clear nodeType for candidates no longer referenced by any surviving triangle, so the + // existing "nodeType > 0" prefix-scan compaction below drops them from the vertex list. + std::vector isReferenced(nodeType.size(), false); + for(const auto& triangle : triangles) + { + isReferenced[static_cast(triangle.node_id[0])] = true; + isReferenced[static_cast(triangle.node_id[1])] = true; + isReferenced[static_cast(triangle.node_id[2])] = true; + } + for(usize i = 0; i < nodeType.size(); i++) + { + if(!isReferenced[i]) + { + nodeType[i] = 0; + } + } + } + + const int64 nTriangleFinal = static_cast(triangles.size()); + // Promote surface nodes to their exterior variant (+10). A triangle that borders the outside of the // volume has exactly one negative feature label (nSpin[0]*nSpin[1] < 0), so each of its nodes lies on // the volume boundary. This is the only output-relevant effect of the legacy triangle-side/inner-edge // connectivity pass: the per-triangle edge ids, edgePlace flags, and unique inner-edge list it also // built never appear in the output (Triangle Geometry + Face Labels + Node Types), so that machinery // has been removed. - for(int64 j = 0; j < nTriangle; j++) + for(int64 j = 0; j < nTriangleFinal; j++) { if(triangles[j].nSpin[0] * triangles[j].nSpin[1] < 0) { @@ -2604,15 +2651,15 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput auto& triangleGeom = dataStructure.getDataRefAs(inputValues->TriangleGeometryPath); triangleGeom.resizeVertexList(static_cast(nNodes)); - triangleGeom.resizeFaceList(static_cast(nTriangle)); + triangleGeom.resizeFaceList(static_cast(nTriangleFinal)); triangleGeom.getVertexAttributeMatrix()->resizeTuples({static_cast(nNodes)}); - triangleGeom.getFaceAttributeMatrix()->resizeTuples({static_cast(nTriangle)}); + triangleGeom.getFaceAttributeMatrix()->resizeTuples({static_cast(nTriangleFinal)}); auto& vertexStore = triangleGeom.getVertices()->getDataStoreRef(); auto& triStore = triangleGeom.getFaces()->getDataStoreRef(); auto& faceLabels = dataStructure.getDataRefAs(inputValues->FaceLabelsDataPath).getDataStoreRef(); auto& nodeTypesOut = dataStructure.getDataRefAs(inputValues->NodeTypesDataPath).getDataStoreRef(); - faceLabels.resizeTuples({static_cast(nTriangle)}); + faceLabels.resizeTuples({static_cast(nTriangleFinal)}); nodeTypesOut.resizeTuples({static_cast(nNodes)}); // Compact nodes: scatter coordinates + node types to their new (sequential) ids. Walking candidates @@ -2638,7 +2685,7 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput const auto toFaceLabel = [maxGrainId](int nSpin) -> int32 { return (nSpin < 0) ? -1 : ((nSpin == maxGrainId) ? 0 : nSpin); }; // Triangles: remap to compacted node ids and write the ordered FaceLabels. - for(int64 i = 0; i < nTriangle; i++) + for(int64 i = 0; i < nTriangleFinal; i++) { triStore[static_cast(i) * 3 + 0] = static_cast(compactedNodeId(triangles[i].node_id[0])); triStore[static_cast(i) * 3 + 1] = static_cast(compactedNodeId(triangles[i].node_id[1])); @@ -2668,7 +2715,7 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput AddFeatureTupleTransferInstance(dataStructure, inputValues->SelectedFeatureDataArrayPaths[i], inputValues->CreatedDataArrayPaths[numCellArrays + i], inputValues->FeatureIdsArrayPath, transfers); } - for(int64 i = 0; i < nTriangle; i++) + for(int64 i = 0; i < nTriangleFinal; i++) { // Match the smaller-first FaceLabel ordering above so each transferred component aligns with // the feature in the same FaceLabels component. diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.hpp index 71fc8b38e1..afc2101a8b 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.hpp @@ -14,6 +14,7 @@ namespace nx::core struct SIMPLNXCORE_EXPORT M3CSurfaceMeshingInputValues { bool RepairTriangleWinding; + bool OmitBoundingBoxSkin; DataPath GridGeomDataPath; DataPath FeatureIdsArrayPath; MultiArraySelectionParameter::ValueType SelectedCellDataArrayPaths; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.cpp index 804846cfbe..ecdf1be58e 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.cpp @@ -59,6 +59,10 @@ Parameters M3CSurfaceMeshingFilter::parameters() const "If true, runs a winding-consistency repair pass after meshing. The M3C per-triangle winding heuristic does not " "guarantee globally consistent normals, so this is recommended.", true)); + params.insert(std::make_unique(k_OmitBoundingBoxSkin_Key, "Omit Bounding Box Skin", + "Do not generate triangles that lie on the outer wall of the bounding box where the wall borders the background (Feature Id 0). Faces where the " + "wall caps a real Feature ARE still generated, so Features flush with the box stay closed.", + false)); params.insertSeparator(Parameters::Separator{"Input Data Objects"}); params.insert(std::make_unique(k_GridGeometryDataPath_Key, "Image Geometry", "The complete path to the Image Geometry from which to create a Triangle Geometry", @@ -96,7 +100,12 @@ Parameters M3CSurfaceMeshingFilter::parameters() const //------------------------------------------------------------------------------ IFilter::VersionType M3CSurfaceMeshingFilter::parametersVersion() const { - return 1; + return 2; + // Version 1 -> 2 + // Change 1: + // Added - k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; + // Solution - set the value to false (preserves prior behavior); + // } //------------------------------------------------------------------------------ @@ -186,6 +195,7 @@ Result<> M3CSurfaceMeshingFilter::executeImpl(DataStructure& dataStructure, cons M3CSurfaceMeshingInputValues inputValues; inputValues.RepairTriangleWinding = filterArgs.value(k_RepairTriangleWinding_Key); + inputValues.OmitBoundingBoxSkin = filterArgs.value(k_OmitBoundingBoxSkin_Key); inputValues.GridGeomDataPath = filterArgs.value(k_GridGeometryDataPath_Key); inputValues.FeatureIdsArrayPath = filterArgs.value(k_FeatureIdsArrayPath_Key); inputValues.SelectedCellDataArrayPaths = filterArgs.value(k_SelectedDataArrayPaths_Key); diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp index 4d2570cc80..157cfff1d3 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp @@ -39,6 +39,7 @@ class SIMPLNXCORE_EXPORT M3CSurfaceMeshingFilter : public IFilter static constexpr StringLiteral k_SelectedDataArrayPaths_Key = "input_data_array_paths"; static constexpr StringLiteral k_SelectedFeatureDataArrayPaths_Key = "input_feature_data_array_paths"; static constexpr StringLiteral k_RepairTriangleWinding_Key = "repair_triangle_winding"; + static constexpr StringLiteral k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; static constexpr StringLiteral k_CreatedTriangleGeometryPath_Key = "output_triangle_geometry_path"; diff --git a/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp b/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp index f1f044621f..1cd21dd90c 100644 --- a/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp +++ b/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp @@ -1,5 +1,6 @@ #include "SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp" #include "SimplnxCore/SimplnxCore_test_dirs.hpp" +#include "SurfaceMeshingTestUtils.hpp" #include "simplnx/Core/Application.hpp" #include "simplnx/DataStructure/AttributeMatrix.hpp" @@ -17,7 +18,9 @@ #include +#include #include +#include using namespace nx::core; using namespace nx::core::UnitTest; @@ -284,40 +287,35 @@ void RunM3COnToy(usize xDim, usize yDim, usize zDim, LabelFuncT&& labeler, [[may // This is the minimal deterministic regression for the null-neighbor crash in treat_anomaly. TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Checkerboard Saddle", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy( - 8, 8, 8, [](usize x, usize y, usize z) -> int32 { return static_cast(((x + y + z) & 1U) + 1); }, "M3CSurfaceMeshingFilterTest_Checkerboard.dream3d"); + RunM3COnToy(8, 8, 8, [](usize x, usize y, usize z) -> int32 { return static_cast(((x + y + z) & 1U) + 1); }, "M3CSurfaceMeshingFilterTest_Checkerboard.dream3d"); } // 8-label octant pattern (1 + x%2 + 2*(y%2) + 4*(z%2)): a repeating 2x2x2 of 8 distinct labels, so // squares present 4 distinct corners (quad points, get_square_index == 19) plus triple configs. TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Octant Quad Points", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy( - 8, 8, 8, [](usize x, usize y, usize z) -> int32 { return static_cast(1 + (x & 1U) + 2 * (y & 1U) + 4 * (z & 1U)); }, "M3CSurfaceMeshingFilterTest_Octant.dream3d"); + RunM3COnToy(8, 8, 8, [](usize x, usize y, usize z) -> int32 { return static_cast(1 + (x & 1U) + 2 * (y & 1U) + 4 * (z & 1U)); }, "M3CSurfaceMeshingFilterTest_Octant.dream3d"); } // Three regions meeting along a vertical line (L-shaped split) => triple lines // (get_square_index in {7,11,13,14}) plus ordinary binary interfaces. TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Triple Line", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy( - 8, 8, 8, [](usize x, usize y, usize /*z*/) -> int32 { return (x < 4) ? 1 : ((y < 4) ? 2 : 3); }, "M3CSurfaceMeshingFilterTest_TripleLine.dream3d"); + RunM3COnToy(8, 8, 8, [](usize x, usize y, usize /*z*/) -> int32 { return (x < 4) ? 1 : ((y < 4) ? 2 : 3); }, "M3CSurfaceMeshingFilterTest_TripleLine.dream3d"); } // Single isolated interior voxel in a uniform matrix: the four neighboring squares are [B,A,A,A] // rotations, exercising get_square_index in {3,6,9,12} (the single-corner binary configurations). TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Single Voxel Inclusion", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy( - 8, 8, 8, [](usize x, usize y, usize z) -> int32 { return (x == 4 && y == 4 && z == 4) ? 2 : 1; }, "M3CSurfaceMeshingFilterTest_Inclusion.dream3d"); + RunM3COnToy(8, 8, 8, [](usize x, usize y, usize z) -> int32 { return (x == 4 && y == 4 && z == 4) ? 2 : 1; }, "M3CSurfaceMeshingFilterTest_Inclusion.dream3d"); } // Interleaved 3-label tiling (rows "1 2" / "3 1"): squares [1,2,1,3] and [2,1,3,1] have all edges // differing with exactly one diagonal equal, exercising get_square_index 17 and 18. TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Interleaved Diagonal", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy( - 8, 8, 8, [](usize x, usize y, usize /*z*/) -> int32 { return (y % 2 == 0) ? ((x % 2 == 0) ? 1 : 2) : ((x % 2 == 0) ? 3 : 1); }, "M3CSurfaceMeshingFilterTest_Interleaved.dream3d"); + RunM3COnToy(8, 8, 8, [](usize x, usize y, usize /*z*/) -> int32 { return (y % 2 == 0) ? ((x % 2 == 0) ? 1 : 2) : ((x % 2 == 0) ? 3 : 1); }, "M3CSurfaceMeshingFilterTest_Interleaved.dream3d"); } TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: SIMPL Backwards Compatibility", "[SimplnxCore][M3CSurfaceMeshingFilter][BackwardsCompatibility]") @@ -524,3 +522,120 @@ TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Exemplar Comparison", "[Simplnx UnitTest::CheckArraysInheritTupleDims(dataStructure); } + +namespace +{ +// Temporarily sets (or clears) an environment variable for the lifetime of the object, restoring +// whatever was there before on destruction. Used below to select M3C's sweep path, which is read +// once from the environment at the top of M3CSurfaceMeshing::operator()(). +class ScopedEnvVar +{ +public: + ScopedEnvVar(std::string name, const char* value) + : m_Name(std::move(name)) + { + if(const char* previous = std::getenv(m_Name.c_str()); previous != nullptr) + { + m_HadPrevious = true; + m_PreviousValue = previous; + } + if(value != nullptr) + { + setenv(m_Name.c_str(), value, 1); + } + else + { + unsetenv(m_Name.c_str()); + } + } + + ~ScopedEnvVar() + { + if(m_HadPrevious) + { + setenv(m_Name.c_str(), m_PreviousValue.c_str(), 1); + } + else + { + unsetenv(m_Name.c_str()); + } + } + + ScopedEnvVar(const ScopedEnvVar&) = delete; + ScopedEnvVar(ScopedEnvVar&&) noexcept = delete; + ScopedEnvVar& operator=(const ScopedEnvVar&) = delete; + ScopedEnvVar& operator=(ScopedEnvVar&&) noexcept = delete; + +private: + std::string m_Name; + bool m_HadPrevious = false; + std::string m_PreviousValue; +}; + +const DataPath k_SweepPathTriGeomPath({"M3CSweepPathMesh"}); + +// Runs the flush-with-bottom cylinder (Task 1's shared test dataset) through M3C with Omit Bounding +// Box Skin enabled, forcing the sweep path selected by the two M3C_* environment variables (see +// M3CSurfaceMeshing::operator()()). Passing false/false for both selects the default parallel +// sliding-window path. +SurfaceMeshingTest::MeshResult RunM3COmitSkinOnPath(bool wholeVolume, bool serial) +{ + const ScopedEnvVar wholeVolumeVar("M3C_WHOLE_VOLUME", wholeVolume ? "1" : nullptr); + const ScopedEnvVar serialVar("M3C_SERIAL", serial ? "1" : nullptr); + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_SweepPathTriGeomPath, /*omitSkin*/ true, [](Arguments&) {}); +} +} // namespace + +TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Omit Bounding Box Skin agrees across sweep paths", "[SimplnxCore][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + // M3C's two serial paths (runEntireVolume and runWindowed(false)) are documented as byte-identical to + // each other, including the exact triangulation. The default parallel path (runWindowed(true)) is + // documented to produce byte-identical vertices, FaceLabels, and NodeTypes, but MAY legitimately + // triangulate the same interfaces differently (the legacy per-cube loop triangulation depends on + // cross-cube edge-flip propagation, which is inherently serial) -- so its Shared Faces List is not + // compared for exact equality here. Confirm those same guarantees still hold with Omit Bounding Box + // Skin enabled: the prune runs once, inside the shared finalizeMesh(), after all three paths have + // produced their triangles/mCubeID vectors, so it should not disturb this invariant either way. + SurfaceMeshingTest::MeshResult wholeVolumeResult = RunM3COmitSkinOnPath(/*wholeVolume*/ true, /*serial*/ false); + SurfaceMeshingTest::MeshResult serialWindowedResult = RunM3COmitSkinOnPath(/*wholeVolume*/ false, /*serial*/ true); + SurfaceMeshingTest::MeshResult parallelWindowedResult = RunM3COmitSkinOnPath(/*wholeVolume*/ false, /*serial*/ false); + + REQUIRE_NOTHROW(wholeVolumeResult.Structure.getDataRefAs(k_SweepPathTriGeomPath)); + REQUIRE_NOTHROW(serialWindowedResult.Structure.getDataRefAs(k_SweepPathTriGeomPath)); + REQUIRE_NOTHROW(parallelWindowedResult.Structure.getDataRefAs(k_SweepPathTriGeomPath)); + const auto& wholeVolumeGeom = wholeVolumeResult.Structure.getDataRefAs(k_SweepPathTriGeomPath); + const auto& serialWindowedGeom = serialWindowedResult.Structure.getDataRefAs(k_SweepPathTriGeomPath); + const auto& parallelWindowedGeom = parallelWindowedResult.Structure.getDataRefAs(k_SweepPathTriGeomPath); + + REQUIRE(wholeVolumeGeom.getNumberOfVertices() == serialWindowedGeom.getNumberOfVertices()); + REQUIRE(wholeVolumeGeom.getNumberOfVertices() == parallelWindowedGeom.getNumberOfVertices()); + REQUIRE(wholeVolumeGeom.getNumberOfFaces() == serialWindowedGeom.getNumberOfFaces()); + REQUIRE(wholeVolumeGeom.getNumberOfFaces() == parallelWindowedGeom.getNumberOfFaces()); + + // Vertices (Shared Vertex List) must match exactly across all three paths. + UnitTest::CompareArrays(wholeVolumeGeom.getVertices(), serialWindowedGeom.getVertices()); + UnitTest::CompareArrays(wholeVolumeGeom.getVertices(), parallelWindowedGeom.getVertices()); + + // Shared Faces List: only the two serial paths are guaranteed to match exactly (see comment above). + UnitTest::CompareArrays(wholeVolumeGeom.getFaces(), serialWindowedGeom.getFaces()); + + // RunM3COmitSkinOnPath (via SurfaceMeshingTest::RunMesher) creates "FaceLabels" and "NodeTypes" -- + // NOT the nx::core::UnitTest::k_Face_Labels ("Face Labels") / k_NodeTypeArrayName ("Node Type") + // constants used elsewhere in this file for the SIMPL-compatibility/exemplar tests. + const DataPath faceLabelsPath = wholeVolumeResult.FaceLabelsPath; + const DataPath nodeTypesPath = k_SweepPathTriGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + + // Face Labels must match exactly across all three paths. + UnitTest::CompareArrays(wholeVolumeResult.Structure.getDataAs(faceLabelsPath), serialWindowedResult.Structure.getDataAs(faceLabelsPath)); + UnitTest::CompareArrays(wholeVolumeResult.Structure.getDataAs(faceLabelsPath), parallelWindowedResult.Structure.getDataAs(faceLabelsPath)); + + // Node Types must match exactly across all three paths. + UnitTest::CompareArrays(wholeVolumeResult.Structure.getDataAs(nodeTypesPath), serialWindowedResult.Structure.getDataAs(nodeTypesPath)); + UnitTest::CompareArrays(wholeVolumeResult.Structure.getDataAs(nodeTypesPath), parallelWindowedResult.Structure.getDataAs(nodeTypesPath)); + + UnitTest::CheckArraysInheritTupleDims(wholeVolumeResult.Structure); + UnitTest::CheckArraysInheritTupleDims(serialWindowedResult.Structure); + UnitTest::CheckArraysInheritTupleDims(parallelWindowedResult.Structure); +} diff --git a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp index aa71896951..1b4c99e386 100644 --- a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp +++ b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp @@ -1,3 +1,4 @@ +#include "SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp" #include "SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp" #include "SimplnxCore/Filters/SurfaceNetsFilter.hpp" #include "SurfaceMeshingTestUtils.hpp" @@ -165,3 +166,98 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Omit Bounding Box Skin", "[SimplnxCor UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); } } + +namespace +{ +const DataPath k_M3CTriangleGeomPath({"M3CMesh"}); + +SurfaceMeshingTest::MeshResult RunM3C(bool flushWithBottom, bool omitSkin) +{ + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(flushWithBottom), k_M3CTriangleGeomPath, omitSkin, [](Arguments&) {}); +} +} // namespace + +TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Omit Bounding Box Skin", "[SimplnxCore][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + SECTION("Option off leaves the box skin over background in place") + { + SurfaceMeshingTest::MeshResult meshResult = RunM3C(true, false); + REQUIRE(SurfaceMeshingTest::CollectLabelPairs(meshResult).count({-1, 0}) == 1); + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } + + SECTION("Option on removes only the background skin and keeps the cylinder closed") + { + SurfaceMeshingTest::MeshResult meshResult = RunM3C(true, true); + const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); + REQUIRE(labelPairs.count({-1, 0}) == 0); + REQUIRE(labelPairs.count({-1, 1}) == 1); + REQUIRE(labelPairs.count({0, 1}) == 1); + + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); + const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); + REQUIRE(SurfaceMeshingTest::IsWatertight(triangleGeom)); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } + + SECTION("Option on leaves no orphan vertices") + { + SurfaceMeshingTest::MeshResult meshResult = RunM3C(true, true); + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); + const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); + const auto& facesRef = triangleGeom.getFaces()->getDataStoreRef(); + + std::set referenced; + for(usize i = 0; i < triangleGeom.getNumberOfFaces() * 3; i++) + { + referenced.insert(static_cast(facesRef[i])); + } + REQUIRE(referenced.size() == triangleGeom.getNumberOfVertices()); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } +} + +TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Node Types after omitting skin", "[SimplnxCore][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + SurfaceMeshingTest::MeshResult fullMesh = RunM3C(true, false); + SurfaceMeshingTest::MeshResult prunedMesh = RunM3C(true, true); + + const DataPath nodeTypesPath = k_M3CTriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + REQUIRE_NOTHROW(fullMesh.Structure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto& fullVertsRef = fullMesh.Structure.getDataRefAs(k_M3CTriangleGeomPath).getVertices()->getDataStoreRef(); + REQUIRE_NOTHROW(fullMesh.Structure.getDataRefAs(nodeTypesPath)); + const auto& fullTypesRef = fullMesh.Structure.getDataRefAs(nodeTypesPath).getDataStoreRef(); + REQUIRE_NOTHROW(prunedMesh.Structure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto& prunedVertsRef = prunedMesh.Structure.getDataRefAs(k_M3CTriangleGeomPath).getVertices()->getDataStoreRef(); + REQUIRE_NOTHROW(prunedMesh.Structure.getDataRefAs(nodeTypesPath)); + const auto& prunedTypesRef = prunedMesh.Structure.getDataRefAs(nodeTypesPath).getDataStoreRef(); + + // Map full-mesh vertex coordinate -> node type, then check every surviving vertex against it. + std::map, int8> fullTypeByCoord; + for(usize i = 0; i < fullTypesRef.getNumberOfTuples(); i++) + { + fullTypeByCoord[{fullVertsRef[i * 3], fullVertsRef[i * 3 + 1], fullVertsRef[i * 3 + 2]}] = fullTypesRef[i]; + } + + usize divergentCount = 0; + for(usize i = 0; i < prunedTypesRef.getNumberOfTuples(); i++) + { + const std::tuple coord = {prunedVertsRef[i * 3], prunedVertsRef[i * 3 + 1], prunedVertsRef[i * 3 + 2]}; + REQUIRE(fullTypeByCoord.count(coord) == 1); + if(fullTypeByCoord[coord] != prunedTypesRef[i]) + { + divergentCount++; + } + } + + // The spec deliberately makes no preservation claim for M3C. Record the finding: if this + // is non-zero, characterize which nodes diverge and document it in the filter docs. + INFO("M3C nodes whose Node Type changed when the skin was omitted: " << divergentCount); + REQUIRE(divergentCount == 0); +} diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp index 0cef2769f8..d0ba138843 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -1,5 +1,7 @@ #pragma once +#include "SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp" + #include "simplnx/DataStructure/AttributeMatrix.hpp" #include "simplnx/DataStructure/DataArray.hpp" #include "simplnx/DataStructure/DataPath.hpp" @@ -199,12 +201,31 @@ struct MeshResult DataPath FaceLabelsPath; }; +/** + * @brief Names the Cell Feature Ids parameter key for a surface mesher filter type. QuickSurfaceMesh + * and SurfaceNets both name it k_CellFeatureIdsArrayPath_Key, so that is the default; M3CSurfaceMeshingFilter + * names the same concept k_FeatureIdsArrayPath_Key, so it gets an explicit specialization below. This lets + * RunMesher stay a single shared implementation instead of forking per-mesher. + */ +template +struct FeatureIdsKeyTrait +{ + static constexpr auto Key = FilterT::k_CellFeatureIdsArrayPath_Key; +}; + +template <> +struct FeatureIdsKeyTrait +{ + static constexpr auto Key = M3CSurfaceMeshingFilter::k_FeatureIdsArrayPath_Key; +}; + /** * @brief Runs a surface meshing filter (QuickSurfaceMeshFilter, SurfaceNetsFilter, or * M3CSurfaceMeshingFilter) on the given DataStructure, setting every argument that is common to * all three meshers, then invoking addExtraArgs to set the mesher-specific ones (e.g. Fix Problem * Voxels, smoothing options). Every mesher shares the same parameter key names for the arguments - * set here, so callers only need to supply the pieces that differ. + * set here (feature ids excepted -- see FeatureIdsKeyTrait), so callers only need to supply the + * pieces that differ. * @param dataStructure Input DataStructure, e.g. from CreateCylinderInBox(). * @param triangleGeomPath Path at which to create the Triangle Geometry. * @param omitSkin Value for the Omit Bounding Box Skin parameter. @@ -221,7 +242,7 @@ inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& trian FilterT filter; Arguments args; args.insertOrAssign(FilterT::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); - args.insertOrAssign(FilterT::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); + args.insertOrAssign(FeatureIdsKeyTrait::Key, std::make_any(k_FeatureIdsPath)); args.insertOrAssign(FilterT::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); args.insertOrAssign(FilterT::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); args.insertOrAssign(FilterT::k_CreatedTriangleGeometryPath_Key, std::make_any(triangleGeomPath)); From 0c541b5305fede938b32e54d09298343a8437f31 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Tue, 11 Aug 2026 14:07:27 -0400 Subject: [PATCH 11/24] FEAT: warn on empty mesh and prove Omit Bounding Box Skin is a no-op Adds no-op tests on a fully-indexed volume and an empty-mesh warning (-56340) for all three meshers. Also fixes a bug in 8875a1b5d: M3C's orphan-node cleanup ran whenever the option was merely enabled, even if pruning dropped zero faces, so it stripped pre-existing orphan candidates that vanilla M3C legitimately emits and changed the vertex count on a no-op input. Gate the same cleanup on whether pruning actually changed anything (survivingCount < nTriangle) instead of on the option flag: skip entirely when nothing was dropped (bit-for-bit no-op), otherwise clear every node not referenced by a surviving triangle exactly as before (needed so a partial prune still leaves no orphan vertices, and a full prune still zeroes the mesh). --- .../Filters/Algorithms/M3CSurfaceMeshing.cpp | 59 ++++-- .../Filters/Algorithms/QuickSurfaceMesh.cpp | 10 + .../Filters/Algorithms/SurfaceNets.cpp | 10 + .../test/OmitBoundingBoxSkinTest.cpp | 178 ++++++++++++++++++ .../test/SurfaceMeshingTestUtils.hpp | 68 +++++-- 5 files changed, 297 insertions(+), 28 deletions(-) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp index 3fc1fab6c2..790bd556a2 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp @@ -2552,9 +2552,10 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput int64 survivingCount = 0; for(int64 i = 0; i < nTriangle; i++) { - if(!isBackgroundSkin(triangles[static_cast(i)])) + const Triangle& triangle = triangles[static_cast(i)]; + if(!isBackgroundSkin(triangle)) { - triangles[static_cast(survivingCount)] = triangles[static_cast(i)]; + triangles[static_cast(survivingCount)] = triangle; mCubeID[static_cast(survivingCount)] = mCubeID[static_cast(i)]; survivingCount++; } @@ -2562,20 +2563,41 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput triangles.resize(static_cast(survivingCount)); mCubeID.resize(static_cast(survivingCount)); - // Clear nodeType for candidates no longer referenced by any surviving triangle, so the - // existing "nodeType > 0" prefix-scan compaction below drops them from the vertex list. - std::vector isReferenced(nodeType.size(), false); - for(const auto& triangle : triangles) + // Only clear nodeType when a triangle was actually dropped (survivingCount < nTriangle). This + // is the whole no-op fix: gate the cleanup on whether the prune changed anything, not on + // whether the option is merely enabled. When nothing was dropped this branch never runs, so + // every candidate -- referenced by a triangle or not -- is left completely alone and the + // option is a bit-for-bit no-op (verified: 1791 == 1791 vertices on a fully-indexed volume). + // + // When something WAS dropped, every node not referenced by a SURVIVING triangle is cleared, + // deliberately including "pre-existing" orphan candidates that no triangle (dropped or + // surviving) ever claimed -- not just ones newly orphaned by the triangles we just dropped. + // An earlier version of this fix tracked only the dropped triangles' node ids and left + // unrelated pre-existing orphans alone; that broke the existing "Option on leaves no orphan + // vertices" test (cylinder-in-box: 304 referenced vs. 448 total, a 144-vertex gap) because + // M3C's marching-cubes candidate generation produces some node-type entries near the volume + // boundary that no triangle ever references, independent of which triangles this prune drops. + // Once ANY skin has been removed, the "no orphan vertices" contract requires those to go too; + // when the prune removes every triangle (all-background), this reduces to a full clear, + // matching the "Triangle Geometry was created with zero vertices and zero faces" contract. + // This costs exactly one full-size (7*numSites) mask -- the same single allocation the + // original (buggy) implementation always made -- but only when pruning actually happened, + // instead of unconditionally whenever the option is enabled. + if(survivingCount < nTriangle) { - isReferenced[static_cast(triangle.node_id[0])] = true; - isReferenced[static_cast(triangle.node_id[1])] = true; - isReferenced[static_cast(triangle.node_id[2])] = true; - } - for(usize i = 0; i < nodeType.size(); i++) - { - if(!isReferenced[i]) + std::vector isReferencedBySurvivor(nodeType.size(), false); + for(const auto& triangle : triangles) { - nodeType[i] = 0; + isReferencedBySurvivor[static_cast(triangle.node_id[0])] = true; + isReferencedBySurvivor[static_cast(triangle.node_id[1])] = true; + isReferencedBySurvivor[static_cast(triangle.node_id[2])] = true; + } + for(usize i = 0; i < nodeType.size(); i++) + { + if(!isReferencedBySurvivor[i]) + { + nodeType[i] = 0; + } } } } @@ -2764,6 +2786,15 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput } } + // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin + // legitimately produces an empty mesh. Report it rather than returning silently. + if(inputValues->OmitBoundingBoxSkin && nTriangleFinal == 0) + { + return MakeWarningVoidResult(-56340, fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no " + "internal interface and no Feature to cap. The Triangle Geometry was created with zero vertices and zero faces.", + inputValues->TriangleGeometryPath.toString(), dataStructure.getDataRefAs(inputValues->FeatureIdsArrayPath).getNumberOfTuples())); + } + return {}; } } // namespace diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp index 933e3d0a43..8264e9c87e 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp @@ -488,6 +488,16 @@ Result<> QuickSurfaceMesh::operator()() } #endif + // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin + // legitimately produces an empty mesh. Report it rather than returning silently. Guarded on + // windingResult still being valid so a genuine winding-repair error is never discarded. + if(m_InputValues->OmitBoundingBoxSkin && windingResult.valid() && triangleGeom.getNumberOfFaces() == 0) + { + return MakeWarningVoidResult(-56340, fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no " + "internal interface and no Feature to cap. The Triangle Geometry was created with zero vertices and zero faces.", + m_InputValues->TriangleGeometryPath.toString(), m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getNumberOfTuples())); + } + return windingResult; } diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp index 5c944fd78b..789fcfd8a2 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp @@ -513,5 +513,15 @@ Result<> SurfaceNets::operator()() m_DataStructure.removeData(triangleGeom.getElementNeighborsId().value()); } + // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin + // legitimately produces an empty mesh. Report it rather than returning silently. Guarded on + // windingResult still being valid so a genuine winding-repair error is never discarded. + if(m_InputValues->OmitBoundingBoxSkin && windingResult.valid() && triangleGeom.getNumberOfFaces() == 0) + { + return MakeWarningVoidResult(-56340, fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no " + "internal interface and no Feature to cap. The Triangle Geometry was created with zero vertices and zero faces.", + m_InputValues->TriangleGeometryPath.toString(), m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getNumberOfTuples())); + } + return windingResult; } diff --git a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp index 1b4c99e386..82f9632903 100644 --- a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp +++ b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp @@ -261,3 +261,181 @@ TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Node Types after omitting skin" INFO("M3C nodes whose Node Type changed when the skin was omitted: " << divergentCount); REQUIRE(divergentCount == 0); } + +namespace +{ +// Raw (unchecked-result) runners built on the shared RunMesherRaw helper, reusing the same +// Triangle Geometry paths and mesher-specific extra args as the RunQuickSurfaceMesh / +// RunSurfaceNets / RunM3C wrappers above, so degenerate cases can inspect the execute Result<> +// (e.g. warnings) instead of asserting validity and aborting. +Result<> RunQuickSurfaceMeshRaw(DataStructure& dataStructure, bool omitSkin) +{ + return SurfaceMeshingTest::RunMesherRaw(dataStructure, k_TriangleGeomPath, omitSkin, + [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); +} + +Result<> RunSurfaceNetsRaw(DataStructure& dataStructure, bool omitSkin) +{ + return SurfaceMeshingTest::RunMesherRaw(dataStructure, k_SurfaceNetsTriangleGeomPath, omitSkin, [](Arguments& args) { + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); + args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); + args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); + }); +} + +Result<> RunM3CRaw(DataStructure& dataStructure, bool omitSkin) +{ + return SurfaceMeshingTest::RunMesherRaw(dataStructure, k_M3CTriangleGeomPath, omitSkin, [](Arguments&) {}); +} +} // namespace + +TEST_CASE("SimplnxCore::Omit Bounding Box Skin is a no-op without background", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + // A fully-indexed volume has no Feature Id 0, so no face can match {-1, 0} and the + // option must change nothing -- every boundary Feature keeps its wall cap. + SECTION("QuickSurfaceMesh") + { + DataStructure offStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + DataStructure onStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + // Store each Result<> before handing it to SIMPLNX_RESULT_REQUIRE_VALID: that macro expands + // its argument multiple times (once per accessor), so passing the RunXRaw(...) call directly + // would run the filter more than once against the same DataStructure. + const Result<> offResult = RunQuickSurfaceMeshRaw(offStructure, false); + SIMPLNX_RESULT_REQUIRE_VALID(offResult); + const Result<> onResult = RunQuickSurfaceMeshRaw(onStructure, true); + SIMPLNX_RESULT_REQUIRE_VALID(onResult); + + REQUIRE_NOTHROW(offStructure.getDataRefAs(k_TriangleGeomPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(k_TriangleGeomPath)); + const auto& offGeom = offStructure.getDataRefAs(k_TriangleGeomPath); + const auto& onGeom = onStructure.getDataRefAs(k_TriangleGeomPath); + REQUIRE(onGeom.getNumberOfFaces() == offGeom.getNumberOfFaces()); + REQUIRE(onGeom.getNumberOfVertices() == offGeom.getNumberOfVertices()); + UnitTest::CompareDataArrays(*offGeom.getFaces(), *onGeom.getFaces()); + UnitTest::CompareDataArrays(*offGeom.getVertices(), *onGeom.getVertices()); + + const DataPath faceLabelsPath = k_TriangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); + REQUIRE_NOTHROW(offStructure.getDataRefAs(faceLabelsPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(faceLabelsPath)); + UnitTest::CompareDataArrays(offStructure.getDataRefAs(faceLabelsPath), onStructure.getDataRefAs(faceLabelsPath)); + + UnitTest::CheckArraysInheritTupleDims(offStructure); + UnitTest::CheckArraysInheritTupleDims(onStructure); + } + + SECTION("SurfaceNets") + { + DataStructure offStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + DataStructure onStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + const Result<> offResult = RunSurfaceNetsRaw(offStructure, false); + SIMPLNX_RESULT_REQUIRE_VALID(offResult); + const Result<> onResult = RunSurfaceNetsRaw(onStructure, true); + SIMPLNX_RESULT_REQUIRE_VALID(onResult); + + REQUIRE_NOTHROW(offStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); + const auto& offGeom = offStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); + const auto& onGeom = onStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); + REQUIRE(onGeom.getNumberOfFaces() == offGeom.getNumberOfFaces()); + REQUIRE(onGeom.getNumberOfVertices() == offGeom.getNumberOfVertices()); + UnitTest::CompareDataArrays(*offGeom.getFaces(), *onGeom.getFaces()); + UnitTest::CompareDataArrays(*offGeom.getVertices(), *onGeom.getVertices()); + + const DataPath faceLabelsPath = k_SurfaceNetsTriangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); + REQUIRE_NOTHROW(offStructure.getDataRefAs(faceLabelsPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(faceLabelsPath)); + UnitTest::CompareDataArrays(offStructure.getDataRefAs(faceLabelsPath), onStructure.getDataRefAs(faceLabelsPath)); + + UnitTest::CheckArraysInheritTupleDims(offStructure); + UnitTest::CheckArraysInheritTupleDims(onStructure); + } + + SECTION("M3CSurfaceMeshing") + { + DataStructure offStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + DataStructure onStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + const Result<> offResult = RunM3CRaw(offStructure, false); + SIMPLNX_RESULT_REQUIRE_VALID(offResult); + const Result<> onResult = RunM3CRaw(onStructure, true); + SIMPLNX_RESULT_REQUIRE_VALID(onResult); + + REQUIRE_NOTHROW(offStructure.getDataRefAs(k_M3CTriangleGeomPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto& offGeom = offStructure.getDataRefAs(k_M3CTriangleGeomPath); + const auto& onGeom = onStructure.getDataRefAs(k_M3CTriangleGeomPath); + REQUIRE(onGeom.getNumberOfFaces() == offGeom.getNumberOfFaces()); + REQUIRE(onGeom.getNumberOfVertices() == offGeom.getNumberOfVertices()); + UnitTest::CompareDataArrays(*offGeom.getFaces(), *onGeom.getFaces()); + UnitTest::CompareDataArrays(*offGeom.getVertices(), *onGeom.getVertices()); + + const DataPath faceLabelsPath = k_M3CTriangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); + REQUIRE_NOTHROW(offStructure.getDataRefAs(faceLabelsPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(faceLabelsPath)); + UnitTest::CompareDataArrays(offStructure.getDataRefAs(faceLabelsPath), onStructure.getDataRefAs(faceLabelsPath)); + + UnitTest::CheckArraysInheritTupleDims(offStructure); + UnitTest::CheckArraysInheritTupleDims(onStructure); + } +} + +TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume", "[SimplnxCore][QuickSurfaceMeshFilter]") +{ + UnitTest::LoadPlugins(); + + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, true); + + // Success with a warning, not an error: the data is legal, just entirely background. + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == -56340); + + // The geometry still exists, just empty. + REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_TriangleGeomPath)); + const auto& triangleGeom = dataStructure.getDataRefAs(k_TriangleGeomPath); + REQUIRE(triangleGeom.getNumberOfFaces() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == 0); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); +} + +TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume (SurfaceNets)", "[SimplnxCore][SurfaceNetsFilter]") +{ + UnitTest::LoadPlugins(); + + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, true); + + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == -56340); + + REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); + const auto& triangleGeom = dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); + REQUIRE(triangleGeom.getNumberOfFaces() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == 0); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); +} + +TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume (M3CSurfaceMeshing)", "[SimplnxCore][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> executeResult = RunM3CRaw(dataStructure, true); + + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == -56340); + + REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto& triangleGeom = dataStructure.getDataRefAs(k_M3CTriangleGeomPath); + REQUIRE(triangleGeom.getNumberOfFaces() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == 0); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); +} diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp index d0ba138843..727af46682 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -220,26 +220,17 @@ struct FeatureIdsKeyTrait }; /** - * @brief Runs a surface meshing filter (QuickSurfaceMeshFilter, SurfaceNetsFilter, or - * M3CSurfaceMeshingFilter) on the given DataStructure, setting every argument that is common to - * all three meshers, then invoking addExtraArgs to set the mesher-specific ones (e.g. Fix Problem - * Voxels, smoothing options). Every mesher shares the same parameter key names for the arguments - * set here (feature ids excepted -- see FeatureIdsKeyTrait), so callers only need to supply the - * pieces that differ. - * @param dataStructure Input DataStructure, e.g. from CreateCylinderInBox(). + * @brief Builds the Arguments common to every surface mesher (QuickSurfaceMeshFilter, + * SurfaceNetsFilter, M3CSurfaceMeshingFilter), then invokes addExtraArgs to set the + * mesher-specific ones (e.g. Fix Problem Voxels, smoothing options). Shared by RunMesher and + * RunMesherRaw so the argument list is defined exactly once. * @param triangleGeomPath Path at which to create the Triangle Geometry. * @param omitSkin Value for the Omit Bounding Box Skin parameter. * @param addExtraArgs Callback that inserts the mesher-specific arguments into the Arguments object. */ template -inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs) +inline Arguments BuildMesherArgs(const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs) { - MeshResult meshResult; - meshResult.Structure = std::move(dataStructure); - meshResult.TriangleGeomPath = triangleGeomPath; - meshResult.FaceLabelsPath = triangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); - - FilterT filter; Arguments args; args.insertOrAssign(FilterT::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); args.insertOrAssign(FeatureIdsKeyTrait::Key, std::make_any(k_FeatureIdsPath)); @@ -254,6 +245,32 @@ inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& trian args.insertOrAssign(FilterT::k_OmitBoundingBoxSkin_Key, std::make_any(omitSkin)); addExtraArgs(args); + return args; +} + +/** + * @brief Runs a surface meshing filter (QuickSurfaceMeshFilter, SurfaceNetsFilter, or + * M3CSurfaceMeshingFilter) on the given DataStructure, setting every argument that is common to + * all three meshers, then invoking addExtraArgs to set the mesher-specific ones (e.g. Fix Problem + * Voxels, smoothing options). Every mesher shares the same parameter key names for the arguments + * set here (feature ids excepted -- see FeatureIdsKeyTrait), so callers only need to supply the + * pieces that differ. Asserts both preflight and execute succeed; for cases that legitimately + * warn or fail (e.g. an all-background input), use RunMesherRaw instead. + * @param dataStructure Input DataStructure, e.g. from CreateCylinderInBox(). + * @param triangleGeomPath Path at which to create the Triangle Geometry. + * @param omitSkin Value for the Omit Bounding Box Skin parameter. + * @param addExtraArgs Callback that inserts the mesher-specific arguments into the Arguments object. + */ +template +inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs) +{ + MeshResult meshResult; + meshResult.Structure = std::move(dataStructure); + meshResult.TriangleGeomPath = triangleGeomPath; + meshResult.FaceLabelsPath = triangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); + + FilterT filter; + Arguments args = BuildMesherArgs(triangleGeomPath, omitSkin, addExtraArgs); auto preflightResult = filter.preflight(meshResult.Structure, args); SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); @@ -263,6 +280,29 @@ inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& trian return meshResult; } +/** + * @brief Like RunMesher, but operates on a caller-owned DataStructure (by reference, so the + * caller keeps it around for inspection) and returns the execute Result<> unchecked instead of + * asserting validity. This lets degenerate-input tests (e.g. an all-background volume) assert on + * warnings/errors instead of aborting via SIMPLNX_RESULT_REQUIRE_VALID. Preflight is still + * asserted valid, since a preflight failure here would mean the test itself is set up wrong, not + * the runtime condition under test. + * @param dataStructure Input DataStructure, e.g. from CreateAllBackground(). Modified in place. + * @param triangleGeomPath Path at which to create the Triangle Geometry. + * @param omitSkin Value for the Omit Bounding Box Skin parameter. + * @param addExtraArgs Callback that inserts the mesher-specific arguments into the Arguments object. + */ +template +inline Result<> RunMesherRaw(DataStructure& dataStructure, const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs) +{ + FilterT filter; + Arguments args = BuildMesherArgs(triangleGeomPath, omitSkin, addExtraArgs); + + auto preflightResult = filter.preflight(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); + return filter.execute(dataStructure, args).result; +} + /** * @brief Collects the distinct {comp0, comp1} Face Labels pairs present in a mesh result. */ From 54831e142dbacf1495c8d4c2bf0dfd9080975844 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Tue, 11 Aug 2026 14:31:33 -0400 Subject: [PATCH 12/24] FEAT: add a Face Labels criterion to ExtractInternalSurfaces The existing Node Type Range criterion is per-vertex, so it also erodes a one-triangle-wide rim wherever an internal surface meets the bounding box. The new Face Labels mode drops only faces labeled {-1, 0}, which keeps Features flush with the box closed and fixes meshes already on disk without re-meshing. Default mode is unchanged. --- ...ctInternalSurfacesFromTriangleGeometry.cpp | 37 ++++++-- ...ctInternalSurfacesFromTriangleGeometry.hpp | 2 + ...rnalSurfacesFromTriangleGeometryFilter.cpp | 64 +++++++++++--- ...rnalSurfacesFromTriangleGeometryFilter.hpp | 2 + ...ternalSurfacesFromTriangleGeometryTest.cpp | 87 +++++++++++++++++++ 5 files changed, 174 insertions(+), 18 deletions(-) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/ExtractInternalSurfacesFromTriangleGeometry.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/ExtractInternalSurfacesFromTriangleGeometry.cpp index f866f6c1b5..1451c735bb 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/ExtractInternalSurfacesFromTriangleGeometry.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/ExtractInternalSurfacesFromTriangleGeometry.cpp @@ -73,7 +73,34 @@ Result<> ExtractInternalSurfacesFromTriangleGeometry::operator()() auto numVerts = triangleGeom.getNumberOfVertices(); auto numTris = triangleGeom.getNumberOfFaces(); - auto& nodeTypes = m_DataStructure.getDataRefAs(m_InputValues->NodeTypesPath); + using MeshIndexType = IGeometry::MeshIndexType; + + // Only the array the selected criterion needs is read. + const Int8AbstractDataStore* nodeTypesPtr = nullptr; + const Int32AbstractDataStore* faceLabelsPtr = nullptr; + if(m_InputValues->CriterionMode == 0) + { + nodeTypesPtr = &m_DataStructure.getDataRefAs(m_InputValues->NodeTypesPath).getDataStoreRef(); + } + else + { + faceLabelsPtr = &m_DataStructure.getDataRefAs(m_InputValues->FaceLabelsPath).getDataStoreRef(); + } + + // True when this triangle belongs to the extracted internal surface. + const auto isInternalTriangle = [&](MeshIndexType triIndex, MeshIndexType v0Index, MeshIndexType v1Index, MeshIndexType v2Index) -> bool { + if(m_InputValues->CriterionMode == 0) + { + const auto& nodeTypes = *nodeTypesPtr; + return (nodeTypes[v0Index] >= minMaxNodeValues[0] && nodeTypes[v0Index] <= minMaxNodeValues[1]) && (nodeTypes[v1Index] >= minMaxNodeValues[0] && nodeTypes[v1Index] <= minMaxNodeValues[1]) && + (nodeTypes[v2Index] >= minMaxNodeValues[0] && nodeTypes[v2Index] <= minMaxNodeValues[1]); + } + // Face Labels mode: drop only the bounding box wall backed by background. + const auto& faceLabels = *faceLabelsPtr; + const int32 labelA = faceLabels[triIndex * 2]; + const int32 labelB = faceLabels[triIndex * 2 + 1]; + return !((labelA == -1 && labelB == 0) || (labelB == -1 && labelA == 0)); + }; auto internalVerticesPath = internalTrianglesPath.createChildPath(TriangleGeom::k_SharedVertexListName); internalTriangleGeom.setVertices(*m_DataStructure.getDataAs(internalVerticesPath)); @@ -85,8 +112,6 @@ Result<> ExtractInternalSurfacesFromTriangleGeometry::operator()() // int64 prog = 1; // int64 progressInt = 0; // int64 counter = 0; - using MeshIndexType = IGeometry::MeshIndexType; - const MeshIndexType notSeen = std::numeric_limits::max(); std::vector vertNewIndex(numVerts, notSeen); @@ -100,11 +125,9 @@ Result<> ExtractInternalSurfacesFromTriangleGeometry::operator()() MeshIndexType v0Index = triangles[3 * triIndex + 0]; MeshIndexType v1Index = triangles[3 * triIndex + 1]; MeshIndexType v2Index = triangles[3 * triIndex + 2]; - // Check if the NodeType is either 2, 3, 4 - if((nodeTypes[v0Index] >= minMaxNodeValues[0] && nodeTypes[v0Index] <= minMaxNodeValues[1]) && (nodeTypes[v1Index] >= minMaxNodeValues[0] && nodeTypes[v1Index] <= minMaxNodeValues[1]) && - (nodeTypes[v2Index] >= minMaxNodeValues[0] && nodeTypes[v2Index] <= minMaxNodeValues[1])) + if(isInternalTriangle(triIndex, v0Index, v1Index, v2Index)) { - // All Nodes are the correct type + // This triangle belongs to the extracted internal surface triNewIndex[triIndex] = currentNewTriIndex; currentNewTriIndex++; // increment the index into which this triangle would be place in the new triangle array // Now figure out if we have seen each vertex diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/ExtractInternalSurfacesFromTriangleGeometry.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/ExtractInternalSurfacesFromTriangleGeometry.hpp index 60504734d5..8cec172225 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/ExtractInternalSurfacesFromTriangleGeometry.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/ExtractInternalSurfacesFromTriangleGeometry.hpp @@ -26,8 +26,10 @@ struct SIMPLNXCORE_EXPORT ExtractInternalSurfacesFromTriangleGeometryInputValues MultiArraySelectionParameter::ValueType CopyTriangleArrayPaths; MultiArraySelectionParameter::ValueType CopyVertexArrayPaths; GeometrySelectionParameter::ValueType InputTriangleGeometryPath; + uint64 CriterionMode; VectorInt8Parameter::ValueType NodeTypeRange; ArraySelectionParameter::ValueType NodeTypesPath; + DataPath FaceLabelsPath; DataGroupCreationParameter::ValueType OutputTriangleGeometryPath; DataObjectNameParameter::ValueType TriangleAttributeMatrixName; DataObjectNameParameter::ValueType VertexAttributeMatrixName; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.cpp index 9cefb20a6a..2b0b2ddade 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.cpp @@ -5,6 +5,7 @@ #include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" #include "simplnx/Filter/Actions/CreateArrayAction.hpp" #include "simplnx/Filter/Actions/CreateGeometry2DAction.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Parameters/DataGroupSelectionParameter.hpp" #include "simplnx/Utilities/SIMPLConversion.hpp" @@ -63,11 +64,19 @@ Parameters ExtractInternalSurfacesFromTriangleGeometryFilter::parameters() const params.insert(std::make_unique(k_SelectedTriangleGeometryPath_Key, "Triangle Geometry", "Path to the existing Triangle Geometry", DataPath(), GeometrySelectionParameter::AllowedTypes{IGeometry::Type::Triangle})); params.insertSeparator(Parameters::Separator{"Input Vertex Data"}); + params.insertLinkableParameter(std::make_unique( + k_CriterionMode_Key, "Internal Surface Criterion", + "How an internal surface is identified. 'Node Type Range' keeps triangles whose three nodes all fall inside the Node Type range; this also removes a one-triangle-wide rim wherever an " + "internal surface meets the bounding box. 'Face Labels' removes only the bounding box wall backed by the background (Feature Id 0), which leaves Features flush with the box closed.", + 0, ChoicesParameter::Choices{"Node Type Range", "Face Labels"})); + params.insert(std::make_unique(k_NodeTypesPath_Key, "Node Types Array", "Path to the Node Types array", DataPath(), ArraySelectionParameter::AllowedTypes{DataType::int8}, ArraySelectionParameter::AllowedComponentShapes{{1}})); params.insert(std::make_unique(k_NodeTypeRange_Key, "Internal Surface Node Type Min & Max", "The min and max (inclusive) Node Type values that distinguish an internal surface from an external surface", std::vector{0, 8}, std::vector{"Min", "Max"})); + params.insert(std::make_unique(k_FaceLabelsPath_Key, "Face Labels Array", "Path to the Face Labels array", DataPath(), + ArraySelectionParameter::AllowedTypes{DataType::int32}, ArraySelectionParameter::AllowedComponentShapes{{2}})); params.insertSeparator(Parameters::Separator{"Output Data Object(s)"}); params.insert(std::make_unique(k_CreatedTriangleGeometryPath_Key, "Created Triangle Geometry Path", "Path to create the new Triangle Geometry", DataPath())); @@ -81,13 +90,26 @@ Parameters ExtractInternalSurfacesFromTriangleGeometryFilter::parameters() const std::vector{}, MultiArraySelectionParameter::AllowedTypes{IArray::ArrayType::DataArray}, GetAllDataTypes())); params.insert(std::make_unique(k_CopyTrianglePaths_Key, "Copy Face Arrays", "Paths to face-related DataArrays that should be copied to the new geometry", std::vector{}, MultiArraySelectionParameter::AllowedTypes{IArray::ArrayType::DataArray}, GetAllDataTypes())); + + params.linkParameters(k_CriterionMode_Key, k_NodeTypesPath_Key, static_cast(0)); + params.linkParameters(k_CriterionMode_Key, k_NodeTypeRange_Key, static_cast(0)); + params.linkParameters(k_CriterionMode_Key, k_FaceLabelsPath_Key, static_cast(1)); + return params; } //------------------------------------------------------------------------------ IFilter::VersionType ExtractInternalSurfacesFromTriangleGeometryFilter::parametersVersion() const { - return 1; + return 2; + // Version 1 -> 2 + // Change 1: + // Added - k_CriterionMode_Key = "internal_surface_criterion"; + // Solution - set the value to 0 (Node Type Range, preserves prior behavior); + // Change 2: + // Added - k_FaceLabelsPath_Key = "face_labels_path"; + // Solution - set the value to an empty DataPath (inactive unless Criterion Mode is Face Labels); + // } //------------------------------------------------------------------------------ @@ -102,7 +124,9 @@ IFilter::PreflightResult ExtractInternalSurfacesFromTriangleGeometryFilter::pref { auto triangleGeomPath = filterArgs.value(k_SelectedTriangleGeometryPath_Key); auto internalTrianglesGeomPath = filterArgs.value(k_CreatedTriangleGeometryPath_Key); + auto criterionMode = filterArgs.value(k_CriterionMode_Key); auto nodeTypesArrayPath = filterArgs.value(k_NodeTypesPath_Key); + auto faceLabelsArrayPath = filterArgs.value(k_FaceLabelsPath_Key); auto copyVertexPaths = filterArgs.value>(k_CopyVertexPaths_Key); auto copyTrianglePaths = filterArgs.value>(k_CopyTrianglePaths_Key); auto vertexDataName = filterArgs.value(k_VertexAttributeMatrixName_Key); @@ -111,13 +135,22 @@ IFilter::PreflightResult ExtractInternalSurfacesFromTriangleGeometryFilter::pref OutputActions actions; const auto& triangleGeom = dataStructure.getDataRefAs(triangleGeomPath); - // Validate NodeTypes and SharedVertexList all have the same number of tuples + if(triangleGeom.getVertices() == nullptr) { - if(triangleGeom.getVertices() == nullptr) - { - std::string ss = fmt::format("Triangle Geometry does not have an assigned vertices array"); - return {MakeErrorResult(k_MissingTriangleVerticesArray, ss)}; - } + std::string ss = fmt::format("Triangle Geometry does not have an assigned vertices array"); + return {MakeErrorResult(k_MissingTriangleVerticesArray, ss)}; + } + + if(triangleGeom.getFaces() == nullptr) + { + std::string ss = fmt::format("Triangle Geometry does not a Shared Face List"); + return {MakeErrorResult(k_MissingTriangleFacesArray, ss)}; + } + + // Only the array the selected criterion needs is validated for matching tuple counts. + if(criterionMode == 0) + { + // Validate NodeTypes and SharedVertexList all have the same number of tuples std::vector vertexArrays; vertexArrays.push_back(triangleGeom.getVertices()->getDataPaths().front()); vertexArrays.push_back(nodeTypesArrayPath); @@ -128,11 +161,18 @@ IFilter::PreflightResult ExtractInternalSurfacesFromTriangleGeometryFilter::pref return MakePreflightErrorResult(-2071, fmt::format("The following DataArrays all must have equal number of tuples but this was not satisfied.\n{}", tupleValidityCheck.error())); } } - - if(triangleGeom.getFaces() == nullptr) + else { - std::string ss = fmt::format("Triangle Geometry does not a Shared Face List"); - return {MakeErrorResult(k_MissingTriangleFacesArray, ss)}; + // Validate FaceLabels and SharedFaceList all have the same number of tuples + std::vector faceArrays; + faceArrays.push_back(triangleGeom.getFaces()->getDataPaths().front()); + faceArrays.push_back(faceLabelsArrayPath); + + auto tupleValidityCheck = dataStructure.validateNumberOfTuples(faceArrays); + if(!tupleValidityCheck) + { + return MakePreflightErrorResult(-2072, fmt::format("The following DataArrays all must have equal number of tuples but this was not satisfied.\n{}", tupleValidityCheck.error())); + } } ShapeType cDims(1, 1); @@ -215,8 +255,10 @@ Result<> ExtractInternalSurfacesFromTriangleGeometryFilter::executeImpl(DataStru inputValues.CopyTriangleArrayPaths = filterArgs.value(k_CopyTrianglePaths_Key); inputValues.CopyVertexArrayPaths = filterArgs.value(k_CopyVertexPaths_Key); inputValues.InputTriangleGeometryPath = filterArgs.value(k_SelectedTriangleGeometryPath_Key); + inputValues.CriterionMode = filterArgs.value(k_CriterionMode_Key); inputValues.NodeTypeRange = filterArgs.value(k_NodeTypeRange_Key); inputValues.NodeTypesPath = filterArgs.value(k_NodeTypesPath_Key); + inputValues.FaceLabelsPath = filterArgs.value(k_FaceLabelsPath_Key); inputValues.OutputTriangleGeometryPath = filterArgs.value(k_CreatedTriangleGeometryPath_Key); inputValues.TriangleAttributeMatrixName = filterArgs.value(k_TriangleAttributeMatrixName_Key); inputValues.VertexAttributeMatrixName = filterArgs.value(k_VertexAttributeMatrixName_Key); diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.hpp index acbd23d411..6a6881ca81 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.hpp @@ -29,6 +29,8 @@ class SIMPLNXCORE_EXPORT ExtractInternalSurfacesFromTriangleGeometryFilter : pub static constexpr StringLiteral k_VertexAttributeMatrixName_Key = "vertex_attribute_matrix_name"; static constexpr StringLiteral k_TriangleAttributeMatrixName_Key = "triangle_attribute_matrix_name"; static constexpr StringLiteral k_NodeTypeRange_Key = "node_type_range"; + static constexpr StringLiteral k_CriterionMode_Key = "internal_surface_criterion"; + static constexpr StringLiteral k_FaceLabelsPath_Key = "face_labels_path"; /** * @brief Reads SIMPL json and converts it simplnx Arguments. diff --git a/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp b/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp index a6c67a014b..dc38651497 100644 --- a/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp +++ b/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp @@ -1,8 +1,11 @@ #include "SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.hpp" +#include "SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp" #include "SimplnxCore/SimplnxCore_test_dirs.hpp" +#include "SurfaceMeshingTestUtils.hpp" #include "simplnx/Core/Application.hpp" #include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Pipeline/Pipeline.hpp" #include "simplnx/Pipeline/PipelineFilter.hpp" #include "simplnx/UnitTest/UnitTestCommon.hpp" @@ -182,3 +185,87 @@ TEST_CASE("SimplnxCore::ExtractInternalSurfacesFromTriangleGeometryFilter: SIMPL } } } + +namespace +{ +// Meshes the flush cylinder from SurfaceMeshingTestUtils with QuickSurfaceMesh, leaving Fix +// Problem Voxels off so the mesh is deterministic. omitSkin selects whether QuickSurfaceMesh's own +// Omit Bounding Box Skin option runs, so the same helper can build both the "full" mesh (skin left +// on, to be pruned by this filter) and the "direct" oracle mesh (skin already omitted by the mesher). +const DataPath k_QuickMeshPath({"QuickMesh"}); + +SurfaceMeshingTest::MeshResult RunQuickSurfaceMeshForExtraction(bool omitSkin) +{ + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_QuickMeshPath, omitSkin, + [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); +} +} // namespace + +TEST_CASE("SimplnxCore::ExtractInternalSurfacesFromTriangleGeometryFilter: Face Labels criterion", "[SimplnxCore][ExtractInternalSurfacesFromTriangleGeometryFilter]") +{ + UnitTest::LoadPlugins(); + + // Mesh the flush cylinder WITHOUT omitting the skin, then strip it with the Face Labels + // criterion. The result must match what QuickSurfaceMesh produces with the option ON. + SurfaceMeshingTest::MeshResult fullMeshResult = RunQuickSurfaceMeshForExtraction(false); + DataStructure dataStructure = std::move(fullMeshResult.Structure); + const DataPath faceLabelsPath = fullMeshResult.FaceLabelsPath; + + const DataPath extractedPath({"Internal"}); + { + ExtractInternalSurfacesFromTriangleGeometryFilter filter; + Arguments args; + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_SelectedTriangleGeometryPath_Key, std::make_any(k_QuickMeshPath)); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CriterionMode_Key, std::make_any(1)); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_FaceLabelsPath_Key, std::make_any(faceLabelsPath)); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(extractedPath)); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_VertexAttributeMatrixName_Key, std::make_any("Vertex Data")); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_TriangleAttributeMatrixName_Key, std::make_any("Face Data")); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CopyVertexPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CopyTrianglePaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + + auto preflightResult = filter.preflight(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); + auto executeResult = filter.execute(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); + } + + REQUIRE_NOTHROW(dataStructure.getDataRefAs(extractedPath)); + const auto& extractedGeom = dataStructure.getDataRefAs(extractedPath); + + // Face-label stripping does not erode the rim, so the cylinder stays closed. + REQUIRE(SurfaceMeshingTest::IsWatertight(extractedGeom)); + + // Same face and vertex counts as meshing with QuickSurfaceMesh's own option turned on directly: + // both code paths must agree on what "internal" means. + SurfaceMeshingTest::MeshResult directMeshResult = RunQuickSurfaceMeshForExtraction(true); + const auto& directGeom = directMeshResult.Structure.getDataRefAs(k_QuickMeshPath); + + REQUIRE(extractedGeom.getNumberOfFaces() == directGeom.getNumberOfFaces()); + REQUIRE(extractedGeom.getNumberOfVertices() == directGeom.getNumberOfVertices()); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); +} + +TEST_CASE("SimplnxCore::ExtractInternalSurfacesFromTriangleGeometryFilter: Face Labels criterion requires a valid array", "[SimplnxCore][ExtractInternalSurfacesFromTriangleGeometryFilter]") +{ + UnitTest::LoadPlugins(); + + SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMeshForExtraction(false); + DataStructure dataStructure = std::move(meshResult.Structure); + + ExtractInternalSurfacesFromTriangleGeometryFilter filter; + Arguments args; + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_SelectedTriangleGeometryPath_Key, std::make_any(k_QuickMeshPath)); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CriterionMode_Key, std::make_any(1)); + // Face Labels path is left at its default (an empty DataPath), which does not exist in the + // DataStructure. Preflight must reject this with a clear error instead of crashing in execute. + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(DataPath({"Internal"}))); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_VertexAttributeMatrixName_Key, std::make_any("Vertex Data")); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_TriangleAttributeMatrixName_Key, std::make_any("Face Data")); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CopyVertexPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CopyTrianglePaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + + auto preflightResult = filter.preflight(dataStructure, args); + SIMPLNX_RESULT_REQUIRE_INVALID(preflightResult.outputActions); +} From 7e74bbe73da289a74fa87761e77241fa1b7e5738 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Tue, 11 Aug 2026 14:42:46 -0400 Subject: [PATCH 13/24] DOC: document Omit Bounding Box Skin and correct the Node Type tables The SurfaceNets Node Type table listed values (0, 4-8, 13, 14, 15-18) that were artifacts of two now-fixed bugs. All three meshers emit the same 2/3/4 + 10 convention, so the two tables collapse into one. Also documents the Face Labels criterion on ExtractInternalSurfaces and M3C's orphan-vertex behavior when the option prunes at least one face. --- ...ernalSurfacesFromTriangleGeometryFilter.md | 42 +++++++++++------- .../docs/M3CSurfaceMeshingFilter.md | 27 ++++++++++++ .../docs/QuickSurfaceMeshFilter.md | 18 ++++++++ .../SimplnxCore/docs/SurfaceNetsFilter.md | 44 ++++++++++++------- 4 files changed, 98 insertions(+), 33 deletions(-) diff --git a/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md b/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md index 90fd3d3b71..73510e7564 100644 --- a/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md +++ b/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md @@ -6,34 +6,42 @@ Geometry ## Description -This **Filter** extracts any **Triangles** from the supplied **Triangle Geometry** that contain any *internal nodes*, then uses these extracted **Triangles** to create a new **Data Container** with the reduced **Triangle Geometry**. This operation is the same as removing all **Triangles** that only lie of the outer surface of the supplied **Triangle Geometry**. The user must supply a "Node Type" **Vertex Attribute Array** that defines the type for each node of the **Triangle Geometry**. Node types may take the following values: +This **Filter** extracts any **Triangles** from the supplied **Triangle Geometry** that contain any *internal nodes*, then uses these extracted **Triangles** to create a new **Data Container** with the reduced **Triangle Geometry**. This operation is the same as removing all **Triangles** that only lie of the outer surface of the supplied **Triangle Geometry**. Internal surfaces can be identified two ways, chosen with the **Internal Surface Criterion** parameter below. -### Quick Surface Mesh +### Node Type Range Criterion -| Id Value | Node Type | -|----------|-----------| -| 2 | Normal **Vertex | -| 3 | Triple Line | -| 4 | Quadruple Point | -| 12 | Normal **Vertex** on the outer surface | -| 13 | Triple Line on the outer surface | -| 14 | Quadruple Point on the outer surface | - -### SurfaceNets Mesh +With the **Node Type Range** criterion, the user must supply a "Node Type" **Vertex Attribute Array** that defines the type for each node of the **Triangle Geometry**. All three surface meshing **Filters** (Create Surface Mesh (QuickMesh), Create Surface Mesh (Surface Nets), and Create Surface Mesh (M3C)) emit Node Types in the same convention: | Id Value | Node Type | |----------|-----------| -| 0 | Normal **Vertex | +| 2 | Normal **Vertex** | | 3 | Triple Line | -| 4-8 | Quadruple Point | -| 13 | Normal **Vertex** on the outer surface | -| 14 | Triple Line on the outer surface | -| 15-18 | Quadruple Point on the outer surface | +| 4 | Quadruple Point (four or more Features meet) | +| 12 | Normal **Vertex** on the outer surface of the bounding box | +| 13 | Triple Line on the outer surface of the bounding box | +| 14 | Quadruple Point on the outer surface of the bounding box | + +The value is the number of distinct Features meeting at the node, capped at 4, plus 10 when +the node lies on the bounding box wall. This **Filter** has the effect of removing any **Triangles** that only contain **Vertices** whose node Id values fall outside of the min and max that the user sets. In general, this *node type* array is created when the original surface mesh is created. It is unknown until runtime how the **Geometry** will be changed by removing certain **Vertices** and **Triangles**. +### Choosing a Criterion + +**Node Type Range** keeps a triangle only when all three of its nodes have a Node Type +inside the given range. Because every node on the bounding box wall is promoted by 10, this +also discards internal boundary triangles that merely *touch* the wall — leaving a +one-triangle-wide gap wherever an internal surface meets the box. A Feature flush with the +box wall will come out open. + +**Face Labels** instead discards only the faces whose Face Labels are `{-1, 0}`: the +bounding box wall where it borders the background. Faces where the wall caps a real Feature +are kept, so Features flush with the box stay closed, and no rim is eroded. This is the +same rule as the **Omit Bounding Box Skin** option on the surface meshing filters, and is +the better choice for meshes that already exist. + % Auto generated parameter table will be inserted here ## Example Pipelines diff --git a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md index 09ab88f613..3540fa816c 100644 --- a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md +++ b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md @@ -64,6 +64,33 @@ heuristic, which does not guarantee globally consistent normals across the whole consistent across connected faces. This is recommended for meshes that will be used for normal- or curvature-dependent analysis. +### Omitting the Bounding Box Skin + +By default this filter generates triangles covering all six outer walls of the Image +Geometry's bounding box. These faces are artifacts of where the volume was cropped rather +than real interfaces, and they receive a Face Label of `-1` on the exterior side. + +Enabling **Omit Bounding Box Skin** suppresses a wall face when the voxel behind it is +background (Feature Id 0) — that is, when its Face Labels would be `{-1, 0}`. Wall faces +that cap a *real* Feature are still generated, because that cut plane is the only possible +closure for a Feature flush with the box. A cylinder sitting flush with the box floor +therefore comes out as a closed surface with no surrounding box. + +On a fully-indexed volume with no Feature Id 0 voxels, nothing is dropped and the option +has no effect — every boundary Feature already needs its wall cap to stay closed. + +Because the test is per-face rather than per-vertex, no triangles are lost along the rim +where an internal boundary meets the box wall. + +**Note:** M3C's candidate-node generation always produces a handful of node entries near the +volume boundary that no triangle references, even with the option disabled — these orphan +vertices are present in stock M3C output. When **Omit Bounding Box Skin** is enabled *and* at +least one wall face is actually pruned, M3C also clears those pre-existing orphan vertices, so +the output has no unreferenced vertices at all. When the option removes nothing (for example on +a fully-indexed volume), it remains a strict no-op and the orphans are left untouched. As a +result, enabling the option on data with any background-backed wall face can reduce the vertex +count by more than the number of removed faces alone would suggest. + ### Notes and Limitations - The volume is automatically wrapped in a temporary ghost layer so that **Features** touching the diff --git a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md index 3938111fa9..dd6c13a3c2 100644 --- a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md +++ b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md @@ -97,6 +97,24 @@ DREAM3D-NX provides three **Filters** that convert a segmented grid into a multi **Guidance:** Surface Nets is the recommended default for most workflows — it yields the smoothest mesh with the fewest triangles and preserves sharp boundaries. Use M3C when a primal, marching-cubes case-table topology is required for a specific downstream modeling or simulation workflow. QuickMesh is retained for backward compatibility. +### Omitting the Bounding Box Skin + +By default this filter generates triangles covering all six outer walls of the Image +Geometry's bounding box. These faces are artifacts of where the volume was cropped rather +than real interfaces, and they receive a Face Label of `-1` on the exterior side. + +Enabling **Omit Bounding Box Skin** suppresses a wall face when the voxel behind it is +background (Feature Id 0) — that is, when its Face Labels would be `{-1, 0}`. Wall faces +that cap a *real* Feature are still generated, because that cut plane is the only possible +closure for a Feature flush with the box. A cylinder sitting flush with the box floor +therefore comes out as a closed surface with no surrounding box. + +On a fully-indexed volume with no Feature Id 0 voxels, nothing is dropped and the option +has no effect — every boundary Feature already needs its wall cap to stay closed. + +Because the test is per-face rather than per-vertex, no triangles are lost along the rim +where an internal boundary meets the box wall. + % Auto generated parameter table will be inserted here ## Example Pipelines diff --git a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md index 81a3b1a1b1..dea3c61e96 100644 --- a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md +++ b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md @@ -39,26 +39,20 @@ SurfaceNets output **with** the built-in smoothing operation applied. ## Node Types -During the meshing process, each vertex, or node, will get a "Node Type" value assigned to it. These will range from 0 to 6. The value is an internal representation from the SurfaceNets algorithm. They are roughly equivelent to the Node Types from the Quick Surface Mesh algorithm but not strictly the same. +During the meshing process, each vertex, or node, will get a "Node Type" value assigned to it. This filter uses the same convention as the Create Surface Mesh (QuickMesh) and Create Surface Mesh (M3C) **Filters**: the value is the number of distinct **Features** meeting at the node, capped at 4, plus 10 when the node lies on the outer surface of the bounding box. -- Node Type = 0: This is a node that ONLY has 2 features connected to the node. -- Node Type = 2: This is a node that has 3 features connected to the node, such as a triple line -- Node Type = 3-6: These nodes have 4 or more features connected to the node. - - -| Node Type | Example Image | -|-----------|----------------------------------------------| -| 0 | ![Node Type 0](Images/SurfaceNets_NodeType_0.png)| -| 2 | ![Node Type 2](Images/SurfaceNets_NodeType_2.png)| -| 3 | ![Node Type 3](Images/SurfaceNets_NodeType_3.png)| -| 4 | ![Node Type 4](Images/SurfaceNets_NodeType_4.png)| -| 6 | ![Node Type 6](Images/SurfaceNets_NodeType_6.png)| +| Id Value | Node Type | +|----------|-----------| +| 2 | Normal **Vertex** | +| 3 | Triple Line | +| 4 | Quadruple Point (four or more Features meet) | +| 12 | Normal **Vertex** on the outer surface of the bounding box | +| 13 | Triple Line on the outer surface of the bounding box | +| 14 | Quadruple Point on the outer surface of the bounding box | ### Exterior or Boundary Nodes -Nodes that appear on the exterior of a volume have Node Type values starting at 10 and going up from there. For instance, a triple line that is also on the exterior of the volume should have a value of 12. - -![Exterior Node Types](Images/SurfaceNets_NodeType_Exterior.png) +Nodes that appear on the outer surface of the bounding box have Node Type values starting at 12 and going up from there. For instance, a triple line that is also on the exterior of the volume has a value of 13. ### Exterior or Boundary Triangles @@ -88,6 +82,24 @@ DREAM3D-NX provides three **Filters** that convert a segmented grid into a multi **Guidance:** Surface Nets is the recommended default for most workflows — it yields the smoothest mesh with the fewest triangles and preserves sharp boundaries. Use M3C when a primal, marching-cubes case-table topology is required for a specific downstream modeling or simulation workflow. QuickMesh is retained for backward compatibility. +### Omitting the Bounding Box Skin + +By default this filter generates triangles covering all six outer walls of the Image +Geometry's bounding box. These faces are artifacts of where the volume was cropped rather +than real interfaces, and they receive a Face Label of `-1` on the exterior side. + +Enabling **Omit Bounding Box Skin** suppresses a wall face when the voxel behind it is +background (Feature Id 0) — that is, when its Face Labels would be `{-1, 0}`. Wall faces +that cap a *real* Feature are still generated, because that cut plane is the only possible +closure for a Feature flush with the box. A cylinder sitting flush with the box floor +therefore comes out as a closed surface with no surrounding box. + +On a fully-indexed volume with no Feature Id 0 voxels, nothing is dropped and the option +has no effect — every boundary Feature already needs its wall cap to stay closed. + +Because the test is per-face rather than per-vertex, no triangles are lost along the rim +where an internal boundary meets the box wall. + % Auto generated parameter table will be inserted here ## Example Pipelines From 850203d80a298aaa4d2ce1083cca5c98798ee773 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Tue, 11 Aug 2026 14:51:08 -0400 Subject: [PATCH 14/24] DOC: clarify Node Type formula and document the all-background degenerate case The Node Type formula ("...capped at 4, plus 10...") was ambiguous about whether the exterior counts as an owner, inviting an off-by-one Node Type Range. Made explicit in SurfaceNetsFilter.md, M3CSurfaceMeshingFilter.md, and ExtractInternalSurfacesFromTriangleGeometryFilter.md that the exterior is one of the owners, so a plain wall vertex is 12, not 11. Also documented the all-background degenerate case (warning -56340, zero vertices/faces, treated as success) in all three mesher docs. --- ...tractInternalSurfacesFromTriangleGeometryFilter.md | 4 +++- .../SimplnxCore/docs/M3CSurfaceMeshingFilter.md | 11 ++++++++++- .../SimplnxCore/docs/QuickSurfaceMeshFilter.md | 6 ++++++ src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md | 8 +++++++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md b/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md index 73510e7564..fb02162bd6 100644 --- a/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md +++ b/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md @@ -22,7 +22,9 @@ With the **Node Type Range** criterion, the user must supply a "Node Type" **Ver | 14 | Quadruple Point on the outer surface of the bounding box | The value is the number of distinct Features meeting at the node, capped at 4, plus 10 when -the node lies on the bounding box wall. +the node lies on the bounding box wall. The region outside the volume counts as one of those +owners, which is why an ordinary vertex on the wall between the exterior and a single Feature +is `12` — two owners, one of them the exterior — rather than `11`. This **Filter** has the effect of removing any **Triangles** that only contain **Vertices** whose node Id values fall outside of the min and max that the user sets. In general, this *node type* array is created when the original surface mesh is created. diff --git a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md index 3540fa816c..7e52201c19 100644 --- a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md +++ b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md @@ -40,7 +40,10 @@ modeling and simulation workflows. ### Node Types The **Node Types** array uses the same convention as the Surface Nets **Filter**. Interior values -denote how many **Features** meet at the vertex; the exterior (volume-boundary) variants add 10. +denote how many **Features** meet at the vertex, capped at 4; the exterior (volume-boundary) +variants add 10. The region outside the volume counts as one of those owners, which is why an +ordinary vertex on the wall between the exterior and a single Feature is `12` — two owners, one +of them the exterior — rather than `11`. | Node Type | Meaning | |-----------|---------| @@ -82,6 +85,12 @@ has no effect — every boundary Feature already needs its wall cap to stay clos Because the test is per-face rather than per-vertex, no triangles are lost along the rim where an internal boundary meets the box wall. +If every voxel in the volume is background (Feature Id 0), every face is a background-backed +wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) +and creates the **Triangle Geometry** with zero vertices and zero faces; this is treated as +success, not an error, because the input is legal — it simply contains no internal interface +and no Feature to cap. + **Note:** M3C's candidate-node generation always produces a handful of node entries near the volume boundary that no triangle references, even with the option disabled — these orphan vertices are present in stock M3C output. When **Omit Bounding Box Skin** is enabled *and* at diff --git a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md index dd6c13a3c2..6249e699ca 100644 --- a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md +++ b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md @@ -115,6 +115,12 @@ has no effect — every boundary Feature already needs its wall cap to stay clos Because the test is per-face rather than per-vertex, no triangles are lost along the rim where an internal boundary meets the box wall. +If every voxel in the volume is background (Feature Id 0), every face is a background-backed +wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) +and creates the **Triangle Geometry** with zero vertices and zero faces; this is treated as +success, not an error, because the input is legal — it simply contains no internal interface +and no Feature to cap. + % Auto generated parameter table will be inserted here ## Example Pipelines diff --git a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md index dea3c61e96..4786ea337e 100644 --- a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md +++ b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md @@ -39,7 +39,7 @@ SurfaceNets output **with** the built-in smoothing operation applied. ## Node Types -During the meshing process, each vertex, or node, will get a "Node Type" value assigned to it. This filter uses the same convention as the Create Surface Mesh (QuickMesh) and Create Surface Mesh (M3C) **Filters**: the value is the number of distinct **Features** meeting at the node, capped at 4, plus 10 when the node lies on the outer surface of the bounding box. +During the meshing process, each vertex, or node, will get a "Node Type" value assigned to it. This filter uses the same convention as the Create Surface Mesh (QuickMesh) and Create Surface Mesh (M3C) **Filters**: the value is the number of distinct **Features** meeting at the node, capped at 4, plus 10 when the node lies on the outer surface of the bounding box. The region outside the volume counts as one of those owners, which is why an ordinary vertex on the wall between the exterior and a single Feature is `12` — two owners, one of them the exterior — rather than `11`. | Id Value | Node Type | |----------|-----------| @@ -100,6 +100,12 @@ has no effect — every boundary Feature already needs its wall cap to stay clos Because the test is per-face rather than per-vertex, no triangles are lost along the rim where an internal boundary meets the box wall. +If every voxel in the volume is background (Feature Id 0), every face is a background-backed +wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) +and creates the **Triangle Geometry** with zero vertices and zero faces; this is treated as +success, not an error, because the input is legal — it simply contains no internal interface +and no Feature to cap. + % Auto generated parameter table will be inserted here ## Example Pipelines From 336548c6b8d0cc7cb13fc9c82f7f9d15078ecf59 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Tue, 11 Aug 2026 15:21:14 -0400 Subject: [PATCH 15/24] FIX: rename the criterion key to satisfy the _index convention ChoicesParameter keys must end with _index, enforced by nx::core::FilterValidation::Filter Parameter Keys. The key ships as internal_surface_criterion_index; the parametersVersion migration comment is corrected to match. --- .../ExtractInternalSurfacesFromTriangleGeometryFilter.cpp | 2 +- .../ExtractInternalSurfacesFromTriangleGeometryFilter.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.cpp index 2b0b2ddade..8b996fe381 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.cpp @@ -104,7 +104,7 @@ IFilter::VersionType ExtractInternalSurfacesFromTriangleGeometryFilter::paramete return 2; // Version 1 -> 2 // Change 1: - // Added - k_CriterionMode_Key = "internal_surface_criterion"; + // Added - k_CriterionMode_Key = "internal_surface_criterion_index"; // Solution - set the value to 0 (Node Type Range, preserves prior behavior); // Change 2: // Added - k_FaceLabelsPath_Key = "face_labels_path"; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.hpp index 6a6881ca81..35ed69f0a2 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/ExtractInternalSurfacesFromTriangleGeometryFilter.hpp @@ -29,7 +29,7 @@ class SIMPLNXCORE_EXPORT ExtractInternalSurfacesFromTriangleGeometryFilter : pub static constexpr StringLiteral k_VertexAttributeMatrixName_Key = "vertex_attribute_matrix_name"; static constexpr StringLiteral k_TriangleAttributeMatrixName_Key = "triangle_attribute_matrix_name"; static constexpr StringLiteral k_NodeTypeRange_Key = "node_type_range"; - static constexpr StringLiteral k_CriterionMode_Key = "internal_surface_criterion"; + static constexpr StringLiteral k_CriterionMode_Key = "internal_surface_criterion_index"; static constexpr StringLiteral k_FaceLabelsPath_Key = "face_labels_path"; /** From a426663942f89def976f4e06926a85a6176aacfb Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Tue, 11 Aug 2026 15:47:03 -0400 Subject: [PATCH 16/24] FIX: address final whole-branch review findings for Omit Bounding Box Skin Portable env-var shim for MSVC in M3CSurfaceMeshingTest (was POSIX-only, blocked Windows CI); exercise the shipped default (Repair Triangle Winding on) in the all-background degenerate case for all three meshers; make the SurfaceNets/QuickSurfaceMesh Node Type equivalence test exact instead of histogram-based; document the two unconditional SurfaceNets output changes (Face Labels, Node Types); compare Face Labels arrays (not just counts) in the ExtractInternalSurfaces oracle test; add Node Types checks to the Omit-Bounding-Box-Skin no-op sections; restore five pre-existing RunM3COnToy call sites to their original formatting. Co-Authored-By: Claude Opus 5 --- .../SimplnxCore/docs/SurfaceNetsFilter.md | 18 ++ ...ternalSurfacesFromTriangleGeometryTest.cpp | 13 +- .../test/M3CSurfaceMeshingTest.cpp | 49 ++++- .../test/OmitBoundingBoxSkinTest.cpp | 184 +++++++++++++----- .../test/SurfaceMeshingTestUtils.hpp | 12 +- .../test/SurfaceNetsNodeTypesTest.cpp | 40 ++-- 6 files changed, 245 insertions(+), 71 deletions(-) diff --git a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md index 4786ea337e..ddb8ebd0c5 100644 --- a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md +++ b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md @@ -64,6 +64,24 @@ have a value of -1. This filter should be used in place of the "QuickMesh Surface Filter". +## Changed Behavior for Existing Pipelines + +Two defects in this filter's output were fixed as part of adding the **Omit Bounding Box Skin** +option below. Both fixes apply unconditionally -- they are not gated by that new option -- so any +pipeline that already used this **Filter** will see different (corrected) output the next time it +runs, with no parameter change on the user's part: + +- **Face Labels**: a face between the exterior and Feature Id 0 is now reported as `{-1, 0}`. + Previously it was reported as `{-1, -1}`. Likewise, a face between Feature Id 0 and another + Feature `k` is now `{0, k}`; previously it was reported as `{-1, k}`. +- **Node Types**: values were previously a junction-face-crossing count in the range `0`-`6`, with + exterior-node variants offset inconsistently. They now follow the shared convention described + above (`2`/`3`/`4` for interior nodes, `12`/`13`/`14` on the bounding box wall), matching Create + Surface Mesh (QuickMesh) and Create Surface Mesh (M3C). + +If you hand-tuned a Node Type range parameter against this **Filter**'s old values, or if you +compare newly generated output against previously stored SurfaceNets results, re-check it against +the tables above. ## Comparison of Surface Meshing Filters diff --git a/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp b/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp index dc38651497..4d89aa74a8 100644 --- a/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp +++ b/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp @@ -4,6 +4,7 @@ #include "SurfaceMeshingTestUtils.hpp" #include "simplnx/Core/Application.hpp" +#include "simplnx/DataStructure/DataArray.hpp" #include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" #include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Pipeline/Pipeline.hpp" @@ -222,7 +223,10 @@ TEST_CASE("SimplnxCore::ExtractInternalSurfacesFromTriangleGeometryFilter: Face args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_VertexAttributeMatrixName_Key, std::make_any("Vertex Data")); args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_TriangleAttributeMatrixName_Key, std::make_any("Face Data")); args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CopyVertexPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); - args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CopyTrianglePaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); + // Copy Face Labels along into the extracted geometry too, so the "both code paths agree" claim + // below can be checked array-for-array rather than just by counting faces and vertices. + args.insertOrAssign(ExtractInternalSurfacesFromTriangleGeometryFilter::k_CopyTrianglePaths_Key, + std::make_any(MultiArraySelectionParameter::ValueType{faceLabelsPath})); auto preflightResult = filter.preflight(dataStructure, args); SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); @@ -244,6 +248,13 @@ TEST_CASE("SimplnxCore::ExtractInternalSurfacesFromTriangleGeometryFilter: Face REQUIRE(extractedGeom.getNumberOfFaces() == directGeom.getNumberOfFaces()); REQUIRE(extractedGeom.getNumberOfVertices() == directGeom.getNumberOfVertices()); + // The two paths must agree exactly, not just on counts: compare the Face Labels array copied + // into the extracted geometry against the one QuickSurfaceMesh produced directly. + const DataPath extractedFaceLabelsPath = extractedPath.createChildPath("Face Data").createChildPath(faceLabelsPath.getTargetName()); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(extractedFaceLabelsPath)); + REQUIRE_NOTHROW(directMeshResult.Structure.getDataRefAs(directMeshResult.FaceLabelsPath)); + UnitTest::CompareDataArrays(dataStructure.getDataRefAs(extractedFaceLabelsPath), directMeshResult.Structure.getDataRefAs(directMeshResult.FaceLabelsPath)); + UnitTest::CheckArraysInheritTupleDims(dataStructure); } diff --git a/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp b/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp index 1cd21dd90c..84e719a0d7 100644 --- a/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp +++ b/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp @@ -287,35 +287,40 @@ void RunM3COnToy(usize xDim, usize yDim, usize zDim, LabelFuncT&& labeler, [[may // This is the minimal deterministic regression for the null-neighbor crash in treat_anomaly. TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Checkerboard Saddle", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy(8, 8, 8, [](usize x, usize y, usize z) -> int32 { return static_cast(((x + y + z) & 1U) + 1); }, "M3CSurfaceMeshingFilterTest_Checkerboard.dream3d"); + RunM3COnToy( + 8, 8, 8, [](usize x, usize y, usize z) -> int32 { return static_cast(((x + y + z) & 1U) + 1); }, "M3CSurfaceMeshingFilterTest_Checkerboard.dream3d"); } // 8-label octant pattern (1 + x%2 + 2*(y%2) + 4*(z%2)): a repeating 2x2x2 of 8 distinct labels, so // squares present 4 distinct corners (quad points, get_square_index == 19) plus triple configs. TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Octant Quad Points", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy(8, 8, 8, [](usize x, usize y, usize z) -> int32 { return static_cast(1 + (x & 1U) + 2 * (y & 1U) + 4 * (z & 1U)); }, "M3CSurfaceMeshingFilterTest_Octant.dream3d"); + RunM3COnToy( + 8, 8, 8, [](usize x, usize y, usize z) -> int32 { return static_cast(1 + (x & 1U) + 2 * (y & 1U) + 4 * (z & 1U)); }, "M3CSurfaceMeshingFilterTest_Octant.dream3d"); } // Three regions meeting along a vertical line (L-shaped split) => triple lines // (get_square_index in {7,11,13,14}) plus ordinary binary interfaces. TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Triple Line", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy(8, 8, 8, [](usize x, usize y, usize /*z*/) -> int32 { return (x < 4) ? 1 : ((y < 4) ? 2 : 3); }, "M3CSurfaceMeshingFilterTest_TripleLine.dream3d"); + RunM3COnToy( + 8, 8, 8, [](usize x, usize y, usize /*z*/) -> int32 { return (x < 4) ? 1 : ((y < 4) ? 2 : 3); }, "M3CSurfaceMeshingFilterTest_TripleLine.dream3d"); } // Single isolated interior voxel in a uniform matrix: the four neighboring squares are [B,A,A,A] // rotations, exercising get_square_index in {3,6,9,12} (the single-corner binary configurations). TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Single Voxel Inclusion", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy(8, 8, 8, [](usize x, usize y, usize z) -> int32 { return (x == 4 && y == 4 && z == 4) ? 2 : 1; }, "M3CSurfaceMeshingFilterTest_Inclusion.dream3d"); + RunM3COnToy( + 8, 8, 8, [](usize x, usize y, usize z) -> int32 { return (x == 4 && y == 4 && z == 4) ? 2 : 1; }, "M3CSurfaceMeshingFilterTest_Inclusion.dream3d"); } // Interleaved 3-label tiling (rows "1 2" / "3 1"): squares [1,2,1,3] and [2,1,3,1] have all edges // differing with exactly one diagonal equal, exercising get_square_index 17 and 18. TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Toy Interleaved Diagonal", "[SimplnxCore][M3CSurfaceMeshingFilter]") { - RunM3COnToy(8, 8, 8, [](usize x, usize y, usize /*z*/) -> int32 { return (y % 2 == 0) ? ((x % 2 == 0) ? 1 : 2) : ((x % 2 == 0) ? 3 : 1); }, "M3CSurfaceMeshingFilterTest_Interleaved.dream3d"); + RunM3COnToy( + 8, 8, 8, [](usize x, usize y, usize /*z*/) -> int32 { return (y % 2 == 0) ? ((x % 2 == 0) ? 1 : 2) : ((x % 2 == 0) ? 3 : 1); }, "M3CSurfaceMeshingFilterTest_Interleaved.dream3d"); } TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: SIMPL Backwards Compatibility", "[SimplnxCore][M3CSurfaceMeshingFilter][BackwardsCompatibility]") @@ -525,6 +530,32 @@ TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Exemplar Comparison", "[Simplnx namespace { +// Portable environment-variable mutators. POSIX declares setenv()/unsetenv(), but MSVC does not, +// so plain std::getenv() is used for reads everywhere else in this repo while writes need this +// shim. MSVC's _putenv_s() removes a variable when given an empty string, which is the closest +// portable equivalent to unsetenv(). +#ifdef _WIN32 +void SetEnvVar(const std::string& name, const char* value) +{ + _putenv_s(name.c_str(), value != nullptr ? value : ""); +} + +void UnsetEnvVar(const std::string& name) +{ + _putenv_s(name.c_str(), ""); +} +#else +void SetEnvVar(const std::string& name, const char* value) +{ + ::setenv(name.c_str(), value, 1); +} + +void UnsetEnvVar(const std::string& name) +{ + ::unsetenv(name.c_str()); +} +#endif + // Temporarily sets (or clears) an environment variable for the lifetime of the object, restoring // whatever was there before on destruction. Used below to select M3C's sweep path, which is read // once from the environment at the top of M3CSurfaceMeshing::operator()(). @@ -541,11 +572,11 @@ class ScopedEnvVar } if(value != nullptr) { - setenv(m_Name.c_str(), value, 1); + SetEnvVar(m_Name, value); } else { - unsetenv(m_Name.c_str()); + UnsetEnvVar(m_Name); } } @@ -553,11 +584,11 @@ class ScopedEnvVar { if(m_HadPrevious) { - setenv(m_Name.c_str(), m_PreviousValue.c_str(), 1); + SetEnvVar(m_Name, m_PreviousValue.c_str()); } else { - unsetenv(m_Name.c_str()); + UnsetEnvVar(m_Name); } } diff --git a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp index 82f9632903..b9d89f7862 100644 --- a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp +++ b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp @@ -268,25 +268,29 @@ namespace // Triangle Geometry paths and mesher-specific extra args as the RunQuickSurfaceMesh / // RunSurfaceNets / RunM3C wrappers above, so degenerate cases can inspect the execute Result<> // (e.g. warnings) instead of asserting validity and aborting. -Result<> RunQuickSurfaceMeshRaw(DataStructure& dataStructure, bool omitSkin) +Result<> RunQuickSurfaceMeshRaw(DataStructure& dataStructure, bool omitSkin, bool repairWinding = false) { - return SurfaceMeshingTest::RunMesherRaw(dataStructure, k_TriangleGeomPath, omitSkin, - [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); + return SurfaceMeshingTest::RunMesherRaw( + dataStructure, k_TriangleGeomPath, omitSkin, [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }, repairWinding); } -Result<> RunSurfaceNetsRaw(DataStructure& dataStructure, bool omitSkin) +Result<> RunSurfaceNetsRaw(DataStructure& dataStructure, bool omitSkin, bool repairWinding = false) { - return SurfaceMeshingTest::RunMesherRaw(dataStructure, k_SurfaceNetsTriangleGeomPath, omitSkin, [](Arguments& args) { - args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); - args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); - args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); - args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); - }); + return SurfaceMeshingTest::RunMesherRaw( + dataStructure, k_SurfaceNetsTriangleGeomPath, omitSkin, + [](Arguments& args) { + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); + args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); + args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); + }, + repairWinding); } -Result<> RunM3CRaw(DataStructure& dataStructure, bool omitSkin) +Result<> RunM3CRaw(DataStructure& dataStructure, bool omitSkin, bool repairWinding = false) { - return SurfaceMeshingTest::RunMesherRaw(dataStructure, k_M3CTriangleGeomPath, omitSkin, [](Arguments&) {}); + return SurfaceMeshingTest::RunMesherRaw( + dataStructure, k_M3CTriangleGeomPath, omitSkin, [](Arguments&) {}, repairWinding); } } // namespace @@ -322,6 +326,14 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin is a no-op without background", " REQUIRE_NOTHROW(onStructure.getDataRefAs(faceLabelsPath)); UnitTest::CompareDataArrays(offStructure.getDataRefAs(faceLabelsPath), onStructure.getDataRefAs(faceLabelsPath)); + // Node Types are untouched by M3C's orphan-cleanup discontinuity, but this is the only no-op + // test that checks all three meshers, so it is the natural place to cover the array for all of + // them rather than just Face Labels/Faces/Vertices. + const DataPath nodeTypesPath = k_TriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + REQUIRE_NOTHROW(offStructure.getDataRefAs(nodeTypesPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(nodeTypesPath)); + UnitTest::CompareDataArrays(offStructure.getDataRefAs(nodeTypesPath), onStructure.getDataRefAs(nodeTypesPath)); + UnitTest::CheckArraysInheritTupleDims(offStructure); UnitTest::CheckArraysInheritTupleDims(onStructure); } @@ -349,6 +361,11 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin is a no-op without background", " REQUIRE_NOTHROW(onStructure.getDataRefAs(faceLabelsPath)); UnitTest::CompareDataArrays(offStructure.getDataRefAs(faceLabelsPath), onStructure.getDataRefAs(faceLabelsPath)); + const DataPath nodeTypesPath = k_SurfaceNetsTriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + REQUIRE_NOTHROW(offStructure.getDataRefAs(nodeTypesPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(nodeTypesPath)); + UnitTest::CompareDataArrays(offStructure.getDataRefAs(nodeTypesPath), onStructure.getDataRefAs(nodeTypesPath)); + UnitTest::CheckArraysInheritTupleDims(offStructure); UnitTest::CheckArraysInheritTupleDims(onStructure); } @@ -376,6 +393,15 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin is a no-op without background", " REQUIRE_NOTHROW(onStructure.getDataRefAs(faceLabelsPath)); UnitTest::CompareDataArrays(offStructure.getDataRefAs(faceLabelsPath), onStructure.getDataRefAs(faceLabelsPath)); + // M3C's orphan-cleanup is the one code path in the whole feature that has a discontinuity + // (see M3CSurfaceMeshing.cpp:2566): it is gated on whether the prune actually dropped anything, + // not on the option flag alone. This fully-indexed input drops nothing, so Node Types must + // still match exactly here. + const DataPath nodeTypesPath = k_M3CTriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + REQUIRE_NOTHROW(offStructure.getDataRefAs(nodeTypesPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(nodeTypesPath)); + UnitTest::CompareDataArrays(offStructure.getDataRefAs(nodeTypesPath), onStructure.getDataRefAs(nodeTypesPath)); + UnitTest::CheckArraysInheritTupleDims(offStructure); UnitTest::CheckArraysInheritTupleDims(onStructure); } @@ -385,57 +411,127 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume { UnitTest::LoadPlugins(); - DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, true); + SECTION("Repair Triangle Winding off") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, true); + + // Success with a warning, not an error: the data is legal, just entirely background. + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == -56340); + + // The geometry still exists, just empty. + REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_TriangleGeomPath)); + const auto& triangleGeom = dataStructure.getDataRefAs(k_TriangleGeomPath); + REQUIRE(triangleGeom.getNumberOfFaces() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == 0); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); + } + + // Repair Triangle Winding defaults to true on all three meshers, so this is the configuration + // shipped users actually get. It exercises the windingResult.valid() guard (QuickSurfaceMesh.cpp) + // and proves findElementNeighbors()/RepairTriangleWinding() are safe to run on a 0-face/0-vertex + // geometry: the contract (success, one warning, zero faces, zero vertices) must still hold. + SECTION("Repair Triangle Winding on (shipped default)") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, true, /*repairWinding*/ true); - // Success with a warning, not an error: the data is legal, just entirely background. - SIMPLNX_RESULT_REQUIRE_VALID(executeResult); - REQUIRE(executeResult.warnings().size() == 1); - REQUIRE(executeResult.warnings()[0].code == -56340); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == -56340); - // The geometry still exists, just empty. - REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_TriangleGeomPath)); - const auto& triangleGeom = dataStructure.getDataRefAs(k_TriangleGeomPath); - REQUIRE(triangleGeom.getNumberOfFaces() == 0); - REQUIRE(triangleGeom.getNumberOfVertices() == 0); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_TriangleGeomPath)); + const auto& triangleGeom = dataStructure.getDataRefAs(k_TriangleGeomPath); + REQUIRE(triangleGeom.getNumberOfFaces() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == 0); - UnitTest::CheckArraysInheritTupleDims(dataStructure); + UnitTest::CheckArraysInheritTupleDims(dataStructure); + } } TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume (SurfaceNets)", "[SimplnxCore][SurfaceNetsFilter]") { UnitTest::LoadPlugins(); - DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, true); + SECTION("Repair Triangle Winding off") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, true); + + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == -56340); + + REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); + const auto& triangleGeom = dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); + REQUIRE(triangleGeom.getNumberOfFaces() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == 0); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); + } + + // See the QuickSurfaceMesh test case above for why this configuration matters: Repair Triangle + // Winding defaults to true, and this proves the warning contract holds there too (guard at + // SurfaceNets.cpp). + SECTION("Repair Triangle Winding on (shipped default)") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, true, /*repairWinding*/ true); - SIMPLNX_RESULT_REQUIRE_VALID(executeResult); - REQUIRE(executeResult.warnings().size() == 1); - REQUIRE(executeResult.warnings()[0].code == -56340); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == -56340); - REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); - const auto& triangleGeom = dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); - REQUIRE(triangleGeom.getNumberOfFaces() == 0); - REQUIRE(triangleGeom.getNumberOfVertices() == 0); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); + const auto& triangleGeom = dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); + REQUIRE(triangleGeom.getNumberOfFaces() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == 0); - UnitTest::CheckArraysInheritTupleDims(dataStructure); + UnitTest::CheckArraysInheritTupleDims(dataStructure); + } } TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume (M3CSurfaceMeshing)", "[SimplnxCore][M3CSurfaceMeshingFilter]") { UnitTest::LoadPlugins(); - DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> executeResult = RunM3CRaw(dataStructure, true); + SECTION("Repair Triangle Winding off") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> executeResult = RunM3CRaw(dataStructure, true); + + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == -56340); + + REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto& triangleGeom = dataStructure.getDataRefAs(k_M3CTriangleGeomPath); + REQUIRE(triangleGeom.getNumberOfFaces() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == 0); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); + } + + // See the QuickSurfaceMesh test case above for why this configuration matters. M3C does not + // route through the shared windingResult.valid() guard the same way, but it still must honor + // the same warning contract when Repair Triangle Winding is left at its shipped default of true. + SECTION("Repair Triangle Winding on (shipped default)") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> executeResult = RunM3CRaw(dataStructure, true, /*repairWinding*/ true); - SIMPLNX_RESULT_REQUIRE_VALID(executeResult); - REQUIRE(executeResult.warnings().size() == 1); - REQUIRE(executeResult.warnings()[0].code == -56340); + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == -56340); - REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_M3CTriangleGeomPath)); - const auto& triangleGeom = dataStructure.getDataRefAs(k_M3CTriangleGeomPath); - REQUIRE(triangleGeom.getNumberOfFaces() == 0); - REQUIRE(triangleGeom.getNumberOfVertices() == 0); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto& triangleGeom = dataStructure.getDataRefAs(k_M3CTriangleGeomPath); + REQUIRE(triangleGeom.getNumberOfFaces() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == 0); - UnitTest::CheckArraysInheritTupleDims(dataStructure); + UnitTest::CheckArraysInheritTupleDims(dataStructure); + } } diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp index 727af46682..52034ee634 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -227,9 +227,11 @@ struct FeatureIdsKeyTrait * @param triangleGeomPath Path at which to create the Triangle Geometry. * @param omitSkin Value for the Omit Bounding Box Skin parameter. * @param addExtraArgs Callback that inserts the mesher-specific arguments into the Arguments object. + * @param repairWinding Value for the Repair Triangle Winding parameter. Defaults to false (matching + * every pre-existing call site); pass true to exercise the shipped default configuration instead. */ template -inline Arguments BuildMesherArgs(const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs) +inline Arguments BuildMesherArgs(const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs, bool repairWinding = false) { Arguments args; args.insertOrAssign(FilterT::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); @@ -241,7 +243,7 @@ inline Arguments BuildMesherArgs(const DataPath& triangleGeomPath, bool omitSkin args.insertOrAssign(FilterT::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); args.insertOrAssign(FilterT::k_FaceDataGroupName_Key, std::make_any("Face Data")); args.insertOrAssign(FilterT::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); - args.insertOrAssign(FilterT::k_RepairTriangleWinding_Key, std::make_any(false)); + args.insertOrAssign(FilterT::k_RepairTriangleWinding_Key, std::make_any(repairWinding)); args.insertOrAssign(FilterT::k_OmitBoundingBoxSkin_Key, std::make_any(omitSkin)); addExtraArgs(args); @@ -291,12 +293,14 @@ inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& trian * @param triangleGeomPath Path at which to create the Triangle Geometry. * @param omitSkin Value for the Omit Bounding Box Skin parameter. * @param addExtraArgs Callback that inserts the mesher-specific arguments into the Arguments object. + * @param repairWinding Value for the Repair Triangle Winding parameter. Defaults to false (matching + * every pre-existing call site); pass true to exercise the shipped default configuration instead. */ template -inline Result<> RunMesherRaw(DataStructure& dataStructure, const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs) +inline Result<> RunMesherRaw(DataStructure& dataStructure, const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs, bool repairWinding = false) { FilterT filter; - Arguments args = BuildMesherArgs(triangleGeomPath, omitSkin, addExtraArgs); + Arguments args = BuildMesherArgs(triangleGeomPath, omitSkin, addExtraArgs, repairWinding); auto preflightResult = filter.preflight(dataStructure, args); SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp index 8078dbe80c..abf9872dc3 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp @@ -12,6 +12,8 @@ #include #include +#include +#include using namespace nx::core; @@ -142,26 +144,38 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Node Types agree with QuickSurfaceMes const auto& qsmGeom = quickMeshStructure.getDataRefAs(quickMeshPath); REQUIRE(snGeom.getNumberOfVertices() == qsmGeom.getNumberOfVertices()); + const auto& snVertsRef = snGeom.getVertices()->getDataStoreRef(); + const auto& qsmVertsRef = qsmGeom.getVertices()->getDataStoreRef(); const auto& snTypesRef = surfaceNetsStructure.getDataRefAs(surfaceNetsPath.createChildPath("Vertex Data").createChildPath("NodeTypes")).getDataStoreRef(); const auto& qsmTypesRef = quickMeshStructure.getDataRefAs(quickMeshPath.createChildPath("Vertex Data").createChildPath("NodeTypes")).getDataStoreRef(); - // Compare as histograms: the two meshers number their nodes in different orders, but a - // corner-for-corner equivalence implies identical value counts. - std::map snHistogram; - std::map qsmHistogram; - for(usize i = 0; i < snTypesRef.getNumberOfTuples(); i++) - { - snHistogram[snTypesRef[i]]++; - } + // Exact, corner-for-corner comparison: the two meshers number their nodes in different orders + // (a histogram comparison alone would pass under a permutation of values across corners), so key + // QuickSurfaceMesh's vertices by coordinate and require every SurfaceNets vertex at the same + // coordinate to carry the identical Node Type value. This is the check that proves the + // equivalence argument in the design spec rather than trusting it. + std::map, int8> qsmTypeByCoord; for(usize i = 0; i < qsmTypesRef.getNumberOfTuples(); i++) { - qsmHistogram[qsmTypesRef[i]]++; + qsmTypeByCoord[{qsmVertsRef[i * 3], qsmVertsRef[i * 3 + 1], qsmVertsRef[i * 3 + 2]}] = qsmTypesRef[i]; } - for(const auto& [value, count] : qsmHistogram) + usize mismatchCount = 0; + std::ostringstream firstMismatch; + for(usize i = 0; i < snTypesRef.getNumberOfTuples(); i++) { - INFO("Node Type " << static_cast(value) << ": QuickSurfaceMesh has " << count << ", SurfaceNets has " << snHistogram[value]); - REQUIRE(snHistogram[value] == count); + const std::tuple coord = {snVertsRef[i * 3], snVertsRef[i * 3 + 1], snVertsRef[i * 3 + 2]}; + REQUIRE(qsmTypeByCoord.count(coord) == 1); + if(qsmTypeByCoord[coord] != snTypesRef[i]) + { + if(mismatchCount == 0) + { + firstMismatch << "(" << std::get<0>(coord) << ", " << std::get<1>(coord) << ", " << std::get<2>(coord) << "): QuickSurfaceMesh=" << static_cast(qsmTypeByCoord[coord]) + << " SurfaceNets=" << static_cast(snTypesRef[i]); + } + mismatchCount++; + } } - REQUIRE(snHistogram.size() == qsmHistogram.size()); + INFO("Total mismatching vertices: " << mismatchCount << " / " << snTypesRef.getNumberOfTuples() << (mismatchCount > 0 ? (" -- first mismatch at " + firstMismatch.str()) : std::string{})); + REQUIRE(mismatchCount == 0); } From 9a2d1d8a80e57bf7ebb32097cd6efb894aebc022 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Tue, 11 Aug 2026 16:02:34 -0400 Subject: [PATCH 17/24] TEST: regenerate SurfaceNets exemplars for the corrected Face Labels and Node Types Face Labels no longer conflate Feature Id 0 with the exterior, and Node Types now use the shared 2/3/4 + 10 convention. Vertices and connectivity are unchanged from v3. Regenerated by re-running the exact pipeline stored inside the v3 archive (SurfaceNetsTest_v3.d3dpipeline) against the current build via nxrunner, pointed at a new output file. Diffing v3 vs v4 with h5py confirms the only datasets that changed are the four "Vertex Data/Node Type" arrays; the input DataContainer, Shared Vertex List, Shared Faces List, and Face Labels are byte-identical. New Node Type values fall entirely within {2,3,4,12,13,14}. --- src/Plugins/SimplnxCore/test/CMakeLists.txt | 2 +- src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Plugins/SimplnxCore/test/CMakeLists.txt b/src/Plugins/SimplnxCore/test/CMakeLists.txt index 9f5646ab29..a8066f52e3 100644 --- a/src/Plugins/SimplnxCore/test/CMakeLists.txt +++ b/src/Plugins/SimplnxCore/test/CMakeLists.txt @@ -288,7 +288,7 @@ if(EXISTS "${DREAM3D_DATA_DIR}" AND SIMPLNX_DOWNLOAD_TEST_FILES) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME Small_IN100_dream3d_v3.tar.gz SHA512 bfa9547e787b0f8e8122702da0eb4e519f48a48bf4f94aad020f72479d071d32dfc96a1425705874c68507a61ed391d28606d9c4f4acd559043ef0ace64fd33f) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME Small_IN100_h5ebsd.tar.gz SHA512 31e606285ea9e8235dcb5f608fd2b252a5ab1492abd975e5ec33a21d083aa9720fe16fb8f752742c140f40e963d692f1a46256b9d36e96b1b09796c1e4ea3db9) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME SurfaceMeshTest.tar.gz SHA512 a74e9fa40ccec78174dbbac90969bfa17367c3a7e14b7b84624032317c351de89957750803d7cb43c67dec19281ee4f647de022d474566fd43e25b8230cce6d6) - download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME SurfaceNetsTest_v3.tar.gz SHA512 06865d006a5fb37b66c8045858112af6e2e2e077ee685246acb5516670954a9d87e0791b7e75aa74011e8187fc4625f3b3f97237b09d02475968c2768a65bd7c) + download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME SurfaceNetsTest_v4.tar.gz SHA512 9a89b55630120dc9c2701500e81da3f8d126fbc6e8a2de8ec21e1a8ef97ae90fda6c7a093a8217c65e1db5f5cebd091c37c8f6561cd44d3def911c8acbf83e49) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME volume_graphics_test.tar.gz SHA512 94d996fbf2b8b42cd715fb3adf33548f097970211e7a26eb9ccc5b073a78014eecbd10d40fc0451ff9cc7c92e23ed21582fc082d64e1f62b3714e4d9640c975f) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME vtk_rectilinear_grid_writer.tar.gz SHA512 9fef02b5269609503d03dd0126cc635cc1c1156894cff18b0184b334d705b850ca1a06ae0d1c66a352a32dd9ad9fb74f24255c7de1399b06bbec7d2e2b41941b) download_test_data(DREAM3D_DATA_DIR ${DREAM3D_DATA_DIR} ARCHIVE_NAME winding_quick_surface_mesh.tar.gz SHA512 ed9944b969c4c2feea8902f98d03024248780607848a40ad374d9a1c7861df1d971a355d779a7af8c775f2225b6364b9a17d61c2350375293e531bcee59255b7) diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp index 8b8ce2d9b8..744e8793d5 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp @@ -17,10 +17,10 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Default", "[SimplnxCore][SurfaceNetsF { UnitTest::LoadPlugins(); - const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "SurfaceNetsTest_v3.tar.gz", "SurfaceNetsTest_v3"); + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "SurfaceNetsTest_v4.tar.gz", "SurfaceNetsTest_v4"); // Read the Small IN100 Data set - auto baseDataFilePath = fs::path(fmt::format("{}/SurfaceNetsTest_v3/SurfaceNetsTest_v3.dream3d", nx::core::unit_test::k_TestFilesDir)); + auto baseDataFilePath = fs::path(fmt::format("{}/SurfaceNetsTest_v4/SurfaceNetsTest_v4.dream3d", nx::core::unit_test::k_TestFilesDir)); DataStructure dataStructure = UnitTest::LoadDataStructure(baseDataFilePath); DataPath smallIn100Group({nx::core::Constants::k_DataContainer}); DataPath gridGeomDataPath({k_DataContainer}); @@ -118,10 +118,10 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Smoothing", "[SimplnxCore][SurfaceNet { UnitTest::LoadPlugins(); - const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "SurfaceNetsTest_v3.tar.gz", "SurfaceNetsTest_v3"); + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "SurfaceNetsTest_v4.tar.gz", "SurfaceNetsTest_v4"); // Read the Small IN100 Data set - auto baseDataFilePath = fs::path(fmt::format("{}/SurfaceNetsTest_v3/SurfaceNetsTest_v3.dream3d", nx::core::unit_test::k_TestFilesDir)); + auto baseDataFilePath = fs::path(fmt::format("{}/SurfaceNetsTest_v4/SurfaceNetsTest_v4.dream3d", nx::core::unit_test::k_TestFilesDir)); DataStructure dataStructure = UnitTest::LoadDataStructure(baseDataFilePath); DataPath smallIn100Group({nx::core::Constants::k_DataContainer}); DataPath gridGeomDataPath({k_DataContainer}); @@ -218,10 +218,10 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Winding", "[SimplnxCore][SurfaceNetsF { UnitTest::LoadPlugins(); - const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "SurfaceNetsTest_v3.tar.gz", "SurfaceNetsTest_v3"); + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "SurfaceNetsTest_v4.tar.gz", "SurfaceNetsTest_v4"); // Read the Small IN100 Data set - auto baseDataFilePath = fs::path(fmt::format("{}/SurfaceNetsTest_v3/SurfaceNetsTest_v3.dream3d", nx::core::unit_test::k_TestFilesDir)); + auto baseDataFilePath = fs::path(fmt::format("{}/SurfaceNetsTest_v4/SurfaceNetsTest_v4.dream3d", nx::core::unit_test::k_TestFilesDir)); DataStructure dataStructure = UnitTest::LoadDataStructure(baseDataFilePath); DataPath smallIn100Group({nx::core::Constants::k_DataContainer}); DataPath gridGeomDataPath({k_DataContainer}); @@ -317,10 +317,10 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Winding Smoothing", "[SimplnxCore][Su { UnitTest::LoadPlugins(); - const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "SurfaceNetsTest_v3.tar.gz", "SurfaceNetsTest_v3"); + const nx::core::UnitTest::TestFileSentinel testDataSentinel(nx::core::unit_test::k_TestFilesDir, "SurfaceNetsTest_v4.tar.gz", "SurfaceNetsTest_v4"); // Read the Small IN100 Data set - auto baseDataFilePath = fs::path(fmt::format("{}/SurfaceNetsTest_v3/SurfaceNetsTest_v3.dream3d", nx::core::unit_test::k_TestFilesDir)); + auto baseDataFilePath = fs::path(fmt::format("{}/SurfaceNetsTest_v4/SurfaceNetsTest_v4.dream3d", nx::core::unit_test::k_TestFilesDir)); DataStructure dataStructure = UnitTest::LoadDataStructure(baseDataFilePath); DataPath smallIn100Group({nx::core::Constants::k_DataContainer}); DataPath gridGeomDataPath({k_DataContainer}); From 8843fdd3b2069cdc2416d383378fe84004f468b1 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Wed, 12 Aug 2026 10:12:57 -0400 Subject: [PATCH 18/24] BUG: Fix pre-existing SurfaceNets Z offset and QuickSurfaceMesh wall vertex bugs * SurfaceNets used voxelSize[1] (Y spacing) instead of voxelSize[2] (Z spacing) when relocating vertices by a half-voxel offset, producing wrong Z coordinates on anisotropic grids. Isotropic exemplar data hid this, so add a dedicated anisotropic-spacing regression test that fails without the fix and passes with it. * QuickSurfaceMesh's createNodesAndTriangles wrote grid corner (i, j+1, k+1) for nodeId4 on the i==0 wall but queried coordinates at (i+1, j+1, k+1), a one-voxel X offset. The same corner is written correctly by later iterations, so this has no observed effect on any existing test or exemplar; fixed as a correctness cleanup. Audited the other five wall branches in both determineActiveNodes and createNodesAndTriangles: no other nodeId/coordinate mismatches found. Signed-off-by: Michael Jackson --- .../docs/Images/SurfaceNets_NodeType_0.png | Bin 145272 -> 0 bytes .../docs/Images/SurfaceNets_NodeType_2.png | Bin 113841 -> 0 bytes .../docs/Images/SurfaceNets_NodeType_3.png | Bin 195122 -> 0 bytes .../docs/Images/SurfaceNets_NodeType_4.png | Bin 198654 -> 0 bytes .../docs/Images/SurfaceNets_NodeType_6.png | Bin 120663 -> 0 bytes .../Images/SurfaceNets_NodeType_Exterior.png | Bin 292157 -> 0 bytes .../Filters/Algorithms/QuickSurfaceMesh.cpp | 2 +- .../Filters/Algorithms/SurfaceNets.cpp | 2 +- .../test/SurfaceMeshingTestUtils.hpp | 6 ++- .../SimplnxCore/test/SurfaceNetsTest.cpp | 40 ++++++++++++++++++ 10 files changed, 46 insertions(+), 4 deletions(-) delete mode 100644 src/Plugins/SimplnxCore/docs/Images/SurfaceNets_NodeType_0.png delete mode 100644 src/Plugins/SimplnxCore/docs/Images/SurfaceNets_NodeType_2.png delete mode 100644 src/Plugins/SimplnxCore/docs/Images/SurfaceNets_NodeType_3.png delete mode 100644 src/Plugins/SimplnxCore/docs/Images/SurfaceNets_NodeType_4.png delete mode 100644 src/Plugins/SimplnxCore/docs/Images/SurfaceNets_NodeType_6.png delete mode 100644 src/Plugins/SimplnxCore/docs/Images/SurfaceNets_NodeType_Exterior.png diff --git a/src/Plugins/SimplnxCore/docs/Images/SurfaceNets_NodeType_0.png b/src/Plugins/SimplnxCore/docs/Images/SurfaceNets_NodeType_0.png deleted file mode 100644 index 26b7d270f0abd9ef2d8a6c31da0828004d5b8ab4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145272 zcmZU)1yCKqvp0$pJb~a&a1HJj2=4B7aF>Hyf(Cc@;O-C(aB#PSySuyFHc+(?AG-3_J%1bNTMMVAVWbxp-D@Lt3W|PuYQ!QPY53^nr5XiP*BJqPP*Pz@DTrzbi*aYre$C24Moo zO0-1GoZ#mJ!avc5SE+o}Lm{*23$RnJF*1z(DXNc)!o_%wh~Bm8zUI9zKQ4G}#^!E* zCg?t%1|^brZCZz#iY!vZp-X~&Fd`)-XR?6^1p|csq6NbklS2iNln8-QqrO?+UA2RX zIwIuCuYG&Hf2Ti!F~%W{ zO9P|dPlHM%Q4=zc%+Uu9tg4Buo&s_40~2i2aKh5bjDgJ$?`_fVOlkPxVMKce6cM|k z$|Z9@&QBDcUOrRFs&;>))}p|>CI!?|(7FXYYG)Q8;at4@Nc3j!7Ng-&$Lv(^AKL4e ztNA`6>=m$kouAmEvP*OacfFI~iG5fr)2cP7-ammo(5vVeP08#NP(PI~M(xWZ)2jES zu)>fQ?IvrKFjv6ae9nD8$uY^hzK>OOxc-{@7*}R7fwdkpu@NcA?=3;7R>ohushTZ? z@teva%jhSyrF!STAJUVEye-@+o}pH48-qv)ex0O2e@PMkz(;o?Ex>C2T9a#XoID_e z&wQ-wa}JZr95c$-r#5vg^jWq-MdU}Mfs*icdy#Hy;hKwxbsH{VV*dh_BJfo~Vd()A zN~dB{V^PS8y*U3A53w_h8T=!g-JZ~n<`+C=F2aEbA|4c$5wz_uSVw4*PQ*$cJn>(6 zv7h!}ggyt#ks+dVsno!H4KS&JwuRo!MLt2`+<@YNOYd@WM9_oM>~wWRSwR%cB^5vv z+aSjKP4)>xnT((S7XOENEawhXEg8!oDRS`NTya`_Oi>jnXr^Ed(LN<4HT2T}>pa6; z00jR4a|UTO*eg%;fb#}P!iY^S^w!wLgKsoo(eV=z?8NV%7ce}y%)jQl%p5t}NbLhA zIyErNF<>C23V3y{6Xvf!6OA1A5=i$Y|5(=lt?iv1v?eq@Qpi`WC#B0OJEP= zJ8C3aKP*;ISlC0N#Ga&&9FNS8Xu&^NiyxHYX%`b+6Lp5QhrbOYs;8G#(rc>crWfnv zEfp*kKB+{Nm>2bHWRxeDYm~WZou)6L(8pOT>?(QA?9Lz`v08JxYGoDKSCiyrmx49g z6<*_?ejyn2==B(iTXv^kfP0KLEUOFB?gEIltJuh+4Dldi`CRURQDu8S6s z2|&d^#D~YHi*&z3@6 zH)atHqwK%Lu?><;y+{X_t9dE<{y}!YBPGO(&j@?CPr>CR%uV zU*Q%mW^{qx6+IJeCH<+dm-rL-#sU8lKPoL~bY~Qxf@TG}S@8*cjM#G@t}qL(%Z5Kg zX=22S4;{QW7u9yD)2TZ=a0IFw=RJr{W^5;^#$6j5uXOiB%-~An>g(G!dW>xqw?MZD zvve_TvRLU_Hvs#l*33@KT9d^_RFj)`({`|TZub%Q<}1i5r3^2ZWm=P{7}l%84QF+7 z4Py-<_hK6ux4~t>SKVi`B<1CPy)U$nwScJYbUPa`4pKNX?lN`?j=#Z(q4y)rbI!2e zQxmhR{(x7?EkD-=mlXHP+Ch75k$5|0bAf~ELQ&CJ7Qd$)~esp-~GPrlob}@)=|)kPv5T0wEBLzq`%ACsb#3FuME|J_~I+2X38JDfYhnfZ#ZE6e`c;Oh(G0^(1MQVdzr zL&37Q)vNn{l9X($cE5H_Qb}R(`oOvOo8%m6&NE83Qg))yM<4k&zB~GSH@bML*PeLF z8Oe@mqkU0*ofuBRVTpO!y`G=V3(9-bywY4ZsP@gjHec5*Zno=*>xo%20~2~0-iYpt zjY-Z8+$mn>WJfc;M850Y^QPS3NhT2AV=sB%T0!rnzuAt~Z#tkBT;UMLFx^o;Tv!b=EopOkc_{i1 z`V$m%s1+342L=662tEoF6l{D56yisX`BB7kVg6q(^lC2b|Ik_g5foJwla~IdRRPXs zX7(IgcP>}tX2+&55LQ7tWOw7UAjEsxkh)6B!_|5~zl`R`$U43OnN92QpQ?=1hL z`vWTQpH@C4D-SbUZE-8RkLmfaA;iJTF7RLS|3A+EwfMh~TK@~l&HcZT|BLhgMXI}) zIg2^ieV7Ca{oj@OZ}9(S{x?v7ox07sihD+&s4QMBUdD_p=yN<2lJOs@&o{V^P@;X%hj$LG?@i10 z1NL_N60Ngt59$cIpGC#RsXpgUe-w7OF7BIAS4mP3-(wzeX(^!u4kqiys4Jzf0Rg)bu*+2$y>RRNq5WQ8lK={pUvQLmV4W*JWpaU@JP~o zs3Ah;oa`}{^jL-7@h^Bf`iU7X>&$- z>X_MURL6XnfH$amoh6y>+>nIv1SvjGfM*CbeMD)>zzoPNhPtjm7;}M!O)8J%+vM1( zz^abQOKI6=`_wl>@Xvami`?evxQ3Hx$zpkD;MQH}#R{K5hXz;gsps=pApL+hcuMEE z#qOd6_AL(fepplZu6k!{|Gg@*s*6A^Q^ce3Z`%yLN8Yc60LGIjc*_i z*KOsQ1fO`7x~E4MmVCC=eVwsfQ&^Xp+D&Bt2k-fdf91XgVsZ`K^|gGy^%$C;VU}$V zdhe3KCW4{ObukF2^-$uA%NE;Mk@XD~BT((325+eexGbx2S-SAWyAbQmBOsvaNjy@b zZKz{0lZc-J@ooG4+c)7G1Z|%_m+!}WxtUuOJPu7t2g;J#-s2;t(|y8Z?(f_F@%e~n zb6q>RyY{Ox0ZOQAo9e|Ll0PY3TeJFJPA9z zb>CSQM-Pzw5+y-i{YiJYvAcxUnHseQ8I0Atwwp*%T)S{uYz8z_`=A5-oH~Q-LoeyJ zl`OziUQJ?LS-u-)kuNa${mieX?~ShlZCabI+@#XKpZL&#dI9FvPU+6WZ5T2xN+_*V zy7Pk%r>#GR25{ZX#m)F38U~Zp-+i@}Y07N&2bX(|1%mZAZuYtgt|T!+ES$7k8|D?t zNav~0A}?#(*#w5=f18`{#yKE*L>~tx-VBmzH_A8Zy@)x#gypioo+f$u+V>RcJ9BM9~{r(9^CA49~??ZILS=j++^=+)u*Pp zA08a!9pBZmiD^5<&nEdIbP!KHg3NOg*91=v#@)COfl;ApNVB43XoN`*iogiC9P;B$HNY zfP;5|=T1#|r~TMzj->OrBt#|4#gvjjqcGU}>YeA1r8pFchx|!*I6l*|_r5DYVNkup z7|_-&aSG9Bueo*WyY@&Ic%o*xByCak>Fv3tyt!eHnYnCU*t zGWZvpaCf7N1%OP{f96|HBN$~}*`u*y@d>l#7)zL@?KGb6EAeq1iy2dTAX`0PNj&&4>kYcK zGKZz2Dxz}e_ykZ+iq~Mi?tPd^-GQ%J9`)J7;PzLH=QZvPPr^(pIB~W1r;9n4{3+(d zUydjX{bxpeeIbf>k8PURoth2ntEixq1Y3o0a=@xwT?037f_W3&Z8sRDwMMa)(OF;&>ii!sKfqez9YQER=hoKbr!mMtc?w}Kg_bfZgZ8qrZkQ?okw^RYI z=bVwrS9fS`fV=)ab+Llb(J^&31_7X!LBUH)1?!YYHe`OJ=-TkxzVLpE+0aq_Zs%{7 zp?Ip}o!&6O!lC`x+eVZAf_vhhA)Q&n`R^pRMGWEU+UhvcY*5KZ8eT)7ZqvZ+zps|k z1gHn4_JLU$!7)~@_1M0+$-%jSrWLe3)vu!X9hV_3QlQPHIJ9@9$JRqDVKRnhJtp_{ z7j`zz+I1G?V}X2HnuEhBs~>gz)5K#23dN)-kYBFPCgZr)GG}=3uZW{M{^r}Pc7`Kh z`RVhgJLl1uBIQ-;7dcrw_SBqVM7iwy`2C@*=2a?p-(7`O{k@%Kh2&MXBjd7-1DRfP zz);*|R0<`>JGk-i*B8=={u%@yZ;3SV1c@pH1V_ zjHcAM`x2m5bmVH16W3(mnXl!2?tMxZCwSy}B)DLTwdz@3sZn9$bJ_i=Vr^a`R)u^2v3LzEEGGp`k zT9{`6BaXkU)oI8VizL!!&BjlGofb92UvK^y3~)BuKC*ef-OdjW2t7D0I`(^MH<}k# zHR>Ifn)Bc&+D{Xm7lI@Wa?{W=5)H_XEgVwZQv^3#Yr9zDtNQzh8AQG!He4+jQBZ$= zqfJI$fD=upApRWp(?-(t4MMScimw0bURWDg7~VV3k_7u#Z)Xy3BW5XN9v zR!%~ed%G^z)>#I2On>XC9B~p}dMDZqWD}~u&%!*sTWgX2n4r<4H~#!+j70^PpY%EP z~_hjZacml7_Lw&;}lO>XcZM~OHcl$1h(7BdNyjffvlB?#o^=ZH@ztoGPFaR>RpTLmk-B^kUhuXcG@7`$z> zwH*nx?C<3a6uSIC%nV$6?sN_e!wzi^=z}=c-SXeuIDUFPD9$idn#Ynj$@QLZ2Phcy zc;~#`9(ywpQWg~i)~Kd6v3N4>Gil|19&#fK0A!;4*Z%K1`+DQyH6_9oIkD^)E%2I# zI}*D7uDpKgtTWT>=CWKQH(xae{P(T$^qAPbhXg}>R?FOQne5O?;CB={+2Q!MnA%AM z4N*owvguH9)SM`L6~dV4km`LRYF39v|CvW-E@U=Z>ogD-X=zH13BwmAMBwtExwobh z3nK_k?%}7Z(@SruS8u)meW!o0)hPsR9ZL!{qG8MWGNavpcD_DE1DFdOntLi-kiivb zXx6(!@Z4c=NCJeO-P=sv_9)nBeT%K?c^ZDZ96VO3P&CfJs?ulm(4O~U!PjOH@Hl?7 znt!dWSi8eqba}vO*~MC?x?jEYb~ZZS->hJ+8SO(rI}O)u=2)|xDu_4hrss@TOItdc zVX%wb^FUPtG9p55{ARw~)*P4XQv7mT6`?Qe0uZz8%B-PU1)jA}pYDPV&6Nb}`H#!| z86uLa;=P65u3PFS53P<;XDSIGkrc$8R)=yU5fOiyB#I-nSR``q%jzv6{-zkvkWx?I zWL$w?>7Et5_+Ckz552tbJ@kXgB|p3}dCmKJW$nyS1f{0@fI*jR|0G6(HmSEuKu*`; zVbUkhqja{W)5JP^YFQge3gS_4Sl9Gw@18g4dT%*8#y1arJXIb#YQR#VG}EU`>}5Eg zIe~50+Tv!avfT8fO3>NbN9Iybn|MYVE5u$hc8+Po`hsp=gpJw`#X!;aKsz>Ac)!%Q z7s@oMxN~NKJSUSUmGrO5GG7?IkUQAkW+>%y5ix?%GxVi^QTH9V=&^Y}2%Gb4hn`Jx zYEwAh7*k?|MY@j6-zSYU_e69oSv98l5Xtwwf~zAU?N@V$4s+`pi|Oi}=HTyq!z4t~ z7nhdjruA6gR-wG+WnL5YORy=)zzVWbV1v-UMuf^3jz(#6?E?3yB;DEH=Pgdu65W2? z$>1u$o+Yw&LS~%(YBBX&MZ(z)|El>-`x2i@dr;O(ef67Fny`P|iubjD6{fgcztu5y z8OBM28~aQ-3v$Q7uRNdL&V;{`7YgM~5lqYwEs>(idUrWLh2%qYI6_>R7^l?G;*^Zw zGG(?g0}KtB47p~zgwX_9-F)tScowh(_~x;CSkQgtc!-^*)s3RTblJzUOm3JLU-vJw znFOKVQ1$DAQiA3+t9|Ws)O7ImhtCZ_Ch!llK}upwNgxHmk6DSl{oR!{-8>@4Z^dfW zhqCTg7H}8;DM(h-GsERMG%c=YB*IIj(?f+Q#OTPSggWgpr@*RJtVXjKYPTDjs^qe` z!0MA}j-Rb}7lTq7V~RVJ=oc8B?#q_`hL=E0V|HyOOi`?$FjUpL7JAHs$>=*5YOoDr z57r!H99q!&>C)r8m0jdg)9)#;^oqr=PQmLuTv&c8FR`(A(I zwp`_owhNg?nF`b zd*={Cg?B6h+xHnPOfmk3q70e*ujoV`WI;|d{Vc{?hr98(bL^#vjf!5VbkXRN($%51 zvq#uh6qIW*eh22ffNef)u!;5*WyRvMvqOWv#BUqENfTPF0%GIO-epr1%N!@zy{ZtT zv+j~ZzSvSY#yu?JKLJfyw2M_3X@21BvKiRu_moYPx#3!Vw~+((aYy{qTyet+rBOtr z*XpJ(F;^T2DV%m+q5L__xhiPgFbocAqVZ(BT{ofVxZt||YOP#Jxwuf>{W4`TDO?V>JsSZi0St~WFKZgQ*L zjJ|*2m(R?r*Bt5}z&5C^bE1>Y#N(kBY*G|*2l%*MGU3W|#{no{quo`8Wn&QeU zR7I-+S=NxKXLMmK0AlTQWscq)F#~4J9Hd!mBamNrW8s&0CC#{pw3|wD&ZXQ6=vBe< zVQ&50Q~pi|w;@N+t>{q)`Q0q)z!9buosd81{MF%^tM#HC4#W6z1J@zbcd;XGm#{ik z5W`;!e0P}>J8#9ECljsjyT!u1Aq+Y1Zt>-@{&5dBZk;P0r;k1c0`mqYyymiM6R|l2;WyQgP5KdOb zloT3{Ux1p{BlC3-(7aDr7!v^QXUy?g0hS_hqbh$@ zYzMVNdp5fAj`Av<=TN(shx$E3(6CWv?39A_3vq?e*llHnRTJ7=y<|dCDmgpCm$SqV z*@!A z_k-W1(S>gC7cX~(S(tH974$lb)xUj0wdRduATUAq=X*NL4q;>lTOB)BY*^^L;vep? zR(>l-6qM2U%Hm#!dtvlDj zP^X#H%S%4to@i_HtHj|N(<$^_zo5K2L!e44jnGJXAz`Lb8Zu>Rh%N9c#z}3E+1@ju z5%FWPBLe5)R-2PzOmaV9(!AgG$EXhlJ zi={q0lz|!>gl|Dz3>bvA=pn@IRZL0E@mw`!aD=a=$5V!o%?ayiho?QegDBiK3FgOS z;W$?d-wdL)OZdmD^$s19?y5J)xb7E6{a+@1&zSP%318)_Flj$d>H2SGqh-2m{8m*z z$!TBVt4s1yTv7aRwI9x-jxc9ALCwrXk|{Z9m#BUlS!bi276oI72uhrfh^kUb>S+GGiWj^YrWjUJrWqB~uBE zoOYF>JEDXkeaT!&s*6&Q^d|JgcmwigR$vCi9ktIXn-@b6gW8z=ZHja!*xy zr9-x#q(hbD{i=26_e7gCy1)&cfReeP^soyI14D0WQ7$*mGl$n#cJtGHAV>&7o9Snw zwrC?z45Ezt_Dq&;JT*(gr`42x8>pr@tdJ5o&5EvHLB%jW)9d{%-$8qg!<_7@=&hcj zLsLC1iJK6}7g{Ksi3o|z@0eu#D?4JzErBl?gEyRIk5#}ycPJAhv{eGHmgf;co9@9;R)GzJL8OVStX5t{mfML2{evN=CR76X2-ykWe$LgqPG&VHJ z_ZeByn(t#D8Ir{+Ino7WI>X_NH30sgfG&6Og3k39#1dzeZIZdD?555-UT@4PBeXX5 zbPXSfUcyIMA4i3Kc~6zn7*FmTtMyBVc-3mlIWt<8v6sC;QWSEre^ifiSyR2zfvK4i zjCvYF`&tZ@ZsxM;{Eg9}caXUx=M%RTlMq<>tp-g143E5l^W27Va}84DXuc+f)Gg!& z>Kpvb8?x`cl~-dhK-*0ZW_Ip&kXNJzLF{c8QScCyl1Q z4!n+~0!1+ZuFqYcLt@ehbJD9}i|E1&>OKhNyS z*_;UIOw5)4#g$x)`-!vir(mEj-F@A=uo&0E|dZI%aZ&yAw@zx-?J`yC6^ zBJA12cxdPlqLePOJoSFI)X548rd4&3!VTb7=k!Pd#z|~m#6-DKIf8E@V*0ColBijM zAJ?lHu?LBw6*sA&$YngPknY+eH}~)!nvL19_CNK~v$1S{v78atqQ$y+*SbO~6havN zX7VF5#jib|o>iYBL{M-R#-orlUCGdw+-gVyO#<&kX1Fcw=o8#TXsx7D>m+~Vy`1W;HGA!I(KFp_Wx`ds>L7iMoWr6!?-mF>oNwmU-8&ojNL zk&K4hzJRSrUkPBr4*XaQpl^K6qiEG^TYz#cNw+##EXL1(q-FPhH}lvp&RDas+fn)^ z_#45`+X{v*HadPQvSDtvJ|qt_<(F3R`gQl^4~L_xImx>g z0K`bZPSzGI zYU<7zu)j#Lrt1KIBDUV(f&FT**iRFE<$Z{QCute4fu=^G8fP>A@0U-CiNufCPA8-L zf9J5Hac%aY_x1PflL5+t?V0>|#6M|Gbq<|L>kM3lGo;M*n*>jNJnH15W7@_D=SP|a z&XFHmV|-vD9!v+$W<#27G)KTfUs|_RA2RKqg2{VJibvf+k!gNOxE#+51+3Ro4UXvv zaR5uugIS_oTVG_3)r<+O`k59iSq%R?Y&0orMUg_EOL3umf8MudO~DA7Yce;V?G^!J zbMN8X?H?nTJ8Z1#h|&!eNu+HM<1y2WWe^IpThEv3qZWrF2hf$|&ce3)Ao$t7yK&rx zKu;K`q|2{5*kxmI95Ml3`hqvcHxLIPK7c2ZtS1R6=KD&p{I;6lfBnFpGAo#H$972*z!>wE9Mdej^}gSYuo zv0HVhc`yPTC3Iw1moiQ9S8?u^*e0}TbS0cs(ik#t918v>Mb!^LwH);j8B^&@c5Zaz zHOxK0RvDL|O5BL*L18%PleY>xcU1TewG3+#V*gO6`Lin3qoGTmCqlEOX*`WU&#L%! znHWxymCu89tj~*d9h2s8H`Og}1#QLKrNS2>b}TawKZ?wZr(%Gm+-z>H5@%aLT(6y? zJo^3*&B?{3i|M;D?N!EW6_~vqtrh6=*5_?D&x!e+)RTC#eF0sGaW9Q&sb!=Nw52IU zkowE2?nB?qprkNgqVcEC_{9ura6n+Z$?cMT%<|B`;DxQ=Ia+I$~{# z>jANb1)nmbX;mJiJn4PrK!^t`O_k(w`W-N9^GAx;iA1lpNJ=z4N5?G$O$s*v0^e?` zw`jk4kh|A1Z}|KaX?fc;Y)Bwk%9gLZ>a869+Tw=*H4%k9eL~ZZF*3D@jl{rT(`)T$ zY#|UF4VPsdAi)-$J}!FPtn+wkS=XuSx`wg?`PMufJ<+b+r1yNDNa){&Vi~d?|2Ns{ z!0>Iz8eaRm4GPRxuO&HulW{7EgR5Tb*i|qJJR;;;D*)c0kDb2{&M+qkeBmuRHVr2L ze*eM?T=(7`yhJp;S+O`KM>%dN_ynzF+)U{8#^*ZnkX1wytuiG69G3%HZ9P$*9#Qr= zTi*$vS}3wi_o%8N0NbsXU8UNvt~Mn7el~$mG|fE3o@uI!j=LJF(k-gZAZn@O+eTLk zGt{a8D|n97Kp~y1KZk^+>7u5&Q&k1e`Y??K{njdix1Xb#x3Y{I4GS%Z*tOa$=ma_|Ry=Al2Gn*Q-> z8j%eq?An3UF}2Szxslr>D<9gbucs~F*(v^DM`BrbY@yz$_Ql(7Jj3K=1$`R2r^n|# zU#v6w_fJ)1)co_}&!4vn;3NWqKci0Gx5af*Ana!M{6E|h<$ltW%MCGbxB=s-LiB;* z;ZTU2X<=(eC>>}y4!zO$Jsp($Z7=g?hf6{jPe7=F+|m;3e^*#v-$iQ1Jouv0Wr(vf z$;(lc-9f}+Q}|OHZ(hqY+0TcEI@;wl)$OP8G884PuGbPRXJsQh?WC^-FU#}oDmWV> zUnst)#M!f%XUWN?O%`b{Y2s<|{`0_-iPHD`mP9SceUf5?79o0-UI;yuIjCZSn)4~% z=?dq1yrW%K!N8x$VbXC3O4Bv6cYVfcL>7)atK^5|Y8mZugY75D0fQL?e~^b7l6RD0 z68^XVubU|;*oD_$Z*U`gClv}M`z|%NpZ(vbJ<4%OaG~C2smYu!N1FW$HW zL@UhJay`E(uYw7JAx=zHY@i=BgEHKyf=7Sm0nzv~V%}bNs^IBU+`sO1YT7PC?!)P_ zU@?-mOI)+9jUJxgT30WS@)TT?`8?Gin(i3pEF6rZVSw)wB8|d+T>fG5eO(5*f9}E; zS^C<)H2pwv!7g64z(hYU`iSXSs1dhD!!k4No)Sxg>(Sz&klAvM%cVe-JLO!t>---A zx4V)-GD|zRDS$-0*V8clGvIVX&kAb#b)s+Wp(Z5TRDR;IY`^J*#uZQau~WOvr~`d+!te=o>HBrMBw^nqQbuitP(HCx{y4ba@F=81uT}A3i0cMT z|HcV*{kqN4GRiN9=MJrh&^er*< z4C8{M=l1&+5Y z))Ots3PmhZWva_&UatU=R*HaN0jf;xu)krXgf8N)+0eUi<$Zzqab^B&rZ~+L`Jesb zZ=N*ASHvTx$Mn$~XP9W3Y}YZHB`h&4vg1yPwv8-Ca9p_WY;QM6)P-#7hHMNy6#co1 z>p@Isxk@qQiRuAkKT#(x2X?uKbH*D_Smd<8SUHDq%$NWFofupF2N8?5RdwJ)B zyoo2iUuRCaEmudsbSvkzWNJLy2U#Z#^H4x-%3sFond_2K~=MRt>4BK z))!e$XDp6l9?|{Hh;23(x}MF34kUQ4G528rAUurx%5`9pUfbht-D9T-@9n1h$d2I~ z_u_r6aLT15xN6%-<4>O9<-g}r%Cs2H<#uJ1u>OpS=Y>Jxzjd6^?5r&lFY=z7U?ls3EQ@`gAK2ON~C(Q>C*W&wh$xXq}volcyw8-F&a z_fSf{vml#${Hm8RzA)%4r`a_P$qWg8r7PSmN>CmiIiF*HF zjo!vkx?t@G9jikZiA5?jM*8oF#C zEfpGxW5k76X{$LZi6m@cjNjboHEsC->S!juY8%f!lzG3Og+mQV^^eerk9?R14B^mw ztbRv|e+Q#CHCTfQJga#$ED9#|_HM;={sGIC3tupb75Fwf3a3NoPsYjY+*oCbuHn$N zwFfwddm)VY`H86p%@s2vz(N$4Tcpc7cJ85wY|pT^V}D;2_kuBfx?2+(o7UBZmOXu& zCM4~(+2p$?4ga<2OO3p2n7}mRdPYQL!prelfB16dbR}QH*T76pC3A`?QcT#L0 zVv0|eFh_FI60wLAKw8BJM`HkBxz}m=2g~C9hPIr!!dp{kPaTe5RRnDn0K0S zHk2-|Ev6j!_(vfkWeDemX!9#c>av$*X+`@jSDME)%g9G`LZ8>`x%e`lOf_8TT^XYv zCL~(260#c3`l~_YV2-L8Vli!da$Zrt%YEYwI;l)v>uI?3e1}<2bdDBy=`!r@ynqSl zibOYh-bt&f!sKgHe+R-Wz*T*G=h*J0IP)85c)gmOvX%fqSj~?r;3!vxFo5jSf4PFJ zdtANHUi`pvbI^GGa!15l$IKn#8d1@M>%LbxQ(h`mQu5)+O4m$VmH^RE0h&Fjeoo=- zv`nsBg%s7;p{}B;GnFiRYLmOJn}eR)E;-dyj^_%t0ZO!&I6DTW!?MqEiHUm9pMeT0 z(LYBWa~~Sim0+5k1b%e_M0h{;f>XAMZ7HFLovSa}e06fJB?FY{d}%(oZKk?c0eg}G zqlOCo%&HX?DLxQG@@0=(jG?#cH8M#Ou=+OSxFIf<1A1Y|I8>$W^!8WXoibprQG7k) z&s$g3JV6}mb<0P9z4FMl{d0-I_f&tv7$Tcuhsfz(a#>JW^)?P`XEN23P36p5%^d}A zNcC!Fx0seJZp^TRz^l*QjJ5Xtthd=!Wd~jB`fY~u4hr|sP=084o&Is^Lz}g%jl!1! z5u9M5-iu-BbdO&A z%c%;KvzY?Mq@Z4AC#gVOXMWOg)m0cQJ3l?kJ_4{L9@6C2M+zKKpUe=?aS|67)D4#O zjE^2^WJ`JhT62*m8P z#W((n{Elb0z|{drYdcv6!uD7q{rJfUQFLWVZ_?~)b#W-BTqxb5l5Q2Tt zOMFKWeY}jeK@n!>Z{9aPSM_kRI57vc#y!(JFL|eRXC!S*S9kB^F&(G4yBEa{vD?ol zp#&>pRRRXL3I9HF>QwX^-9n3MkzciGRvqrL>`|wR9A4?!)76sJBmuJ_^PuKa_UyShKJ))8qrCUlJ+n0-Do^is#?Hhde+$B&KufP zyCFQLbz;9B-O^TPpq7E>81~hC&cB}|>;900VtIVof5{@prbJY3l}Knqhs5pSR` zCDBrbOCM*3jy>0(@`gN{2KE>yb|YaatmR{!`$Qr^ACY8cVy@RjkC7nDhP&BU)CR&i zJekZtG{R#QtTvfd#a#c!ULsRQ;?;F`E+^WevJPuWpkflJpAKE;mqa6o=|YLW@M??lcsm*~?df^m-DzECjCtQw9LdXAV^HNMArsesS(%Y* z!ZZ9@%!!jPYh~GJeK5gy$QJ9+RGgvaWiO;o{j+ZdrGl`plVf%M{C=5k>X=I{?PPMrk33jkV<8`mNVtbR&~nUKfKk< zS24wonXO;3p(*Q}BcD@n3%|0}xY#w%q`5(U88UM7$*naM44#N57qN}Bgi6nC$omFQ zw_{p5y`jy&9JCz?0O*-u^`2snEQJje4djvH>V#%hJx6+!-Mc3+(kS->K8`k--%T_t zd{Ht=1pQLXG7n-7D?9c=P0w-PHKK){u=Q+etSH6M4dyvh0X3IKy0=E_Gu5mv&h?Z; zcG2q3CAD&zzM3p>D;6o|K~_#&z6gGY-Y1=~bsqQ~y#;>|O|28ml|6aK_W(c-CK6k{ zZ{Bx{_9-q?m@M+PVDWZ5!|4`#EX<3&{oxQnEaxMKHM#`OciJ$1)psRU_g`gx#=rdjNr-tY9YFphc6TdH%`YR(P)z`Vu;I4+3=cn@>SnlE zs|4F1xr7XW{{%oeHM=utEJG8!j72LqzxPu>-SWHQ?Ew@~nK2-Gp*Aa&dn-gE5 zfJR8jAEjrD+FY9NlhlIlT_U~KuZv6D2O#7VqArkZiX0va!*V{^?BQTT?47!d=0eNd zccI_W;m?iAS*ES-57V7B9uc9Co_05C^oW&@B<&dp)+oe9)Nc+ghg-4XmJ@a&)PD7j zH}l7@CyDcr)gGIsL?xA-&!#)B_G~|SSs<;e*W#u?+FSbW3Z*`9le;YAyxCFJI!9qL z6Z$O6KYf8AXde8dBgz8Q@_ysMWw(mSFi`sHwmxvTQi`E`=tDn{1gzKZg*U!xHQO$% zvv~LY6nNdea2q|pCp%bDjN~ygZ8{cmTK6{Sqy2Q5VRnS!uZj-7XJWg&Wufjt zwZ@v$@HW$8h{nD{77Sb$YufHx;$N-eqFTpqoA(sjCu(V*ydH{bb z`sYBQA>f9VT6X-P5R+}woN7np`PwQ1_zp_?RGJ^`8Y+)raHM901*?Uh6FF7fNHY)% z)T|1y_gtQLucqsoVvf)6Gb3j9AaJiNMoMIbqPflT^7>afpms@QGgfavj*?Otx0>^c z(r!>0bCN>rh1MKzykQ}Dlo4kaX# z*XiJkwg8CvmNZ_@MNZ4awj$|yZ@bO-)GaMlfIbxcJcxcmeqJ<{D`zMT$-{J3Lc9Hu zLfhX*T*K!PJ?)9KgB)@F4Uz3Fcw*z)A^|7xdEnrVg@h&P2ltV-KU%@ZOY$0;U~eUS zcBp$NMy%H4=#gaWwKy^S&HsJmfoYAZ?yjYpcm}9&W0I|Ikv2GHJQVJ-CJwDL-(8UDOQk{K(e>dEj@hqqvmNk`8=@U?C(0l2{9XI}XeHOz7O4b9T z!vVxQEdOkAo6Lxi5~+}|EetR)W8|^ud=okz`^ojWe{j_ES~Eay%L`h@+$sa6`u_ol zKzG0KEVj(!7+C=?eVnr3A(r*m{*XNIu78iQyj+Gh;d|gY@I|RxCNPA+$;vv04R)ic z%3aq-o?#h}RPEn;L}mrd^V=?!N*eD{&#b6-V)BSg9o-{~m~>fG1PLc6ZFS7O9W?nA zhjY>>o7P=~-R`}zV%Y{`;4gQTCsmJsTro+5@OkRZ#dsEgr(@Mw7t2bV+^M@Blp~+K zS&j}bki}2GTozx7&s(opuG+m216gB?IGy=~?sSvm854~td)iOi<(`()2^KBiAe&$Q zGjix_AC-Ndf3KZjhV>*I`U(<$IMu6vm~>sYqn;>U&%QPXuWL;BqX#@a<)Onj^K(Y{ z*_PIV6LEC_&&D5ZpLOn8a^<;Ou_H2sj|)wIOBtB->$_e0(_6{J zE_c8|ckYmxY@0ZFcb%VvW&#eqQ?hjZIkNWZ*UHYD{s4SH6f)BJ_AAgKkE40(m$qHk zzu^%#AAwQVh^etFR{wo=rWvzqJ#v4{EKT1DGuw^h{apV1;rvB-283gvV_DdOOgN-j z0#_S(OgFCEjt8n9kmLByg_!rOV#V>$Rczba!leNayB-WgG7-SbZo^Q@C@znyN+0Om}$QdvH zk4U=jm;GP-`!wOpP# z>2(fkab1^@bn3c7Q`Wale3VyRX+IzNfiK?X3DYk2xYf+Bh%A$-(Oe*cA9N(!Xj^^a zRQ!lNr@z^tavF6PO@-jA4fViCwA-@-)MG3l^-#S`FWa_44&QmeY)v`S(Pj`RdX6+8 z;<>-jL2cuy4(YUo6UjGhsbjm#QWvJ~V|?tWtX#V;wXHK{(hItsFx7v=fMjclnEpJz zD)C0lB~HQ9IIYiyQ}~5!%~juxk1CGJo?HH^q2t$ETz}T4n_3p_MN4t(`5YwRt(VF2#}CWNxBs~u z|HI#tu@AgYPCWd8M(PoDSBP`gNmmDFU>FSAoR+!4>xZ&r{dsc6xBmy(^N;V4gSXvi zCp}L7Y1TRkaeC~ZjbM2JJ(+Zx=z5{y#F1K(#8liz*_7UqhS!uGRWXP0d?PSatwUWg^Bm^oBjkJm-u++ zB#R5AINLTX^wH%f_%-!(qyK%-JsWO4=gK z@U<-Ssi(5&R4HoUH$<&w(?`{=!%nuFSFMy+W5@gF|M)pMa%?;$(|A?gPPmb5nOG4! zj!4u-o1AodkP5yT3wb(~3YvlFq7gbA52tl(NNd~qK`Vx1`WPBM^au*QB`X%oVjQ~L z1ql7vc>zt(qD`Zcr@G`7I=XXh*r|>4OxJM|&x1kR@U1<8hp1Mr_wVtgZX`nZBMx;_ zGFG|A8+w&ZnOKA7n%Bf}8T*uQLZ7@YAE)qs?si%IobQocANhU1-s+vAP8y8|F7-si zGwSAHGWX+siiFzIwak+6XlqHk;k)5i^*VghPma@KP@k=&o%;~+j_tmueu#>FWMQpz zjGOn343z2}AZ9@Xyx?PqZ z$5*C){ws3)xBt5w`=4)<<6r(VBFm-s%9wTfQu=$GcCV+e-pqs?Z4T~qWdJ=rans>+ z$!qN4vz{RvU;gi9=MDc24_7Ug(F?BbGP0<@H4JSqkZ+ZbL64D`{mC*^-uDXFTPg82^r0e=A}#; zf1R0SWW@t3yfgqY5ssawMn>yHRiOu)yca2KdOQ$ieK5Tm$IexL5UYqK#bvy;*StoK-v0&J z|M~aHsw-dRJ+vw!s5%c(>a$a-M`kuqfH>cVW`DCv6Q$I0D4!FhWUvRfd>)pDpqt#u zgOA9{ZO>DQdejMr2sw9c@)-hy&f!{c(e@6-9NoPBBJ6hWmsKmUgRY7VP?%+r@pIc| z4bP4_bqA$FA>#})T~k;%%m=aN$>_EV;w@O_*GG?I%o4_e+!^-h0#*=l6+9thB9@!-)rpD~a<>(ti zPyHm#qJ7|)`caL2?n9i@P55z%y-4O06GvdmxfYP5n>$&`jNhz#?}`I6+ts(OGbR%- zkC6*5l9ijb%Fum}%s%NpF*{uj?jU7Qy+N>=I^EdIF1SY4z4(o?l=1gn@eFz2m%b`r-?2+iSyv*pgd52iV^k#LOq={9Wx%CR zOQb%gOu{%=>{J`Sq)q00)uWA10kwCUixK%MGks1g^#{9!Lknf-j3GI67apjhlFvC! zj^5@%Mt+$vl^4JvXRS7wH?cRud2j4U6uq~|h|dt!B6jW;D_ z_fJ{%uv8>Z)X7ia^e|gkCaGMz)Pg!-3 z-e0Ag?a~+3qfIq;3LXFeKmbWZK~$QhXfItdDr;Bb>o$RJkQjT;Yo0$pEJ@NV^J>~; zIhlrDxQceJ2T9TkMuumfbZuj;qh_5S@GqxiXHlq`<8@-qirG7cWtY52*5H-tj`#hB zjPJNJ&caht>jXwW{SwbL!jH+_U6&Ws+|r!svD586ioH+Hpf;+f9dFO3ZVc1wmUYKd z>B78fcbjx_&&6kUzxSC>m$!WSbNCSdr0#6F5Loi7*!=AwhtqT?zT$tE*?LQZpOfNeZUkiEXK^qsI_dElUWLzJrCvBLKsqo4}kv(j8vLj|(}D`m^L%CcX4f75${d8_ATo1)Z?K(|D{O zhUa>U6F$S%^evWx2RyZPtnk0)h2M_{)5he$t^d%vc5Tq%KE=|!W)T?&!d89`YC7`u zU)y9X(^b8$WUQFcH>y)pNf~cD(o3WMcRInDCrfocK}OMUW@_>9wm#*lYO8iTVvd zv(JLvMqT=kXLr}yHc5}7hB(P;$J&}+mcd%Ooa0$sq4UBkOKr;wG?(kPpC=crUn_r# z#LEkCKGxwfk+yfgxUv8rI+1W$*E?P6nXhz#!)-}3%%r0-*AKd3&!`!@Efh`z#4sr} znzxw8caF>Wo-yTxf{hEu26{ANjYA9C!P9|t&};*LEuPy{SS61!;&)k(9+Ty(`5rSn z9Epy8gN~ZEz613b&1aV9*b1KeFR^K-hu>0;F-S46-x^QUfrmQzwpiA^_(x^W$No$v z_di7C$VpaKR$kbKqf}7n~b*_;7hUB}vYI zb;G*rUCSAY%K?3A$`j#v#TDNnD=vSj?D*?nk*WQUape7s z>e=)5>}Z>E#ow6RGp_C8YhDni)8?dZ9gWkKx9bax3Y8{0^uwUw zQHKi>i`K3aJU!WoM=k0GR&Hk=eqD$k7aCb=!KrN|IJ33D3!dXgQcejJeBBMxXXuo8 z$`72V=_76>NA32Neu-Jw0)P12OJ&8gUM71!`lm(m!u4OpKzsDM$5AIa^Htya&9;6* z6|aqHe$_W8oyLGJ+9c?HA)vC*b>FbF7X#TZW1l?mD3UI}{tX_&7#_*1Gj10*;YJ!6Vbwj@_M|#`_3TV(-PNWq&IlP6ijbkE%}M=o4EB+Wh}m+G(rGRDEgjd-3Dz*#QNwaf zGMI#U6f&L*Yn#7iXOGCiI}Tb96i|WwBN%TdUdUM|9kXMs!BZOTE}mh*2KJ#xgo&|n zS-l=#jFFOG#?#$t!jEJZHDeAsYW4xilQHVNY4RP4AW{Eb)&G?RmeTR18x2F#|+vbX%PvGR5 zW@S6*nqMd0T2|Yetkx$c`MAb$%(8G&MvrF+<>nmTZ>F;9+V7L$ZO@X&-u++X1Ws@o z-5BLQbupDVojNa;JmH@lc`N?r$>`IcWXrFCoMEYEQ8_RToJwzwWC_Oo@**lr?X#AZ zdb&u|j27#nb!+9jFS$tm-_L$tP9DcMO93t?-<)V|mrEIwvGGGMJ~9;RlV0?SL+7}_ z86w+Gt6o8?4pb69=t!`Nl@|(4ydhIv^TBZ$J#$!&AHy#XJ#tk25!A-df{6EI6OVEo zP?u|<8W2Nw!kEo9=#Kw$vuX+9j!PK zZ(&>F6>*h5^n4`yu=SWcmU*~)z{I=vrazM@B#n46+dmniR~VqAn_`JRLe`ZGIjHF{ z-N4ATVQ0N;lQDBLPGhDqm~L|oo51_I^A|3a1w%Mj&9MR}e9=xzim}l~6Q2D%#(A># zVtlpa=5^=FPWpn5j(w}9D_mPW_)QzrGn=L?hnRh3+-x)Jq^s}g+7;xZ@x)df)?THb zte4GP@mF8>dRe;VLfQ46U&BH=u9Lr-d^o8(xtewB;;;!**$%7&7x~PeHmw&(87(lI z7tM6-_ItW{q#0rqqy5a4Llg>LS9+bYlIeJ0mA*<1(v>WHHv`d zCTFc!A%Ap>zrX8AHQz?IU2i1W%(vvrovz+qj>Q7L(juU=w;6-RgN2~MXPa{}O)te# zmSX{fHi(UdeJGQ!@|cJrUViSV9J~uJI0M5$8I#R>HFml4pi?GV2-RV>aXIx0oN@I5PLfcOm64BCsJ)UO1WA{F}>7M(2Cu_s5x0p4VS%OUo7wfXg>^)umX+Oa0>EVJ> z(cV_R(LB$VG;NG@A)t*$*0cvxW#EG}Y%oY`+p)a8?CfDVaJ%1PrXhVPKtYoiL8=^T zuA{ojqfxqucf%>c(#~x>Uc)bO ztZx~o)DOL=ftM0*=2-$Kj=dke`o%vWlaD_rhrfJNT0iP!2pF7(n)Xke zglQF@I)%00{(sAS+%nnqE+pQV4Bue2PjgOnI}qQ@6MTQ0emh-r3hxX6r97=AZBkci z=$WkioApX=Um7M{w{xi)nXMErxVq%F*`>C_q_&$i+sl_MmLGZMrSg_9d|4jYhhOZ$ zqQHeA7KcnnvduC+y{zB)1z)_#`JecD!S|yfqjFBZC0*Dn24&y{O?++JSg1e5!S{WK zH!Q`+#OBN4d-3D;P^xYp2MAs3NvGU_iK)Tow#HZRRPJ^jjM*eCg4mPG>GQdfB-IZR zo8sjJmy#&u$yb&)6QFn81|TI&kGb-Zd67KzoTv_E*+<*2%RHX>ixwif0e&lU( z;>bSrZOILm82s|^lMfvoP}8lFVI;9&c+L5$KHp)V)EnAa9(#EG@}k=)nWXa zN1brf)F*b^Pr9yQH_I~j@9EAmpr_n?-7EjCo{h)<`ZqCgV$wYk^>i0NkD z*VPXmr0WC(X%vPqNSO;gUMy9Kcq*nfn*N&Y4wKC4gPWCV>KPl?%PTKDUw-eFTN?>C zZZEU8WE&SPf9!xoKc~yZ0e%@L7ZP?g=#ro4QoltP_Jxd~YOmN_U{FYN;i6yny<*#l z9JmunmqJyb%xTn-Xj?qjQ9c}13EOcPK-h&|$%8}txX@aB{iE6t$99aGK*PRFdZ|+! zPwfypmKv#R*wpnSP3+^wHC=VT@e-Y#F)uYT5gt{4{er8DeeG1dCqa zWRyofK?vDSROgx$$*|Nfag4S#ERPZUXSi)$@HN9_zqE_>aB|vTI!?3n&I9CoG-7kla;e{>myOSzSF=txI82lEGdUjp*k|`GPs>6n4 z)?3um-sy6%{u!6Guljd#V*IG=`J3O#6CozZoYlnyjSCqkx%yX3^qBBZMveP?>H3M& zJm@LsL>;8`)9dMrLso(F!Wg_XbyM3zPHl&5x9h%9{;CVN%leTac?+Iswu>1TXXg{l zOuks|PwTQJ!+nbBcGrqXI><7RE6d5ifV zlI|%y9HzPoLS@QP>!A*_Ty>yAprqqA1y9G(oFyE^bROxW2am|oVSZf5{O4eaXGx5D zIT;(z^ungWix|Rp;Gk_-hLlozvTO6;*q=L=xv`s zKQKx?j=H~w)0vE`WQed7FDJxueW0v))VHY3uJeUJk2p_E;HyKA?vq6;e5VT+m5;Jb znnmN_82S>jLV>PiMC)hJ5B@ z20SHo-s$opnZ68q8v5z=mBsZseJI6j?iYI@D@cQHF{btUBbQzxpM3aHx%t6|s-11@ za=DH$;j$e&U42g%$eJ`+_n|fU_R!(Fm289N0#wn>HvIxn7b>Hdu3UuAT`sT(s#K^7 zz$TC#N;3{`n?3bh?sj%AOB>S(tiVb3u$#ayIj!EvuN9;nl9*za$;|089_Up&(3XwG zkQ1i2D<2pewCymw=ue78^{o#z&thVK;>AF`Ku|sK=i|G3S6%;uvhT*X;?og$Q4?5t z(m0rQ)X5MLfX~DHm2opsW_i%{&NMK)l5zH#e0Sh!oSd{NUeb7o3h%Ej7+$VF9253B zUd4HVS2!tbl`i~(Ot$PJ3+td8?K9V(Bab2Jo;-ORDi~`$s2+4#8%&*0L*BOOpP*@1 z+sx5Ux9ll<`;A<9GM}6>f60if{qCQXvHQLv2R`}^jC?VP2Br~fV>0=4?7VQ|0(vTI zjdy^L3=KMK2Gy(2s!euYt9sNz4Y9%M*=+hxZO2Y+N0?a~aRO(}(2)GtGcJ)o!uz|A z96Ai1?P_DqO34>H;CiR)7d7-#@~vo2yU;;^1)ca{lV)M;%12ZCp;*r60!2NS>4HTX z2bt7gdH$#zxXZq1o&rs-dIBg9Wg6I_asx1VLnqk~i*DRbohmP5jU646(be{y%OSU5 z%fuTobnqep!$%}Q))_14sEGwyV=j5t?|3>o*|VQX-{S}#YwvrNyj_3f8P~|r`IpQ7 zkG>rk(8S7J?nr|+Ux4CZ`O&o&bni@iB;x|hFrkNu89t-#OxldKI!?(XlI}u0;H0s7 zpCeX8o#Iwr*;XOtK6bQC_D(n3uDf#CY8l0|Haqq_3|N~>gCx~jhoRB7dGNMzlV?6` z=xW)llP+HYenaeZ8+u|ZHd}yZ(L+yRO2bS?* zLOwo1H90;h%T|rLE$w|5tAR#RjGDMXM@_#@s}0))4(Y@%ZHQIa1_tBe`q;q8iMN5_ z`r04TYUloezv`vmk9Fj;a_noL)^)^B2J|=vc627=c;!~=fv%IGwM*YYciy5du##`Y z8wohqh$|+l+f43$sQnNX)RI4rWg2Ivt2T8bUK*m5@pzm4O9k|Ko43njdzo~pZs)R2 zmYE-N);WB$DP=Ro3cM88=@6&=p6=;5n-iPzOw1B+K&XYQHprUq{V6$m>qq6#r`}&r zkOoGYV&HdO6yFHEG{MvGH7*h^7DducYAu3xxip3%3mQ~!J@}0QY}l~bv}?A_q>d?I zOcyf8Z`$%=Doa~lN{PUTNdJl$1km4A|&N z(b{BnQp~&ELJt`xaLPLMMf+>cKc(LY zELy)s*1Y=P$>C4FUk-ovgHY|5D8)tMXSAM#Pqo}Tm?B3!aj`XPtbj7P3mPmd%+9N8vtOeg7fCF8V%4x7M1^zcz0fx~)oH=bNBAEJV*BqyEv4qVbb+tfwz z{%BpcRancnZaf$7?fNZdowGOx8b0gBp{90@+B;&pHCa{n!YcSY6|*Yed^=s9#F>`4 zv01$7JS5(ql!G7s3psLY{=j>loH1#i+S(Q<_PKG`?8IyXznth@bYrJW6)S^}Wwr_1 zTqjwCm__N@D_9`SZ?da|-7!_VP^sFmZ?-E)y&!9j>KCq>_R-!nG9v#HiT8he`8Ij{ zD1ILni$NS*7*62n<-F5n9K85ZYm8htx@itU(kb;BrpkN~Y3Qk}^nn;y%%}U)HtAEc z;_M+gx&yyFw0BZtqf<>PYGpn&5CR7;f>uA|M-bsF^Vr{NZo-!D=dM`GZ=&*~SK0@U zKKdlloIn|GkK`F~rn=Ts4EQjtQU+RMYVeAfTK=m(Aa;*w<+r^~j(zcF8N1_i{@yN- zaWc}85-e@%##uM|t)NYK=sI{{jgcKp_SXD%dsNeY zlX)Stnj!VT0^e{cpLLmLr^{Z=w49F3OnuBq|8xR^O^4Z%voDg>ulY&Y|Mzc}V_*Jc zo;cKfs*c83=#)h)T^Cg5wJ*wiQ3C-YFS1e+b~pHoce|M<)O_>^?@oIJP1?>OdTX^GszH$eF#0{p-G?4S6+w4ghZae2*_HpFNioyj=ucC&to zQ__r+@8>QYWx|DilNx^Sw_Pf$zxUtBzQ6fHJQ#6H_XUEp zSWeivq+5Z-#GJ!=-ooZZa|=uI~nW zAlrtGHa(Q4y|r_krTh&SUx?%?^7cFK(sh;V8((do!0ly@t|lGuwB}-uy$EPlfsdG@!+qRr>X!4KJO=Da@mi{X?EiN}Lu1*DE6WNFNxKR53e zo6o>!(w^LnCzn_8$z{qsw$$%t+wD;WhSvSsl$Cg-8}0MAoUglGo%fKHwY@H>c_wEF z#?J|r?aU8(==Z{!b<)+_HEAT+;eU>WCvK*tzs=A^SIDYY{Y%;RuHTXIyS|twU`)ih ztYhMNUB9~RwPWqRK)Wv5E}nilMq|i0LHidQvzDG;H`%s_URD@jM&|R=>94@*M>cI+ z?G$_V*AI^}UbInu{Njt`UH9H6x9r@d371JtpI(L|og!Qapx&gp&_n{%MSzKsdc<$g zbf^5l@))RZvf77X7d{!R#sEFF#Z$~@E|sYxC*GU*mcud$1aRTg9WFxTQ>A+Aer(C%$1Dj`tyKlO6So7!n^m z#fca>rys7zfRC*GwY=L&G(+J4*%eP^n}G(8{BLV&7n)LmX-h4kI25i z_$`^Z|7+ERFDL)NbT6kq*<#WSR_6;XFF-Tk`A&Dxk!$G{*IC)EmR=z|U0H&N>sl}9 z#MR--ExT}X+pcA66QC&GY{oTRJ0ZaSoMp@8Ut!1l+h4g&_K%O-P8YYA7tWiHxDX3; z^avWpiC@sfG=8yI^h&-ZKXB=%Nw?Y_3+>@=#W_Q=|E{B;*tS5s5@uRZsTUnm8%AB* zDNeFLu$LSP@n#>hPP%&Ag}q|O{@E6uu$h*@24omdBQAUCYh~}-e@iAGzB|s$ zV0AMjxa_(}o(f*yA3X55ZG;+Q8`oXYw@$qZqfq7r+fx>j#&m@V*VVZy8t=4t{T0f1 zuHU>_p1Xd%ya^9h@vfoXUe>3VW18UN2cLeMyVxe5eXMl2pm>rDd(~;^abZkYPIIW! zVnZ5->ZvV~E*_}bcRRi)BMk@@OtIwUL~Hhnq0UU7KElq{8C&dvH-2PX7B1qi3oWta ziNuvK1E)%ukm};ITLC2|*Xu=77_9t*MFLt9^d!LhD(zmg&fh}yIZ%H_KfnWG? zjM3*^FAK4AJM^J<@?;c;VdrER2^OPP>6uNPU_-ZzkF@KeZmlUP!Php~KWy*-)$x5h zWFg*@j&qkV!3kRHvQ3&L&Sfn#O026)=4*Zy6omRdzsrl430MP>~EFP7ksDe{h$9;rglDv37sc>&}m}Dgkl|& zYEEmM#h9S8sO$H1^UNS*t8l2|aABuj%W!54Tf7@KJx){8f3w{{shbHi5w#qxCSKL< zF#Cy%E|h(f6Y|b`@71K6pI$DKVYx$XBvRt*;W`YcO1{eH;zPd68a5hZ>4OUrW2L_8 zdMw&LC8HY`tKi^$$F$Z&NSip>FiJG}K96gj2UOTq2^;+JBm52B#^-a3glP$k_()## zU0p9_LJL_WJG5OtCsEf?exVnbX{Q=ktnnfM`Voiu55FZw(5RE&unYYfmsl&l^ne95jIL9@hLyV-F+K?fZ3?1z< z@iLSWBWUnT9MH2)y0+8x9zCTMPuOXeIAN!09%i$MKt`{9xr{vL#j^KpzbVJ}?hMFO zw_aHy<|l^NbwSRYSH7p)9$t(T2P+QmWm_+GzarXtdF0!&$}~4%!gVs2s*%}BwPo3l z$+S(RF|T_wzR0u1c1Wqg{*)jss;H|VH+Ff^X}R<`yv z>APOwxqccC@Gbrtcj3m(vi#+*m4kot<}`L;!@AcxVJDK~ZDXF_uPv|lkk@sM>H5hxq%M2=kleXpU(0^fH8gZKT@u`wt(Dtn|~Hku2f};G%BgG~0!0o6MoMWrIkU$3YiA7I)(%=vS_3mDZ^k{f3t#`Z zdSgr$7?_Rv)J8GB>~|VNr&C*%?GGnHTu4DT+o2wEZ*RhT;Og9GsYN`lL(&<2ZPeczEi_)Rau&p`oSo=QA}Ze<6N2 zUT?QD`FVg$d<@3o%Y42-&N>X(`%iUEa5!CR>h`F30>eh_$s)GPxNs*wE>jzoiwvz^ zB#TEDV7Gfr)?SFGi*>8w!emQB$03-Dm8an3ah1t-l(9+i)HoiZLek~uas>~VF>&Ub zcpNG46eob42Z?t?ZK!AN9Js;>--T_&ll&6U$CNzaX?IIK#=_#`tw~;arf*~IwvN$H zp8;#Xfw3I7nfLt8FUaDHE|bMuFHp1i6FrZ146^mN;4*-=vX4vXnL=AlgUMYBbwWaU z@{xOF(fZBacUmJU>zp)N)k&5?P1}ZojwNbf@n3pDN2lyeAx|{9u~|ntg3mHnaTy+f%Z$^bp7fpW>4llc;&knwM7!nR@dI-3 zZ{H^S-})w5{o}tN^A_Q~u{kSUlc5iImpU(^J|-$U?JvjZjU3b2T-SQFtPakuxl?j{ z>bRUt#}pExw~-W?9N9jhwAV<4Qq1T3o z!rQ}o;DfhZ+83Z+;JmK7M5w*R(;O z^o0Ux6g2s_lgEWp#YvGL7aG%~Yn`x8MIxda17=LN^Yx@>959jKG*MH*l3l7b)|yx2 zgv@O{;cJp73wS)+rC*OkW!bNy8c+3U8~rpNy6mSoyY&~HdA5vx+xN(!_q$=qDBGl2Tz>AxE%KH7@4)qaREF^riglrq8RVo&jm$6g zd0q46Ub{pvCYyEAwTborvG*R}mK|4_=sMx%eEW88by6!QOR}7ejltwMfO$h0_=XI_ zykU6En*koYVLXIkhWRiCW8(oHVEBv;3>dI^1Sf1`TXK*sTW+b5T;??cxwjTFXH%?ibTp-`6V#@d?0p9Xcwn+Pq$F8N>HU1F#+jIza_n;kYQ%Z4%4; zp^n>O!TzJKjA$7rKlqf(5d!sSA9WHag67L8PBB0Jt~0VYy(nFMoN_V%)eC~5KTxxz zosn#jNIXqJ4-0>MU1$-fmw6)e>Z)8w|AaxiFO`aG*7UuL=L}ToivmF|~+F}sUhRfDHpvN+0tu01t zEh`&}I;Rj@%VE0mGJ&B=Z4E454hOykx)jK0YZux%fYt9uPo9>!>&@WKY4jfZJM7^Pl-kw`o@1D=id0ArRVk+Nb`o><}Uw2 z#`jkw(zXuJNQnjZex9^{yo;Sdf66rQ+)EeZ_1p$t!B}f{(V+T5wW#Z+982q{sBe@f zW3{@8sLdSD%VZG7>ntO2wfm7TJS?~G*cDh52uzjmKVdw2HReTmhc`p5IM*C>?bly2 zQ|)Z@?kWncPG1E`RJp!r5%yUtjQqM*ik?;R^S79f#IBU4>t$deV1?s9Q zSOxO2p{|J$1U(OsrJO592GRhgISw-Bb};5;4&iiw7lS1Ma@kTjwB7MJHF45rup~?A zL{J(ET28h!C_&Kqluu=wtkqxq3G<19#xmvU9~6z2m(9NVq4tAMUe-LwgmUiRhJjvr z8G_CuXC~$J?3{f0whhwP9o~DL`QvS1WAnaaN2~9pHWya6&{6-rAE|)d3@-g517RAK!jq%HX13; z*F3Ilo$sfDlUxjFBvl2#u<~?V^DE#%zU8`dlqXF>j%OP!){R(VDc~!$cuq8dsz*oIE0p zb>a1oB442aK`HB>65Z;{YLB&>Xj3X z*&bzYr)2b0_wy*Nbd$jk|6KU$%52PafVn#3UvgSiyK}WhFz_x49A+bF$;yQ>N$g z@X%ybj^(7&%7X!y%k)%^w#kG3=#Cz_^vt}>p2y_`RRAWPpbqOLn$k@<@hR)h2R%Nc zJB*;~`V5Yg$sg;{fElo2!!+2bbM7Q^PN#|1isL-UIbM{{Xn_}fa9Pb=&U3ci%a)s6 z>leQ}IocyeN#1$74@3J0z8Cc-M$|BoqZkqJCr-t17eQvWw(!!M_->OoBGBBQv(GDcV5QSfrC{85&ZQ)S1p?dCd%4@ zVzNB&iIp%CKjCw-aJtDF25D+L`UrYnhR>=O@KZVYVYJ`}ebb34@!dboi3cnzCz*mz z%Fpl=Gs#B(NV)h)bI~S>7%*}0$1=u9D09%{^t=oqo0ok^<@yDl z$#F2oiHGG_$M37Inhb62#tl_7G_G>YO$d33MjYj<3?0aHD2qNJZR-3iZlWr^7()#c zyA;HT5opn_%6iaCI<9MSj^hEnvs^iNtM4HgYX6k{QybdO3S4cg+s*v!AaC~Ya*}WU z4!QhS@07*khtU`8FKl7#ar~7xYb$*Sn~q}}hq-LTa!kddTxo;8%P!!WX+y8)!UrbR z4R&H%vU*N4jfmw{$JTo0OUF8K3)p6J_vWo~=HdmpaQPBoZLC>Nvw7XitJ8~tH_2lc zTx+7!ISdCa&`s7R630(=>2J`3J>us9GTEh#fRWkC zWn&p~?jL_-(3aW@de#@gZuAefy{viOmb^?q0v>UJzkQ@%UbtyYK6C1VeC+7CFfU=E z;9-hEqZ0^&r ze#I8Xk&n+jPqOBljr}y1RTlbTrx$V$#9S~~(4}7JOQ=L0mYL$fv}&=Q_f5d?erI3g z{ZXpJYTySOgm+sgcHzw2p3Ph2@Trp^`)ZdW+`su|YQ=y`zQg6R)pT~%H6^Zen+@C? z5fjaSsif!1*DJHb;Zc?9BV#iB{r{)TJ^XRG{I`GZd--{sV>*gKArD~bfHl6=y==h{ zhY-5W1D2LO(2*W-O-_Slq~*52&-82(DC#Gy5YRGwvr8MTKDuwNpZjROhjzlRT-M5F zOUoJGf^gP9v>V&Swis3cL-_#@<+1*5dGVGpIWs*c?|$OATtZ;t2+UWpRt}Q_2Al_6 z&P`s9I@INWtO&j&M>*<}z)7kUjEOt8y+`IQF3Hphdw@Fzyr2W6Ecg;jok4+qqD)+; zX<6j*Bu_8*hTxe8E)Qk_L-k5D;G#EGHxHsIU?%%j0Wi{nf5jlWx?Q%*+Z=T}`04VV zYXDwFe&CzGRhG}6m6?C|TiZF@L18>`jM}*7c(cv1bw{?yQa)`-*4p71xeUiE9~I*D z;Rfa}NG3ms&lLJWbCn2vM>^{KXEG{nf2iyFl*;Q~c7D6M!v+402)a+7I-xIeA*njB z+8E?GOnkbM=&4+VVb_J-^i}5U5N{nJ*imaqYn59IR#E2JLoV9+V$>RVi^|aV|Cr2v z=)Wzk?yX#ykN_y-rf9H`;Nw!xrJ;$J4Va4cy z*K^`|+43Te^KzUD8g0-wwd;XAtfZChI-b+6$w&W!&*s0&c}{sRdmij*e*|0JR<=9f z4}Hh?%H=4&!STEY}wpQZ@o8FGxw)=y8J>K{>)Ype=ySCcpepoHAT9a*z>VAWc z<#gZ534?Y0&7;k`>OXc(m!_{SWnF$n09UJ5G;-xASFS;eSErQ#h(LG0d@brXH*Z7W z{kJmxcYh@_AO5>En0-)vF>-Aq{Y=~Pxfz-Lz#}sMnI~o8=xJHvbG7-ZGYgg$e4rf; zW(~L~Yrw)tje&|~w68U&xoiqrHgN>HVp&jZ4VJ{TEf0{njl?&6^EcTl$Z8vskFEZi zAJp-{@A|PHyq%#x6eE;X&;8BXWj_p(PsF-u{eavwF(@B6ct##Qj_bT0Aays{Bw)iO zl(7dbC|jMo)9OCVs^uy%s7pM6c<>$F(JiO;;<_#sNcZugf~~a3r>q(=JnHh!l?;Rd3msj0nmdVb@KqIjVkKU55+GAH1#p)S}+cBF#x(AbLd7Krw1RR|3S`eMR~Uy z@*wX&0L(Y&c95rx%UfR=R@WVONbi@wRxZEu_d^?jqsJk~p>IGAV=C-4$if`AI0h-> z@|K%lK`!V!j^~TV?apO-A2Er`)#T^Te?sbwUKtsEfvJ0=$~n1Z z8tY6|^iDjgT&Yea9*8;4)%fE2opk+7fXi0pSEyef9h2tH8)fPbe+%zi9hJuRoyE3P z*|=Ub`dUg=`(y6FL(;f;GxiluGoQO8i~Enu(vj1$eBrXJ;H4G3!@1Ul*G0lF9?Y7u zG7nnaKN#3rrhp#wDrvN!XR?OjvPnPS6A!6KS4u_;wxVo?S+J#0t$HN4_?XG+q!D~j z*}SY%Ohtc~zV?&qz$f-oOWEYSeKui<4D~i;0;ilGJ2fSzrsickzR07uVR##ZPeEI; z3+0k6=XpP?C&Y3&$5Z^&Ci1(7>T>F_Ss9qXv$dnx_e|Ct6tY_~BTXfA-nCM4@8YRh zS)5;zTV7)C&?UZ344zZL%XzMJ5b)pn%F0SmxhumdU{IgHic`unyY$odQ>%QiUy?UW zc2^0v$`%hu(gQ}}b1yCbjaxHTR8&2d@Py3<3B%>9ZvNty2S``)dm zmYW+kLL>wx93!zzn$|NY=oiejt#`sRp7vO!Jsv@B+hoTF2jx=-4#@i9Vd=+O6AG9rb zS#gto(kuB01{a&gH@^zyj87qxH3coBEw0artyl&gXlyrIs1u)-5qSHX^1${{dFkA_Wpn_KZn1B);n2y-x>91BpieZ%Vy(PqJagUbi#x=TQFu%qG z<9dW#Bg_@57n^*A%2E9KphUPYLZSQiyJYZte?+E!|E)6j$R~B;ES~~eQyqh-@*hX@ zRc}7Ld~{=)SvMrjTeeE~%Wje0Z@5po?%p9X&?Ae7&dAJ%9+R1m?UUKP&*0{Zi}or< zsHRiP@DPxCDi%I*viH-nJRO~v$xE^(XZ#>n;^(KFDc5>>JJ(BPlg(}AK7xJ)J|F4UfO);mSNmz)g^zk_p}^3JDqkd_P+0Ccpb~O8VN%{$9Fp( z=-@j>K@Srsc}zUbJdR*{X5Splkj`V!HV@`rCs1+nugs=MarGQUR#K=Vj^4N&KK5hYw7dJ(lx& z>@$#qeQG3|T3e-_;YYkcE8DB8L+7T=n{Y$bX}oiN!NvmQbWCVY^LgFN{E6q~JTJ;q z=9*70pF8()+-^N2!=raukLV65brfk#RlIiePCA`Ds*k^&VN_M+ES=%RKJ9T|9%8F}@X`*Ml4x!NsCq;6!>ZLxqH2EC(ADfv)0FnmBE-$P0KVnjQ;C z#K1oW-G1C?^_e5++vOG6G!j0jp}5wb+@9$My5ofY%6ZoI)K2p9KA?5tHv8*x_Q^Tv z9<1wWW`!)myQsn|pMQc(Xu3SJ?~-i4V^qes+J_YKv7u#c5B>xNeQCeafW>j7^pGpv z%gQjm%Y|HBDA9^IjuC9oZ`Uo`DAZN3WYcu7#%5}3<_{cg-g=wN{N$ucnIrtd($SQp#vg5IP zF;`eGs~#sVN|1(f;IAL)k^bI>>^*i_&R$-Sm)|_9FR*}^O`y68RV78&ejy%_0zQFh zxy(~r){({jCb;TiGTVdI?h|ve{$@Px?2tmhc+ zOHQ->r#?ZxXtP?LmQ!2v*HHosZ-eXm_V1AC-~Aow!fECj?gz21HSega3001xVlqNW z68hMKEwZM$c@?3tgA+YB>hs0R&-e!&oKrxFSCOc$ozLYBek5=Vc1Ri=da6%^&`CpH0YR zJxCj_VVW)TA@P9^AwAx;#l~-y4SogLjb=0h2O6hF z517VZDFjT{L9W4(9u#TXFBvUe56k z-7maf7C!$unfcRqO8*c2D>e+gfTOka$M!?26OZGpn2ca;$~f40OUI5#eZ2f-p-jfH zTshSBc%hiq@kjS1E7)|PTiK55jIYk6x*zxSTNBlo*bZj;M=ACv)NkCpK_1+9Ku%3w zkPTxa;JKoz1_gp9x)C|5tfzxei|jQAT{WslM$yDS)xHQlfHBbf>aRpFnwP0Jy+MZl zub+~})@{$RBiSItyI*y%N0JXx&vVzD=6TMuGEY6%apP6jc3vOCz`lfU++r2Hh#)+F z@T}TujPy#^dRqxM2Cxc(Z42yL41pvs+jNrxRdQLc%c(wSa7&MMShjKqKIjhECqHWk8Ocot5`J zdQKj=aaeY5ws#p*mV9jo9Mc?s@`=m?tl6hinH<|k1`>S-GxkOAPz_%mYUpZr^WC_c zI><%Yte$)z*Zi5egwF)_;Oj+04WfeRL5fzqjJzsfG7zdiE=N@NJJD&a}_VVt#{b&e!p?{-qjvw0}+86xk`?hbBi$C>~GXLPm zr0b=)0h9XdMgy?FYzGHqOKJ(ls@N)uXLJueCC#l{Bc2u}}gN%Tp&$%SL=QGf%wzj=i3YI+q3vEH`C_-3VTZJvw^t z>w9|e^@poWXV3m4Zk$~w!y~t+M$uwkGGZ@g>qXEoim@UK9ovF9dyWOPoZ z|K~fU>)v~%Hju7MRPF;}KMULZLm$WIW$=Lm1?K=rLnM{0Vcxt%w^Gj4au6hDtp}&0 zahkb%%ZT*cv|gH6@$z6D2UWnJTVA#ta*>vo zDQ9(h<=0k|Y`{_6fFEo)zR3bZ_3Rf?L6YpJJxpYBh|KiW2>xB=A{Fx)LqpPt1>y=P_PXt!PGRiCssOpm^> zr$}$Zi^qWVXpjvU)P`QqU`-Bvd`33hinABJTt6sSgr*fLx{1J5+SwyB(u*GoJ70iP ze`Lg&85ON(G!)Bx^Uq~HSHTiq&@Eul|DZ!-_}}6~fGXQ1IqEtFb0)=cJkLoFLEGim zXfxVrBj31Tn=CzpCk6KImFE5TnSC=Cd;GX%MXcTqY3O*n(`<}m&-dDU5 zCmihYENvo1V)ND*NExW3j+rPltAH6?$mR3$YO;afhkHy;PF|Gxg+;uriVK$_2&>lC zBHi2H?#8Reo<0Be_51eyk_-;sD1Cibek$_J83x@A2)eh0o^VG>IjZhVA#X=#gT6?- zIAO$2g(KJE&uY4B;a`PJ^S0Y%887gjea~OoDJ1;5E%ZGxpT%wAQ=byy3lLxL^sf~&Oqa=Zaq2_iD+l}W_d-tr9#t^RgVimV=?4nFRaYp7( zPRSDQjK=AtI&Lb$7w^@uhNWO5js-wlIS*P{S^32P$#!d)Ay!@n)p1+-MT}OyW0_oz zn`AS;5R4N&`C~N0$jc2pR>W2Ah0BZb=+l>FY_KVVeYi>$+5qcli|J`OYm1`ia0FM6s&JI>vDr)HiOB#*!A8LhD%Ew@4><-; z*#-wxabZR*XC~XY^Uhz=)64tz{TJ!)-;Qku zwAP-^p8YUZ$#@^|Fz%LR?=Tg5Db(B1ueVMoyldgDrn?%yQ~RmAn*Lh&6*66S-6czh z56Qy&->ZSQ=GR%>=Jn3m&X5)!{=RqoJUD zix@Wfk{kGHJm@JcMG}+E^|HWJ&?i<|4>TId@mtEt2a_$@qI!$JO2f0X!(GA`1$_3& zDLfKb!=n>C{g~Q8-OAvrjNmK#rBqi8)ulc*oV7ds#Jp^|o2Qrwsg1C*{>2~AoT@oM zk3N1`cHTWC>$dSZT~NtDuJ%INX-V1TOxEbFG!2Bby(&(oOW`0N`&4J#%vO$<$(tUV znJ}EDZBt(=cn~sM&I`6W$P>333nbK@WaFjm6b zN3hy$;{DJIGIwZFF7H1t^LTgkGVYM(#MVF%P7^w(2Gj_K&FMM;s_`s1Wh>3Z=fp=r z!*IIiipe0$M0}MEdC+qj179kaWevmlMO#JOR$Jr`_BZg>s;2D2sobfVCD}3&p66xj zgHPt8VS7380v)nuA=RDIH(Hm&pPZBNolWT-NY~B0`JoG9!`$qFPh6BcUp+1Z<9_xA z95QtlWNu~k#V0%k%j8r>iBaD4OqU$u8AhN{heEFF*d@CK`>NtPo@aOwBViW;BW)?m zbv;*N^nLZVW_qz*_%XU;yDS}iN|v5@LYnt>c%3iIX)_D{l31~UH2>bemwF!_?c1^i zdLfu%Bxn$2UZ5Fv0V;Pl*mgdu>WkIa8mKedE%rzEM8)ft>cFWkScOVcC%MwPiZp+Fl<{!}HSh{=$->c>WG#>t-i#Ibz(l!>--=}zNjBjZWs5#4Ze}aV zuE-GX4!-B60l6@>C?ELL1(}*&vSEYHvtGtz#d4?@%Gd?fbxwYkm^0v>-fy4#;}}z1 zDteiF6Ln6~q%AM<>q5&ivH@o!0xucDeWgLpb<$g#s2}*eBbjo#@m^GxOEkr?w@Yb& z0AGF3yO}dx$58nkC)W-B=Qg76xn1ako_x-D9pveI(MR{M=uh5XxqR=x_*Pl`$VX-2 z;m_#Uwg3)SxP!9I#~{bKZsCno){jNm<>SZk20Gs8#x{kNVJRi6n^fjE+Z)>)%9VA9 z5yz8buBGm>K|i)T)4gTOdfeTAK`zhC>ew_D8>jIH1pKO|(=|R!mgI4$rL=C{E99=b zep#M+>aB9@*t-&=L&$xrW2&qzg3*lmh)1N*ficsr+jKyl#e7Y zcmX`S zQ#@21FktAO18w>u9v6Zyz4&;7P3Sa~1t%}Z0Gs$4Xo#n_avjLfuIsvO<^`OjtD`lS ztI~B^z;L_PHrQ92x!vGXq|;sssBPs-epoyGM*{JEbDPDs*C)oL`@6nf=HB*)B1^c$ z0{IwNIexjJyY(1GSr4l$SAMR8akUhKuFJD8!{+{!>%?Tru&=yszQ;CaeVN8f=#R4f ziuxdaknh>FP7a==fn2_!YYKJaRnTz%h@M{7Muk6peOqN@ACvht29!gqLef-gbfjP+6xGg^VsH}9`%E-X{ubZR+ zru+o3%NQ@`xO9>zQ*tcVR|EPdVWpC31R1F0oP>_k%XmDgYphp#whYR^o-yfK#}B9D z6x!JtoQj^58NAtP9s!w;C)M@wBn7ic3h|ZUDtg^e*)(i*p0H=wXTsVO@l_5so_6j^dNoF|HW^Dz*X|70qPE)$m zf_~teuSJ^bf~0oJI3;Y`caB}k+hM>!(f44hoqVvFPC=_+sg1#QhLPmi2qb2i|Bc-{ zW$E!JFgH9UjeG62zGRzR$dRRbu;Fl-ELXV;ANZhjzw%{loo$)8ik9nyjx^UP1~>aL zkIx9NLqt(q4I^UYX|gcD#0U>UHGl(OGS;lisSh zPr`Z z_|ot!(MCqec~;KUPizHd^^Et6sDT_$i z>XAYoXbZDg!Jc21iQP?85AtPIDxN+xC%uCW*>zub=duo5VspbE{EtC~Sb>&uB^KnP zZYEz0hK3vEXp0r*x_Oxu+9y4u8M&2K^1Z0HHVkbmjaJ%p9}-sVo9LhM>Il4ZZ~a|- z6>OK(H-}dsDyCy2XR(5o_rua-kIOQC*mvD^M}mQ@VWbHJT#Md zzLjJO&5Cv@&+(So3ihMzHuaJI9@&d;g7@N4!%@61zP;gsu}seB^s6%Hg00Wqj*mZp zQ_a64^Ydpl2$Nn;r%!(XH(u?Ofx%}X=(0zdV$Wvfc68OjpDG>YWf)a59dWNg_gZbc zubuo`qf8CoiEJX+&cEv~ad+XQH0}(~SiAmp%9r*&hL0Cq#2t}7krLQ;jTW?QG*Z2k zWL!RR%B5T@=ecIWGK)z*m68m!^nZ?IdIcF&k_5`AH1K#*_XJMCZpTV^_pmevyKocM zvaWzH?Z@+qr)Tt)hls)H@g(5b1Zy^mD^v?c_#2HS*|b89eE4AHqF#}2JUXvok2y9? zQJ?lgP$VxayKHxNO*X7+${7URClAfb_((%~@xwwp1@cU}uS!r`#`Ai_2BCqQkPm%w zL3X^To8&0sjdvOuN53#D8+P`{mRmUa0a*P6gJq^NP05&6b2%-$d>frI4#ZNh%5>;J zTWsT*?I71tKEs85?TWG=wABHlvyZ`t3?s?om>3$sSHJpY{*V7cnqU8wG-TaMdEJ7( zGMpB2WHCfjfy^-&$E(;KlB8g)WUUPm|!r@X?b}i(__EJYqDBK@Wc^r z^t=oj=z1O3@tH^2#J6j`E(?rcqlU+bZrar&qj)6j!w*f#(POyI%T+x(03xAmy_)LA z1A0*w^`UjRn;e1n^b_T4yPOkQdtn+bwllq*v!!^?4^;?%? z1I$*DZ*;x@&@h6WHW<3VRz0n=9Plcx<|Pr#iKBpQnvuz_ubjniR&5j*){0rKUGgfzAQIqyr)3?61&gcBUrP zBW~@y2c58Q+qO=QpP#}r?0!R)jYl0<&^D;zO;g4rY?5ue()IRq zb>SuG6R(sbNB&4IT=<-poyYw2>G$c2H3kNEo5Lh#4T8{pJ_vg952)@(?@p1XvZ;|;we24Z${g!aH!hN~Me0kq~S((42D_t5e zv*E90Y;EM^CGQ4xtRO>9qFOnD<)vULlh@+v_MqtA8ouczYL4ufWtl|hspaNSm-KGv zlYyOs(tiW`9WUcp#0w~<4^PX*1D9m>Jia?Rk4X;`R|7W*4@`1{!YIb4boSwGPPtnuiRrMzzV%2U48 zX^;2sTs*lf8*cJ5BkHPyM7aH*n3lW0a##j=O_>S0`D!f+##ILdXiGOQdmaE#O&FA= zFmrA$8*-%=X{vh#@;Pq7E*bd0noZq5lxrtn!m$16*d=_0De~$&x6Ax*{EpObzgcP< za2=Cu#Wa)Zqv~aK@>xZ`@F!R)-*&Uq@gex)DwjWcJU}U|%9o*ImlH2wGH`KhX#i7< z6v%QLD${|#ntqwjgQjcweNOpar<>sxp1vd@_< zu6Ca|ejbhVvCW)r+W-1_7y`wH zuGS5!@r!8HwY6Zhk*V|%|c z?=;VK$_oNIjYQ#OgECd}uA6vKITpZEc9o3NJda8!IL&k8sZTNRCZ7A+#0w|}whzeo zz2ma^wVP!9ODCjnQ?JZlSdh~XpO<4FJ|kxkj4vIV)z8^ku)`!6f}fuPHagme2{Hy* zm@D#4kF=IYjxt&DTrXn5o|TPfd@J|h2CF;nusgax^3iEIf7agYrSp26pwJ&^v;|}9 zEtWm__Vdd_qcsFxo?_;I_K;0x7WhPFE-p!TUk#57QGj465Lw-58f2&o8E#3=FpIk6 zJKgb;u6|QSF@l`qS!049oso^jF*la#Ya}~fdjnFDf-Ly6x!tVfJIDCj$f|3 zjPirum6%zZN_>p|j@OP}=w#xu!!rCe z>t#AEn9d8>oiJN;ufQMo`-<@0w^DvRFiLHytzRegojYXyEx#i*+_hNWzO~rb?*A3! z%Lkv9m8tXix=%O_h@IzVwFz2DlvFa)#lO@b#idfo=wuo%=eTsz%qi4lat+rvDor^j zFPTREw+fRQxr|mait(ys8u-3!58i*=zol1(_Y6wUxV;H#=JcFgIB;1mAD@#sJgd5b zd9#k2n)nW58sn6qxq*hVQVV4UXHC?JWv*n5ta+hq7{(8B1-|R8$knZ*?`@2Fz;Ig1m6-Yh(4FNo+o2Ct zzJP6ZYCE>c!mt0oQh&kiY2^y_*mrI^qb)sxM+J|c#OdXmOe{C&s+9LK_XfsA3R)F) z$Z+f=nXDTer+`__&)h6@pVILs^7AtBvpU}nyYJX}xp~v5%Cj9Q5uqw2`V|FTLUC2Q zVZ&F*`STCy3p7|C#>Wo&2X>gpDn!AGtsSo&-TjPMD8w?Akn(z7el~c-?}YnY@C!Dw zNh@!AK?V+&d0sEIrH&6b*S2n!`8Ol*?z};hFot32(xqM<)Ch^SdWqjst0dI=pqLD#3J)UIa1Aom308?3i z^DEthE%&ttRxPVu3dV_Vcy?+q=mck}KR8&|Z9i75b2t^eUQY#^FN9=L-Jqjh1>5}c z(31}?$mZMeNLEkkClv+6>8BT^i8kK!;&kV-1;7BtjQyPFG+3soc#<=WAXkuYqw9Du zRM2(1icz7PVaLE&@}=Orikyhl{_;4Efe|!X|!Wy#l?)OUl ztG|pE?3h)5SW!xbkFz0v^8tLpt09e@+k)8;EDJ$153HHGn-0+4&Cy(2{%SU^AAe$~ zS3dICGqPoDKnC#Y*p|MH&Vr@oqSMVUeBnQWfzGYr8i_PwxrUD)b0e**ix6@8!x&~x)=VX%>T+;r2GH= zF=@P@;^ipqx{2=Osc`qQ`|5cvXf(n)L@M*QEe{w=Mt2O)Gc1mBMjzE+o+p>L+@&Z% z3$#SNf<1`ZOZbgyGB#3(lI%FP62l*-d43&ufa<|JkbAL>-ZCI7i+DEp?7VK1PtV}l zV7#pfUk2*KBRzeic%L!0I-e0npJ?lXD_&+-X`4(0WlKdqXvz=!A(K@(RSEbkgFl3K zD&Kx*w;VjMAP;?XR_?y9TY3gK&rky*mTB-+o2WDIMl2oKT-R&6JMYJPl{Lx)VF+A0 zvnbo|!fnoM4Nu)-?ooZ7N=2E;e+*#yk2Edod{&}S2RJxipt`QJ60nWvI>_Tk;S)`D z)d{2FgnP0ZaWb0v&h{2*7Eqn$IiNC(u^*qOHrBz}B)$D@Q2OonUn?d++1_)(Dja9yGl`=cn6eiWDn<)ML7%l#XAu-Pf-<@qH9;02jI zw;*Q^;Mw5IOVWdtF@rDza3AjY)l+!@FXCIjn2#tcA1w)8pt2}?znZ6ztK^$rv$rO< z+}R~ZusZ$NhY)!0@0N9&Z1Pt<_8)@iryz?;!DcpILY2tiFH+*c2D z1q}Bk1pd$ohU`50SF#0+6zsXzn1Xz%Ey|*N_M^k(17?&j+Vgg>|C&GeZ8HB;zby6p z@08k&J7C+mhHZb{!CW=RR39luNXx379DO0Xf z+-X#Zm?)!eV>{3lFqA3Rrmi|ISR!|98`8gi9(=bOi;Hq#r7L*{xLc$(hez#o zUnbP$Vvv`~U&o+VA)5n0k zLHdSvXh3E#?ituD-2YKDoThB%kVdW6l6piUXT_WF1%c&gW%gg&H#+l)_BfV z=Nq;e6Qj@V)@Eyi^#!M&WT(Inddeq&{ny<}gl)SJ@cWkJ(+|$cEq8Ru_M35>Qy9sE zulqm;Cbrk*z{l~SiPK9mJi!2K?IiT{#bp`A>mmz5G6oGI2H-5P`9AfaMBlv}^C}v} zfNiVG6p(a5k_9k|C7dKjTGZ8*BjsBCE6_A}yB;}?hrBA-2S3b?;j4w%C$1lChjvE4 z7%nQ?p6s#z>bLHa#D;8O;E|g8djHS?iP)H_9pp@` zGnHwvP8|wiL1=FCBDiTvAfGh*h+m0xESZt!~Hdxd!tT2-jw>#XklSOel#?)T{G_ znx^XdN{N4(xE?&TjT^njyQ1-839f=?aCh;A!+2LToM7PX!}GQMqquKo-Qfv4 z?aRHlxUgc63vEJ8C)R8gTNz|LaO8mpQ(q}~#lWTwp!ZCfPMpMzX6=L=3Q<>ef^PJM z#6&9uI+d^TFUhA<=SEAXyffd3uMRma1#AW@(@eY+xD!qN(zXQKvF(rvL7l!dzw>{S z`G>zCOYizyslV=Pv<21|TC^4&enx6zybg^0ra=>A7XrNQbL~&sA|d2Xi}i%5jc^Q- zsZy?!?lkh5uBGm}#L4Yt*!SvjZ@9`;v0@s_Np0nK_w{7SHn&FmE(*n&l_F% zC^%NGGc!l=D#+b3I({!+8F?oH@8fux23EdPT^fA*`ZnVG$bDD^_h}ovL)0}iaA^rI z2Vg*6oRR6t1GskcdEBLFtK?<8-Mj(4?tzU6${TQ+Y=?9YqKsh7ylbH9CDd2mmg}ui z?)K}A|6JfTzwv8q#rq3yl&+uu4^rDWVf$|_##>gpRN`o6&v;H6l2(o8T#{3{7~sfD z7$q!af#wIj%C^T!HYk&VbE3mGCIw&Z2Dp&9ZO?PA(>ynx;>N(+#$ND*9wk4j+F;m4 z8OJR48D+Zh&f;#|=rp_?A1?>;+y$(JLl8cHa8Bn~2H}3JFd2lq`#4pg?V$;7$Mfi) z@`JA^v+GIXA1klOzz9w^-_w-C2bSc)_s`3nFG8RPO|inhQahksgx}w0iSQmgXv?WZ8r>)aQR-yDME!Ie1k7|g+HqVy$1$Gyo8(ki0Ta!y zHQS2KFbXTvw(>;`71Q9v_7{29+3ZQfk87*&1EU~c`qANi!^f4}SMN#XWqsB7zSqg( zPyedaUWn7oJGOGSAXyLUzGl$H9ARxG7n=@%P^P#kMKzL?7GPqX1>L7S_JY2)KVVYH z>n(PI%+>N&vj_g|+eYMrUpR)hR87m~aokN$ceO9*Yo6FJqtP9#bjt#{@Y>2;?M_`f zAOl0Y4ZP9Bs`m~A-#aw;PEPK{uiK|&aA3Ri^=~d7!0?CdYc{%cTj>s84k1$53Cmao zGZ=GQoINKOjy{85y_azl3EqOUh||_MEzQ8&HMm}SM{bbrAq3+g1Y>N>Yfapc@w`me z-uG>rl@H*yLhTquznb6r4YD|o74Oges&xJ0PuMTncB(nO3oBimY7)FG+y^6(-L+IM z1_y(nluH!-F@!L|2YW6_9yvuDt7AE4fD4)HSvA?9XCBy+my|LY(<{n*yNj5?P{`K8 ztC9f?$MFgd7z<(U2VuQGOt0uu4QHaTy2UoS%ld5Q+#-T7R--4E05fyQw<2OsKK z+fqPEwD=+kpKRU&6{%+wU5|&p;!B2S&GP-Q|7k@_GA;v=;d+kQ#nyQ|MQ3 zhf-sVSeE)-H%a|lzDkyU?QPQd)t^>XA9Jj%>^q3plG*82-=``BAY%ECDy^*+*r=gO zieP_OXR-zv{~GJbF922HyDi!QU&nkX-@SbdFUz=qJDG6@Ae{2mEZLT*?4THFs9y6* zm%zP)+vLKzM`Dn4A8BfMd7SUGKOh?-3QOt$}_n>UhBmhrq=C&kN9d51Mu|OCAsj-qMY1|OF%gN zJb-6!`>+b`N6vfYtnc{O%P7FS9^0hhK=ygtgY@Q|cDnh|Pb|u=OAXn12QNiHj&36{ z_-@#RQ_TC95Oldea6K16w;wOhh+r}BX2B-Xh{B#?0zU*h4{I@qsetQy4wX{yQ5fK? zv;-^1&UC{n^vZ*Gc50ZmFonAxX5acawa08)8^J>%t!Swc5o z$6e3dYBys#$Ky%U=Xhh*lAL>bL5@F)o3e1KdSJY+0hlY{I%XWd=Ig(C)Gq#*Z)yLJ zZp2EvzafX8Se6UtSLBYD;x14u$gW<((s#2@vEZN!!ZGTWy{(;sXKzzcwyzt& zYWJetv(v8al9lEg*7AhAm)WQ_r?P0~K=0rUcvkl*z40majv>1k)dz9c@(^y6n!fyu zOkQ{b?`!?23}MwfFt8QR6L#Bvfnc26piDiwsRtQy;&tR_I(3}3UcuJYI~?~J0f@<) zx0Vr%m#|7+p1mlSpZ+9XI*&3pp0>un#?S;#Q%~T9^|;Av{Z8o`MSvbe?u*y%{kANej>{I%c1spemo=Fk7Q5!?O6>19jB3EgS77j$nX1g#oP_j}-^@)cmI zZV4Z>6fBEaX2Wf#09SGj)mF?hE%}?!sM4#QZ=cyfRcm00cAp6f=Ez56s zo7CU%6SkKRAIJGq?DH{PBIN7RNJTqs45M5QtlW)E+GZ;nP)2Jfqy0x_z%AE0@*Q(+>4Pckg?UkW% zye=%#ikM1fV^HYE3pa*`cH%7M1XjqW@j>jz@VxMxbT>Jtw`Y z+=f<%FoSZlr(c=~%3Xuwc&2e9Uct8&FCV~ZXsmYY-MH}!tL4Q@XJz)-<8pcb$K~Q9 ze=m~{{kdHH?BB`s6A#Jk)1Q-tbH`-q(mB1(T*EoHS~nixr`@V8HsC7xp*@w@xxLlw zxa<|m)n0n9EI;@eS^3aIQh)V}tJ_HI$&0e`*nYf&m1iML%>Smkva~7A^X8e1*X*~W zNw-S66ggJT{syLV)@r*FD<~(dR7$vRI~WEdFF7~Kvy`m4bkZsEigeQ~>N`SC&8?EY zMod4TR9@Be57GGg$sW7|c?dyxd}mWew>9y$D11hB3fE!}MxQ5g_v`vZ{)@XEc>{8f|$wCELU?=Rr~%h+o=uJ?d-y3{t*P;Q9Pc+G>1onrq3?p$M~|GMG$6p_hKbH zw2rG_+=Xn1H=0U+asSN@1aVw5e&W;6xriIC?ybvuoMQg;UoXp@IK{j$2Yfs(RJ{tz zR%Br;rBkBxhCR&`cd z(N>U;7^$t^#x=|9L`n}FBkzyQFZvVg88zd1yAf>bKlnOX{zbet7N?n4o_;3XM8#He zS7}?JTd_jaehB`sS7NtVN3_;m#`%Rh{j0WP$5=JrE`@-nepKs6p5sSZI)DU!?%OdU z`;Je^j`hViGMcOWOZ%3>Z4h2Xo;N5XuU_P>0Hr`$zx+4IEKVDD^>UeQMjTH2+$#Yr zccrHnUs&1nB3U!U5OIn$t$kXMd8E(@=LE z?N9IsRYi+@;y|c@JG2`O+}za{Ztfy3beXs#d1Ds?^78DI%pUlxp0ZwU$!NDPH50@~!8ikxtjYS&}^+$-3 zy{LvlD^}uG@M7TY&?fqC}uYerF@6kO7yhrvz?)zl zoUJ@@0FMhHNcRq43WZ4zp(${(Nu@xd%>b<>5E{*fs{M^PY>u{)x#OXT2}fCh7Il@F z$x*jJ%WjT>fALf=m;Rc{@+87mhLHj!SUT}hrf9QLUNK7TqaON0S)rYZ?}0S;i)P@n z{rE6@<#yLzibsdO`lXly-htB+klkP}#n3>9=y?pL5T$8!I1;N{Ew%r3C$mtO3?irR%8}E~e@muh6lLK<{%p>?($tX@mZ^K)! zMp8h81>HC7hydqvgAKqEA9D1;b+jJ>EtY{pDAi|~{DAFc&)L9OhMeL$4fQ$#=Sm2k zl+#2x%HV|)dfk|-o#aGu1_E+kN99_v`zk0vbI@x^+D_!kVrTIkd0(s6(3Y{IvMoao8Vcl7U zRfXYTRahS2idbfEbu33_-Y)p%SV?BJb~y6dd}!?-=waacm^A-<*HpFD>?QvyWc=W= zqsSc$x%=sP&UPAplw;`j;qj!2T?jaEdKy9X^0^hcaB@YCJ-&<|>pZQ@04%co?z)_Q zYDGTtx688awwfH@&qs&YE}Q&)6=s$^n4#teY#x-VXyE6sMI=rPZZUY1>cP!|6)B{} zK%~Jc({*_^JC0|^fP0xQF#rdQf-MHWfT3ByO##yUuvK>Mo6o6cGu^aR@+S+jhL7>0 z1^3l+=w&{8yYsu5Yd`eOvhsaD2lrw7j@>jAe7B+vM2^z1abU8nxH&E9#j$J784yKR zt5ectD4*LY+g-IzeWV=E%cN)i3?tCqxM2WaAG#zjyb%Lf0-fMICFC1xeI(M+E~K5X-cnLkB!ysy*n?Ro5x-gJY3T1=?j6bXZYe0!{fHXgF_< zyEJi|=3uzFOKotX1MU*ug^ggm!d3F*Ihi|o%<8iU$XF%wndAESgwzp`xizOb?tvh?~l$#PG()W7>1O_qP-N|%ZOBXW(F zCi>8)$}dj(rs5c$M<5g&E4i3(Gpwi@3mJ&h)`$g78$+&_K?Q%@ubh);nP0@h#t)Bh z5GUWO`lQvr9Md#%i|(K2t-LF>m*gwj5ch@uplQ3Pk!3Q&P}*|AWhUPr@&yI5N8>4KUNp`*f8HI&(rM7z&0Aofsc;?D^K~M z44TOi$I71b_4F>!dxR*L=Vm9!1X<2UMH%R+U86hSa@s4=6~}297pQZfFsIJa)V$_i zXC;;ujB>7*<%+>SPBS@;>!i)htD$HQG;@wRWQ974q|=7d&Rvj|Q)gvm2kvGjjl!HH znL<{WL)y_)hfHh*oYs2F>0#H27{NA&zb8VkQpfIvNalm%b@1o@UBmM3&zzD6ZsfwK zc)Xc8qt&+D{k=rKs$@V#)zb&wgBu-g#+zn#snaHd!xUE72-Y=MtHrwUjmFN7ve4o4 zw&%`2DQB?yZQ$by488;XeDjIfS2&bCC$&%xa!Pld3fiiCw?TZ@&uH|=?P^ZIjHdXJ z1_u5YX{eQG$|ntdqNl9q5R}8V%$xyv4yUa#Gt`Dhq=5ij8y}a(wrv`aYY4{m_2?^n zSeiRR{U)B532i$l@RE$vQyW@ P6aMV9~5o2B-3uaw$%d>viJdsuN0{^lQr>pWq< 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�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 ymQS)>Qro$;->$r}t9A!ZLrd-@(zSJ_ivrIaT1s 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%0AWu4R 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
sWC0i<_%>d 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

D3>$Kkr%Wvu9xZ>k;Wrr$*8d>LSU-U{s$i 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

iCgQ9oA#0G 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 )Ct0^e~j+v5#mDq>%acEJO_s@(>G{6llSZL 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

nY;w#hOLITa_|TVkOb`)jN)qZ)#vr0^QONmbO6m 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 m_Nod ::GetGridCoordinates(grid, i, j, k + 1, vertex, (m_NodeIds[nodeId3] * 3)); nodeId4 = ((k + 1) * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + i; - ::GetGridCoordinates(grid, i + 1, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); + ::GetGridCoordinates(grid, i, j + 1, k + 1, vertex, (m_NodeIds[nodeId4] * 3)); triangle[triangleIndex * 3 + 0] = m_NodeIds[nodeId1]; triangle[triangleIndex * 3 + 1] = m_NodeIds[nodeId3]; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp index 789fcfd8a2..0045cf8242 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp @@ -161,7 +161,7 @@ Result<> SurfaceNets::operator()() { cellMapPtr->getVertexPosition(vertIndex, position.data()); // Relocate the vertex correctly based on the origin of the ImageGeometry - position = position + origin - Point3Df(0.5f * voxelSize[0], 0.5f * voxelSize[1], 0.5f * voxelSize[1]); + position = position + origin - Point3Df(0.5f * voxelSize[0], 0.5f * voxelSize[1], 0.5f * voxelSize[2]); triangleGeom.setVertexCoordinate(static_cast(vertIndex), position); cellMapPtr->getVertexCellIndex(vertIndex, vertCellIndex.data()); diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp index 52034ee634..483782326e 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -35,16 +35,18 @@ inline const DataPath k_FeatureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); * background of Feature Id 0. The cylinder is always inset from the four X/Y walls and * from the top; flushWithBottom controls whether it touches the z == 0 wall. * @param flushWithBottom When true the cylinder spans z = 0..8, otherwise z = 2..8. + * @param spacing ImageGeom voxel spacing. Defaults to {1,1,1} (isotropic) so existing callers + * are unaffected; pass an anisotropic value to exercise axis-specific spacing bugs. * @return A DataStructure containing ImageGeom/CellData/FeatureIds. */ -inline DataStructure CreateCylinderInBox(bool flushWithBottom) +inline DataStructure CreateCylinderInBox(bool flushWithBottom, FloatVec3 spacing = {1.0F, 1.0F, 1.0F}) { DataStructure dataStructure; auto* imageGeomPtr = ImageGeom::Create(dataStructure, "ImageGeom"); const std::vector dims = {k_BoxDim, k_BoxDim, k_BoxDim}; imageGeomPtr->setDimensions(dims); - imageGeomPtr->setSpacing({1.0F, 1.0F, 1.0F}); + imageGeomPtr->setSpacing(spacing); imageGeomPtr->setOrigin({0.0F, 0.0F, 0.0F}); auto* cellAMPtr = AttributeMatrix::Create(dataStructure, "CellData", {dims[2], dims[1], dims[0]}, imageGeomPtr->getId()); diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp index 744e8793d5..8c4f90bfee 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp @@ -1,6 +1,8 @@ #include "SimplnxCore/Filters/SurfaceNetsFilter.hpp" #include "SimplnxCore/SimplnxCore_test_dirs.hpp" +#include "SurfaceMeshingTestUtils.hpp" +#include "simplnx/DataStructure/Geometry/ImageGeom.hpp" #include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" #include "simplnx/Parameters/ArrayCreationParameter.hpp" #include "simplnx/Parameters/BoolParameter.hpp" @@ -13,6 +15,44 @@ using namespace nx::core; using namespace nx::core::UnitTest; using namespace nx::core::Constants; +TEST_CASE("SimplnxCore::SurfaceNetsFilter: Anisotropic spacing places Z correctly", "[SimplnxCore][SurfaceNetsFilter]") +{ + // Regression test for a bug where the Z half-voxel relocation offset used voxelSize[1] (Y + // spacing) instead of voxelSize[2] (Z spacing). On isotropic data (the exemplar dataset used + // by the other SurfaceNetsFilter tests above) voxelSize[1] == voxelSize[2], so the bug is + // invisible there. Y and Z spacing are chosen sharply different here (1.0 vs 4.0) so a + // Y-for-Z substitution is unmistakable in the resulting mesh's Z bounding box. + UnitTest::LoadPlugins(); + + const FloatVec3 k_Spacing = {0.25F, 1.0F, 4.0F}; + DataStructure dataStructure = SurfaceMeshingTest::CreateCylinderInBox(/*flushWithBottom=*/true, k_Spacing); + const DataPath k_TriangleGeomPath({"SurfaceNets"}); + + SurfaceMeshingTest::MeshResult meshResult = SurfaceMeshingTest::RunMesher(std::move(dataStructure), k_TriangleGeomPath, false, [](Arguments& args) { + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); + args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); + args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); + }); + + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(k_TriangleGeomPath)); + const auto& triangleGeom = meshResult.Structure.getDataRefAs(k_TriangleGeomPath); + const auto boundingBox = triangleGeom.getBoundingBox(); + + // The cylinder is flush with the box's bottom Z wall, and the box's top Z wall is pure + // background over its full X/Y extent, so the mesh's Z bounding box exactly spans the box: + // [0, dimZ * spacingZ]. With the bug (Y spacing substituted for Z spacing), every vertex's Z + // is shifted by 0.5*(spacingZ - spacingY) = 1.5, moving both bounds to [1.5, 49.5]. + const float32 k_ExpectedMinZ = 0.0F; + const float32 k_ExpectedMaxZ = static_cast(SurfaceMeshingTest::k_BoxDim) * k_Spacing[2]; + const float32 k_Tolerance = 1.0e-4F; + + REQUIRE_THAT(boundingBox.getMinPoint()[2], Catch::Matchers::WithinAbs(k_ExpectedMinZ, k_Tolerance)); + REQUIRE_THAT(boundingBox.getMaxPoint()[2], Catch::Matchers::WithinAbs(k_ExpectedMaxZ, k_Tolerance)); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); +} + TEST_CASE("SimplnxCore::SurfaceNetsFilter: Default", "[SimplnxCore][SurfaceNetsFilter]") { UnitTest::LoadPlugins(); From 4f5fcbf482c18d804699362fa07c80bff9af7907 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Wed, 12 Aug 2026 15:53:32 -0400 Subject: [PATCH 19/24] ENH: Convert Omit Bounding Box Skin from bool to a two-value ChoicesParameter The bool "Omit Bounding Box Skin" parameter added to QuickSurfaceMeshFilter, SurfaceNetsFilter, and M3CSurfaceMeshingFilter on this branch has not shipped yet. Since this codebase has no parameter migration machinery to safely widen a bool into an enum later, convert it now to a two-value ChoicesParameter ("bounding_box_skin_mode_index") before it ships, so a plausible future third mode does not require a silent-default-substituting key change. Only two choices exist today (Off / Background-Backed Walls Only); no new behavior is added. Also fixes a related performance regression: QuickSurfaceMesh's SkipWallFace predicate took an already-read Feature Id, so the counting pass evaluated a DataStore read for every boundary voxel even with the option off. It now takes the store and index so the mode check short-circuits before any read, while remaining the single shared function called from both the counting and emit passes (the count/emit agreement is a correctness requirement, not just style). Renamed M3C's local `isBackgroundSkin` lambda to `SkipBackgroundSkinFace` to match the Skip* naming used by the other two meshers' shared predicates, and renamed the test-only `FeatureIdsKeyTrait::Key` to `::k_Key` for convention consistency. Co-Authored-By: Claude Opus 5 --- .../Filters/Algorithms/M3CSurfaceMeshing.cpp | 12 ++++--- .../Filters/Algorithms/M3CSurfaceMeshing.hpp | 3 +- .../Filters/Algorithms/QuickSurfaceMesh.cpp | 33 ++++++++++--------- .../Filters/Algorithms/QuickSurfaceMesh.hpp | 3 +- .../Filters/Algorithms/SurfaceNets.cpp | 20 +++++------ .../Filters/Algorithms/SurfaceNets.hpp | 3 +- .../Filters/M3CSurfaceMeshingFilter.cpp | 18 ++++++---- .../Filters/M3CSurfaceMeshingFilter.hpp | 2 +- .../Filters/QuickSurfaceMeshFilter.cpp | 18 ++++++---- .../Filters/QuickSurfaceMeshFilter.hpp | 2 +- .../SimplnxCore/Filters/SurfaceNetsFilter.cpp | 18 ++++++---- .../SimplnxCore/Filters/SurfaceNetsFilter.hpp | 2 +- .../test/SurfaceMeshingTestUtils.hpp | 28 +++++++++------- .../Utilities/Meshing/TriangleUtilities.hpp | 15 +++++++++ 14 files changed, 109 insertions(+), 68 deletions(-) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp index 790bd556a2..b012ab3c9b 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp @@ -2539,11 +2539,15 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput // internal representation that is one negative ghost label paired with maxGrainId, which // is the renumbered zero-feature (see toFaceLabel below). Pruning the scratch vectors here // means the output TriangleGeom is sized from the surviving count and never over-allocated. - if(inputValues->OmitBoundingBoxSkin) + if(inputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) { messageHandler("Omitting bounding box skin faces..."); - const auto isBackgroundSkin = [maxGrainId](const Triangle& triangle) -> bool { + // True when this triangle is a bounding-box wall face backed by background (i.e. its output + // Face Labels would be {-1, 0}). M3C's single sequential pass over `triangles` (below) is the + // only place this predicate is evaluated, so -- unlike QuickSurfaceMesh's SkipWallFace and + // SurfaceNets' SkipPaddingQuad -- there is no second pass it must stay in agreement with. + const auto SkipBackgroundSkinFace = [maxGrainId](const Triangle& triangle) -> bool { const int spinA = triangle.nSpin[0]; const int spinB = triangle.nSpin[1]; return (spinA < 0 && spinB == maxGrainId) || (spinB < 0 && spinA == maxGrainId); @@ -2553,7 +2557,7 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput for(int64 i = 0; i < nTriangle; i++) { const Triangle& triangle = triangles[static_cast(i)]; - if(!isBackgroundSkin(triangle)) + if(!SkipBackgroundSkinFace(triangle)) { triangles[static_cast(survivingCount)] = triangle; mCubeID[static_cast(survivingCount)] = mCubeID[static_cast(i)]; @@ -2788,7 +2792,7 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin // legitimately produces an empty mesh. Report it rather than returning silently. - if(inputValues->OmitBoundingBoxSkin && nTriangleFinal == 0) + if(inputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly && nTriangleFinal == 0) { return MakeWarningVoidResult(-56340, fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no " "internal interface and no Feature to cap. The Triangle Geometry was created with zero vertices and zero faces.", diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.hpp index afc2101a8b..f3ff9124f5 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.hpp @@ -6,6 +6,7 @@ #include "simplnx/DataStructure/DataStructure.hpp" #include "simplnx/DataStructure/Geometry/IGeometry.hpp" #include "simplnx/Filter/IFilter.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" namespace nx::core @@ -14,7 +15,7 @@ namespace nx::core struct SIMPLNXCORE_EXPORT M3CSurfaceMeshingInputValues { bool RepairTriangleWinding; - bool OmitBoundingBoxSkin; + ChoicesParameter::ValueType BoundingBoxSkinMode; DataPath GridGeomDataPath; DataPath FeatureIdsArrayPath; MultiArraySelectionParameter::ValueType SelectedCellDataArrayPaths; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp index fe1b7ea62e..7f4e5da72b 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp @@ -239,10 +239,13 @@ void GetGridCoordinates(const IGridGeometry* grid, size_t x, size_t y, size_t z, * "the voxel behind the wall is background". Both the counting pass and the emit pass * MUST call this same function -- if they disagree, node ids go unassigned and * ownerLists is indexed out of bounds. + * Takes the store and index (rather than the already-read Feature Id) so the mode check + * short-circuits before touching the DataStore on the default (mode == Off) path, which the + * counting pass otherwise runs for every boundary voxel even when the option is disabled. */ -inline bool SkipWallFace(bool omitBoundingBoxSkin, int32 featureId) +inline bool SkipWallFace(ChoicesParameter::ValueType mode, const Int32AbstractDataStore& featureIds, usize point) { - return omitBoundingBoxSkin && featureId == 0; + return mode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly && featureIds[point] == 0; } // ----------------------------------------------------------------------------- @@ -491,7 +494,7 @@ Result<> QuickSurfaceMesh::operator()() // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin // legitimately produces an empty mesh. Report it rather than returning silently. Guarded on // windingResult still being valid so a genuine winding-repair error is never discarded. - if(m_InputValues->OmitBoundingBoxSkin && windingResult.valid() && triangleGeom.getNumberOfFaces() == 0) + if(m_InputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly && windingResult.valid() && triangleGeom.getNumberOfFaces() == 0) { return MakeWarningVoidResult(-56340, fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no " "internal interface and no Feature to cap. The Triangle Geometry was created with zero vertices and zero faces.", @@ -711,7 +714,7 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, if(i == 0) { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -743,7 +746,7 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(j == 0) { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -775,7 +778,7 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(k == 0) { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -807,7 +810,7 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(i == (xP - 1)) { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -868,7 +871,7 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(j == (yP - 1)) { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -929,7 +932,7 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(k == (zP - 1)) { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -1089,7 +1092,7 @@ void QuickSurfaceMesh::createNodesAndTriangles(std::vector& m_Nod if(i == 0) { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; ::GetGridCoordinates(grid, i, j, k, vertex, (m_NodeIds[nodeId1] * 3)); @@ -1141,7 +1144,7 @@ void QuickSurfaceMesh::createNodesAndTriangles(std::vector& m_Nod } if(j == 0) { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; ::GetGridCoordinates(grid, i, j, k, vertex, (m_NodeIds[nodeId1] * 3)); @@ -1193,7 +1196,7 @@ void QuickSurfaceMesh::createNodesAndTriangles(std::vector& m_Nod } if(k == 0) { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; ::GetGridCoordinates(grid, i, j, k, vertex, (m_NodeIds[nodeId1] * 3)); @@ -1245,7 +1248,7 @@ void QuickSurfaceMesh::createNodesAndTriangles(std::vector& m_Nod } if(i == (xP - 1)) // Takes care of the end of a Row... { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); ::GetGridCoordinates(grid, i + 1, j, k, vertex, (m_NodeIds[nodeId1] * 3)); @@ -1361,7 +1364,7 @@ void QuickSurfaceMesh::createNodesAndTriangles(std::vector& m_Nod } if(j == (yP - 1)) // Takes care of the end of a column { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); ::GetGridCoordinates(grid, i + 1, j + 1, k, vertex, (m_NodeIds[nodeId1] * 3)); @@ -1476,7 +1479,7 @@ void QuickSurfaceMesh::createNodesAndTriangles(std::vector& m_Nod } if(k == (zP - 1)) // Takes care of the end of a Pillar { - if(!::SkipWallFace(m_InputValues->OmitBoundingBoxSkin, featureIds[point])) + if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) { nodeId1 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); ::GetGridCoordinates(grid, i + 1, j, k + 1, vertex, (m_NodeIds[nodeId1] * 3)); diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp index e8f958f9d5..a7b55d130c 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp @@ -6,6 +6,7 @@ #include "simplnx/DataStructure/DataStructure.hpp" #include "simplnx/DataStructure/Geometry/IGridGeometry.hpp" #include "simplnx/Filter/IFilter.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" #include @@ -19,7 +20,7 @@ struct SIMPLNXCORE_EXPORT QuickSurfaceMeshInputValues bool FixProblemVoxels; bool RepairTriangleWinding; bool GenerateTripleLines; - bool OmitBoundingBoxSkin; + ChoicesParameter::ValueType BoundingBoxSkinMode; DataPath GridGeomDataPath; DataPath FeatureIdsArrayPath; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp index 0045cf8242..f8d971defe 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp @@ -84,9 +84,9 @@ void getQuadTriangleIDs(std::array& vData, bool isQuadFrontFacing * Note this reads the RAW quadLabels, where MMSurfaceNet::Padding is still distinct from a * real Feature Id 0. Do not call it after the Padding -> -1 remap. */ -inline bool SkipPaddingQuad(bool omitBoundingBoxSkin, const std::array& quadLabels) +inline bool SkipPaddingQuad(ChoicesParameter::ValueType mode, const std::array& quadLabels) { - if(!omitBoundingBoxSkin) + if(mode != BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) { return false; } @@ -178,21 +178,21 @@ Result<> SurfaceNets::operator()() if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::BackBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - if(!::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) + if(!::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) { triangleCount += 2; } } if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - if(!::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) + if(!::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) { triangleCount += 2; } } if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBackEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - if(!::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) + if(!::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) { triangleCount += 2; } @@ -241,7 +241,7 @@ Result<> SurfaceNets::operator()() cellMapPtr->getVertexCellIndex(idxVtx, cellIndex.data()); // Back-bottom edge if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::BackBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data()) && - !::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) + !::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) { vData[0] = {vertexIndices[0], 00.0f, 0.0f, 0.0f}; vData[1] = {vertexIndices[1], 00.0f, 0.0f, 0.0f}; @@ -304,7 +304,7 @@ Result<> SurfaceNets::operator()() // Left-bottom edge if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data()) && - !::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) + !::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) { vData[0] = {vertexIndices[0], 00.0f, 0.0f, 0.0f}; vData[1] = {vertexIndices[1], 00.0f, 0.0f, 0.0f}; @@ -365,7 +365,7 @@ Result<> SurfaceNets::operator()() // Left-back edge if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBackEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data()) && - !::SkipPaddingQuad(m_InputValues->OmitBoundingBoxSkin, quadLabels)) + !::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) { vData[0] = {vertexIndices[0], 00.0f, 0.0f, 0.0f}; vData[1] = {vertexIndices[1], 00.0f, 0.0f, 0.0f}; @@ -428,7 +428,7 @@ Result<> SurfaceNets::operator()() // Dropping faces can orphan vertices, which come from the cell map before any triangle // exists. Compact them so the vertex list, Node Types and vertex AttributeMatrix agree. // Skipped entirely when the option is off, because then no face was dropped. - if(m_InputValues->OmitBoundingBoxSkin) + if(m_InputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) { m_MessageHandler("Removing vertices orphaned by omitted bounding box faces..."); @@ -516,7 +516,7 @@ Result<> SurfaceNets::operator()() // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin // legitimately produces an empty mesh. Report it rather than returning silently. Guarded on // windingResult still being valid so a genuine winding-repair error is never discarded. - if(m_InputValues->OmitBoundingBoxSkin && windingResult.valid() && triangleGeom.getNumberOfFaces() == 0) + if(m_InputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly && windingResult.valid() && triangleGeom.getNumberOfFaces() == 0) { return MakeWarningVoidResult(-56340, fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no " "internal interface and no Feature to cap. The Triangle Geometry was created with zero vertices and zero faces.", diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.hpp index 7e6be588a6..9e2631df4b 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.hpp @@ -5,6 +5,7 @@ #include "simplnx/DataStructure/DataPath.hpp" #include "simplnx/DataStructure/DataStructure.hpp" #include "simplnx/Filter/IFilter.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" namespace nx::core @@ -14,7 +15,7 @@ struct SIMPLNXCORE_EXPORT SurfaceNetsInputValues { bool ApplySmoothing; bool RepairTriangleWinding; - bool OmitBoundingBoxSkin; + ChoicesParameter::ValueType BoundingBoxSkinMode; int32 SmoothingIterations; float32 MaxDistanceFromVoxel; float32 RelaxationFactor; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.cpp index ecdf1be58e..3408934201 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.cpp @@ -8,11 +8,13 @@ #include "simplnx/Filter/Actions/CreateGeometry2DAction.hpp" #include "simplnx/Parameters/ArraySelectionParameter.hpp" #include "simplnx/Parameters/BoolParameter.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Parameters/DataGroupCreationParameter.hpp" #include "simplnx/Parameters/DataGroupSelectionParameter.hpp" #include "simplnx/Parameters/DataObjectNameParameter.hpp" #include "simplnx/Parameters/GeometrySelectionParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" +#include "simplnx/Utilities/Meshing/TriangleUtilities.hpp" #include "simplnx/Utilities/SIMPLConversion.hpp" using namespace nx::core; @@ -59,10 +61,12 @@ Parameters M3CSurfaceMeshingFilter::parameters() const "If true, runs a winding-consistency repair pass after meshing. The M3C per-triangle winding heuristic does not " "guarantee globally consistent normals, so this is recommended.", true)); - params.insert(std::make_unique(k_OmitBoundingBoxSkin_Key, "Omit Bounding Box Skin", - "Do not generate triangles that lie on the outer wall of the bounding box where the wall borders the background (Feature Id 0). Faces where the " - "wall caps a real Feature ARE still generated, so Features flush with the box stay closed.", - false)); + params.insert(std::make_unique(k_BoundingBoxSkinMode_Key, "Bounding Box Skin", + "Controls how triangles are generated on the outer wall of the bounding box. 'Off' generates the " + "wall as normal. 'Background-Backed Walls Only' omits wall faces where the wall borders the " + "background (Feature Id 0); faces where the wall caps a real Feature ARE still generated, so " + "Features flush with the box stay closed.", + BoundingBoxSkinMode::k_Off, ChoicesParameter::Choices{"Off", "Background-Backed Walls Only"})); params.insertSeparator(Parameters::Separator{"Input Data Objects"}); params.insert(std::make_unique(k_GridGeometryDataPath_Key, "Image Geometry", "The complete path to the Image Geometry from which to create a Triangle Geometry", @@ -103,8 +107,8 @@ IFilter::VersionType M3CSurfaceMeshingFilter::parametersVersion() const return 2; // Version 1 -> 2 // Change 1: - // Added - k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; - // Solution - set the value to false (preserves prior behavior); + // Added - k_BoundingBoxSkinMode_Key = "bounding_box_skin_mode_index"; + // Solution - set the value to 0 (BoundingBoxSkinMode::k_Off, preserves prior behavior); // } @@ -195,7 +199,7 @@ Result<> M3CSurfaceMeshingFilter::executeImpl(DataStructure& dataStructure, cons M3CSurfaceMeshingInputValues inputValues; inputValues.RepairTriangleWinding = filterArgs.value(k_RepairTriangleWinding_Key); - inputValues.OmitBoundingBoxSkin = filterArgs.value(k_OmitBoundingBoxSkin_Key); + inputValues.BoundingBoxSkinMode = filterArgs.value(k_BoundingBoxSkinMode_Key); inputValues.GridGeomDataPath = filterArgs.value(k_GridGeometryDataPath_Key); inputValues.FeatureIdsArrayPath = filterArgs.value(k_FeatureIdsArrayPath_Key); inputValues.SelectedCellDataArrayPaths = filterArgs.value(k_SelectedDataArrayPaths_Key); diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp index 157cfff1d3..d44b7cc684 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/M3CSurfaceMeshingFilter.hpp @@ -39,7 +39,7 @@ class SIMPLNXCORE_EXPORT M3CSurfaceMeshingFilter : public IFilter static constexpr StringLiteral k_SelectedDataArrayPaths_Key = "input_data_array_paths"; static constexpr StringLiteral k_SelectedFeatureDataArrayPaths_Key = "input_feature_data_array_paths"; static constexpr StringLiteral k_RepairTriangleWinding_Key = "repair_triangle_winding"; - static constexpr StringLiteral k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; + static constexpr StringLiteral k_BoundingBoxSkinMode_Key = "bounding_box_skin_mode_index"; static constexpr StringLiteral k_CreatedTriangleGeometryPath_Key = "output_triangle_geometry_path"; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp index f2a4723c3b..5542a3d6ae 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.cpp @@ -10,11 +10,13 @@ #include "simplnx/Filter/Actions/CreateGeometry2DAction.hpp" #include "simplnx/Parameters/ArraySelectionParameter.hpp" #include "simplnx/Parameters/BoolParameter.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Parameters/DataGroupCreationParameter.hpp" #include "simplnx/Parameters/DataGroupSelectionParameter.hpp" #include "simplnx/Parameters/DataObjectNameParameter.hpp" #include "simplnx/Parameters/GeometrySelectionParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" +#include "simplnx/Utilities/Meshing/TriangleUtilities.hpp" #include "simplnx/Utilities/SIMPLConversion.hpp" using namespace nx::core; @@ -62,10 +64,12 @@ Parameters QuickSurfaceMeshFilter::parameters() const params.insert(std::make_unique(k_FixProblemVoxels_Key, "Attempt to Fix Problem Voxels", "See help page.", false)); params.insert(std::make_unique(k_RepairTriangleWinding_Key, "Attempt to Make Windings Consistent", "If true, attempts to repair the windings for the mesh. This may not be possible. See help page.", true)); - params.insert(std::make_unique(k_OmitBoundingBoxSkin_Key, "Omit Bounding Box Skin", - "Do not generate triangles that lie on the outer wall of the bounding box where the wall borders the background (Feature Id 0). Faces where the " - "wall caps a real Feature ARE still generated, so Features flush with the box stay closed.", - false)); + params.insert(std::make_unique(k_BoundingBoxSkinMode_Key, "Bounding Box Skin", + "Controls how triangles are generated on the outer wall of the bounding box. 'Off' generates the " + "wall as normal. 'Background-Backed Walls Only' omits wall faces where the wall borders the " + "background (Feature Id 0); faces where the wall caps a real Feature ARE still generated, so " + "Features flush with the box stay closed.", + BoundingBoxSkinMode::k_Off, ChoicesParameter::Choices{"Off", "Background-Backed Walls Only"})); // params.insert(std::make_unique(k_GenerateTripleLines_Key, "Generate Triple Lines", "Experimental feature. May not work.", false)); params.insert(std::make_unique(k_GridGeometryDataPath_Key, "Grid Geometry", "The complete path to the Grid Geometry from which to create a Triangle Geometry", DataPath{}, @@ -107,8 +111,8 @@ IFilter::VersionType QuickSurfaceMeshFilter::parametersVersion() const return 3; // Version 2 -> 3 // Change 1: - // Added - k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; - // Solution - set the value to false (preserves prior behavior); + // Added - k_BoundingBoxSkinMode_Key = "bounding_box_skin_mode_index"; + // Solution - set the value to 0 (BoundingBoxSkinMode::k_Off, preserves prior behavior); // // Version 1 -> 2 // Change 1: @@ -220,7 +224,7 @@ Result<> QuickSurfaceMeshFilter::executeImpl(DataStructure& dataStructure, const // inputValues.GenerateTripleLines = filterArgs.value(k_GenerateTripleLines_Key); inputValues.FixProblemVoxels = filterArgs.value(k_FixProblemVoxels_Key); inputValues.RepairTriangleWinding = filterArgs.value(k_RepairTriangleWinding_Key); - inputValues.OmitBoundingBoxSkin = filterArgs.value(k_OmitBoundingBoxSkin_Key); + inputValues.BoundingBoxSkinMode = filterArgs.value(k_BoundingBoxSkinMode_Key); inputValues.GridGeomDataPath = filterArgs.value(k_GridGeometryDataPath_Key); inputValues.FeatureIdsArrayPath = filterArgs.value(k_CellFeatureIdsArrayPath_Key); diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp index 2420d0df37..91c8b0672c 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/QuickSurfaceMeshFilter.hpp @@ -28,7 +28,7 @@ class SIMPLNXCORE_EXPORT QuickSurfaceMeshFilter : public IFilter // static constexpr StringLiteral k_GenerateTripleLines_Key = "generate_triple_lines"; static constexpr StringLiteral k_RepairTriangleWinding_Key = "repair_triangle_winding"; static constexpr StringLiteral k_FixProblemVoxels_Key = "fix_problem_voxels"; - static constexpr StringLiteral k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; + static constexpr StringLiteral k_BoundingBoxSkinMode_Key = "bounding_box_skin_mode_index"; static constexpr StringLiteral k_GridGeometryDataPath_Key = "input_grid_geometry_path"; static constexpr StringLiteral k_CellFeatureIdsArrayPath_Key = "feature_ids_path"; static constexpr StringLiteral k_SelectedDataArrayPaths_Key = "input_data_array_paths"; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.cpp index ccccbd3fc7..e504f84408 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.cpp @@ -12,11 +12,13 @@ #include "simplnx/Filter/Actions/CreateGeometry2DAction.hpp" #include "simplnx/Parameters/ArraySelectionParameter.hpp" #include "simplnx/Parameters/BoolParameter.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Parameters/DataGroupCreationParameter.hpp" #include "simplnx/Parameters/DataObjectNameParameter.hpp" #include "simplnx/Parameters/GeometrySelectionParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" #include "simplnx/Parameters/NumberParameter.hpp" +#include "simplnx/Utilities/Meshing/TriangleUtilities.hpp" using namespace nx::core; @@ -59,10 +61,12 @@ Parameters SurfaceNetsFilter::parameters() const params.insertSeparator(Parameters::Separator{"Input Parameter(s)"}); params.insert(std::make_unique(k_RepairTriangleWinding_Key, "Attempt to Make Windings Consistent", "If true, attempts to repair the windings for the mesh. This may not be possible. See help page.", true)); - params.insert(std::make_unique(k_OmitBoundingBoxSkin_Key, "Omit Bounding Box Skin", - "Do not generate triangles that lie on the outer wall of the bounding box where the wall borders the background (Feature Id 0). Faces where the " - "wall caps a real Feature ARE still generated, so Features flush with the box stay closed.", - false)); + params.insert(std::make_unique(k_BoundingBoxSkinMode_Key, "Bounding Box Skin", + "Controls how triangles are generated on the outer wall of the bounding box. 'Off' generates the " + "wall as normal. 'Background-Backed Walls Only' omits wall faces where the wall borders the " + "background (Feature Id 0); faces where the wall caps a real Feature ARE still generated, so " + "Features flush with the box stay closed.", + BoundingBoxSkinMode::k_Off, ChoicesParameter::Choices{"Off", "Background-Backed Walls Only"})); params.insertLinkableParameter(std::make_unique(k_ApplySmoothing_Key, "Apply smoothing operations", "Use the built in smoothing operation.", false)); params.insert(std::make_unique(k_SmoothingIterations_Key, "Relaxation Iterations", "Number of relaxation iterations to perform. More iterations causes more smoothing.", 20)); @@ -115,8 +119,8 @@ IFilter::VersionType SurfaceNetsFilter::parametersVersion() const return 2; // Version 1 -> 2 // Change 1: - // Added - k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; - // Solution - set the value to false (preserves prior behavior); + // Added - k_BoundingBoxSkinMode_Key = "bounding_box_skin_mode_index"; + // Solution - set the value to 0 (BoundingBoxSkinMode::k_Off, preserves prior behavior); // } @@ -210,7 +214,7 @@ Result<> SurfaceNetsFilter::executeImpl(DataStructure& dataStructure, const Argu inputValues.ApplySmoothing = filterArgs.value(k_ApplySmoothing_Key); inputValues.RepairTriangleWinding = filterArgs.value(k_RepairTriangleWinding_Key); - inputValues.OmitBoundingBoxSkin = filterArgs.value(k_OmitBoundingBoxSkin_Key); + inputValues.BoundingBoxSkinMode = filterArgs.value(k_BoundingBoxSkinMode_Key); inputValues.SmoothingIterations = filterArgs.value(k_SmoothingIterations_Key); inputValues.MaxDistanceFromVoxel = filterArgs.value(k_MaxDistanceFromVoxelCenter_Key); inputValues.RelaxationFactor = filterArgs.value(k_RelaxationFactor_Key); diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.hpp index bd8e1df597..3047e98c9d 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/SurfaceNetsFilter.hpp @@ -40,7 +40,7 @@ class SIMPLNXCORE_EXPORT SurfaceNetsFilter : public IFilter static constexpr StringLiteral k_ApplySmoothing_Key = "apply_smoothing"; static constexpr StringLiteral k_RepairTriangleWinding_Key = "repair_triangle_winding"; - static constexpr StringLiteral k_OmitBoundingBoxSkin_Key = "omit_bounding_box_skin"; + static constexpr StringLiteral k_BoundingBoxSkinMode_Key = "bounding_box_skin_mode_index"; static constexpr StringLiteral k_SmoothingIterations_Key = "smoothing_iterations"; static constexpr StringLiteral k_MaxDistanceFromVoxelCenter_Key = "max_distance_from_voxel"; static constexpr StringLiteral k_RelaxationFactor_Key = "relaxation_factor"; diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp index 483782326e..18d9417701 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -9,6 +9,7 @@ #include "simplnx/DataStructure/Geometry/ImageGeom.hpp" #include "simplnx/DataStructure/Geometry/TriangleGeom.hpp" #include "simplnx/Filter/Arguments.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" #include "simplnx/UnitTest/UnitTestCommon.hpp" @@ -212,13 +213,13 @@ struct MeshResult template struct FeatureIdsKeyTrait { - static constexpr auto Key = FilterT::k_CellFeatureIdsArrayPath_Key; + static constexpr auto k_Key = FilterT::k_CellFeatureIdsArrayPath_Key; }; template <> struct FeatureIdsKeyTrait { - static constexpr auto Key = M3CSurfaceMeshingFilter::k_FeatureIdsArrayPath_Key; + static constexpr auto k_Key = M3CSurfaceMeshingFilter::k_FeatureIdsArrayPath_Key; }; /** @@ -227,17 +228,18 @@ struct FeatureIdsKeyTrait * mesher-specific ones (e.g. Fix Problem Voxels, smoothing options). Shared by RunMesher and * RunMesherRaw so the argument list is defined exactly once. * @param triangleGeomPath Path at which to create the Triangle Geometry. - * @param omitSkin Value for the Omit Bounding Box Skin parameter. + * @param boundingBoxSkinMode Value for the Bounding Box Skin parameter (a BoundingBoxSkinMode + * value; ChoicesParameter::ValueType so bool literals from pre-existing call sites still convert). * @param addExtraArgs Callback that inserts the mesher-specific arguments into the Arguments object. * @param repairWinding Value for the Repair Triangle Winding parameter. Defaults to false (matching * every pre-existing call site); pass true to exercise the shipped default configuration instead. */ template -inline Arguments BuildMesherArgs(const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs, bool repairWinding = false) +inline Arguments BuildMesherArgs(const DataPath& triangleGeomPath, ChoicesParameter::ValueType boundingBoxSkinMode, ExtraArgsFn addExtraArgs, bool repairWinding = false) { Arguments args; args.insertOrAssign(FilterT::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); - args.insertOrAssign(FeatureIdsKeyTrait::Key, std::make_any(k_FeatureIdsPath)); + args.insertOrAssign(FeatureIdsKeyTrait::k_Key, std::make_any(k_FeatureIdsPath)); args.insertOrAssign(FilterT::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); args.insertOrAssign(FilterT::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); args.insertOrAssign(FilterT::k_CreatedTriangleGeometryPath_Key, std::make_any(triangleGeomPath)); @@ -246,7 +248,7 @@ inline Arguments BuildMesherArgs(const DataPath& triangleGeomPath, bool omitSkin args.insertOrAssign(FilterT::k_FaceDataGroupName_Key, std::make_any("Face Data")); args.insertOrAssign(FilterT::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); args.insertOrAssign(FilterT::k_RepairTriangleWinding_Key, std::make_any(repairWinding)); - args.insertOrAssign(FilterT::k_OmitBoundingBoxSkin_Key, std::make_any(omitSkin)); + args.insertOrAssign(FilterT::k_BoundingBoxSkinMode_Key, std::make_any(boundingBoxSkinMode)); addExtraArgs(args); return args; @@ -262,11 +264,12 @@ inline Arguments BuildMesherArgs(const DataPath& triangleGeomPath, bool omitSkin * warn or fail (e.g. an all-background input), use RunMesherRaw instead. * @param dataStructure Input DataStructure, e.g. from CreateCylinderInBox(). * @param triangleGeomPath Path at which to create the Triangle Geometry. - * @param omitSkin Value for the Omit Bounding Box Skin parameter. + * @param boundingBoxSkinMode Value for the Bounding Box Skin parameter (a BoundingBoxSkinMode + * value; ChoicesParameter::ValueType so bool literals from pre-existing call sites still convert). * @param addExtraArgs Callback that inserts the mesher-specific arguments into the Arguments object. */ template -inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs) +inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& triangleGeomPath, ChoicesParameter::ValueType boundingBoxSkinMode, ExtraArgsFn addExtraArgs) { MeshResult meshResult; meshResult.Structure = std::move(dataStructure); @@ -274,7 +277,7 @@ inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& trian meshResult.FaceLabelsPath = triangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); FilterT filter; - Arguments args = BuildMesherArgs(triangleGeomPath, omitSkin, addExtraArgs); + Arguments args = BuildMesherArgs(triangleGeomPath, boundingBoxSkinMode, addExtraArgs); auto preflightResult = filter.preflight(meshResult.Structure, args); SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); @@ -293,16 +296,17 @@ inline MeshResult RunMesher(DataStructure&& dataStructure, const DataPath& trian * the runtime condition under test. * @param dataStructure Input DataStructure, e.g. from CreateAllBackground(). Modified in place. * @param triangleGeomPath Path at which to create the Triangle Geometry. - * @param omitSkin Value for the Omit Bounding Box Skin parameter. + * @param boundingBoxSkinMode Value for the Bounding Box Skin parameter (a BoundingBoxSkinMode + * value; ChoicesParameter::ValueType so bool literals from pre-existing call sites still convert). * @param addExtraArgs Callback that inserts the mesher-specific arguments into the Arguments object. * @param repairWinding Value for the Repair Triangle Winding parameter. Defaults to false (matching * every pre-existing call site); pass true to exercise the shipped default configuration instead. */ template -inline Result<> RunMesherRaw(DataStructure& dataStructure, const DataPath& triangleGeomPath, bool omitSkin, ExtraArgsFn addExtraArgs, bool repairWinding = false) +inline Result<> RunMesherRaw(DataStructure& dataStructure, const DataPath& triangleGeomPath, ChoicesParameter::ValueType boundingBoxSkinMode, ExtraArgsFn addExtraArgs, bool repairWinding = false) { FilterT filter; - Arguments args = BuildMesherArgs(triangleGeomPath, omitSkin, addExtraArgs, repairWinding); + Arguments args = BuildMesherArgs(triangleGeomPath, boundingBoxSkinMode, addExtraArgs, repairWinding); auto preflightResult = filter.preflight(dataStructure, args); SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); diff --git a/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp b/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp index b5f680525b..5b445fc967 100644 --- a/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp +++ b/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp @@ -5,6 +5,21 @@ #include "simplnx/DataStructure/Geometry/IGeometry.hpp" #include "simplnx/DataStructure/Geometry/INodeGeometry2D.hpp" #include "simplnx/Filter/IFilter.hpp" +#include "simplnx/Parameters/ChoicesParameter.hpp" + +namespace nx::core +{ +/** + * @brief Shared values for the "Bounding Box Skin" ChoicesParameter used by QuickSurfaceMeshFilter, + * SurfaceNetsFilter, and M3CSurfaceMeshingFilter. Named here (rather than as bare literals) so a + * future third mode can be added without every `== 1` comparison needing to be rediscovered. + */ +namespace BoundingBoxSkinMode +{ +inline constexpr ChoicesParameter::ValueType k_Off = 0; +inline constexpr ChoicesParameter::ValueType k_BackgroundBackedWallsOnly = 1; +} // namespace BoundingBoxSkinMode +} // namespace nx::core namespace nx::core::MeshingUtilities { From 658f186342913144637d25f83c27054785c923b3 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Wed, 12 Aug 2026 16:23:16 -0400 Subject: [PATCH 20/24] ENH: De-duplicate skin-removal warning, warn on no-op prune, narrow M3C orphan-clear, validate Feature Id sentinels Four related changes to the Omit Bounding Box Skin warning/error handling, all touching QuickSurfaceMesh, SurfaceNets, and M3CSurfaceMeshing: 1. De-duplicate the copy-pasted empty-mesh warning (-56340) into MeshingUtilities::MakeEmptyMeshWarning() in TriangleUtilities.hpp/.cpp, named alongside a new k_EmptyMeshAfterSkinRemovalWarning constant. Tests now assert on the named constant. 2. Add a second warning (k_NoFacesPrunedWarning, -56342) emitted when the option is on but suppressed zero faces, since a fully-indexed volume is the most common dataset shape and previously gave no feedback that the option had no effect. QuickSurfaceMesh and SurfaceNets count suppressions in their existing counting passes; M3C compares survivingCount to nTriangle. Never fires alongside the empty-mesh warning. 3. Narrow M3CSurfaceMeshing's orphan nodeType clearing to nodes orphaned BY the prune (referenced by a dropped triangle, referenced by no surviving triangle), leaving pre-existing orphan candidates untouched. Dropped triangles' node ids are recorded in a small vector during the prune loop instead of allocating a second full 7*numSites mask. 4. Validate Feature Ids against each mesher's internal sentinel space (negative values, and INT32_MAX for SurfaceNets/M3C) at the top of each algorithm's execute entry point, rejecting with a clear error naming the value and array path. Mitigation for simplnx#1705, not a fix. Test changes: relaxed M3C's "no orphan vertices" assertion to "no vertex newly orphaned by the prune"; the all-background degenerate test's M3C vertex-count expectation is now the empirically measured pre-existing orphan count (144 for the test fixture) instead of 0; added tests for the no-op-prune warning and the Feature Id sentinel rejections. Co-Authored-By: Claude Opus 5 --- .../Filters/Algorithms/M3CSurfaceMeshing.cpp | 106 +++++--- .../Filters/Algorithms/QuickSurfaceMesh.cpp | 76 ++++-- .../Filters/Algorithms/QuickSurfaceMesh.hpp | 5 +- .../Filters/Algorithms/SurfaceNets.cpp | 58 ++++- .../test/OmitBoundingBoxSkinTest.cpp | 228 ++++++++++++++++-- .../Utilities/Meshing/TriangleUtilities.cpp | 41 ++++ .../Utilities/Meshing/TriangleUtilities.hpp | 62 +++++ 7 files changed, 495 insertions(+), 81 deletions(-) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp index b012ab3c9b..9653df146a 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp @@ -2535,6 +2535,11 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput { const int64 nTriangle = static_cast(triangles.size()); + // Faces suppressed by the prune below. Stays 0 when the mode is Off, or when the mode is on but + // nothing matched. Read after the winding-repair pass to decide which (if either) of the two + // Omit Bounding Box Skin warnings to emit. + int64 numFacesPruned = 0; + // Omit Bounding Box Skin: drop faces whose output Face Labels would be {-1, 0}. In the // internal representation that is one negative ghost label paired with maxGrainId, which // is the renumbered zero-feature (see toFaceLabel below). Pruning the scratch vectors here @@ -2554,10 +2559,20 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput }; int64 survivingCount = 0; + // node_id values touched by a DROPPED triangle, recorded before the in-place compaction below + // overwrites them. Used to narrow the nodeType clear (see below) to exactly the nodes the prune + // itself orphaned, at a cost of O(3 * droppedCount) instead of a second full 7*numSites mask. + std::vector droppedNodeIds; for(int64 i = 0; i < nTriangle; i++) { const Triangle& triangle = triangles[static_cast(i)]; - if(!SkipBackgroundSkinFace(triangle)) + if(SkipBackgroundSkinFace(triangle)) + { + droppedNodeIds.push_back(triangle.node_id[0]); + droppedNodeIds.push_back(triangle.node_id[1]); + droppedNodeIds.push_back(triangle.node_id[2]); + } + else { triangles[static_cast(survivingCount)] = triangle; mCubeID[static_cast(survivingCount)] = mCubeID[static_cast(i)]; @@ -2566,41 +2581,34 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput } triangles.resize(static_cast(survivingCount)); mCubeID.resize(static_cast(survivingCount)); + numFacesPruned = nTriangle - survivingCount; + + // Clear nodeType only for nodes the prune itself orphaned: referenced by a DROPPED triangle and + // by no SURVIVING triangle. Nodes referenced only by survivors are left untouched, and + // "pre-existing" candidates that no triangle -- dropped or surviving -- ever referenced are left + // exactly as they were; the option no longer sweeps up orphan candidates it had no hand in creating. + if(!droppedNodeIds.empty()) + { + std::sort(droppedNodeIds.begin(), droppedNodeIds.end()); + droppedNodeIds.erase(std::unique(droppedNodeIds.begin(), droppedNodeIds.end()), droppedNodeIds.end()); - // Only clear nodeType when a triangle was actually dropped (survivingCount < nTriangle). This - // is the whole no-op fix: gate the cleanup on whether the prune changed anything, not on - // whether the option is merely enabled. When nothing was dropped this branch never runs, so - // every candidate -- referenced by a triangle or not -- is left completely alone and the - // option is a bit-for-bit no-op (verified: 1791 == 1791 vertices on a fully-indexed volume). - // - // When something WAS dropped, every node not referenced by a SURVIVING triangle is cleared, - // deliberately including "pre-existing" orphan candidates that no triangle (dropped or - // surviving) ever claimed -- not just ones newly orphaned by the triangles we just dropped. - // An earlier version of this fix tracked only the dropped triangles' node ids and left - // unrelated pre-existing orphans alone; that broke the existing "Option on leaves no orphan - // vertices" test (cylinder-in-box: 304 referenced vs. 448 total, a 144-vertex gap) because - // M3C's marching-cubes candidate generation produces some node-type entries near the volume - // boundary that no triangle ever references, independent of which triangles this prune drops. - // Once ANY skin has been removed, the "no orphan vertices" contract requires those to go too; - // when the prune removes every triangle (all-background), this reduces to a full clear, - // matching the "Triangle Geometry was created with zero vertices and zero faces" contract. - // This costs exactly one full-size (7*numSites) mask -- the same single allocation the - // original (buggy) implementation always made -- but only when pruning actually happened, - // instead of unconditionally whenever the option is enabled. - if(survivingCount < nTriangle) - { - std::vector isReferencedBySurvivor(nodeType.size(), false); + std::vector referencedBySurvivor(droppedNodeIds.size(), false); for(const auto& triangle : triangles) { - isReferencedBySurvivor[static_cast(triangle.node_id[0])] = true; - isReferencedBySurvivor[static_cast(triangle.node_id[1])] = true; - isReferencedBySurvivor[static_cast(triangle.node_id[2])] = true; + for(const SiteId nodeId : triangle.node_id) + { + const auto it = std::lower_bound(droppedNodeIds.begin(), droppedNodeIds.end(), nodeId); + if(it != droppedNodeIds.end() && *it == nodeId) + { + referencedBySurvivor[static_cast(it - droppedNodeIds.begin())] = true; + } + } } - for(usize i = 0; i < nodeType.size(); i++) + for(usize i = 0; i < droppedNodeIds.size(); i++) { - if(!isReferencedBySurvivor[i]) + if(!referencedBySurvivor[i]) { - nodeType[i] = 0; + nodeType[static_cast(droppedNodeIds[i])] = 0; } } } @@ -2790,13 +2798,24 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput } } - // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin - // legitimately produces an empty mesh. Report it rather than returning silently. - if(inputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly && nTriangleFinal == 0) + if(inputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) { - return MakeWarningVoidResult(-56340, fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no " - "internal interface and no Feature to cap. The Triangle Geometry was created with zero vertices and zero faces.", - inputValues->TriangleGeometryPath.toString(), dataStructure.getDataRefAs(inputValues->FeatureIdsArrayPath).getNumberOfTuples())); + // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin + // legitimately produces an empty mesh. Report it rather than returning silently. Unlike + // QuickSurfaceMesh/SurfaceNets, M3C's narrowed orphan-node clearing (see above) can leave + // pre-existing candidate nodes in the output even when every face is dropped, so nNodes here + // is not necessarily zero. + if(nTriangleFinal == 0) + { + return MeshingUtilities::MakeEmptyMeshWarning(inputValues->TriangleGeometryPath, dataStructure.getDataRefAs(inputValues->FeatureIdsArrayPath).getNumberOfTuples(), + static_cast(nNodes)); + } + // A fully-indexed volume (no Feature Id 0) makes the option a no-op: nothing was pruned, and + // the user otherwise gets byte-identical output with no feedback that the option had no effect. + if(numFacesPruned == 0) + { + return MeshingUtilities::MakeNoFacesPrunedWarning(inputValues->TriangleGeometryPath); + } } return {}; @@ -2831,6 +2850,21 @@ Result<> M3CSurfaceMeshing::operator()() // M3C_SERIAL=1 -> runWindowed(false): serial sliding window (same tessellation as legacy) // M3C_WHOLE_VOLUME=1 -> runEntireVolume(): serial whole-volume (O(volume) memory) // Both serial paths are byte-identical to each other. + + // Reject Feature Ids that collide with this algorithm's internal sentinel space: maxGrainId+1 is + // signed overflow (undefined behavior) when INT32_MAX is present, and negative Feature Ids collide + // with M3C's nSpin < 0 ghost convention. This is a mitigation for the underlying sentinel-collision + // design, not a fix -- see simplnx#1705. Run here (execute), not preflight: a full-volume scan is + // too expensive to repeat on every GUI parameter edit. + { + const auto& featureIdsStore = m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getDataStoreRef(); + Result<> sentinelCheck = MeshingUtilities::ValidateFeatureIdsAgainstSentinels(featureIdsStore, m_InputValues->FeatureIdsArrayPath, /*rejectMaxInt32=*/true); + if(sentinelCheck.invalid()) + { + return sentinelCheck; + } + } + if(const char* wholeVol = std::getenv("M3C_WHOLE_VOLUME"); wholeVol != nullptr && std::string_view(wholeVol) == "1") { return runEntireVolume(); diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp index 7f4e5da72b..1be4609f78 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp @@ -344,6 +344,19 @@ QuickSurfaceMesh::~QuickSurfaceMesh() noexcept = default; // ----------------------------------------------------------------------------- Result<> QuickSurfaceMesh::operator()() { + // Reject Feature Ids that collide with this algorithm's hard-coded exterior Face Label (-1) and + // owner-set marker: a negative Feature Id would be silently misinterpreted downstream. This is a + // mitigation for the underlying sentinel-collision design, not a fix -- see simplnx#1705. Run here + // (execute), not preflight: a full-volume scan is too expensive to repeat on every GUI parameter edit. + { + const auto& featureIdsStore = m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getDataStoreRef(); + Result<> sentinelCheck = MeshingUtilities::ValidateFeatureIdsAgainstSentinels(featureIdsStore, m_InputValues->FeatureIdsArrayPath, /*rejectMaxInt32=*/false); + if(sentinelCheck.invalid()) + { + return sentinelCheck; + } + } + // Get the ImageGeometry auto& grid = m_DataStructure.getDataRefAs(m_InputValues->GridGeomDataPath); @@ -363,6 +376,7 @@ Result<> QuickSurfaceMesh::operator()() MeshIndexType nodeCount = 0; MeshIndexType triangleCount = 0; + MeshIndexType suppressedFaceCount = 0; if(m_InputValues->FixProblemVoxels) { @@ -373,7 +387,7 @@ Result<> QuickSurfaceMesh::operator()() return {}; } - determineActiveNodes(nodeIds, nodeCount, triangleCount); + determineActiveNodes(nodeIds, nodeCount, triangleCount, suppressedFaceCount); if(m_ShouldCancel) { return {}; @@ -491,14 +505,22 @@ Result<> QuickSurfaceMesh::operator()() } #endif - // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin - // legitimately produces an empty mesh. Report it rather than returning silently. Guarded on - // windingResult still being valid so a genuine winding-repair error is never discarded. - if(m_InputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly && windingResult.valid() && triangleGeom.getNumberOfFaces() == 0) + // Guarded on windingResult still being valid so a genuine winding-repair error is never discarded. + if(m_InputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly && windingResult.valid()) { - return MakeWarningVoidResult(-56340, fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no " - "internal interface and no Feature to cap. The Triangle Geometry was created with zero vertices and zero faces.", - m_InputValues->TriangleGeometryPath.toString(), m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getNumberOfTuples())); + // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin + // legitimately produces an empty mesh. Report it rather than returning silently. + if(triangleGeom.getNumberOfFaces() == 0) + { + return MeshingUtilities::MakeEmptyMeshWarning(m_InputValues->TriangleGeometryPath, m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getNumberOfTuples(), + triangleGeom.getNumberOfVertices()); + } + // A fully-indexed volume (no Feature Id 0) makes the option a no-op: nothing was pruned, and + // the user otherwise gets byte-identical output with no feedback that the option had no effect. + if(suppressedFaceCount == 0) + { + return MeshingUtilities::MakeNoFacesPrunedWarning(m_InputValues->TriangleGeometryPath); + } } return windingResult; @@ -676,7 +698,7 @@ void QuickSurfaceMesh::correctProblemVoxels() } // ----------------------------------------------------------------------------- -void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, MeshIndexType& nodeCount, MeshIndexType& triangleCount) +void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, MeshIndexType& nodeCount, MeshIndexType& triangleCount, MeshIndexType& suppressedFaceCount) { m_MessageHandler(IFilter::Message::Type::Info, "Determining active Nodes"); @@ -714,7 +736,11 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, if(i == 0) { - if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + if(::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + { + suppressedFaceCount++; + } + else { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -746,7 +772,11 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(j == 0) { - if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + if(::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + { + suppressedFaceCount++; + } + else { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -778,7 +808,11 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(k == 0) { - if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + if(::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + { + suppressedFaceCount++; + } + else { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + i; if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -810,7 +844,11 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(i == (xP - 1)) { - if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + if(::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + { + suppressedFaceCount++; + } + else { nodeId1 = (k * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -871,7 +909,11 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(j == (yP - 1)) { - if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + if(::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + { + suppressedFaceCount++; + } + else { nodeId1 = (k * (xP + 1) * (yP + 1)) + ((j + 1) * (xP + 1)) + (i + 1); if(nodeIds[nodeId1] == std::numeric_limits::max()) @@ -932,7 +974,11 @@ void QuickSurfaceMesh::determineActiveNodes(std::vector& nodeIds, } if(k == (zP - 1)) { - if(!::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + if(::SkipWallFace(m_InputValues->BoundingBoxSkinMode, featureIds, point)) + { + suppressedFaceCount++; + } + else { nodeId1 = ((k + 1) * (xP + 1) * (yP + 1)) + (j * (xP + 1)) + (i + 1); if(nodeIds[nodeId1] == std::numeric_limits::max()) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp index a7b55d130c..f46a98cda2 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.hpp @@ -61,8 +61,11 @@ class SIMPLNXCORE_EXPORT QuickSurfaceMesh * @param m_NodeIds * @param nodeCount * @param triangleCount + * @param suppressedFaceCount Incremented once per bounding-box wall face that 'Omit Bounding Box + * Skin' (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) suppresses. Always 0 when the mode is + * Off. Lets the caller warn when the option is on but pruned nothing. */ - void determineActiveNodes(std::vector& m_NodeIds, MeshIndexType& nodeCount, MeshIndexType& triangleCount); + void determineActiveNodes(std::vector& m_NodeIds, MeshIndexType& nodeCount, MeshIndexType& triangleCount, MeshIndexType& suppressedFaceCount); /** * @brief diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp index f8d971defe..504dee338c 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp @@ -114,6 +114,20 @@ const std::atomic_bool& SurfaceNets::getCancel() // ----------------------------------------------------------------------------- Result<> SurfaceNets::operator()() { + // Reject Feature Ids that collide with MMSurfaceNet::Padding (INT32_MAX), the sentinel this + // algorithm uses for "outside the volume" throughout MMCellMap: a real Feature Id of INT32_MAX + // would be silently treated as exterior. This is a mitigation for the underlying + // sentinel-collision design, not a fix -- see simplnx#1705. Run here (execute), not preflight: a + // full-volume scan is too expensive to repeat on every GUI parameter edit. + { + const auto& featureIdsStore = m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getDataStoreRef(); + Result<> sentinelCheck = MeshingUtilities::ValidateFeatureIdsAgainstSentinels(featureIdsStore, m_InputValues->FeatureIdsArrayPath, /*rejectMaxInt32=*/true); + if(sentinelCheck.invalid()) + { + return sentinelCheck; + } + } + // Get the ImageGeometry auto& imageGeom = m_DataStructure.getDataRefAs(m_InputValues->GridGeomDataPath); @@ -169,6 +183,10 @@ Result<> SurfaceNets::operator()() } usize triangleCount = 0; + // Counts quads suppressed by 'Omit Bounding Box Skin' (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) + // in this counting pass. Always 0 when the mode is Off. Lets the caller warn when the option is on but + // pruned nothing. + usize suppressedFaceCount = 0; std::array quadNxArrayIndices = {0, 0}; // First Pass through to just count the number of triangles: for(int idxVtx = 0; idxVtx < nodeCount; idxVtx++) @@ -178,21 +196,33 @@ Result<> SurfaceNets::operator()() if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::BackBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - if(!::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) + if(::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) + { + suppressedFaceCount++; + } + else { triangleCount += 2; } } if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBottomEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - if(!::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) + if(::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) + { + suppressedFaceCount++; + } + else { triangleCount += 2; } } if(cellMapPtr->getEdgeQuad(idxVtx, MMCellFlag::Edge::LeftBackEdge, vertexIndices.data(), quadLabels.data(), quadNxArrayIndices.data())) { - if(!::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) + if(::SkipPaddingQuad(m_InputValues->BoundingBoxSkinMode, quadLabels)) + { + suppressedFaceCount++; + } + else { triangleCount += 2; } @@ -513,14 +543,22 @@ Result<> SurfaceNets::operator()() m_DataStructure.removeData(triangleGeom.getElementNeighborsId().value()); } - // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin - // legitimately produces an empty mesh. Report it rather than returning silently. Guarded on - // windingResult still being valid so a genuine winding-repair error is never discarded. - if(m_InputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly && windingResult.valid() && triangleGeom.getNumberOfFaces() == 0) + // Guarded on windingResult still being valid so a genuine winding-repair error is never discarded. + if(m_InputValues->BoundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly && windingResult.valid()) { - return MakeWarningVoidResult(-56340, fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no " - "internal interface and no Feature to cap. The Triangle Geometry was created with zero vertices and zero faces.", - m_InputValues->TriangleGeometryPath.toString(), m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getNumberOfTuples())); + // An entirely-background volume has nothing but {-1, 0} faces, so omitting the skin + // legitimately produces an empty mesh. Report it rather than returning silently. + if(triangleGeom.getNumberOfFaces() == 0) + { + return MeshingUtilities::MakeEmptyMeshWarning(m_InputValues->TriangleGeometryPath, m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getNumberOfTuples(), + triangleGeom.getNumberOfVertices()); + } + // A fully-indexed volume (no Feature Id 0) makes the option a no-op: nothing was pruned, and + // the user otherwise gets byte-identical output with no feedback that the option had no effect. + if(suppressedFaceCount == 0) + { + return MeshingUtilities::MakeNoFacesPrunedWarning(m_InputValues->TriangleGeometryPath); + } } return windingResult; diff --git a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp index b9d89f7862..ef5d111170 100644 --- a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp +++ b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp @@ -7,11 +7,14 @@ #include "simplnx/Parameters/BoolParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" #include "simplnx/UnitTest/UnitTestCommon.hpp" +#include "simplnx/Utilities/Meshing/TriangleUtilities.hpp" #include +#include #include #include +#include #include #include @@ -203,21 +206,61 @@ TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Omit Bounding Box Skin", "[Simp UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); } - SECTION("Option on leaves no orphan vertices") + // M3C's marching-cubes candidate generation can leave some "pre-existing" candidate nodes that no + // triangle -- dropped or surviving -- ever references, independent of the skin-omit option (see + // M3CSurfaceMeshing.cpp finalizeMesh). So the option cannot promise zero orphan vertices overall; + // what it promises is that it never CREATES a new orphan beyond nodes the prune itself touched. + // Verify that by coordinate: every vertex unreferenced in the pruned mesh must also have been + // unreferenced in the full (un-pruned) mesh at the same coordinate. + SECTION("Option on leaves no vertex newly orphaned by the prune") { - SurfaceMeshingTest::MeshResult meshResult = RunM3C(true, true); - REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); - const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); - const auto& facesRef = triangleGeom.getFaces()->getDataStoreRef(); - - std::set referenced; - for(usize i = 0; i < triangleGeom.getNumberOfFaces() * 3; i++) + SurfaceMeshingTest::MeshResult fullMesh = RunM3C(true, false); + SurfaceMeshingTest::MeshResult prunedMesh = RunM3C(true, true); + + const auto isReferencedByCoord = [](const TriangleGeom& triangleGeom) { + const auto& vertsRef = triangleGeom.getVertices()->getDataStoreRef(); + const auto& facesRef = triangleGeom.getFaces()->getDataStoreRef(); + + std::set referencedIndices; + for(usize i = 0; i < triangleGeom.getNumberOfFaces() * 3; i++) + { + referencedIndices.insert(static_cast(facesRef[i])); + } + + std::map, bool> result; + for(usize v = 0; v < triangleGeom.getNumberOfVertices(); v++) + { + const std::tuple coord = {vertsRef[v * 3], vertsRef[v * 3 + 1], vertsRef[v * 3 + 2]}; + result[coord] = referencedIndices.count(v) > 0; + } + return result; + }; + + REQUIRE_NOTHROW(fullMesh.Structure.getDataRefAs(k_M3CTriangleGeomPath)); + REQUIRE_NOTHROW(prunedMesh.Structure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto fullReferenced = isReferencedByCoord(fullMesh.Structure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto prunedReferenced = isReferencedByCoord(prunedMesh.Structure.getDataRefAs(k_M3CTriangleGeomPath)); + + usize newlyOrphanedCount = 0; + for(const auto& [coord, isReferencedInPruned] : prunedReferenced) { - referenced.insert(static_cast(facesRef[i])); + if(isReferencedInPruned) + { + continue; + } + // A vertex that survives the prune unreferenced must have also been unreferenced pre-prune. + REQUIRE(fullReferenced.count(coord) == 1); + if(fullReferenced.at(coord)) + { + newlyOrphanedCount++; + } } - REQUIRE(referenced.size() == triangleGeom.getNumberOfVertices()); - UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + INFO("Vertices newly orphaned by the prune (must be 0): " << newlyOrphanedCount); + REQUIRE(newlyOrphanedCount == 0); + + UnitTest::CheckArraysInheritTupleDims(fullMesh.Structure); + UnitTest::CheckArraysInheritTupleDims(prunedMesh.Structure); } } @@ -407,6 +450,45 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin is a no-op without background", " } } +TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns when nothing is pruned", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + // A fully-indexed volume has no Feature Id 0, so the option suppresses zero faces. That is the + // most common dataset shape in practice, and byte-identical output with no feedback is not + // acceptable -- the user cannot tell the option had no effect. This is the companion to the + // all-background case (which suppresses every face); the two warnings must never fire together. + SECTION("QuickSurfaceMesh") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, true); + + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == MeshingUtilities::k_NoFacesPrunedWarning); + } + + SECTION("SurfaceNets") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, true); + + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == MeshingUtilities::k_NoFacesPrunedWarning); + } + + SECTION("M3CSurfaceMeshing") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + const Result<> executeResult = RunM3CRaw(dataStructure, true); + + SIMPLNX_RESULT_REQUIRE_VALID(executeResult); + REQUIRE(executeResult.warnings().size() == 1); + REQUIRE(executeResult.warnings()[0].code == MeshingUtilities::k_NoFacesPrunedWarning); + } +} + TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume", "[SimplnxCore][QuickSurfaceMeshFilter]") { UnitTest::LoadPlugins(); @@ -419,7 +501,7 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume // Success with a warning, not an error: the data is legal, just entirely background. SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); - REQUIRE(executeResult.warnings()[0].code == -56340); + REQUIRE(executeResult.warnings()[0].code == MeshingUtilities::k_EmptyMeshAfterSkinRemovalWarning); // The geometry still exists, just empty. REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_TriangleGeomPath)); @@ -441,7 +523,7 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); - REQUIRE(executeResult.warnings()[0].code == -56340); + REQUIRE(executeResult.warnings()[0].code == MeshingUtilities::k_EmptyMeshAfterSkinRemovalWarning); REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_TriangleGeomPath)); const auto& triangleGeom = dataStructure.getDataRefAs(k_TriangleGeomPath); @@ -463,7 +545,7 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); - REQUIRE(executeResult.warnings()[0].code == -56340); + REQUIRE(executeResult.warnings()[0].code == MeshingUtilities::k_EmptyMeshAfterSkinRemovalWarning); REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); const auto& triangleGeom = dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); @@ -483,7 +565,7 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); - REQUIRE(executeResult.warnings()[0].code == -56340); + REQUIRE(executeResult.warnings()[0].code == MeshingUtilities::k_EmptyMeshAfterSkinRemovalWarning); REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); const auto& triangleGeom = dataStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); @@ -498,6 +580,26 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume { UnitTest::LoadPlugins(); + // Unlike QuickSurfaceMesh/SurfaceNets, M3C does not necessarily reach zero vertices here: its + // marching-cubes candidate generation can leave "pre-existing" candidate nodes that no triangle + // ever references, independent of the skin-omit option (see M3CSurfaceMeshing.cpp finalizeMesh). + // When the option prunes every face (as it does on an all-background volume), the narrowed + // orphan-node clearing leaves exactly those pre-existing orphans behind. Measure that count from + // the un-pruned (option off) mesh of the same input rather than assuming any particular number. + DataStructure offStructure = SurfaceMeshingTest::CreateAllBackground(); + const Result<> offResult = RunM3CRaw(offStructure, false); + SIMPLNX_RESULT_REQUIRE_VALID(offResult); + REQUIRE_NOTHROW(offStructure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto& offGeom = offStructure.getDataRefAs(k_M3CTriangleGeomPath); + const auto& offFacesRef = offGeom.getFaces()->getDataStoreRef(); + std::set offReferencedVertices; + for(usize i = 0; i < offGeom.getNumberOfFaces() * 3; i++) + { + offReferencedVertices.insert(static_cast(offFacesRef[i])); + } + const usize preExistingOrphanCount = offGeom.getNumberOfVertices() - offReferencedVertices.size(); + INFO("Pre-existing orphan vertex count measured from the un-pruned mesh: " << preExistingOrphanCount); + SECTION("Repair Triangle Winding off") { DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); @@ -505,12 +607,12 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); - REQUIRE(executeResult.warnings()[0].code == -56340); + REQUIRE(executeResult.warnings()[0].code == MeshingUtilities::k_EmptyMeshAfterSkinRemovalWarning); REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_M3CTriangleGeomPath)); const auto& triangleGeom = dataStructure.getDataRefAs(k_M3CTriangleGeomPath); REQUIRE(triangleGeom.getNumberOfFaces() == 0); - REQUIRE(triangleGeom.getNumberOfVertices() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == preExistingOrphanCount); UnitTest::CheckArraysInheritTupleDims(dataStructure); } @@ -525,13 +627,101 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); - REQUIRE(executeResult.warnings()[0].code == -56340); + REQUIRE(executeResult.warnings()[0].code == MeshingUtilities::k_EmptyMeshAfterSkinRemovalWarning); REQUIRE_NOTHROW(dataStructure.getDataRefAs(k_M3CTriangleGeomPath)); const auto& triangleGeom = dataStructure.getDataRefAs(k_M3CTriangleGeomPath); REQUIRE(triangleGeom.getNumberOfFaces() == 0); - REQUIRE(triangleGeom.getNumberOfVertices() == 0); + REQUIRE(triangleGeom.getNumberOfVertices() == preExistingOrphanCount); UnitTest::CheckArraysInheritTupleDims(dataStructure); } } + +TEST_CASE("SimplnxCore::Omit Bounding Box Skin mesher inputs reject Feature Id sentinel collisions", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + // These validations are unconditional (not gated on the Bounding Box Skin mode), so each SECTION + // below leaves the option off to prove that. This is a mitigation for the sentinel-collision + // design described in simplnx#1705, not a fix for it. + SECTION("QuickSurfaceMesh rejects a negative Feature Id") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath)); + auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); + featureIdsRef[0] = -7; + + const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, false); + REQUIRE(executeResult.invalid()); + REQUIRE(executeResult.errors().size() == 1); + REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); + INFO(executeResult.errors()[0].message); + REQUIRE(executeResult.errors()[0].message.find("-7") != std::string::npos); + REQUIRE(executeResult.errors()[0].message.find(SurfaceMeshingTest::k_FeatureIdsPath.toString()) != std::string::npos); + } + + SECTION("SurfaceNets rejects a negative Feature Id") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath)); + auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); + featureIdsRef[0] = -7; + + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, false); + REQUIRE(executeResult.invalid()); + REQUIRE(executeResult.errors().size() == 1); + REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); + INFO(executeResult.errors()[0].message); + REQUIRE(executeResult.errors()[0].message.find("-7") != std::string::npos); + REQUIRE(executeResult.errors()[0].message.find(SurfaceMeshingTest::k_FeatureIdsPath.toString()) != std::string::npos); + } + + SECTION("SurfaceNets rejects a Feature Id of INT32_MAX") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath)); + auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); + featureIdsRef[0] = std::numeric_limits::max(); + + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, false); + REQUIRE(executeResult.invalid()); + REQUIRE(executeResult.errors().size() == 1); + REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); + INFO(executeResult.errors()[0].message); + REQUIRE(executeResult.errors()[0].message.find(std::to_string(std::numeric_limits::max())) != std::string::npos); + REQUIRE(executeResult.errors()[0].message.find(SurfaceMeshingTest::k_FeatureIdsPath.toString()) != std::string::npos); + } + + SECTION("M3CSurfaceMeshing rejects a negative Feature Id") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath)); + auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); + featureIdsRef[0] = -7; + + const Result<> executeResult = RunM3CRaw(dataStructure, false); + REQUIRE(executeResult.invalid()); + REQUIRE(executeResult.errors().size() == 1); + REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); + INFO(executeResult.errors()[0].message); + REQUIRE(executeResult.errors()[0].message.find("-7") != std::string::npos); + REQUIRE(executeResult.errors()[0].message.find(SurfaceMeshingTest::k_FeatureIdsPath.toString()) != std::string::npos); + } + + SECTION("M3CSurfaceMeshing rejects a Feature Id of INT32_MAX") + { + DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); + REQUIRE_NOTHROW(dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath)); + auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); + featureIdsRef[0] = std::numeric_limits::max(); + + const Result<> executeResult = RunM3CRaw(dataStructure, false); + REQUIRE(executeResult.invalid()); + REQUIRE(executeResult.errors().size() == 1); + REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); + INFO(executeResult.errors()[0].message); + REQUIRE(executeResult.errors()[0].message.find(std::to_string(std::numeric_limits::max())) != std::string::npos); + REQUIRE(executeResult.errors()[0].message.find(SurfaceMeshingTest::k_FeatureIdsPath.toString()) != std::string::npos); + } +} diff --git a/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp b/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp index 4bd36cc0d5..2de12b7ccd 100644 --- a/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp +++ b/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp @@ -399,3 +399,44 @@ void MeshingUtilities::CalculateNormalsImpl::operator()(const nx::core::Range& r { generate(range.min(), range.max()); } + +Result<> MeshingUtilities::MakeEmptyMeshWarning(const DataPath& triangleGeomPath, usize numCells, usize numVertices) +{ + return MakeWarningVoidResult(k_EmptyMeshAfterSkinRemovalWarning, + fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no internal " + "interface and no Feature to cap. The Triangle Geometry now has 0 faces and {} vertices remaining.", + triangleGeomPath.toString(), numCells, numVertices)); +} + +Result<> MeshingUtilities::MakeNoFacesPrunedWarning(const DataPath& triangleGeomPath) +{ + return MakeWarningVoidResult(k_NoFacesPrunedWarning, + fmt::format("'Omit Bounding Box Skin' removed 0 faces of geometry '{}' because the input volume contains no background (Feature Id 0) voxels. There is nothing " + "for this option to prune on this input; the output is identical to leaving it off.", + triangleGeomPath.toString())); +} + +Result<> MeshingUtilities::ValidateFeatureIdsAgainstSentinels(const Int32AbstractDataStore& featureIdsStore, const DataPath& featureIdsPath, bool rejectMaxInt32) +{ + const usize numTuples = featureIdsStore.getNumberOfTuples(); + for(usize i = 0; i < numTuples; i++) + { + const int32 featureId = featureIdsStore[i]; + if(featureId < 0) + { + return MakeErrorResult(k_InvalidFeatureIdError, fmt::format("Feature Ids array '{}' contains a negative value ({}) at tuple index {}. This mesher reserves negative Feature Ids for an " + "internal ghost/exterior sentinel convention; relabel this input so every Feature Id is >= 0. (Mitigation for the " + "sentinel-collision design tracked separately as simplnx#1705.)", + featureIdsPath.toString(), featureId, i)); + } + if(rejectMaxInt32 && featureId == std::numeric_limits::max()) + { + return MakeErrorResult(k_InvalidFeatureIdError, fmt::format("Feature Ids array '{}' contains the value {} at tuple index {}, which collides with an internal 'outside the volume' " + "sentinel used by this mesher. Relabel this input so no Feature Id equals INT32_MAX. (Mitigation for the sentinel-collision " + "design tracked separately as simplnx#1705.)", + featureIdsPath.toString(), featureId, i)); + } + } + + return {}; +} diff --git a/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp b/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp index 5b445fc967..75997ca580 100644 --- a/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp +++ b/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp @@ -2,6 +2,7 @@ #include "simplnx/Common/Range.hpp" #include "simplnx/Common/Result.hpp" +#include "simplnx/DataStructure/DataPath.hpp" #include "simplnx/DataStructure/Geometry/IGeometry.hpp" #include "simplnx/DataStructure/Geometry/INodeGeometry2D.hpp" #include "simplnx/Filter/IFilter.hpp" @@ -23,6 +24,67 @@ inline constexpr ChoicesParameter::ValueType k_BackgroundBackedWallsOnly = 1; namespace nx::core::MeshingUtilities { +/** + * @brief Warning emitted when 'Omit Bounding Box Skin' (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) + * removes every face of the mesh -- i.e. the input is entirely background (Feature Id 0), so there is no + * internal interface and no Feature to cap any box wall. Shared verbatim by QuickSurfaceMesh, SurfaceNets, + * and M3CSurfaceMeshing so the warning text and code are defined exactly once. See MakeEmptyMeshWarning(). + */ +inline constexpr int32 k_EmptyMeshAfterSkinRemovalWarning = -56340; + +/** + * @brief Warning emitted when 'Omit Bounding Box Skin' (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) + * is enabled but suppressed zero faces -- i.e. the input volume contains no background (Feature Id 0) + * voxels, so the option had nothing to prune and the output is identical to leaving it off. This is the + * most common dataset shape in practice, so silent no-feedback behavior here is not acceptable. See + * MakeNoFacesPrunedWarning(). + */ +inline constexpr int32 k_NoFacesPrunedWarning = -56342; + +/** + * @brief Error emitted when a Feature Ids array contains a value that collides with a mesher's internal + * "not a real Feature" sentinel space (see ValidateFeatureIdsAgainstSentinels()). This is a mitigation + * for the underlying sentinel-collision design, not a fix for it -- the architectural issue is tracked + * separately as simplnx#1705. + */ +inline constexpr int32 k_InvalidFeatureIdError = -56343; + +/** + * @brief Builds the warning Result for k_EmptyMeshAfterSkinRemovalWarning (see its docs above). + * The vertex count is reported rather than assumed to be zero: QuickSurfaceMesh and SurfaceNets + * both reach zero vertices in this case, but M3CSurfaceMeshing's marching-cubes candidate generation + * can leave a handful of pre-existing candidate nodes that no triangle -- dropped or surviving -- + * ever referenced, so its vertex count here is not necessarily zero. + * @param triangleGeomPath Path to the (now-empty, or near-empty) Triangle Geometry, named in the message. + * @param numCells Number of Feature Id cells in the input, named in the message. + * @param numVertices Number of vertices remaining in the Triangle Geometry after the prune. + */ +SIMPLNX_EXPORT Result<> MakeEmptyMeshWarning(const DataPath& triangleGeomPath, usize numCells, usize numVertices); + +/** + * @brief Builds the warning Result for k_NoFacesPrunedWarning (see its docs above). + * @param triangleGeomPath Path to the Triangle Geometry, named in the message. + */ +SIMPLNX_EXPORT Result<> MakeNoFacesPrunedWarning(const DataPath& triangleGeomPath); + +/** + * @brief Validates that no value in a Feature Ids array collides with a mesher's internal "not a real + * Feature" sentinel space (e.g. SurfaceNets' MMSurfaceNet::Padding == INT32_MAX, M3CSurfaceMeshing's + * maxGrainId+1 overflow and nSpin < 0 ghost convention, QuickSurfaceMesh's hard-coded -1 exterior Face + * Label). This is a mitigation, not a fix, for that design -- the architectural issue is tracked + * separately as simplnx#1705. + * + * Call this from an algorithm's execute entry point, never from preflight: a full-volume scan (e.g. + * ~134M reads at 512^3) is too expensive to repeat on every GUI parameter edit. + * @param featureIdsStore The Feature Ids to validate. + * @param featureIdsPath Path to the array, named in the error message so the user can locate it. + * @param rejectMaxInt32 When true, also reject a Feature Id of exactly INT32_MAX (SurfaceNets and + * M3CSurfaceMeshing both need this; QuickSurfaceMesh only collides on negative values, so it passes false). + * @returns An invalid Result<> naming the offending value, its tuple index, and featureIdsPath on the + * first rejected value found; an empty valid Result<> otherwise. + */ +SIMPLNX_EXPORT Result<> ValidateFeatureIdsAgainstSentinels(const Int32AbstractDataStore& featureIdsStore, const DataPath& featureIdsPath, bool rejectMaxInt32); + namespace detail { inline static constexpr usize k_00 = 0; From 3e6fbc0f20d488ba8d2f956f39317b5111c3cdae Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Wed, 12 Aug 2026 16:48:28 -0400 Subject: [PATCH 21/24] TEST: fix stale Bounding Box Skin label, test hygiene, and cross-mesher/corner coverage Wave 3: repo-wide sweep to rename every "Omit Bounding Box Skin" reference (the parameter's old bool-era label) to the current "Bounding Box Skin" ChoicesParameter and its "Background-Backed Walls Only" mode, across warning text, code comments, test names, and filter docs (24 hits, 11 files). Test hygiene: - SurfaceNetsFaceLabelsTest.cpp and SurfaceNetsNodeTypesTest.cpp now build Arguments via the shared RunMesher helper instead of duplicating the field-by-field block. - Three TEST_CASEs that never called UnitTest::CheckArraysInheritTupleDims now do, by having their helpers return the DataStructure instead of discarding it. - SurfaceMeshingTestUtilsTest.cpp's throwaway CheckArraysInheritTupleDims(DataStructure{}) moved into each SECTION against that section's real dataStructure. - Added missing REQUIRE_NOTHROW around getDataRefAs() in CollectLabelPairs and in the SurfaceNets/QuickSurfaceMesh Node Types comparison. - Fused SurfaceNets' two-pass vertex compaction (assign then copy) into one pass, preserving the ascending-old-index invariant that makes the in-place copy safe. New coverage: - Cross-mesher conformance test: QuickSurfaceMesh, SurfaceNets, and M3C agree on the Face Label pair set (not counts/arrays, which legitimately differ) with the mode both off and on; watertightness is asserted only for the "on" mode, since "off" has a pre-existing T-junction where an internal boundary meets the box wall. - Corner-Feature watertightness test: a Feature occupying a box corner so three suppressed wall planes meet at a right angle. Passes on all three meshers with no edge-use defects found. ctest -R "SimplnxCore::" 974/974 (was 972/972); ctest -R "FilterValidation" 5/5. Final grep for "Omit Bounding Box Skin" under src: 0 hits. Co-Authored-By: Claude Opus 5 --- ...ernalSurfacesFromTriangleGeometryFilter.md | 4 +- .../docs/M3CSurfaceMeshingFilter.md | 6 +- .../docs/QuickSurfaceMeshFilter.md | 4 +- .../SimplnxCore/docs/SurfaceNetsFilter.md | 6 +- .../Filters/Algorithms/M3CSurfaceMeshing.cpp | 4 +- .../Filters/Algorithms/SurfaceNets.cpp | 53 +++-- ...ternalSurfacesFromTriangleGeometryTest.cpp | 2 +- .../test/M3CSurfaceMeshingTest.cpp | 13 +- .../test/OmitBoundingBoxSkinTest.cpp | 183 +++++++++++++++++- .../test/SurfaceMeshingTestUtils.hpp | 1 + .../test/SurfaceMeshingTestUtilsTest.cpp | 12 +- .../test/SurfaceNetsFaceLabelsTest.cpp | 50 ++--- .../test/SurfaceNetsNodeTypesTest.cpp | 122 ++++-------- .../Utilities/Meshing/TriangleUtilities.cpp | 8 +- .../Utilities/Meshing/TriangleUtilities.hpp | 14 +- 15 files changed, 297 insertions(+), 185 deletions(-) diff --git a/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md b/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md index fb02162bd6..3718239da5 100644 --- a/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md +++ b/src/Plugins/SimplnxCore/docs/ExtractInternalSurfacesFromTriangleGeometryFilter.md @@ -41,8 +41,8 @@ box wall will come out open. **Face Labels** instead discards only the faces whose Face Labels are `{-1, 0}`: the bounding box wall where it borders the background. Faces where the wall caps a real Feature are kept, so Features flush with the box stay closed, and no rim is eroded. This is the -same rule as the **Omit Bounding Box Skin** option on the surface meshing filters, and is -the better choice for meshes that already exist. +same rule as the **Bounding Box Skin** option's **Background-Backed Walls Only** mode on the +surface meshing filters, and is the better choice for meshes that already exist. % Auto generated parameter table will be inserted here diff --git a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md index 7e52201c19..e7eda60ed3 100644 --- a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md +++ b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md @@ -73,8 +73,8 @@ By default this filter generates triangles covering all six outer walls of the I Geometry's bounding box. These faces are artifacts of where the volume was cropped rather than real interfaces, and they receive a Face Label of `-1` on the exterior side. -Enabling **Omit Bounding Box Skin** suppresses a wall face when the voxel behind it is -background (Feature Id 0) — that is, when its Face Labels would be `{-1, 0}`. Wall faces +Enabling the **Bounding Box Skin** option's **Background-Backed Walls Only** mode suppresses a +wall face when the voxel behind it is background (Feature Id 0) — that is, when its Face Labels would be `{-1, 0}`. Wall faces that cap a *real* Feature are still generated, because that cut plane is the only possible closure for a Feature flush with the box. A cylinder sitting flush with the box floor therefore comes out as a closed surface with no surrounding box. @@ -93,7 +93,7 @@ and no Feature to cap. **Note:** M3C's candidate-node generation always produces a handful of node entries near the volume boundary that no triangle references, even with the option disabled — these orphan -vertices are present in stock M3C output. When **Omit Bounding Box Skin** is enabled *and* at +vertices are present in stock M3C output. When the **Bounding Box Skin** option's **Background-Backed Walls Only** mode is enabled *and* at least one wall face is actually pruned, M3C also clears those pre-existing orphan vertices, so the output has no unreferenced vertices at all. When the option removes nothing (for example on a fully-indexed volume), it remains a strict no-op and the orphans are left untouched. As a diff --git a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md index 6249e699ca..60c6d604ae 100644 --- a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md +++ b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md @@ -103,8 +103,8 @@ By default this filter generates triangles covering all six outer walls of the I Geometry's bounding box. These faces are artifacts of where the volume was cropped rather than real interfaces, and they receive a Face Label of `-1` on the exterior side. -Enabling **Omit Bounding Box Skin** suppresses a wall face when the voxel behind it is -background (Feature Id 0) — that is, when its Face Labels would be `{-1, 0}`. Wall faces +Enabling the **Bounding Box Skin** option's **Background-Backed Walls Only** mode suppresses a +wall face when the voxel behind it is background (Feature Id 0) — that is, when its Face Labels would be `{-1, 0}`. Wall faces that cap a *real* Feature are still generated, because that cut plane is the only possible closure for a Feature flush with the box. A cylinder sitting flush with the box floor therefore comes out as a closed surface with no surrounding box. diff --git a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md index ddb8ebd0c5..f2d657089e 100644 --- a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md +++ b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md @@ -66,7 +66,7 @@ This filter should be used in place of the "QuickMesh Surface Filter". ## Changed Behavior for Existing Pipelines -Two defects in this filter's output were fixed as part of adding the **Omit Bounding Box Skin** +Two defects in this filter's output were fixed as part of adding the **Bounding Box Skin** option below. Both fixes apply unconditionally -- they are not gated by that new option -- so any pipeline that already used this **Filter** will see different (corrected) output the next time it runs, with no parameter change on the user's part: @@ -106,8 +106,8 @@ By default this filter generates triangles covering all six outer walls of the I Geometry's bounding box. These faces are artifacts of where the volume was cropped rather than real interfaces, and they receive a Face Label of `-1` on the exterior side. -Enabling **Omit Bounding Box Skin** suppresses a wall face when the voxel behind it is -background (Feature Id 0) — that is, when its Face Labels would be `{-1, 0}`. Wall faces +Enabling the **Bounding Box Skin** option's **Background-Backed Walls Only** mode suppresses a +wall face when the voxel behind it is background (Feature Id 0) — that is, when its Face Labels would be `{-1, 0}`. Wall faces that cap a *real* Feature are still generated, because that cut plane is the only possible closure for a Feature flush with the box. A cylinder sitting flush with the box floor therefore comes out as a closed surface with no surrounding box. diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp index 9653df146a..0d29abb47c 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp @@ -2537,10 +2537,10 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput // Faces suppressed by the prune below. Stays 0 when the mode is Off, or when the mode is on but // nothing matched. Read after the winding-repair pass to decide which (if either) of the two - // Omit Bounding Box Skin warnings to emit. + // Bounding Box Skin warnings to emit. int64 numFacesPruned = 0; - // Omit Bounding Box Skin: drop faces whose output Face Labels would be {-1, 0}. In the + // Bounding Box Skin option, 'Background-Backed Walls Only' mode: drop faces whose output Face Labels would be {-1, 0}. In the // internal representation that is one negative ghost label paired with maxGrainId, which // is the renumbered zero-feature (see toFaceLabel below). Pruning the scratch vectors here // means the output TriangleGeom is sized from the surviving count and never over-allocated. diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp index 504dee338c..c03f4ebd63 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp @@ -183,9 +183,9 @@ Result<> SurfaceNets::operator()() } usize triangleCount = 0; - // Counts quads suppressed by 'Omit Bounding Box Skin' (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) - // in this counting pass. Always 0 when the mode is Off. Lets the caller warn when the option is on but - // pruned nothing. + // Counts quads suppressed by the Bounding Box Skin option's 'Background-Backed Walls Only' mode + // (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) in this counting pass. Always 0 when the mode is + // Off. Lets the caller warn when the option is on but pruned nothing. usize suppressedFaceCount = 0; std::array quadNxArrayIndices = {0, 0}; // First Pass through to just count the number of triangles: @@ -472,42 +472,39 @@ Result<> SurfaceNets::operator()() isReferenced[static_cast(facesRef[i])] = true; } - // Second pass: assign new indices in ascending order of OLD index (not order of first - // use in the face list). This guarantees newVertexIndex[oldIndex] <= oldIndex for every - // referenced vertex, which is what makes the in-place compaction below safe -- a - // destination slot is always at or before its source slot, so writing it never clobbers - // data that a later iteration still needs to read. + // Second pass: assign each referenced vertex's new index and copy its data in the same + // step, walking in ascending order of OLD index (not order of first use in the face + // list). Assigning destIndex from a running counter as oldIndex ascends guarantees + // newVertexIndex[oldIndex] <= oldIndex for every referenced vertex, which is what makes + // the in-place copy below safe -- a destination slot is always at or before its source + // slot, so writing it never clobbers data that a later iteration still needs to read. + // The two passes this replaces (assign-then-copy) walked all nodeCount vertices twice for + // no benefit, since the copy consumes newVertexIndex[oldIndex] immediately after it is + // assigned. constexpr usize k_NotUsed = std::numeric_limits::max(); std::vector newVertexIndex(nodeCount, k_NotUsed); usize survivingVertexCount = 0; + auto& verticesRef = triangleGeom.getVertices()->getDataStoreRef(); for(usize oldIndex = 0; oldIndex < nodeCount; oldIndex++) { - if(isReferenced[oldIndex]) + if(!isReferenced[oldIndex]) { - newVertexIndex[oldIndex] = survivingVertexCount; - survivingVertexCount++; + continue; } + const usize destIndex = survivingVertexCount; + newVertexIndex[oldIndex] = destIndex; + for(usize comp = 0; comp < 3; comp++) + { + verticesRef[destIndex * 3 + comp] = verticesRef[oldIndex * 3 + comp]; + } + nodeTypes[destIndex] = nodeTypes[oldIndex]; + survivingVertexCount++; } if(survivingVertexCount < nodeCount) { - auto& verticesRef = triangleGeom.getVertices()->getDataStoreRef(); - // Compact in place. Safe because newVertexIndex[oldIndex] <= oldIndex (see above). - for(usize oldIndex = 0; oldIndex < nodeCount; oldIndex++) - { - const usize destIndex = newVertexIndex[oldIndex]; - if(destIndex == k_NotUsed) - { - continue; - } - for(usize comp = 0; comp < 3; comp++) - { - verticesRef[destIndex * 3 + comp] = verticesRef[oldIndex * 3 + comp]; - } - nodeTypes[destIndex] = nodeTypes[oldIndex]; - } - - // Remap the face indices to the compacted vertex ids. + // Remap the face indices to the compacted vertex ids. Must run after the copy loop + // above (it reads the pre-remap face indices to look up newVertexIndex). for(usize i = 0; i < numFaceIndices; i++) { facesRef[i] = static_cast(newVertexIndex[static_cast(facesRef[i])]); diff --git a/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp b/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp index 4d89aa74a8..ca4acd7b02 100644 --- a/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp +++ b/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp @@ -191,7 +191,7 @@ namespace { // Meshes the flush cylinder from SurfaceMeshingTestUtils with QuickSurfaceMesh, leaving Fix // Problem Voxels off so the mesh is deterministic. omitSkin selects whether QuickSurfaceMesh's own -// Omit Bounding Box Skin option runs, so the same helper can build both the "full" mesh (skin left +// Bounding Box Skin option runs, so the same helper can build both the "full" mesh (skin left // on, to be pruned by this filter) and the "direct" oracle mesh (skin already omitted by the mesher). const DataPath k_QuickMeshPath({"QuickMesh"}); diff --git a/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp b/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp index 84e719a0d7..a57e4c9386 100644 --- a/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp +++ b/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp @@ -605,8 +605,8 @@ class ScopedEnvVar const DataPath k_SweepPathTriGeomPath({"M3CSweepPathMesh"}); -// Runs the flush-with-bottom cylinder (Task 1's shared test dataset) through M3C with Omit Bounding -// Box Skin enabled, forcing the sweep path selected by the two M3C_* environment variables (see +// Runs the flush-with-bottom cylinder (Task 1's shared test dataset) through M3C with the Bounding +// Box Skin option's 'Background-Backed Walls Only' mode enabled, forcing the sweep path selected by the two M3C_* environment variables (see // M3CSurfaceMeshing::operator()()). Passing false/false for both selects the default parallel // sliding-window path. SurfaceMeshingTest::MeshResult RunM3COmitSkinOnPath(bool wholeVolume, bool serial) @@ -617,7 +617,7 @@ SurfaceMeshingTest::MeshResult RunM3COmitSkinOnPath(bool wholeVolume, bool seria } } // namespace -TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Omit Bounding Box Skin agrees across sweep paths", "[SimplnxCore][M3CSurfaceMeshingFilter]") +TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Bounding Box Skin agrees across sweep paths", "[SimplnxCore][M3CSurfaceMeshingFilter]") { UnitTest::LoadPlugins(); @@ -626,9 +626,10 @@ TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Omit Bounding Box Skin agrees a // documented to produce byte-identical vertices, FaceLabels, and NodeTypes, but MAY legitimately // triangulate the same interfaces differently (the legacy per-cube loop triangulation depends on // cross-cube edge-flip propagation, which is inherently serial) -- so its Shared Faces List is not - // compared for exact equality here. Confirm those same guarantees still hold with Omit Bounding Box - // Skin enabled: the prune runs once, inside the shared finalizeMesh(), after all three paths have - // produced their triangles/mCubeID vectors, so it should not disturb this invariant either way. + // compared for exact equality here. Confirm those same guarantees still hold with the Bounding Box + // Skin option's 'Background-Backed Walls Only' mode enabled: the prune runs once, inside the shared + // finalizeMesh(), after all three paths have produced their triangles/mCubeID vectors, so it should + // not disturb this invariant either way. SurfaceMeshingTest::MeshResult wholeVolumeResult = RunM3COmitSkinOnPath(/*wholeVolume*/ true, /*serial*/ false); SurfaceMeshingTest::MeshResult serialWindowedResult = RunM3COmitSkinOnPath(/*wholeVolume*/ false, /*serial*/ true); SurfaceMeshingTest::MeshResult parallelWindowedResult = RunM3COmitSkinOnPath(/*wholeVolume*/ false, /*serial*/ false); diff --git a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp index ef5d111170..c4b19f2050 100644 --- a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp +++ b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp @@ -31,7 +31,7 @@ SurfaceMeshingTest::MeshResult RunQuickSurfaceMesh(bool flushWithBottom, bool om } } // namespace -TEST_CASE("SimplnxCore::QuickSurfaceMeshFilter: Omit Bounding Box Skin", "[SimplnxCore][QuickSurfaceMeshFilter]") +TEST_CASE("SimplnxCore::QuickSurfaceMeshFilter: Bounding Box Skin", "[SimplnxCore][QuickSurfaceMeshFilter]") { UnitTest::LoadPlugins(); @@ -121,7 +121,7 @@ SurfaceMeshingTest::MeshResult RunSurfaceNets(bool flushWithBottom, bool omitSki } } // namespace -TEST_CASE("SimplnxCore::SurfaceNetsFilter: Omit Bounding Box Skin", "[SimplnxCore][SurfaceNetsFilter]") +TEST_CASE("SimplnxCore::SurfaceNetsFilter: Bounding Box Skin", "[SimplnxCore][SurfaceNetsFilter]") { UnitTest::LoadPlugins(); @@ -180,7 +180,7 @@ SurfaceMeshingTest::MeshResult RunM3C(bool flushWithBottom, bool omitSkin) } } // namespace -TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Omit Bounding Box Skin", "[SimplnxCore][M3CSurfaceMeshingFilter]") +TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Bounding Box Skin", "[SimplnxCore][M3CSurfaceMeshingFilter]") { UnitTest::LoadPlugins(); @@ -337,7 +337,7 @@ Result<> RunM3CRaw(DataStructure& dataStructure, bool omitSkin, bool repairWindi } } // namespace -TEST_CASE("SimplnxCore::Omit Bounding Box Skin is a no-op without background", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") +TEST_CASE("SimplnxCore::Bounding Box Skin is a no-op without background", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") { UnitTest::LoadPlugins(); @@ -450,7 +450,7 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin is a no-op without background", " } } -TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns when nothing is pruned", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") +TEST_CASE("SimplnxCore::Bounding Box Skin warns when nothing is pruned", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") { UnitTest::LoadPlugins(); @@ -489,7 +489,7 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns when nothing is pruned", "[ } } -TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume", "[SimplnxCore][QuickSurfaceMeshFilter]") +TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume", "[SimplnxCore][QuickSurfaceMeshFilter]") { UnitTest::LoadPlugins(); @@ -534,7 +534,7 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume } } -TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume (SurfaceNets)", "[SimplnxCore][SurfaceNetsFilter]") +TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume (SurfaceNets)", "[SimplnxCore][SurfaceNetsFilter]") { UnitTest::LoadPlugins(); @@ -576,7 +576,7 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume } } -TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume (M3CSurfaceMeshing)", "[SimplnxCore][M3CSurfaceMeshingFilter]") +TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume (M3CSurfaceMeshing)", "[SimplnxCore][M3CSurfaceMeshingFilter]") { UnitTest::LoadPlugins(); @@ -638,7 +638,7 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin warns on an all-background volume } } -TEST_CASE("SimplnxCore::Omit Bounding Box Skin mesher inputs reject Feature Id sentinel collisions", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") +TEST_CASE("SimplnxCore::Bounding Box Skin mesher inputs reject Feature Id sentinel collisions", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") { UnitTest::LoadPlugins(); @@ -725,3 +725,168 @@ TEST_CASE("SimplnxCore::Omit Bounding Box Skin mesher inputs reject Feature Id s REQUIRE(executeResult.errors()[0].message.find(SurfaceMeshingTest::k_FeatureIdsPath.toString()) != std::string::npos); } } + +TEST_CASE("SimplnxCore::Bounding Box Skin: all three meshers agree on Face Label pairs", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + // The three meshers legitimately produce different geometry -- different vertex counts, + // triangle counts, and tessellations -- so those are NOT compared here. What must agree is the + // *semantic* result: which Feature-pair interfaces exist. CollectLabelPairs gives exactly that + // set, independent of mesh topology, which is why it (rather than raw array/geometry equality) + // is the right comparison across three independently-implemented meshers. CreateCylinderInBox(true) + // (via flushWithBottom=true below) is used so both the {-1, 1} cap (cylinder flush with the box + // floor) and the {0, 1} interior interface (cylinder side away from the floor) are present to compare, + // alongside the {-1, 0} background skin. + // + // Watertightness is only asserted for the "on" mode. With the mode off, a per-voxel-face + // boundary quad and the vertical wall quad next to it can share an edge with a THIRD quad from + // the neighboring (differently-labeled) voxel's own boundary quad -- a pre-existing T-junction + // at any point an internal boundary meets the box wall, independent of this option. "On" mode + // drops that neighboring background-backed quad, leaving exactly 2 quads at the edge, which is + // precisely the closure this option exists to provide (see the per-mesher "Option on removes + // only the background skin and keeps the cylinder closed" cases above). + auto checkAgreement = [](bool omitSkin) { + SurfaceMeshingTest::MeshResult qsmResult = RunQuickSurfaceMesh(true, omitSkin); + SurfaceMeshingTest::MeshResult snResult = RunSurfaceNets(true, omitSkin); + SurfaceMeshingTest::MeshResult m3cResult = RunM3C(true, omitSkin); + + const auto qsmLabelPairs = SurfaceMeshingTest::CollectLabelPairs(qsmResult); + const auto snLabelPairs = SurfaceMeshingTest::CollectLabelPairs(snResult); + const auto m3cLabelPairs = SurfaceMeshingTest::CollectLabelPairs(m3cResult); + + CHECK(qsmLabelPairs == snLabelPairs); + CHECK(qsmLabelPairs == m3cLabelPairs); + + REQUIRE_NOTHROW(qsmResult.Structure.getDataRefAs(qsmResult.TriangleGeomPath)); + REQUIRE_NOTHROW(snResult.Structure.getDataRefAs(snResult.TriangleGeomPath)); + REQUIRE_NOTHROW(m3cResult.Structure.getDataRefAs(m3cResult.TriangleGeomPath)); + if(omitSkin) + { + CHECK(SurfaceMeshingTest::IsWatertight(qsmResult.Structure.getDataRefAs(qsmResult.TriangleGeomPath))); + CHECK(SurfaceMeshingTest::IsWatertight(snResult.Structure.getDataRefAs(snResult.TriangleGeomPath))); + CHECK(SurfaceMeshingTest::IsWatertight(m3cResult.Structure.getDataRefAs(m3cResult.TriangleGeomPath))); + } + + UnitTest::CheckArraysInheritTupleDims(qsmResult.Structure); + UnitTest::CheckArraysInheritTupleDims(snResult.Structure); + UnitTest::CheckArraysInheritTupleDims(m3cResult.Structure); + }; + + SECTION("Bounding Box Skin mode off") + { + checkAgreement(false); + } + + SECTION("Bounding Box Skin mode on (Background-Backed Walls Only)") + { + checkAgreement(true); + } +} + +namespace +{ +// Builds a 12x12x12 ImageGeom where a single Feature (Id 1) occupies a corner block touching the +// x==0, y==0, AND z==0 walls simultaneously, so three suppressed wall planes meet at a right-angle +// corner. CreateCylinderInBox only ever touches one wall (the floor) at a time, so this is built +// directly rather than forcing that helper into a shape it was not designed for. +DataStructure CreateCornerFeatureInBox() +{ + DataStructure dataStructure; + constexpr usize k_CornerExtent = 3; + + auto* imageGeomPtr = ImageGeom::Create(dataStructure, "ImageGeom"); + const std::vector dims = {SurfaceMeshingTest::k_BoxDim, SurfaceMeshingTest::k_BoxDim, SurfaceMeshingTest::k_BoxDim}; + imageGeomPtr->setDimensions(dims); + imageGeomPtr->setSpacing({1.0F, 1.0F, 1.0F}); + imageGeomPtr->setOrigin({0.0F, 0.0F, 0.0F}); + + auto* cellAMPtr = AttributeMatrix::Create(dataStructure, "CellData", {dims[2], dims[1], dims[0]}, imageGeomPtr->getId()); + imageGeomPtr->setCellData(*cellAMPtr); + auto* featureIdsPtr = Int32Array::CreateWithStore(dataStructure, "FeatureIds", {dims[2], dims[1], dims[0]}, {1}, cellAMPtr->getId()); + featureIdsPtr->fill(0); + + auto& featureIdsRef = featureIdsPtr->getDataStoreRef(); + for(usize z = 0; z < k_CornerExtent; z++) + { + for(usize y = 0; y < k_CornerExtent; y++) + { + for(usize x = 0; x < k_CornerExtent; x++) + { + featureIdsRef[(z * SurfaceMeshingTest::k_BoxDim * SurfaceMeshingTest::k_BoxDim) + (y * SurfaceMeshingTest::k_BoxDim) + x] = 1; + } + } + } + + return dataStructure; +} +} // namespace + +TEST_CASE("SimplnxCore::Bounding Box Skin: corner Feature stays watertight", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + // The feature's whole justification is that a Feature flush with the box stays closed. Every + // other test in this file only exercises a single flush face (CreateCylinderInBox's floor). A + // per-face suppression rule could still fail where two or three suppressed wall planes meet at a + // right angle -- which only happens at a corner -- so this is the test that would catch it. + SECTION("QuickSurfaceMesh") + { + SurfaceMeshingTest::MeshResult meshResult = SurfaceMeshingTest::RunMesher( + CreateCornerFeatureInBox(), k_TriangleGeomPath, true, [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); + const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); + CHECK(labelPairs.count({-1, 1}) == 1); + CHECK(labelPairs.count({0, 1}) == 1); + CHECK(labelPairs.count({-1, 0}) == 0); + + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); + const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); + const auto counts = SurfaceMeshingTest::CountEdgeUses(triangleGeom); + INFO("QuickSurfaceMesh corner-Feature edge use counts -- Total: " << counts.TotalEdges << " UsedOnce: " << counts.EdgesUsedOnce << " UsedTwice: " << counts.EdgesUsedTwice + << " UsedMoreThanTwice: " << counts.EdgesUsedMoreThanTwice); + REQUIRE(SurfaceMeshingTest::IsWatertight(triangleGeom)); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } + + SECTION("SurfaceNets") + { + SurfaceMeshingTest::MeshResult meshResult = SurfaceMeshingTest::RunMesher(CreateCornerFeatureInBox(), k_SurfaceNetsTriangleGeomPath, true, [](Arguments& args) { + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); + args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); + args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); + }); + const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); + CHECK(labelPairs.count({-1, 1}) == 1); + CHECK(labelPairs.count({0, 1}) == 1); + CHECK(labelPairs.count({-1, 0}) == 0); + + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); + const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); + const auto counts = SurfaceMeshingTest::CountEdgeUses(triangleGeom); + INFO("SurfaceNets corner-Feature edge use counts -- Total: " << counts.TotalEdges << " UsedOnce: " << counts.EdgesUsedOnce << " UsedTwice: " << counts.EdgesUsedTwice + << " UsedMoreThanTwice: " << counts.EdgesUsedMoreThanTwice); + REQUIRE(SurfaceMeshingTest::IsWatertight(triangleGeom)); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } + + SECTION("M3CSurfaceMeshing") + { + SurfaceMeshingTest::MeshResult meshResult = SurfaceMeshingTest::RunMesher(CreateCornerFeatureInBox(), k_M3CTriangleGeomPath, true, [](Arguments&) {}); + const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); + CHECK(labelPairs.count({-1, 1}) == 1); + CHECK(labelPairs.count({0, 1}) == 1); + CHECK(labelPairs.count({-1, 0}) == 0); + + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); + const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); + const auto counts = SurfaceMeshingTest::CountEdgeUses(triangleGeom); + INFO("M3CSurfaceMeshing corner-Feature edge use counts -- Total: " << counts.TotalEdges << " UsedOnce: " << counts.EdgesUsedOnce << " UsedTwice: " << counts.EdgesUsedTwice + << " UsedMoreThanTwice: " << counts.EdgesUsedMoreThanTwice); + REQUIRE(SurfaceMeshingTest::IsWatertight(triangleGeom)); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); + } +} diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp index 18d9417701..88894fb9ef 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -318,6 +318,7 @@ inline Result<> RunMesherRaw(DataStructure& dataStructure, const DataPath& trian */ inline std::set> CollectLabelPairs(const MeshResult& meshResult) { + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.FaceLabelsPath)); const auto& faceLabelsRef = meshResult.Structure.getDataRefAs(meshResult.FaceLabelsPath).getDataStoreRef(); std::set> labelPairs; for(usize i = 0; i < faceLabelsRef.getNumberOfTuples(); i++) diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp index 177fc2a70a..8af9e8912b 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtilsTest.cpp @@ -36,6 +36,8 @@ TEST_CASE("SimplnxCore::SurfaceMeshingTestUtils", "[SimplnxCore][SurfaceMeshingT } // The cylinder axis voxel is Feature 1 at z == 4. REQUIRE(featureIdsRef[(4 * 12 * 12) + (6 * 12) + 6] == 1); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); } SECTION("CreateCylinderInBox flush touches the z == 0 plane") @@ -47,6 +49,8 @@ TEST_CASE("SimplnxCore::SurfaceMeshingTestUtils", "[SimplnxCore][SurfaceMeshingT REQUIRE(featureIdsRef[(0 * 12 * 12) + (6 * 12) + 6] == 1); // Still inset from the x/y walls. REQUIRE(featureIdsRef[(0 * 12 * 12) + (6 * 12) + 0] == 0); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); } SECTION("IsWatertight rejects an open mesh and accepts a closed one") @@ -98,6 +102,8 @@ TEST_CASE("SimplnxCore::SurfaceMeshingTestUtils", "[SimplnxCore][SurfaceMeshingT REQUIRE(counts.TotalEdges == 6); REQUIRE(counts.EdgesUsedTwice == 6); REQUIRE(counts.EdgesUsedOnce == 0); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); } SECTION("CreateFullyIndexedPolycrystal has no background and eight distinct Features") @@ -128,6 +134,8 @@ TEST_CASE("SimplnxCore::SurfaceMeshingTestUtils", "[SimplnxCore][SurfaceMeshingT REQUIRE(distinctFeatures.count(6) == 1); REQUIRE(distinctFeatures.count(7) == 1); REQUIRE(distinctFeatures.count(8) == 1); + + UnitTest::CheckArraysInheritTupleDims(dataStructure); } SECTION("CreateAllBackground is entirely Feature Id 0") @@ -146,7 +154,7 @@ TEST_CASE("SimplnxCore::SurfaceMeshingTestUtils", "[SimplnxCore][SurfaceMeshingT { REQUIRE(featureIdsRef[i] == 0); } - } - UnitTest::CheckArraysInheritTupleDims(DataStructure{}); + UnitTest::CheckArraysInheritTupleDims(dataStructure); + } } diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp index 4768c5be06..0e4d1121ba 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp @@ -15,44 +15,19 @@ using namespace nx::core; namespace { -const DataPath k_ImageGeomPath({"ImageGeom"}); -const DataPath k_FeatureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); const DataPath k_TriangleGeomPath({"SurfaceNets"}); -// Runs SurfaceNets on the flush cylinder and returns the distinct {comp0, comp1} label pairs. -std::set> RunAndCollectLabelPairs() +// Runs SurfaceNets on the flush cylinder, using the shared mesher-agnostic RunMesher helper (see +// SurfaceMeshingTestUtils.hpp) so the argument list is defined in one place instead of duplicated +// per test file. +SurfaceMeshingTest::MeshResult RunSurfaceNetsForFaceLabels() { - DataStructure dataStructure = SurfaceMeshingTest::CreateCylinderInBox(true); - - SurfaceNetsFilter filter; - Arguments args; - args.insertOrAssign(SurfaceNetsFilter::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); - args.insertOrAssign(SurfaceNetsFilter::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); - args.insertOrAssign(SurfaceNetsFilter::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); - args.insertOrAssign(SurfaceNetsFilter::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); - args.insertOrAssign(SurfaceNetsFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(k_TriangleGeomPath)); - args.insertOrAssign(SurfaceNetsFilter::k_VertexDataGroupName_Key, std::make_any("Vertex Data")); - args.insertOrAssign(SurfaceNetsFilter::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); - args.insertOrAssign(SurfaceNetsFilter::k_FaceDataGroupName_Key, std::make_any("Face Data")); - args.insertOrAssign(SurfaceNetsFilter::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); - args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); - args.insertOrAssign(SurfaceNetsFilter::k_RepairTriangleWinding_Key, std::make_any(false)); - - auto preflightResult = filter.preflight(dataStructure, args); - SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); - auto executeResult = filter.execute(dataStructure, args); - SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); - - const DataPath faceLabelsPath = k_TriangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); - REQUIRE_NOTHROW(dataStructure.getDataRefAs(faceLabelsPath)); - const auto& faceLabelsRef = dataStructure.getDataRefAs(faceLabelsPath).getDataStoreRef(); - - std::set> labelPairs; - for(usize i = 0; i < faceLabelsRef.getNumberOfTuples(); i++) - { - labelPairs.insert({faceLabelsRef[i * 2], faceLabelsRef[i * 2 + 1]}); - } - return labelPairs; + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_TriangleGeomPath, false, [](Arguments& args) { + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); + args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); + args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); + }); } } // namespace @@ -60,7 +35,8 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Face Label conventions", "[SimplnxCor { UnitTest::LoadPlugins(); - const std::set> labelPairs = RunAndCollectLabelPairs(); + SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNetsForFaceLabels(); + const std::set> labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); // The cylinder wall separates background (0) from the cylinder (1). CHECK(labelPairs.count({0, 1}) == 1); @@ -70,4 +46,6 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Face Label conventions", "[SimplnxCor CHECK(labelPairs.count({-1, 1}) == 1); // The buggy {-1,-1} pair must not appear. CHECK(labelPairs.count({-1, -1}) == 0); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); } diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp index abf9872dc3..891794a272 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp @@ -19,37 +19,28 @@ using namespace nx::core; namespace { -const DataPath k_ImageGeomPath({"ImageGeom"}); -const DataPath k_FeatureIdsPath({"ImageGeom", "CellData", "FeatureIds"}); +const DataPath k_SurfaceNetsTriangleGeomPath({"SurfaceNets"}); +const DataPath k_QuickMeshTriangleGeomPath({"QuickMesh"}); -// Returns the set of distinct Node Type values produced by SurfaceNets on the flush cylinder. -std::set RunSurfaceNetsNodeTypes() +// Runs SurfaceNets on the flush cylinder, using the shared mesher-agnostic RunMesher helper (see +// SurfaceMeshingTestUtils.hpp) so the argument list is defined in one place instead of duplicated +// per test file. +SurfaceMeshingTest::MeshResult RunSurfaceNetsForNodeTypes() { - DataStructure dataStructure = SurfaceMeshingTest::CreateCylinderInBox(true); - const DataPath triangleGeomPath({"SurfaceNets"}); - - SurfaceNetsFilter filter; - Arguments args; - args.insertOrAssign(SurfaceNetsFilter::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); - args.insertOrAssign(SurfaceNetsFilter::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); - args.insertOrAssign(SurfaceNetsFilter::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); - args.insertOrAssign(SurfaceNetsFilter::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); - args.insertOrAssign(SurfaceNetsFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(triangleGeomPath)); - args.insertOrAssign(SurfaceNetsFilter::k_VertexDataGroupName_Key, std::make_any("Vertex Data")); - args.insertOrAssign(SurfaceNetsFilter::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); - args.insertOrAssign(SurfaceNetsFilter::k_FaceDataGroupName_Key, std::make_any("Face Data")); - args.insertOrAssign(SurfaceNetsFilter::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); - args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); - args.insertOrAssign(SurfaceNetsFilter::k_RepairTriangleWinding_Key, std::make_any(false)); - - auto preflightResult = filter.preflight(dataStructure, args); - SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); - auto executeResult = filter.execute(dataStructure, args); - SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); - - const DataPath nodeTypesPath = triangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); - REQUIRE_NOTHROW(dataStructure.getDataRefAs(nodeTypesPath)); - const auto& nodeTypesRef = dataStructure.getDataRefAs(nodeTypesPath).getDataStoreRef(); + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_SurfaceNetsTriangleGeomPath, false, [](Arguments& args) { + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); + args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); + args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); + }); +} + +// Returns the set of distinct Node Type values present in meshResult's Vertex Data/NodeTypes array. +std::set CollectNodeTypeValues(const SurfaceMeshingTest::MeshResult& meshResult) +{ + const DataPath nodeTypesPath = meshResult.TriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(nodeTypesPath)); + const auto& nodeTypesRef = meshResult.Structure.getDataRefAs(nodeTypesPath).getDataStoreRef(); std::set distinctValues; for(usize i = 0; i < nodeTypesRef.getNumberOfTuples(); i++) @@ -64,7 +55,8 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Node Types follow the NodeType conven { UnitTest::LoadPlugins(); - const std::set distinctValues = RunSurfaceNetsNodeTypes(); + SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNetsForNodeTypes(); + const std::set distinctValues = CollectNodeTypeValues(meshResult); // Only the shared convention values may appear: 2/3/4 interior, 12/13/14 on the box wall. const std::set allowedValues = {NodeType::Default, NodeType::TriplePoint, NodeType::QuadPoint, NodeType::SurfaceDefault, NodeType::SurfaceTriplePoint, NodeType::SurfaceQuadPoint}; @@ -80,6 +72,8 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Node Types follow the NodeType conven // 0 must never appear -- it means NodeType::Unused. REQUIRE(distinctValues.count(0) == 0); + + UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); } TEST_CASE("SimplnxCore::SurfaceNetsFilter: Node Types agree with QuickSurfaceMesh", "[SimplnxCore][SurfaceNetsFilter]") @@ -90,64 +84,27 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Node Types agree with QuickSurfaceMes // both derive the node type from the same 8 surrounding voxels. With smoothing disabled // the values must agree corner-for-corner. This is the check that proves the equivalence // argument in the design spec rather than trusting it. - DataStructure surfaceNetsStructure = SurfaceMeshingTest::CreateCylinderInBox(true); - DataStructure quickMeshStructure = SurfaceMeshingTest::CreateCylinderInBox(true); - - const DataPath surfaceNetsPath({"SurfaceNets"}); - const DataPath quickMeshPath({"QuickMesh"}); - - { - SurfaceNetsFilter filter; - Arguments args; - args.insertOrAssign(SurfaceNetsFilter::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); - args.insertOrAssign(SurfaceNetsFilter::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); - args.insertOrAssign(SurfaceNetsFilter::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); - args.insertOrAssign(SurfaceNetsFilter::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); - args.insertOrAssign(SurfaceNetsFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(surfaceNetsPath)); - args.insertOrAssign(SurfaceNetsFilter::k_VertexDataGroupName_Key, std::make_any("Vertex Data")); - args.insertOrAssign(SurfaceNetsFilter::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); - args.insertOrAssign(SurfaceNetsFilter::k_FaceDataGroupName_Key, std::make_any("Face Data")); - args.insertOrAssign(SurfaceNetsFilter::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); - args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); - args.insertOrAssign(SurfaceNetsFilter::k_RepairTriangleWinding_Key, std::make_any(false)); - - auto preflightResult = filter.preflight(surfaceNetsStructure, args); - SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); - auto executeResult = filter.execute(surfaceNetsStructure, args); - SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); - } - - { - QuickSurfaceMeshFilter filter; - Arguments args; - args.insertOrAssign(QuickSurfaceMeshFilter::k_GridGeometryDataPath_Key, std::make_any(k_ImageGeomPath)); - args.insertOrAssign(QuickSurfaceMeshFilter::k_CellFeatureIdsArrayPath_Key, std::make_any(k_FeatureIdsPath)); - args.insertOrAssign(QuickSurfaceMeshFilter::k_SelectedDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); - args.insertOrAssign(QuickSurfaceMeshFilter::k_SelectedFeatureDataArrayPaths_Key, std::make_any(MultiArraySelectionParameter::ValueType())); - args.insertOrAssign(QuickSurfaceMeshFilter::k_CreatedTriangleGeometryPath_Key, std::make_any(quickMeshPath)); - args.insertOrAssign(QuickSurfaceMeshFilter::k_VertexDataGroupName_Key, std::make_any("Vertex Data")); - args.insertOrAssign(QuickSurfaceMeshFilter::k_NodeTypesArrayName_Key, std::make_any("NodeTypes")); - args.insertOrAssign(QuickSurfaceMeshFilter::k_FaceDataGroupName_Key, std::make_any("Face Data")); - args.insertOrAssign(QuickSurfaceMeshFilter::k_FaceLabelsArrayName_Key, std::make_any("FaceLabels")); - args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); - args.insertOrAssign(QuickSurfaceMeshFilter::k_RepairTriangleWinding_Key, std::make_any(false)); - - auto preflightResult = filter.preflight(quickMeshStructure, args); - SIMPLNX_RESULT_REQUIRE_VALID(preflightResult.outputActions); - auto executeResult = filter.execute(quickMeshStructure, args); - SIMPLNX_RESULT_REQUIRE_VALID(executeResult.result); - } + SurfaceMeshingTest::MeshResult surfaceNetsResult = RunSurfaceNetsForNodeTypes(); + SurfaceMeshingTest::MeshResult quickMeshResult = + SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_QuickMeshTriangleGeomPath, false, + [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); // Both meshers should produce the same number of nodes, since both emit one per grid // corner where two or more Features meet. - const auto& snGeom = surfaceNetsStructure.getDataRefAs(surfaceNetsPath); - const auto& qsmGeom = quickMeshStructure.getDataRefAs(quickMeshPath); + REQUIRE_NOTHROW(surfaceNetsResult.Structure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); + REQUIRE_NOTHROW(quickMeshResult.Structure.getDataRefAs(k_QuickMeshTriangleGeomPath)); + const auto& snGeom = surfaceNetsResult.Structure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); + const auto& qsmGeom = quickMeshResult.Structure.getDataRefAs(k_QuickMeshTriangleGeomPath); REQUIRE(snGeom.getNumberOfVertices() == qsmGeom.getNumberOfVertices()); const auto& snVertsRef = snGeom.getVertices()->getDataStoreRef(); const auto& qsmVertsRef = qsmGeom.getVertices()->getDataStoreRef(); - const auto& snTypesRef = surfaceNetsStructure.getDataRefAs(surfaceNetsPath.createChildPath("Vertex Data").createChildPath("NodeTypes")).getDataStoreRef(); - const auto& qsmTypesRef = quickMeshStructure.getDataRefAs(quickMeshPath.createChildPath("Vertex Data").createChildPath("NodeTypes")).getDataStoreRef(); + const DataPath snNodeTypesPath = k_SurfaceNetsTriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + const DataPath qsmNodeTypesPath = k_QuickMeshTriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + REQUIRE_NOTHROW(surfaceNetsResult.Structure.getDataRefAs(snNodeTypesPath)); + REQUIRE_NOTHROW(quickMeshResult.Structure.getDataRefAs(qsmNodeTypesPath)); + const auto& snTypesRef = surfaceNetsResult.Structure.getDataRefAs(snNodeTypesPath).getDataStoreRef(); + const auto& qsmTypesRef = quickMeshResult.Structure.getDataRefAs(qsmNodeTypesPath).getDataStoreRef(); // Exact, corner-for-corner comparison: the two meshers number their nodes in different orders // (a histogram comparison alone would pass under a permutation of values across corners), so key @@ -178,4 +135,7 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Node Types agree with QuickSurfaceMes } INFO("Total mismatching vertices: " << mismatchCount << " / " << snTypesRef.getNumberOfTuples() << (mismatchCount > 0 ? (" -- first mismatch at " + firstMismatch.str()) : std::string{})); REQUIRE(mismatchCount == 0); + + UnitTest::CheckArraysInheritTupleDims(surfaceNetsResult.Structure); + UnitTest::CheckArraysInheritTupleDims(quickMeshResult.Structure); } diff --git a/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp b/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp index 2de12b7ccd..1a14cc7911 100644 --- a/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp +++ b/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp @@ -403,16 +403,16 @@ void MeshingUtilities::CalculateNormalsImpl::operator()(const nx::core::Range& r Result<> MeshingUtilities::MakeEmptyMeshWarning(const DataPath& triangleGeomPath, usize numCells, usize numVertices) { return MakeWarningVoidResult(k_EmptyMeshAfterSkinRemovalWarning, - fmt::format("'Omit Bounding Box Skin' removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 (background), so there is no internal " - "interface and no Feature to cap. The Triangle Geometry now has 0 faces and {} vertices remaining.", + fmt::format("The 'Bounding Box Skin' option's 'Background-Backed Walls Only' mode removed every face of geometry '{}'. All {} cells of the input have Feature Id 0 " + "(background), so there is no internal interface and no Feature to cap. The Triangle Geometry now has 0 faces and {} vertices remaining.", triangleGeomPath.toString(), numCells, numVertices)); } Result<> MeshingUtilities::MakeNoFacesPrunedWarning(const DataPath& triangleGeomPath) { return MakeWarningVoidResult(k_NoFacesPrunedWarning, - fmt::format("'Omit Bounding Box Skin' removed 0 faces of geometry '{}' because the input volume contains no background (Feature Id 0) voxels. There is nothing " - "for this option to prune on this input; the output is identical to leaving it off.", + fmt::format("The 'Bounding Box Skin' option's 'Background-Backed Walls Only' mode removed 0 faces of geometry '{}' because the input volume contains no background " + "(Feature Id 0) voxels. There is nothing for this option to prune on this input; the output is identical to leaving it off.", triangleGeomPath.toString())); } diff --git a/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp b/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp index 75997ca580..5bc3b4acbb 100644 --- a/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp +++ b/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp @@ -25,16 +25,18 @@ inline constexpr ChoicesParameter::ValueType k_BackgroundBackedWallsOnly = 1; namespace nx::core::MeshingUtilities { /** - * @brief Warning emitted when 'Omit Bounding Box Skin' (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) - * removes every face of the mesh -- i.e. the input is entirely background (Feature Id 0), so there is no - * internal interface and no Feature to cap any box wall. Shared verbatim by QuickSurfaceMesh, SurfaceNets, - * and M3CSurfaceMeshing so the warning text and code are defined exactly once. See MakeEmptyMeshWarning(). + * @brief Warning emitted when the 'Bounding Box Skin' option's 'Background-Backed Walls Only' mode + * (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) removes every face of the mesh -- i.e. the input is + * entirely background (Feature Id 0), so there is no internal interface and no Feature to cap any box + * wall. Shared verbatim by QuickSurfaceMesh, SurfaceNets, and M3CSurfaceMeshing so the warning text and + * code are defined exactly once. See MakeEmptyMeshWarning(). */ inline constexpr int32 k_EmptyMeshAfterSkinRemovalWarning = -56340; /** - * @brief Warning emitted when 'Omit Bounding Box Skin' (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) - * is enabled but suppressed zero faces -- i.e. the input volume contains no background (Feature Id 0) + * @brief Warning emitted when the 'Bounding Box Skin' option's 'Background-Backed Walls Only' mode + * (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) is enabled but suppressed zero faces -- i.e. the + * input volume contains no background (Feature Id 0) * voxels, so the option had nothing to prune and the output is identical to leaving it off. This is the * most common dataset shape in practice, so silent no-feedback behavior here is not acceptable. See * MakeNoFacesPrunedWarning(). From 988107d47e0f4047c9edf369bece597083b02a0d Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Wed, 12 Aug 2026 17:09:04 -0400 Subject: [PATCH 22/24] DOC: Correct M3C orphan-vertex claim, document sentinel validation/watertightness, refresh stale example pipelines * M3CSurfaceMeshingFilter.md: the "clears all pre-existing orphan vertices" claim no longer matches finalizeMesh() -- the option now narrows its clear to only the vertices its own prune orphaned. Rewrote the note to describe the current behavior and why -56340 reports a remaining vertex count instead of assuming zero. * SurfaceNetsFilter.md: added the previously-undocumented Z-offset fix (Z component used Y spacing) to "Changed Behavior for Existing Pipelines". * All three mesher docs: documented the new -56342 no-op warning, the -56343 Feature Id sentinel validation error (with the accepted range per mesher), and the manifold-vs-non-manifold T-junction benefit asserted by OmitBoundingBoxSkinTest.cpp's cross-mesher conformance test. * QuickSurfaceMeshFilter.md: added the "exterior counts as an owner" Node Type explanation (parity with the other two mesher docs) and a note on Node Type stability across the prune. * LaplacianSmoothingFilter.md / HierarchicalSmoothFilter.md: noted that smoothing a Surface Nets mesh now behaves differently because Surface Nets' Node Types were corrected to the shared convention -- a correction, not a regression. * Round-tripped 5 stale example pipelines (Small IN100 Quick Mesh, Compute_Feature_Face_Curvature_Small_IN100, SurfaceNets_Demo, M3C_Demo, Porosity Mesh Export) through Pipeline::FromFile/toJson via the simplnx Python bindings, restoring the pinnedParams/ workflowParams GUI fields the core toJson() omits, to clear the -5432 "Parameter key not found" warnings this branch reintroduced. Signed-off-by: Michael Jackson --- .../(03) Porosity Mesh Export.d3dpipeline | 6 +- .../(05) Small IN100 Quick Mesh.d3dpipeline | 6 +- .../docs/HierarchicalSmoothFilter.md | 6 ++ .../docs/LaplacianSmoothingFilter.md | 7 ++ .../docs/M3CSurfaceMeshingFilter.md | 39 ++++++-- .../docs/QuickSurfaceMeshFilter.md | 33 ++++++- .../SimplnxCore/docs/SurfaceNetsFilter.md | 36 ++++++- ...ure_Face_Curvature_Small_IN100.d3dpipeline | 6 +- .../pipelines/M3C_Demo.d3dpipeline | 94 +++++++++++++++---- .../pipelines/SurfaceNets_Demo.d3dpipeline | 6 +- 10 files changed, 201 insertions(+), 38 deletions(-) diff --git a/src/Plugins/ITKImageProcessing/pipelines/(03) Porosity Mesh Export.d3dpipeline b/src/Plugins/ITKImageProcessing/pipelines/(03) Porosity Mesh Export.d3dpipeline index ad4c92030e..bc9a980bc7 100644 --- a/src/Plugins/ITKImageProcessing/pipelines/(03) Porosity Mesh Export.d3dpipeline +++ b/src/Plugins/ITKImageProcessing/pipelines/(03) Porosity Mesh Export.d3dpipeline @@ -252,6 +252,10 @@ }, { "args": { + "bounding_box_skin_mode_index": { + "value": 0, + "version": 1 + }, "face_data_group_name": { "value": "Face Data", "version": 1 @@ -288,7 +292,7 @@ "value": "TriangleDataContainer", "version": 1 }, - "parameters_version": 2, + "parameters_version": 3, "repair_triangle_winding": { "value": true, "version": 1 diff --git a/src/Plugins/OrientationAnalysis/pipelines/Small_IN100_Processing/(05) Small IN100 Quick Mesh.d3dpipeline b/src/Plugins/OrientationAnalysis/pipelines/Small_IN100_Processing/(05) Small IN100 Quick Mesh.d3dpipeline index 483fa71e4c..11a0f48f19 100644 --- a/src/Plugins/OrientationAnalysis/pipelines/Small_IN100_Processing/(05) Small IN100 Quick Mesh.d3dpipeline +++ b/src/Plugins/OrientationAnalysis/pipelines/Small_IN100_Processing/(05) Small IN100 Quick Mesh.d3dpipeline @@ -128,6 +128,10 @@ }, { "args": { + "bounding_box_skin_mode_index": { + "value": 0, + "version": 1 + }, "face_data_group_name": { "value": "Face Data", "version": 1 @@ -164,7 +168,7 @@ "value": "TriangleDataContainer", "version": 1 }, - "parameters_version": 2, + "parameters_version": 3, "repair_triangle_winding": { "value": true, "version": 1 diff --git a/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md b/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md index a0538686fc..0968997443 100644 --- a/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md +++ b/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md @@ -14,6 +14,12 @@ This **Filter** applies hierarchical smoothing to a triangle surface mesh repres This hierarchical approach preserves the topology of the grain boundary network while producing smooth surfaces. The smoothing parameter is optimized via interval bisection to balance smoothness against displacement from the original mesh. +Because every stage above is driven by the Node Type value, smoothing a mesh produced by Create +Surface Mesh (Surface Nets) now behaves differently than it did previously: that **Filter**'s Node +Types were corrected to follow the `2`/`3`/`4`/`12`/`13`/`14` convention this **Filter** expects, +so vertices that were previously misclassified (and therefore held fixed or smoothed in the wrong +stage) are now classified correctly. This is a correction, not a regression. + Nodes that are displaced beyond the error threshold (a multiple of a reference edge length) are rejected and reset to their original positions. ## Algorithm Overview diff --git a/src/Plugins/SimplnxCore/docs/LaplacianSmoothingFilter.md b/src/Plugins/SimplnxCore/docs/LaplacianSmoothingFilter.md index fc52a99704..4383c33c1d 100644 --- a/src/Plugins/SimplnxCore/docs/LaplacianSmoothingFilter.md +++ b/src/Plugins/SimplnxCore/docs/LaplacianSmoothingFilter.md @@ -74,6 +74,13 @@ The values for the *Node Type* array can take one of the following values. If your surface mesh is lacking a `Node Type` array, you can simply create a DataArray inside the Vertex Data Attribute Matrix. The type should be "int8" and have an initialization value of 3. This will allow **all** nodes to move. +Any Node Type value not listed above (including `0`/`Unused`) leaves that vertex's lambda at `0.0`, +so the vertex does not move. Smoothing a mesh produced by Create Surface Mesh (Surface Nets) now +behaves differently than it did previously, because that **Filter**'s Node Types were corrected to +follow this convention: most vertices in a Surface Nets mesh were previously pinned in place +because their Node Type value did not match any of the cases above. This is a correction, not a +regression — those vertices are now free to move as their Node Type intends. + For more information on surface meshing, visit the tutorial. % Auto generated parameter table will be inserted here diff --git a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md index e7eda60ed3..49d085c562 100644 --- a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md +++ b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md @@ -80,10 +80,20 @@ closure for a Feature flush with the box. A cylinder sitting flush with the box therefore comes out as a closed surface with no surrounding box. On a fully-indexed volume with no Feature Id 0 voxels, nothing is dropped and the option -has no effect — every boundary Feature already needs its wall cap to stay closed. +has no effect — every boundary Feature already needs its wall cap to stay closed. Rather than +silently doing nothing, the **Filter** reports this with a warning (code `-56342`): the option was +enabled but removed zero faces because the input has no background voxels for it to act on. Because the test is per-face rather than per-vertex, no triangles are lost along the rim -where an internal boundary meets the box wall. +where an internal boundary meets the box wall. With the option **off**, wherever an internal +Feature-Feature boundary meets the bounding box wall, three faces share that edge: the internal +boundary quad and the two wall quads on either side of it — a non-manifold T-junction that is +inherent to including the full box skin. With the option **on**, the background-backed wall quad +on that edge is dropped, leaving exactly two faces sharing it, which is manifold. The option +therefore does not merely remove unwanted geometry: in the configurations exercised by this +**Filter**'s cross-mesher conformance test (a cylinder **Feature** flush with the box wall, and a +**Feature** occupying a box corner), enabling it produces a watertight mesh where leaving it off +does not. This is not a universal guarantee of watertightness for arbitrary input. If every voxel in the volume is background (Feature Id 0), every face is a background-backed wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) @@ -91,14 +101,25 @@ and creates the **Triangle Geometry** with zero vertices and zero faces; this is success, not an error, because the input is legal — it simply contains no internal interface and no Feature to cap. +### Feature Id Validation + +Independently of the **Bounding Box Skin** setting, this **Filter** always rejects a **Feature +Ids** array that contains a negative value or a value equal to `INT32_MAX`, because both collide +with sentinel values M3C's algorithm uses internally to represent ghost cells and the outside of +the volume. A **Feature Id** must therefore be in the range `0` to `INT32_MAX - 1`. A rejected +value produces an error (code `-56343`) naming the offending value, its tuple index, and the +array's **Data Path**. This is a mitigation for the underlying sentinel-collision design (tracked +as issue #1705), not a fix for it. + **Note:** M3C's candidate-node generation always produces a handful of node entries near the -volume boundary that no triangle references, even with the option disabled — these orphan -vertices are present in stock M3C output. When the **Bounding Box Skin** option's **Background-Backed Walls Only** mode is enabled *and* at -least one wall face is actually pruned, M3C also clears those pre-existing orphan vertices, so -the output has no unreferenced vertices at all. When the option removes nothing (for example on -a fully-indexed volume), it remains a strict no-op and the orphans are left untouched. As a -result, enabling the option on data with any background-backed wall face can reduce the vertex -count by more than the number of removed faces alone would suggest. +volume boundary that no triangle references, even with the option disabled — these pre-existing +orphan vertices are present in stock M3C output regardless of the **Bounding Box Skin** setting +(tracked as issue #1706). The **Bounding Box Skin** option's **Background-Backed Walls Only** mode +does not touch them: it clears only the vertices that its own pruning orphans (vertices that were +referenced exclusively by a dropped wall face), and leaves every pre-existing orphan exactly as it +was. Consequently, on an all-background volume the pruned output is zero faces with those +pre-existing orphan vertices still present — which is why the `-56340` warning above reports the +remaining vertex count rather than assuming it is zero. ### Notes and Limitations diff --git a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md index 60c6d604ae..82d67d5194 100644 --- a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md +++ b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md @@ -56,6 +56,11 @@ NodeType = 4 One of the arrays to come out of the algorithm is the "Node Type" vertex array. This array uses a value to label each vertex as to what kind of node it was determined to be during the meshing process. +The value is the number of distinct **Features** meeting at the node, capped at 4, plus 10 when the +node lies on the outer surface of the bounding box. The region outside the volume counts as one of +those owners, which is why an ordinary vertex on the wall between the exterior and a single Feature +is `12` — two owners, one of them the exterior — rather than `11`. + | Value | Description | |-------|-------------| | 2 | Node within the interior of the grain face. | @@ -65,6 +70,10 @@ One of the arrays to come out of the algorithm is the "Node Type" vertex array. | 13 | Node that is on the exterior of the mesh and is a triple line | | 14 | Node that is on the exterior of the mesh and is a quadruple point | +When the **Bounding Box Skin** option below prunes wall faces, the Node Type of every surviving +vertex is unchanged from the value it had in the full (unpruned) mesh; this is asserted by a unit +test. Create Surface Mesh (M3C) offers no such guarantee. + ### Exterior or Boundary Triangles Each triangle that is created will have an 2 component attribute called `Face Labels` that represent the Feature ID on either @@ -110,10 +119,20 @@ closure for a Feature flush with the box. A cylinder sitting flush with the box therefore comes out as a closed surface with no surrounding box. On a fully-indexed volume with no Feature Id 0 voxels, nothing is dropped and the option -has no effect — every boundary Feature already needs its wall cap to stay closed. +has no effect — every boundary Feature already needs its wall cap to stay closed. Rather than +silently doing nothing, the **Filter** reports this with a warning (code `-56342`): the option was +enabled but removed zero faces because the input has no background voxels for it to act on. Because the test is per-face rather than per-vertex, no triangles are lost along the rim -where an internal boundary meets the box wall. +where an internal boundary meets the box wall. With the option **off**, wherever an internal +Feature-Feature boundary meets the bounding box wall, three faces share that edge: the internal +boundary quad and the two wall quads on either side of it — a non-manifold T-junction that is +inherent to including the full box skin. With the option **on**, the background-backed wall quad +on that edge is dropped, leaving exactly two faces sharing it, which is manifold. The option +therefore does not merely remove unwanted geometry: in the configurations exercised by this +**Filter**'s cross-mesher conformance test (a cylinder **Feature** flush with the box wall, and a +**Feature** occupying a box corner), enabling it produces a watertight mesh where leaving it off +does not. This is not a universal guarantee of watertightness for arbitrary input. If every voxel in the volume is background (Feature Id 0), every face is a background-backed wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) @@ -121,6 +140,16 @@ and creates the **Triangle Geometry** with zero vertices and zero faces; this is success, not an error, because the input is legal — it simply contains no internal interface and no Feature to cap. +### Feature Id Validation + +Independently of the **Bounding Box Skin** setting, this **Filter** always rejects a **Feature +Ids** array that contains a negative value, because negative values collide with an internal +ghost/exterior sentinel convention. A **Feature Id** must therefore be `>= 0` (this **Filter**, +unlike Create Surface Mesh (Surface Nets) and Create Surface Mesh (M3C), does not additionally +reject `INT32_MAX`). A rejected value produces an error (code `-56343`) naming the offending value, +its tuple index, and the array's **Data Path**. This is a mitigation for the underlying +sentinel-collision design (tracked as issue #1705), not a fix for it. + % Auto generated parameter table will be inserted here ## Example Pipelines diff --git a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md index f2d657089e..eeb7531c08 100644 --- a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md +++ b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md @@ -78,10 +78,16 @@ runs, with no parameter change on the user's part: exterior-node variants offset inconsistently. They now follow the shared convention described above (`2`/`3`/`4` for interior nodes, `12`/`13`/`14` on the bounding box wall), matching Create Surface Mesh (QuickMesh) and Create Surface Mesh (M3C). +- **Vertex Z coordinate on anisotropic spacing**: the half-voxel offset this **Filter** applies when + relocating each vertex used the **Y** spacing for the Z component instead of the **Z** spacing. + Every vertex's Z coordinate was wrong on any **Image Geometry** with anisotropic spacing (Z + spacing different from Y spacing); it is correct now. Volumes with isotropic spacing (all three + spacing values equal) were unaffected and see no change from this fix. -If you hand-tuned a Node Type range parameter against this **Filter**'s old values, or if you -compare newly generated output against previously stored SurfaceNets results, re-check it against -the tables above. +If you hand-tuned a Node Type range parameter against this **Filter**'s old values, if you rely on +smoothing **Filters** (Laplacian Smoothing, Hierarchical Smoothing) downstream that read Node +Types, or if you compare newly generated output against previously stored SurfaceNets results +generated on anisotropic-spacing data, re-check it against the corrected behavior above. ## Comparison of Surface Meshing Filters @@ -113,10 +119,20 @@ closure for a Feature flush with the box. A cylinder sitting flush with the box therefore comes out as a closed surface with no surrounding box. On a fully-indexed volume with no Feature Id 0 voxels, nothing is dropped and the option -has no effect — every boundary Feature already needs its wall cap to stay closed. +has no effect — every boundary Feature already needs its wall cap to stay closed. Rather than +silently doing nothing, the **Filter** reports this with a warning (code `-56342`): the option was +enabled but removed zero faces because the input has no background voxels for it to act on. Because the test is per-face rather than per-vertex, no triangles are lost along the rim -where an internal boundary meets the box wall. +where an internal boundary meets the box wall. With the option **off**, wherever an internal +Feature-Feature boundary meets the bounding box wall, three faces share that edge: the internal +boundary quad and the two wall quads on either side of it — a non-manifold T-junction that is +inherent to including the full box skin. With the option **on**, the background-backed wall quad +on that edge is dropped, leaving exactly two faces sharing it, which is manifold. The option +therefore does not merely remove unwanted geometry: in the configurations exercised by this +**Filter**'s cross-mesher conformance test (a cylinder **Feature** flush with the box wall, and a +**Feature** occupying a box corner), enabling it produces a watertight mesh where leaving it off +does not. This is not a universal guarantee of watertightness for arbitrary input. If every voxel in the volume is background (Feature Id 0), every face is a background-backed wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) @@ -124,6 +140,16 @@ and creates the **Triangle Geometry** with zero vertices and zero faces; this is success, not an error, because the input is legal — it simply contains no internal interface and no Feature to cap. +### Feature Id Validation + +Independently of the **Bounding Box Skin** setting, this **Filter** always rejects a **Feature +Ids** array that contains a negative value or a value equal to `INT32_MAX`, because both collide +with sentinel values this **Filter**'s underlying `MMSurfaceNet` implementation uses internally to +mark padding. A **Feature Id** must therefore be in the range `0` to `INT32_MAX - 1`. A rejected +value produces an error (code `-56343`) naming the offending value, its tuple index, and the +array's **Data Path**. This is a mitigation for the underlying sentinel-collision design (tracked +as issue #1705), not a fix for it. + % Auto generated parameter table will be inserted here ## Example Pipelines diff --git a/src/Plugins/SimplnxCore/pipelines/Compute_Feature_Face_Curvature_Small_IN100.d3dpipeline b/src/Plugins/SimplnxCore/pipelines/Compute_Feature_Face_Curvature_Small_IN100.d3dpipeline index 9c4cead2d8..2c0a1a0803 100644 --- a/src/Plugins/SimplnxCore/pipelines/Compute_Feature_Face_Curvature_Small_IN100.d3dpipeline +++ b/src/Plugins/SimplnxCore/pipelines/Compute_Feature_Face_Curvature_Small_IN100.d3dpipeline @@ -158,6 +158,10 @@ "value": true, "version": 1 }, + "bounding_box_skin_mode_index": { + "value": 0, + "version": 1 + }, "face_data_group_name": { "value": "Face Data", "version": 1 @@ -194,7 +198,7 @@ "value": "TriangleDataContainer", "version": 1 }, - "parameters_version": 1, + "parameters_version": 2, "relaxation_factor": { "value": 0.5, "version": 1 diff --git a/src/Plugins/SimplnxCore/pipelines/M3C_Demo.d3dpipeline b/src/Plugins/SimplnxCore/pipelines/M3C_Demo.d3dpipeline index 8ec624b6cb..23ee26d731 100644 --- a/src/Plugins/SimplnxCore/pipelines/M3C_Demo.d3dpipeline +++ b/src/Plugins/SimplnxCore/pipelines/M3C_Demo.d3dpipeline @@ -13,6 +13,14 @@ "value": false, "version": 1 }, + "change_origin": { + "value": false, + "version": 1 + }, + "change_spacing": { + "value": false, + "version": 1 + }, "color_weights": { "value": [ 0.21250000596046448, @@ -25,6 +33,40 @@ "value": false, "version": 1 }, + "cropping_options": { + "value": { + "bounds_x_physical": [ + 0.0, + 0.0 + ], + "bounds_x_voxels": [ + 0, + 0 + ], + "bounds_y_physical": [ + 0.0, + 0.0 + ], + "bounds_y_voxels": [ + 0, + 0 + ], + "bounds_z_physical": [ + 0.0, + 0.0 + ], + "bounds_z_voxels": [ + 0, + 0 + ], + "crop_x": true, + "crop_y": true, + "crop_z": true, + "is_2d": false, + "type": 0 + }, + "version": 1 + }, "exact_xy_dimensions": { "value": [ 100, @@ -66,6 +108,10 @@ ], "version": 1 }, + "origin_spacing_processing_index": { + "value": 1, + "version": 1 + }, "output_image_geometry_path": { "value": "RoboMet.3D Image Stack", "version": 1 @@ -206,8 +252,16 @@ }, { "args": { - "input_grid_geometry_path": { - "value": "RoboMet.3D Image Stack", + "bounding_box_skin_mode_index": { + "value": 0, + "version": 1 + }, + "face_data_group_name": { + "value": "Face Data", + "version": 1 + }, + "face_labels_array_name": { + "value": "FaceLabels", "version": 1 }, "feature_ids_path": { @@ -222,31 +276,27 @@ "value": [], "version": 1 }, - "repair_triangle_winding": { - "value": true, - "version": 1 - }, - "output_triangle_geometry_path": { - "value": "TriangleDataContainer", - "version": 1 - }, - "vertex_data_group_name": { - "value": "Vertex Data", + "input_grid_geometry_path": { + "value": "RoboMet.3D Image Stack", "version": 1 }, "node_types_array_name": { "value": "NodeTypes", "version": 1 }, - "face_data_group_name": { - "value": "Face Data", + "output_triangle_geometry_path": { + "value": "TriangleDataContainer", "version": 1 }, - "face_labels_array_name": { - "value": "FaceLabels", + "parameters_version": 2, + "repair_triangle_winding": { + "value": true, "version": 1 }, - "parameters_version": 1 + "vertex_data_group_name": { + "value": "Vertex Data", + "version": 1 + } }, "comments": "", "filter": { @@ -257,11 +307,19 @@ }, { "args": { + "compression_level": { + "value": 5, + "version": 1 + }, "export_file_path": { "value": "Data/Output/SurfaceMesh/M3C_Demo.dream3d", "version": 1 }, - "parameters_version": 1, + "parameters_version": 2, + "use_compression": { + "value": true, + "version": 1 + }, "write_xdmf_file": { "value": true, "version": 1 diff --git a/src/Plugins/SimplnxCore/pipelines/SurfaceNets_Demo.d3dpipeline b/src/Plugins/SimplnxCore/pipelines/SurfaceNets_Demo.d3dpipeline index 97256e6470..59218e6166 100644 --- a/src/Plugins/SimplnxCore/pipelines/SurfaceNets_Demo.d3dpipeline +++ b/src/Plugins/SimplnxCore/pipelines/SurfaceNets_Demo.d3dpipeline @@ -256,6 +256,10 @@ "value": true, "version": 1 }, + "bounding_box_skin_mode_index": { + "value": 0, + "version": 1 + }, "face_data_group_name": { "value": "Face Data", "version": 1 @@ -292,7 +296,7 @@ "value": "TriangleDataContainer", "version": 1 }, - "parameters_version": 1, + "parameters_version": 2, "relaxation_factor": { "value": 0.5, "version": 1 From f8f68c06f1ab6ad7bd1d4134c3aa57a5b9161f87 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Wed, 12 Aug 2026 19:10:48 -0400 Subject: [PATCH 23/24] DOC: Fix incorrect Unused NodeType constant and inverted bisection description LaplacianSmoothingFilter.md had a stale DREAM3D 6.x NodeType table (SurfaceMesh namespace, Unused = -1) and a sentence reconciled to it instead of to the actual code, where nx::core::NodeType::Unused is 0. Corrected the table and sentence to match INodeGeometry2D.hpp and LaplacianSmoothing.cpp's switch statement. HierarchicalSmoothFilter.md described the interval-bisection loop's halt condition backwards relative to HierarchicalSmooth.cpp's smooth(): the loop continues while the objective's slope is significant and halts once it goes flat (converged), not the reverse. Kept the M3CSurfaceMeshingFilter.md edit from a prior interrupted sweep, which correctly distinguishes M3C's zero-faces-but-not-necessarily-zero-vertices degenerate case from QuickSurfaceMesh/SurfaceNets. Also reviewed QuickSurfaceMeshFilter.md, SurfaceNetsFilter.md, and ExtractInternalSurfacesFromTriangleGeometryFilter.md end to end against source and tests; no further discrepancies found. Docs build remains at the 7 pre-existing warnings baseline; ctest SimplnxCore:: remains 974/974. Co-Authored-By: Claude Opus 5 --- .../SimplnxCore/docs/HierarchicalSmoothFilter.md | 8 ++++---- .../SimplnxCore/docs/LaplacianSmoothingFilter.md | 16 ++++++++-------- .../SimplnxCore/docs/M3CSurfaceMeshingFilter.md | 8 +++++--- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md b/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md index 0968997443..9c724af68d 100644 --- a/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md +++ b/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md @@ -54,10 +54,10 @@ where `I` is the identity matrix, `L` is the reduced graph Laplacian, `y_origina The algorithm uses **interval bisection** to find the optimal `epsilon`: -1. Start at `epsilon = 0.5`. -2. Compute a numerical derivative of the objective function (the total Laplacian residual energy). -3. If the derivative is near zero (flat region), the current `epsilon` is not in the active tradeoff zone. Halve `epsilon` and try again. -4. Repeat until either a significant slope is found or the iteration limit is reached. +1. Start at `epsilon = 0.5`, with a step size of `epsilon / 2`. +2. Compute a numerical derivative (slope) of the objective function (the total Laplacian residual energy) at the current `epsilon`. +3. If the slope's magnitude is still significant, step `epsilon` up or down (in the direction that reduces the slope) by the current step size, then halve the step size. +4. Repeat until the slope's magnitude falls below the convergence threshold (a flat region — the optimal `epsilon` has been found) or the iteration limit is reached. The **Max Bisection Iterations** parameter controls how many halvings are attempted. The default value of **53** comes from `log2(10^16) ~ 53`, which is the number of bisection steps needed to resolve a double-precision floating point value to machine epsilon. In practice, the search often converges in far fewer iterations because it terminates early once a significant slope is detected. diff --git a/src/Plugins/SimplnxCore/docs/LaplacianSmoothingFilter.md b/src/Plugins/SimplnxCore/docs/LaplacianSmoothingFilter.md index 4383c33c1d..b412eac23a 100644 --- a/src/Plugins/SimplnxCore/docs/LaplacianSmoothingFilter.md +++ b/src/Plugins/SimplnxCore/docs/LaplacianSmoothingFilter.md @@ -60,15 +60,15 @@ At the conclusion of the filter these extra internal arrays will be reclaimed by The values for the *Node Type* array can take one of the following values. - namespace SurfaceMesh { + namespace nx::core { namespace NodeType { - const int8_t Unused = -1; - const int8_t Default = 2; - const int8_t TriplePoint = 3; - const int8_t QuadPoint = 4; - const int8_t SurfaceDefault = 12; - const int8_t SurfaceTriplePoint = 13; - const int8_t SurfaceQuadPoint = 14; + inline constexpr int8_t Unused = 0; + inline constexpr int8_t Default = 2; + inline constexpr int8_t TriplePoint = 3; + inline constexpr int8_t QuadPoint = 4; + inline constexpr int8_t SurfaceDefault = 12; + inline constexpr int8_t SurfaceTriplePoint = 13; + inline constexpr int8_t SurfaceQuadPoint = 14; } } diff --git a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md index 49d085c562..f8d7cc96bf 100644 --- a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md +++ b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md @@ -97,9 +97,11 @@ does not. This is not a universal guarantee of watertightness for arbitrary inpu If every voxel in the volume is background (Feature Id 0), every face is a background-backed wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) -and creates the **Triangle Geometry** with zero vertices and zero faces; this is treated as -success, not an error, because the input is legal — it simply contains no internal interface -and no Feature to cap. +and creates the **Triangle Geometry** with zero faces. Unlike Create Surface Mesh (QuickMesh) and +Surface Nets, this is **not** zero vertices for M3C: as described in the note below, M3C's +candidate-node generation leaves a handful of pre-existing orphan vertices that the option's +pruning does not clear, so they remain in the output. This is treated as success, not an error, +because the input is legal — it simply contains no internal interface and no Feature to cap. ### Feature Id Validation From d754c27f5f58110d03e0ea4088d4d1e2720f8a95 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Thu, 13 Aug 2026 09:57:53 -0400 Subject: [PATCH 24/24] FIX: correct wall-face warning wording, add cancellable sentinel scan, address remaining review nits Final review-gate fixes for Omit Bounding Box Skin: - Restate the -56342 warning (code, doc comment, and all three mesher docs) to say only what is measured -- no bounding-box wall face is background-backed -- not that the volume has no background voxels. Add CreateEnclosedPorosity() and a covering test for the interior-porosity counterexample this distinction depends on. - Fix the remaining "terminates early" self-contradiction in HierarchicalSmoothFilter.md. - Make ValidateFeatureIdsAgainstSentinels report progress and poll cancellation every 1M tuples instead of running an uninterruptible, silent full-volume scan; update all three call sites. - Correct the corner-case test attribution in the mesher docs, add absolute label-pair assertions to the cross-mesher agreement test, use the named M3CNodeType::k_Unused instead of a literal 0, pass the named BoundingBoxSkinMode constants instead of bool literals at every RunMesher call site, and finish the REQUIRE_NOTHROW/CheckArraysInheritTupleDims hygiene sweep. - Reserve droppedNodeIds before M3C's orphan-node compaction loop, and drop TriangleUtilities.hpp's ChoicesParameter.hpp include now that the mode constants are plain uint64. Co-Authored-By: Claude Fable 5 --- .../docs/HierarchicalSmoothFilter.md | 2 +- .../docs/M3CSurfaceMeshingFilter.md | 17 +- .../docs/QuickSurfaceMeshFilter.md | 17 +- .../SimplnxCore/docs/SurfaceNetsFilter.md | 17 +- .../Filters/Algorithms/M3CSurfaceMeshing.cpp | 19 +- .../Filters/Algorithms/QuickSurfaceMesh.cpp | 2 +- .../Filters/Algorithms/SurfaceNets.cpp | 2 +- ...ternalSurfacesFromTriangleGeometryTest.cpp | 11 +- .../test/M3CSurfaceMeshingTest.cpp | 4 +- .../test/OmitBoundingBoxSkinTest.cpp | 255 +++++++++++++----- .../test/SurfaceMeshingTestUtils.hpp | 43 +++ .../test/SurfaceNetsFaceLabelsTest.cpp | 3 +- .../test/SurfaceNetsNodeTypesTest.cpp | 5 +- .../SimplnxCore/test/SurfaceNetsTest.cpp | 3 +- .../Utilities/Meshing/TriangleUtilities.cpp | 20 +- .../Utilities/Meshing/TriangleUtilities.hpp | 31 ++- 16 files changed, 341 insertions(+), 110 deletions(-) diff --git a/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md b/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md index 9c724af68d..7563ca7b22 100644 --- a/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md +++ b/src/Plugins/SimplnxCore/docs/HierarchicalSmoothFilter.md @@ -59,7 +59,7 @@ The algorithm uses **interval bisection** to find the optimal `epsilon`: 3. If the slope's magnitude is still significant, step `epsilon` up or down (in the direction that reduces the slope) by the current step size, then halve the step size. 4. Repeat until the slope's magnitude falls below the convergence threshold (a flat region — the optimal `epsilon` has been found) or the iteration limit is reached. -The **Max Bisection Iterations** parameter controls how many halvings are attempted. The default value of **53** comes from `log2(10^16) ~ 53`, which is the number of bisection steps needed to resolve a double-precision floating point value to machine epsilon. In practice, the search often converges in far fewer iterations because it terminates early once a significant slope is detected. +The **Max Bisection Iterations** parameter controls how many halvings are attempted. The default value of **53** comes from `log2(10^16) ~ 53`, which is the number of bisection steps needed to resolve a double-precision floating point value to machine epsilon. In practice, the search often converges in far fewer iterations because it stops as soon as the slope flattens out below the convergence threshold, well before the iteration limit is reached. **Practical guidance:** diff --git a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md index f8d7cc96bf..90fa238535 100644 --- a/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md +++ b/src/Plugins/SimplnxCore/docs/M3CSurfaceMeshingFilter.md @@ -80,9 +80,13 @@ closure for a Feature flush with the box. A cylinder sitting flush with the box therefore comes out as a closed surface with no surrounding box. On a fully-indexed volume with no Feature Id 0 voxels, nothing is dropped and the option -has no effect — every boundary Feature already needs its wall cap to stay closed. Rather than -silently doing nothing, the **Filter** reports this with a warning (code `-56342`): the option was -enabled but removed zero faces because the input has no background voxels for it to act on. +has no effect — every boundary Feature already needs its wall cap to stay closed. The same warning +also fires on a volume whose background is fully enclosed as interior porosity: no bounding-box +wall voxel is background-backed even though the volume is full of Feature Id 0 internally, so the +option again drops nothing. Rather than silently doing nothing, the **Filter** reports this with a +warning (code `-56342`): no bounding-box **wall** face is backed by background, so the option has +nothing to prune on this input. The warning says nothing about whether the volume contains +background elsewhere — only that none of it borders a wall. Because the test is per-face rather than per-vertex, no triangles are lost along the rim where an internal boundary meets the box wall. With the option **off**, wherever an internal @@ -91,9 +95,10 @@ boundary quad and the two wall quads on either side of it — a non-manifold T-j inherent to including the full box skin. With the option **on**, the background-backed wall quad on that edge is dropped, leaving exactly two faces sharing it, which is manifold. The option therefore does not merely remove unwanted geometry: in the configurations exercised by this -**Filter**'s cross-mesher conformance test (a cylinder **Feature** flush with the box wall, and a -**Feature** occupying a box corner), enabling it produces a watertight mesh where leaving it off -does not. This is not a universal guarantee of watertightness for arbitrary input. +**Filter**'s cross-mesher conformance test (a cylinder **Feature** flush with the box wall) and by +a separate corner-Feature test (a **Feature** occupying a box corner where three suppressed wall +planes meet), enabling it produces a watertight mesh where leaving it off does not. This is not a +universal guarantee of watertightness for arbitrary input. If every voxel in the volume is background (Feature Id 0), every face is a background-backed wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) diff --git a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md index 82d67d5194..f97ad9b4b3 100644 --- a/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md +++ b/src/Plugins/SimplnxCore/docs/QuickSurfaceMeshFilter.md @@ -119,9 +119,13 @@ closure for a Feature flush with the box. A cylinder sitting flush with the box therefore comes out as a closed surface with no surrounding box. On a fully-indexed volume with no Feature Id 0 voxels, nothing is dropped and the option -has no effect — every boundary Feature already needs its wall cap to stay closed. Rather than -silently doing nothing, the **Filter** reports this with a warning (code `-56342`): the option was -enabled but removed zero faces because the input has no background voxels for it to act on. +has no effect — every boundary Feature already needs its wall cap to stay closed. The same warning +also fires on a volume whose background is fully enclosed as interior porosity: no bounding-box +wall voxel is background-backed even though the volume is full of Feature Id 0 internally, so the +option again drops nothing. Rather than silently doing nothing, the **Filter** reports this with a +warning (code `-56342`): no bounding-box **wall** face is backed by background, so the option has +nothing to prune on this input. The warning says nothing about whether the volume contains +background elsewhere — only that none of it borders a wall. Because the test is per-face rather than per-vertex, no triangles are lost along the rim where an internal boundary meets the box wall. With the option **off**, wherever an internal @@ -130,9 +134,10 @@ boundary quad and the two wall quads on either side of it — a non-manifold T-j inherent to including the full box skin. With the option **on**, the background-backed wall quad on that edge is dropped, leaving exactly two faces sharing it, which is manifold. The option therefore does not merely remove unwanted geometry: in the configurations exercised by this -**Filter**'s cross-mesher conformance test (a cylinder **Feature** flush with the box wall, and a -**Feature** occupying a box corner), enabling it produces a watertight mesh where leaving it off -does not. This is not a universal guarantee of watertightness for arbitrary input. +**Filter**'s cross-mesher conformance test (a cylinder **Feature** flush with the box wall) and by +a separate corner-Feature test (a **Feature** occupying a box corner where three suppressed wall +planes meet), enabling it produces a watertight mesh where leaving it off does not. This is not a +universal guarantee of watertightness for arbitrary input. If every voxel in the volume is background (Feature Id 0), every face is a background-backed wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) diff --git a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md index eeb7531c08..043674e49b 100644 --- a/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md +++ b/src/Plugins/SimplnxCore/docs/SurfaceNetsFilter.md @@ -119,9 +119,13 @@ closure for a Feature flush with the box. A cylinder sitting flush with the box therefore comes out as a closed surface with no surrounding box. On a fully-indexed volume with no Feature Id 0 voxels, nothing is dropped and the option -has no effect — every boundary Feature already needs its wall cap to stay closed. Rather than -silently doing nothing, the **Filter** reports this with a warning (code `-56342`): the option was -enabled but removed zero faces because the input has no background voxels for it to act on. +has no effect — every boundary Feature already needs its wall cap to stay closed. The same warning +also fires on a volume whose background is fully enclosed as interior porosity: no bounding-box +wall voxel is background-backed even though the volume is full of Feature Id 0 internally, so the +option again drops nothing. Rather than silently doing nothing, the **Filter** reports this with a +warning (code `-56342`): no bounding-box **wall** face is backed by background, so the option has +nothing to prune on this input. The warning says nothing about whether the volume contains +background elsewhere — only that none of it borders a wall. Because the test is per-face rather than per-vertex, no triangles are lost along the rim where an internal boundary meets the box wall. With the option **off**, wherever an internal @@ -130,9 +134,10 @@ boundary quad and the two wall quads on either side of it — a non-manifold T-j inherent to including the full box skin. With the option **on**, the background-backed wall quad on that edge is dropped, leaving exactly two faces sharing it, which is manifold. The option therefore does not merely remove unwanted geometry: in the configurations exercised by this -**Filter**'s cross-mesher conformance test (a cylinder **Feature** flush with the box wall, and a -**Feature** occupying a box corner), enabling it produces a watertight mesh where leaving it off -does not. This is not a universal guarantee of watertightness for arbitrary input. +**Filter**'s cross-mesher conformance test (a cylinder **Feature** flush with the box wall) and by +a separate corner-Feature test (a **Feature** occupying a box corner where three suppressed wall +planes meet), enabling it produces a watertight mesh where leaving it off does not. This is not a +universal guarantee of watertightness for arbitrary input. If every voxel in the volume is background (Feature Id 0), every face is a background-backed wall face and the option removes all of them. The **Filter** reports a warning (code `-56340`) diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp index 0d29abb47c..2013369d2a 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/M3CSurfaceMeshing.cpp @@ -2558,11 +2558,26 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput return (spinA < 0 && spinB == maxGrainId) || (spinB < 0 && spinA == maxGrainId); }; + // Count how many triangles will be dropped before allocating droppedNodeIds: pushing onto an + // unreserved vector here causes dozens of reallocations (and a transient ~1.5x peak) on a + // representative dataset. This adds a second pass over `triangles`, but it only evaluates the + // same boolean predicate the compaction loop below already does -- no allocation -- so it is + // negligible next to the reallocations it avoids. + int64 numToDrop = 0; + for(int64 i = 0; i < nTriangle; i++) + { + if(SkipBackgroundSkinFace(triangles[static_cast(i)])) + { + numToDrop++; + } + } + int64 survivingCount = 0; // node_id values touched by a DROPPED triangle, recorded before the in-place compaction below // overwrites them. Used to narrow the nodeType clear (see below) to exactly the nodes the prune // itself orphaned, at a cost of O(3 * droppedCount) instead of a second full 7*numSites mask. std::vector droppedNodeIds; + droppedNodeIds.reserve(static_cast(3 * numToDrop)); for(int64 i = 0; i < nTriangle; i++) { const Triangle& triangle = triangles[static_cast(i)]; @@ -2608,7 +2623,7 @@ Result<> finalizeMesh(DataStructure& dataStructure, const M3CSurfaceMeshingInput { if(!referencedBySurvivor[i]) { - nodeType[static_cast(droppedNodeIds[i])] = 0; + nodeType[static_cast(droppedNodeIds[i])] = M3CNodeType::k_Unused; } } } @@ -2858,7 +2873,7 @@ Result<> M3CSurfaceMeshing::operator()() // too expensive to repeat on every GUI parameter edit. { const auto& featureIdsStore = m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getDataStoreRef(); - Result<> sentinelCheck = MeshingUtilities::ValidateFeatureIdsAgainstSentinels(featureIdsStore, m_InputValues->FeatureIdsArrayPath, /*rejectMaxInt32=*/true); + Result<> sentinelCheck = MeshingUtilities::ValidateFeatureIdsAgainstSentinels(featureIdsStore, m_InputValues->FeatureIdsArrayPath, /*rejectMaxInt32=*/true, m_ShouldCancel, m_MessageHandler); if(sentinelCheck.invalid()) { return sentinelCheck; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp index 1be4609f78..c4f717cd56 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/QuickSurfaceMesh.cpp @@ -350,7 +350,7 @@ Result<> QuickSurfaceMesh::operator()() // (execute), not preflight: a full-volume scan is too expensive to repeat on every GUI parameter edit. { const auto& featureIdsStore = m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getDataStoreRef(); - Result<> sentinelCheck = MeshingUtilities::ValidateFeatureIdsAgainstSentinels(featureIdsStore, m_InputValues->FeatureIdsArrayPath, /*rejectMaxInt32=*/false); + Result<> sentinelCheck = MeshingUtilities::ValidateFeatureIdsAgainstSentinels(featureIdsStore, m_InputValues->FeatureIdsArrayPath, /*rejectMaxInt32=*/false, m_ShouldCancel, m_MessageHandler); if(sentinelCheck.invalid()) { return sentinelCheck; diff --git a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp index c03f4ebd63..4b7b0d5fb0 100644 --- a/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp +++ b/src/Plugins/SimplnxCore/src/SimplnxCore/Filters/Algorithms/SurfaceNets.cpp @@ -121,7 +121,7 @@ Result<> SurfaceNets::operator()() // full-volume scan is too expensive to repeat on every GUI parameter edit. { const auto& featureIdsStore = m_DataStructure.getDataRefAs(m_InputValues->FeatureIdsArrayPath).getDataStoreRef(); - Result<> sentinelCheck = MeshingUtilities::ValidateFeatureIdsAgainstSentinels(featureIdsStore, m_InputValues->FeatureIdsArrayPath, /*rejectMaxInt32=*/true); + Result<> sentinelCheck = MeshingUtilities::ValidateFeatureIdsAgainstSentinels(featureIdsStore, m_InputValues->FeatureIdsArrayPath, /*rejectMaxInt32=*/true, m_ShouldCancel, m_MessageHandler); if(sentinelCheck.invalid()) { return sentinelCheck; diff --git a/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp b/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp index ca4acd7b02..b2e0e28214 100644 --- a/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp +++ b/src/Plugins/SimplnxCore/test/ExtractInternalSurfacesFromTriangleGeometryTest.cpp @@ -10,6 +10,7 @@ #include "simplnx/Pipeline/Pipeline.hpp" #include "simplnx/Pipeline/PipelineFilter.hpp" #include "simplnx/UnitTest/UnitTestCommon.hpp" +#include "simplnx/Utilities/Meshing/TriangleUtilities.hpp" #include @@ -195,9 +196,9 @@ namespace // on, to be pruned by this filter) and the "direct" oracle mesh (skin already omitted by the mesher). const DataPath k_QuickMeshPath({"QuickMesh"}); -SurfaceMeshingTest::MeshResult RunQuickSurfaceMeshForExtraction(bool omitSkin) +SurfaceMeshingTest::MeshResult RunQuickSurfaceMeshForExtraction(ChoicesParameter::ValueType boundingBoxSkinMode) { - return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_QuickMeshPath, omitSkin, + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_QuickMeshPath, boundingBoxSkinMode, [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); } } // namespace @@ -208,7 +209,7 @@ TEST_CASE("SimplnxCore::ExtractInternalSurfacesFromTriangleGeometryFilter: Face // Mesh the flush cylinder WITHOUT omitting the skin, then strip it with the Face Labels // criterion. The result must match what QuickSurfaceMesh produces with the option ON. - SurfaceMeshingTest::MeshResult fullMeshResult = RunQuickSurfaceMeshForExtraction(false); + SurfaceMeshingTest::MeshResult fullMeshResult = RunQuickSurfaceMeshForExtraction(BoundingBoxSkinMode::k_Off); DataStructure dataStructure = std::move(fullMeshResult.Structure); const DataPath faceLabelsPath = fullMeshResult.FaceLabelsPath; @@ -242,7 +243,7 @@ TEST_CASE("SimplnxCore::ExtractInternalSurfacesFromTriangleGeometryFilter: Face // Same face and vertex counts as meshing with QuickSurfaceMesh's own option turned on directly: // both code paths must agree on what "internal" means. - SurfaceMeshingTest::MeshResult directMeshResult = RunQuickSurfaceMeshForExtraction(true); + SurfaceMeshingTest::MeshResult directMeshResult = RunQuickSurfaceMeshForExtraction(BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); const auto& directGeom = directMeshResult.Structure.getDataRefAs(k_QuickMeshPath); REQUIRE(extractedGeom.getNumberOfFaces() == directGeom.getNumberOfFaces()); @@ -262,7 +263,7 @@ TEST_CASE("SimplnxCore::ExtractInternalSurfacesFromTriangleGeometryFilter: Face { UnitTest::LoadPlugins(); - SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMeshForExtraction(false); + SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMeshForExtraction(BoundingBoxSkinMode::k_Off); DataStructure dataStructure = std::move(meshResult.Structure); ExtractInternalSurfacesFromTriangleGeometryFilter filter; diff --git a/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp b/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp index a57e4c9386..fa61f01ea9 100644 --- a/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp +++ b/src/Plugins/SimplnxCore/test/M3CSurfaceMeshingTest.cpp @@ -15,6 +15,7 @@ #include "simplnx/Pipeline/Pipeline.hpp" #include "simplnx/Pipeline/PipelineFilter.hpp" #include "simplnx/UnitTest/UnitTestCommon.hpp" +#include "simplnx/Utilities/Meshing/TriangleUtilities.hpp" #include @@ -613,7 +614,8 @@ SurfaceMeshingTest::MeshResult RunM3COmitSkinOnPath(bool wholeVolume, bool seria { const ScopedEnvVar wholeVolumeVar("M3C_WHOLE_VOLUME", wholeVolume ? "1" : nullptr); const ScopedEnvVar serialVar("M3C_SERIAL", serial ? "1" : nullptr); - return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_SweepPathTriGeomPath, /*omitSkin*/ true, [](Arguments&) {}); + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_SweepPathTriGeomPath, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly, + [](Arguments&) {}); } } // namespace diff --git a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp index c4b19f2050..c4ecf0acc8 100644 --- a/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp +++ b/src/Plugins/SimplnxCore/test/OmitBoundingBoxSkinTest.cpp @@ -24,9 +24,9 @@ namespace { const DataPath k_TriangleGeomPath({"QuickMesh"}); -SurfaceMeshingTest::MeshResult RunQuickSurfaceMesh(bool flushWithBottom, bool omitSkin) +SurfaceMeshingTest::MeshResult RunQuickSurfaceMesh(bool flushWithBottom, ChoicesParameter::ValueType boundingBoxSkinMode) { - return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(flushWithBottom), k_TriangleGeomPath, omitSkin, + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(flushWithBottom), k_TriangleGeomPath, boundingBoxSkinMode, [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); } } // namespace @@ -37,7 +37,7 @@ TEST_CASE("SimplnxCore::QuickSurfaceMeshFilter: Bounding Box Skin", "[SimplnxCor SECTION("Option off leaves the box skin over background in place") { - SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMesh(true, false); + SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMesh(true, BoundingBoxSkinMode::k_Off); const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); REQUIRE(labelPairs.count({-1, 0}) == 1); UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); @@ -45,7 +45,7 @@ TEST_CASE("SimplnxCore::QuickSurfaceMeshFilter: Bounding Box Skin", "[SimplnxCor SECTION("Option on removes only the background skin and keeps the cylinder closed") { - SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMesh(true, true); + SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMesh(true, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); // The artificial background skin is gone. @@ -67,12 +67,13 @@ TEST_CASE("SimplnxCore::QuickSurfaceMeshFilter: Bounding Box Skin", "[SimplnxCor { // Inset cylinder: the whole box wall is background, so ALL skin is dropped and only // the cylinder surface remains -- which is closed on its own. - SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMesh(false, true); + SurfaceMeshingTest::MeshResult meshResult = RunQuickSurfaceMesh(false, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); REQUIRE(labelPairs.count({-1, 0}) == 0); REQUIRE(labelPairs.count({-1, 1}) == 0); REQUIRE(labelPairs.count({0, 1}) == 1); + REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); REQUIRE(SurfaceMeshingTest::IsWatertight(triangleGeom)); @@ -81,13 +82,17 @@ TEST_CASE("SimplnxCore::QuickSurfaceMeshFilter: Bounding Box Skin", "[SimplnxCor SECTION("Node Types of surviving nodes match the full mesh") { - SurfaceMeshingTest::MeshResult fullMesh = RunQuickSurfaceMesh(true, false); - SurfaceMeshingTest::MeshResult prunedMesh = RunQuickSurfaceMesh(true, true); + SurfaceMeshingTest::MeshResult fullMesh = RunQuickSurfaceMesh(true, BoundingBoxSkinMode::k_Off); + SurfaceMeshingTest::MeshResult prunedMesh = RunQuickSurfaceMesh(true, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); const DataPath nodeTypesPath = k_TriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); + REQUIRE_NOTHROW(fullMesh.Structure.getDataRefAs(k_TriangleGeomPath)); const auto& fullVertsRef = fullMesh.Structure.getDataRefAs(k_TriangleGeomPath).getVertices()->getDataStoreRef(); + REQUIRE_NOTHROW(fullMesh.Structure.getDataRefAs(nodeTypesPath)); const auto& fullTypesRef = fullMesh.Structure.getDataRefAs(nodeTypesPath).getDataStoreRef(); + REQUIRE_NOTHROW(prunedMesh.Structure.getDataRefAs(k_TriangleGeomPath)); const auto& prunedVertsRef = prunedMesh.Structure.getDataRefAs(k_TriangleGeomPath).getVertices()->getDataStoreRef(); + REQUIRE_NOTHROW(prunedMesh.Structure.getDataRefAs(nodeTypesPath)); const auto& prunedTypesRef = prunedMesh.Structure.getDataRefAs(nodeTypesPath).getDataStoreRef(); // Map full-mesh vertex coordinate -> node type, then check every surviving vertex agrees. @@ -103,6 +108,9 @@ TEST_CASE("SimplnxCore::QuickSurfaceMeshFilter: Bounding Box Skin", "[SimplnxCor REQUIRE(fullTypeByCoord.count(coord) == 1); REQUIRE(fullTypeByCoord[coord] == prunedTypesRef[i]); } + + UnitTest::CheckArraysInheritTupleDims(fullMesh.Structure); + UnitTest::CheckArraysInheritTupleDims(prunedMesh.Structure); } } @@ -110,9 +118,9 @@ namespace { const DataPath k_SurfaceNetsTriangleGeomPath({"SurfaceNets"}); -SurfaceMeshingTest::MeshResult RunSurfaceNets(bool flushWithBottom, bool omitSkin) +SurfaceMeshingTest::MeshResult RunSurfaceNets(bool flushWithBottom, ChoicesParameter::ValueType boundingBoxSkinMode) { - return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(flushWithBottom), k_SurfaceNetsTriangleGeomPath, omitSkin, [](Arguments& args) { + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(flushWithBottom), k_SurfaceNetsTriangleGeomPath, boundingBoxSkinMode, [](Arguments& args) { args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); @@ -127,14 +135,14 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Bounding Box Skin", "[SimplnxCore][Su SECTION("Option off leaves the box skin over background in place") { - SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNets(true, false); + SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNets(true, BoundingBoxSkinMode::k_Off); REQUIRE(SurfaceMeshingTest::CollectLabelPairs(meshResult).count({-1, 0}) == 1); UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); } SECTION("Option on removes only the background skin and keeps the cylinder closed") { - SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNets(true, true); + SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNets(true, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); REQUIRE(labelPairs.count({-1, 0}) == 0); REQUIRE(labelPairs.count({-1, 1}) == 1); @@ -149,7 +157,7 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Bounding Box Skin", "[SimplnxCore][Su SECTION("Option on leaves no orphan vertices") { - SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNets(true, true); + SurfaceMeshingTest::MeshResult meshResult = RunSurfaceNets(true, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); REQUIRE_NOTHROW(meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath)); const auto& triangleGeom = meshResult.Structure.getDataRefAs(meshResult.TriangleGeomPath); const auto& facesRef = triangleGeom.getFaces()->getDataStoreRef(); @@ -174,9 +182,9 @@ namespace { const DataPath k_M3CTriangleGeomPath({"M3CMesh"}); -SurfaceMeshingTest::MeshResult RunM3C(bool flushWithBottom, bool omitSkin) +SurfaceMeshingTest::MeshResult RunM3C(bool flushWithBottom, ChoicesParameter::ValueType boundingBoxSkinMode) { - return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(flushWithBottom), k_M3CTriangleGeomPath, omitSkin, [](Arguments&) {}); + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(flushWithBottom), k_M3CTriangleGeomPath, boundingBoxSkinMode, [](Arguments&) {}); } } // namespace @@ -186,14 +194,14 @@ TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Bounding Box Skin", "[SimplnxCo SECTION("Option off leaves the box skin over background in place") { - SurfaceMeshingTest::MeshResult meshResult = RunM3C(true, false); + SurfaceMeshingTest::MeshResult meshResult = RunM3C(true, BoundingBoxSkinMode::k_Off); REQUIRE(SurfaceMeshingTest::CollectLabelPairs(meshResult).count({-1, 0}) == 1); UnitTest::CheckArraysInheritTupleDims(meshResult.Structure); } SECTION("Option on removes only the background skin and keeps the cylinder closed") { - SurfaceMeshingTest::MeshResult meshResult = RunM3C(true, true); + SurfaceMeshingTest::MeshResult meshResult = RunM3C(true, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); REQUIRE(labelPairs.count({-1, 0}) == 0); REQUIRE(labelPairs.count({-1, 1}) == 1); @@ -214,8 +222,8 @@ TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Bounding Box Skin", "[SimplnxCo // unreferenced in the full (un-pruned) mesh at the same coordinate. SECTION("Option on leaves no vertex newly orphaned by the prune") { - SurfaceMeshingTest::MeshResult fullMesh = RunM3C(true, false); - SurfaceMeshingTest::MeshResult prunedMesh = RunM3C(true, true); + SurfaceMeshingTest::MeshResult fullMesh = RunM3C(true, BoundingBoxSkinMode::k_Off); + SurfaceMeshingTest::MeshResult prunedMesh = RunM3C(true, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); const auto isReferencedByCoord = [](const TriangleGeom& triangleGeom) { const auto& vertsRef = triangleGeom.getVertices()->getDataStoreRef(); @@ -268,8 +276,8 @@ TEST_CASE("SimplnxCore::M3CSurfaceMeshingFilter: Node Types after omitting skin" { UnitTest::LoadPlugins(); - SurfaceMeshingTest::MeshResult fullMesh = RunM3C(true, false); - SurfaceMeshingTest::MeshResult prunedMesh = RunM3C(true, true); + SurfaceMeshingTest::MeshResult fullMesh = RunM3C(true, BoundingBoxSkinMode::k_Off); + SurfaceMeshingTest::MeshResult prunedMesh = RunM3C(true, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); const DataPath nodeTypesPath = k_M3CTriangleGeomPath.createChildPath("Vertex Data").createChildPath("NodeTypes"); REQUIRE_NOTHROW(fullMesh.Structure.getDataRefAs(k_M3CTriangleGeomPath)); @@ -311,16 +319,16 @@ namespace // Triangle Geometry paths and mesher-specific extra args as the RunQuickSurfaceMesh / // RunSurfaceNets / RunM3C wrappers above, so degenerate cases can inspect the execute Result<> // (e.g. warnings) instead of asserting validity and aborting. -Result<> RunQuickSurfaceMeshRaw(DataStructure& dataStructure, bool omitSkin, bool repairWinding = false) +Result<> RunQuickSurfaceMeshRaw(DataStructure& dataStructure, ChoicesParameter::ValueType boundingBoxSkinMode, bool repairWinding = false) { return SurfaceMeshingTest::RunMesherRaw( - dataStructure, k_TriangleGeomPath, omitSkin, [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }, repairWinding); + dataStructure, k_TriangleGeomPath, boundingBoxSkinMode, [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }, repairWinding); } -Result<> RunSurfaceNetsRaw(DataStructure& dataStructure, bool omitSkin, bool repairWinding = false) +Result<> RunSurfaceNetsRaw(DataStructure& dataStructure, ChoicesParameter::ValueType boundingBoxSkinMode, bool repairWinding = false) { return SurfaceMeshingTest::RunMesherRaw( - dataStructure, k_SurfaceNetsTriangleGeomPath, omitSkin, + dataStructure, k_SurfaceNetsTriangleGeomPath, boundingBoxSkinMode, [](Arguments& args) { args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); @@ -330,10 +338,10 @@ Result<> RunSurfaceNetsRaw(DataStructure& dataStructure, bool omitSkin, bool rep repairWinding); } -Result<> RunM3CRaw(DataStructure& dataStructure, bool omitSkin, bool repairWinding = false) +Result<> RunM3CRaw(DataStructure& dataStructure, ChoicesParameter::ValueType boundingBoxSkinMode, bool repairWinding = false) { return SurfaceMeshingTest::RunMesherRaw( - dataStructure, k_M3CTriangleGeomPath, omitSkin, [](Arguments&) {}, repairWinding); + dataStructure, k_M3CTriangleGeomPath, boundingBoxSkinMode, [](Arguments&) {}, repairWinding); } } // namespace @@ -350,9 +358,9 @@ TEST_CASE("SimplnxCore::Bounding Box Skin is a no-op without background", "[Simp // Store each Result<> before handing it to SIMPLNX_RESULT_REQUIRE_VALID: that macro expands // its argument multiple times (once per accessor), so passing the RunXRaw(...) call directly // would run the filter more than once against the same DataStructure. - const Result<> offResult = RunQuickSurfaceMeshRaw(offStructure, false); + const Result<> offResult = RunQuickSurfaceMeshRaw(offStructure, BoundingBoxSkinMode::k_Off); SIMPLNX_RESULT_REQUIRE_VALID(offResult); - const Result<> onResult = RunQuickSurfaceMeshRaw(onStructure, true); + const Result<> onResult = RunQuickSurfaceMeshRaw(onStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); SIMPLNX_RESULT_REQUIRE_VALID(onResult); REQUIRE_NOTHROW(offStructure.getDataRefAs(k_TriangleGeomPath)); @@ -385,9 +393,9 @@ TEST_CASE("SimplnxCore::Bounding Box Skin is a no-op without background", "[Simp { DataStructure offStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); DataStructure onStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); - const Result<> offResult = RunSurfaceNetsRaw(offStructure, false); + const Result<> offResult = RunSurfaceNetsRaw(offStructure, BoundingBoxSkinMode::k_Off); SIMPLNX_RESULT_REQUIRE_VALID(offResult); - const Result<> onResult = RunSurfaceNetsRaw(onStructure, true); + const Result<> onResult = RunSurfaceNetsRaw(onStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); SIMPLNX_RESULT_REQUIRE_VALID(onResult); REQUIRE_NOTHROW(offStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); @@ -417,9 +425,9 @@ TEST_CASE("SimplnxCore::Bounding Box Skin is a no-op without background", "[Simp { DataStructure offStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); DataStructure onStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); - const Result<> offResult = RunM3CRaw(offStructure, false); + const Result<> offResult = RunM3CRaw(offStructure, BoundingBoxSkinMode::k_Off); SIMPLNX_RESULT_REQUIRE_VALID(offResult); - const Result<> onResult = RunM3CRaw(onStructure, true); + const Result<> onResult = RunM3CRaw(onStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); SIMPLNX_RESULT_REQUIRE_VALID(onResult); REQUIRE_NOTHROW(offStructure.getDataRefAs(k_M3CTriangleGeomPath)); @@ -461,7 +469,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns when nothing is pruned", "[Simpl SECTION("QuickSurfaceMesh") { DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); - const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, true); + const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); @@ -471,7 +479,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns when nothing is pruned", "[Simpl SECTION("SurfaceNets") { DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); - const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, true); + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); @@ -481,7 +489,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns when nothing is pruned", "[Simpl SECTION("M3CSurfaceMeshing") { DataStructure dataStructure = SurfaceMeshingTest::CreateFullyIndexedPolycrystal(); - const Result<> executeResult = RunM3CRaw(dataStructure, true); + const Result<> executeResult = RunM3CRaw(dataStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); @@ -489,6 +497,104 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns when nothing is pruned", "[Simpl } } +TEST_CASE("SimplnxCore::Bounding Box Skin warns when background is fully enclosed", "[SimplnxCore][QuickSurfaceMeshFilter][SurfaceNetsFilter][M3CSurfaceMeshingFilter]") +{ + UnitTest::LoadPlugins(); + + // CreateEnclosedPorosity() is full of Feature Id 0 internally, but every wall voxel is Feature 1 -- + // the interior pocket never touches a bounding-box wall. k_NoFacesPrunedWarning's text says only + // that no WALL face is background-backed, not that the volume has no background; this is the input + // that would falsify the old (incorrect) wording, which claimed the latter. The option must still + // prune zero faces and warn, and its output must be byte-identical to leaving the option off -- + // exactly the same no-op contract as the fully-indexed case above, but for a different reason. + SECTION("QuickSurfaceMesh") + { + DataStructure offStructure = SurfaceMeshingTest::CreateEnclosedPorosity(); + DataStructure onStructure = SurfaceMeshingTest::CreateEnclosedPorosity(); + const Result<> offResult = RunQuickSurfaceMeshRaw(offStructure, BoundingBoxSkinMode::k_Off); + SIMPLNX_RESULT_REQUIRE_VALID(offResult); + const Result<> onResult = RunQuickSurfaceMeshRaw(onStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); + SIMPLNX_RESULT_REQUIRE_VALID(onResult); + REQUIRE(onResult.warnings().size() == 1); + REQUIRE(onResult.warnings()[0].code == MeshingUtilities::k_NoFacesPrunedWarning); + + REQUIRE_NOTHROW(offStructure.getDataRefAs(k_TriangleGeomPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(k_TriangleGeomPath)); + const auto& offGeom = offStructure.getDataRefAs(k_TriangleGeomPath); + const auto& onGeom = onStructure.getDataRefAs(k_TriangleGeomPath); + REQUIRE(onGeom.getNumberOfFaces() == offGeom.getNumberOfFaces()); + REQUIRE(onGeom.getNumberOfVertices() == offGeom.getNumberOfVertices()); + UnitTest::CompareDataArrays(*offGeom.getFaces(), *onGeom.getFaces()); + UnitTest::CompareDataArrays(*offGeom.getVertices(), *onGeom.getVertices()); + + const DataPath faceLabelsPath = k_TriangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); + REQUIRE_NOTHROW(offStructure.getDataRefAs(faceLabelsPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(faceLabelsPath)); + UnitTest::CompareDataArrays(offStructure.getDataRefAs(faceLabelsPath), onStructure.getDataRefAs(faceLabelsPath)); + + UnitTest::CheckArraysInheritTupleDims(offStructure); + UnitTest::CheckArraysInheritTupleDims(onStructure); + } + + SECTION("SurfaceNets") + { + DataStructure offStructure = SurfaceMeshingTest::CreateEnclosedPorosity(); + DataStructure onStructure = SurfaceMeshingTest::CreateEnclosedPorosity(); + const Result<> offResult = RunSurfaceNetsRaw(offStructure, BoundingBoxSkinMode::k_Off); + SIMPLNX_RESULT_REQUIRE_VALID(offResult); + const Result<> onResult = RunSurfaceNetsRaw(onStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); + SIMPLNX_RESULT_REQUIRE_VALID(onResult); + REQUIRE(onResult.warnings().size() == 1); + REQUIRE(onResult.warnings()[0].code == MeshingUtilities::k_NoFacesPrunedWarning); + + REQUIRE_NOTHROW(offStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath)); + const auto& offGeom = offStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); + const auto& onGeom = onStructure.getDataRefAs(k_SurfaceNetsTriangleGeomPath); + REQUIRE(onGeom.getNumberOfFaces() == offGeom.getNumberOfFaces()); + REQUIRE(onGeom.getNumberOfVertices() == offGeom.getNumberOfVertices()); + UnitTest::CompareDataArrays(*offGeom.getFaces(), *onGeom.getFaces()); + UnitTest::CompareDataArrays(*offGeom.getVertices(), *onGeom.getVertices()); + + const DataPath faceLabelsPath = k_SurfaceNetsTriangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); + REQUIRE_NOTHROW(offStructure.getDataRefAs(faceLabelsPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(faceLabelsPath)); + UnitTest::CompareDataArrays(offStructure.getDataRefAs(faceLabelsPath), onStructure.getDataRefAs(faceLabelsPath)); + + UnitTest::CheckArraysInheritTupleDims(offStructure); + UnitTest::CheckArraysInheritTupleDims(onStructure); + } + + SECTION("M3CSurfaceMeshing") + { + DataStructure offStructure = SurfaceMeshingTest::CreateEnclosedPorosity(); + DataStructure onStructure = SurfaceMeshingTest::CreateEnclosedPorosity(); + const Result<> offResult = RunM3CRaw(offStructure, BoundingBoxSkinMode::k_Off); + SIMPLNX_RESULT_REQUIRE_VALID(offResult); + const Result<> onResult = RunM3CRaw(onStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); + SIMPLNX_RESULT_REQUIRE_VALID(onResult); + REQUIRE(onResult.warnings().size() == 1); + REQUIRE(onResult.warnings()[0].code == MeshingUtilities::k_NoFacesPrunedWarning); + + REQUIRE_NOTHROW(offStructure.getDataRefAs(k_M3CTriangleGeomPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(k_M3CTriangleGeomPath)); + const auto& offGeom = offStructure.getDataRefAs(k_M3CTriangleGeomPath); + const auto& onGeom = onStructure.getDataRefAs(k_M3CTriangleGeomPath); + REQUIRE(onGeom.getNumberOfFaces() == offGeom.getNumberOfFaces()); + REQUIRE(onGeom.getNumberOfVertices() == offGeom.getNumberOfVertices()); + UnitTest::CompareDataArrays(*offGeom.getFaces(), *onGeom.getFaces()); + UnitTest::CompareDataArrays(*offGeom.getVertices(), *onGeom.getVertices()); + + const DataPath faceLabelsPath = k_M3CTriangleGeomPath.createChildPath("Face Data").createChildPath("FaceLabels"); + REQUIRE_NOTHROW(offStructure.getDataRefAs(faceLabelsPath)); + REQUIRE_NOTHROW(onStructure.getDataRefAs(faceLabelsPath)); + UnitTest::CompareDataArrays(offStructure.getDataRefAs(faceLabelsPath), onStructure.getDataRefAs(faceLabelsPath)); + + UnitTest::CheckArraysInheritTupleDims(offStructure); + UnitTest::CheckArraysInheritTupleDims(onStructure); + } +} + TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume", "[SimplnxCore][QuickSurfaceMeshFilter]") { UnitTest::LoadPlugins(); @@ -496,7 +602,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume", "[ SECTION("Repair Triangle Winding off") { DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, true); + const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); // Success with a warning, not an error: the data is legal, just entirely background. SIMPLNX_RESULT_REQUIRE_VALID(executeResult); @@ -519,7 +625,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume", "[ SECTION("Repair Triangle Winding on (shipped default)") { DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, true, /*repairWinding*/ true); + const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly, /*repairWinding*/ true); SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); @@ -541,7 +647,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume (Sur SECTION("Repair Triangle Winding off") { DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, true); + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); @@ -561,7 +667,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume (Sur SECTION("Repair Triangle Winding on (shipped default)") { DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, true, /*repairWinding*/ true); + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly, /*repairWinding*/ true); SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); @@ -587,7 +693,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume (M3C // orphan-node clearing leaves exactly those pre-existing orphans behind. Measure that count from // the un-pruned (option off) mesh of the same input rather than assuming any particular number. DataStructure offStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> offResult = RunM3CRaw(offStructure, false); + const Result<> offResult = RunM3CRaw(offStructure, BoundingBoxSkinMode::k_Off); SIMPLNX_RESULT_REQUIRE_VALID(offResult); REQUIRE_NOTHROW(offStructure.getDataRefAs(k_M3CTriangleGeomPath)); const auto& offGeom = offStructure.getDataRefAs(k_M3CTriangleGeomPath); @@ -603,7 +709,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume (M3C SECTION("Repair Triangle Winding off") { DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> executeResult = RunM3CRaw(dataStructure, true); + const Result<> executeResult = RunM3CRaw(dataStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); @@ -623,7 +729,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin warns on an all-background volume (M3C SECTION("Repair Triangle Winding on (shipped default)") { DataStructure dataStructure = SurfaceMeshingTest::CreateAllBackground(); - const Result<> executeResult = RunM3CRaw(dataStructure, true, /*repairWinding*/ true); + const Result<> executeResult = RunM3CRaw(dataStructure, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly, /*repairWinding*/ true); SIMPLNX_RESULT_REQUIRE_VALID(executeResult); REQUIRE(executeResult.warnings().size() == 1); @@ -652,7 +758,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin mesher inputs reject Feature Id sentin auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); featureIdsRef[0] = -7; - const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, false); + const Result<> executeResult = RunQuickSurfaceMeshRaw(dataStructure, BoundingBoxSkinMode::k_Off); REQUIRE(executeResult.invalid()); REQUIRE(executeResult.errors().size() == 1); REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); @@ -668,7 +774,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin mesher inputs reject Feature Id sentin auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); featureIdsRef[0] = -7; - const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, false); + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, BoundingBoxSkinMode::k_Off); REQUIRE(executeResult.invalid()); REQUIRE(executeResult.errors().size() == 1); REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); @@ -684,7 +790,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin mesher inputs reject Feature Id sentin auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); featureIdsRef[0] = std::numeric_limits::max(); - const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, false); + const Result<> executeResult = RunSurfaceNetsRaw(dataStructure, BoundingBoxSkinMode::k_Off); REQUIRE(executeResult.invalid()); REQUIRE(executeResult.errors().size() == 1); REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); @@ -700,7 +806,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin mesher inputs reject Feature Id sentin auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); featureIdsRef[0] = -7; - const Result<> executeResult = RunM3CRaw(dataStructure, false); + const Result<> executeResult = RunM3CRaw(dataStructure, BoundingBoxSkinMode::k_Off); REQUIRE(executeResult.invalid()); REQUIRE(executeResult.errors().size() == 1); REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); @@ -716,7 +822,7 @@ TEST_CASE("SimplnxCore::Bounding Box Skin mesher inputs reject Feature Id sentin auto& featureIdsRef = dataStructure.getDataRefAs(SurfaceMeshingTest::k_FeatureIdsPath).getDataStoreRef(); featureIdsRef[0] = std::numeric_limits::max(); - const Result<> executeResult = RunM3CRaw(dataStructure, false); + const Result<> executeResult = RunM3CRaw(dataStructure, BoundingBoxSkinMode::k_Off); REQUIRE(executeResult.invalid()); REQUIRE(executeResult.errors().size() == 1); REQUIRE(executeResult.errors()[0].code == MeshingUtilities::k_InvalidFeatureIdError); @@ -746,10 +852,13 @@ TEST_CASE("SimplnxCore::Bounding Box Skin: all three meshers agree on Face Label // drops that neighboring background-backed quad, leaving exactly 2 quads at the edge, which is // precisely the closure this option exists to provide (see the per-mesher "Option on removes // only the background skin and keeps the cylinder closed" cases above). - auto checkAgreement = [](bool omitSkin) { - SurfaceMeshingTest::MeshResult qsmResult = RunQuickSurfaceMesh(true, omitSkin); - SurfaceMeshingTest::MeshResult snResult = RunSurfaceNets(true, omitSkin); - SurfaceMeshingTest::MeshResult m3cResult = RunM3C(true, omitSkin); + // Mutual agreement alone would pass on an identical regression shared by all three meshers (e.g. + // all three suddenly dropping the {0, 1} interface), so each mode is also checked against the + // absolute set of label pairs it must contain/omit, independent of what the other two meshers did. + auto checkAgreement = [](ChoicesParameter::ValueType boundingBoxSkinMode) { + SurfaceMeshingTest::MeshResult qsmResult = RunQuickSurfaceMesh(true, boundingBoxSkinMode); + SurfaceMeshingTest::MeshResult snResult = RunSurfaceNets(true, boundingBoxSkinMode); + SurfaceMeshingTest::MeshResult m3cResult = RunM3C(true, boundingBoxSkinMode); const auto qsmLabelPairs = SurfaceMeshingTest::CollectLabelPairs(qsmResult); const auto snLabelPairs = SurfaceMeshingTest::CollectLabelPairs(snResult); @@ -758,10 +867,27 @@ TEST_CASE("SimplnxCore::Bounding Box Skin: all three meshers agree on Face Label CHECK(qsmLabelPairs == snLabelPairs); CHECK(qsmLabelPairs == m3cLabelPairs); + // The {0, 1} interior interface (cylinder side away from the floor) is untouched by the option + // in either mode, so it must always be present. + CHECK(qsmLabelPairs.count({0, 1}) == 1); + // The cylinder's bottom cap ({-1, 1}) is the closure this option exists to preserve; it must + // survive regardless of mode. + CHECK(qsmLabelPairs.count({-1, 1}) == 1); + if(boundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) + { + // The background-backed box skin must be gone. + CHECK(qsmLabelPairs.count({-1, 0}) == 0); + } + else + { + // With the option off, the artificial background skin is left in place. + CHECK(qsmLabelPairs.count({-1, 0}) == 1); + } + REQUIRE_NOTHROW(qsmResult.Structure.getDataRefAs(qsmResult.TriangleGeomPath)); REQUIRE_NOTHROW(snResult.Structure.getDataRefAs(snResult.TriangleGeomPath)); REQUIRE_NOTHROW(m3cResult.Structure.getDataRefAs(m3cResult.TriangleGeomPath)); - if(omitSkin) + if(boundingBoxSkinMode == BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) { CHECK(SurfaceMeshingTest::IsWatertight(qsmResult.Structure.getDataRefAs(qsmResult.TriangleGeomPath))); CHECK(SurfaceMeshingTest::IsWatertight(snResult.Structure.getDataRefAs(snResult.TriangleGeomPath))); @@ -775,12 +901,12 @@ TEST_CASE("SimplnxCore::Bounding Box Skin: all three meshers agree on Face Label SECTION("Bounding Box Skin mode off") { - checkAgreement(false); + checkAgreement(BoundingBoxSkinMode::k_Off); } SECTION("Bounding Box Skin mode on (Background-Backed Walls Only)") { - checkAgreement(true); + checkAgreement(BoundingBoxSkinMode::k_BackgroundBackedWallsOnly); } } @@ -832,8 +958,9 @@ TEST_CASE("SimplnxCore::Bounding Box Skin: corner Feature stays watertight", "[S // right angle -- which only happens at a corner -- so this is the test that would catch it. SECTION("QuickSurfaceMesh") { - SurfaceMeshingTest::MeshResult meshResult = SurfaceMeshingTest::RunMesher( - CreateCornerFeatureInBox(), k_TriangleGeomPath, true, [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); + SurfaceMeshingTest::MeshResult meshResult = + SurfaceMeshingTest::RunMesher(CreateCornerFeatureInBox(), k_TriangleGeomPath, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly, + [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); CHECK(labelPairs.count({-1, 1}) == 1); CHECK(labelPairs.count({0, 1}) == 1); @@ -851,12 +978,13 @@ TEST_CASE("SimplnxCore::Bounding Box Skin: corner Feature stays watertight", "[S SECTION("SurfaceNets") { - SurfaceMeshingTest::MeshResult meshResult = SurfaceMeshingTest::RunMesher(CreateCornerFeatureInBox(), k_SurfaceNetsTriangleGeomPath, true, [](Arguments& args) { - args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); - args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); - args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); - args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); - }); + SurfaceMeshingTest::MeshResult meshResult = + SurfaceMeshingTest::RunMesher(CreateCornerFeatureInBox(), k_SurfaceNetsTriangleGeomPath, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly, [](Arguments& args) { + args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); + args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); + args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); + args.insertOrAssign(SurfaceNetsFilter::k_RelaxationFactor_Key, std::make_any(0.5F)); + }); const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); CHECK(labelPairs.count({-1, 1}) == 1); CHECK(labelPairs.count({0, 1}) == 1); @@ -874,7 +1002,8 @@ TEST_CASE("SimplnxCore::Bounding Box Skin: corner Feature stays watertight", "[S SECTION("M3CSurfaceMeshing") { - SurfaceMeshingTest::MeshResult meshResult = SurfaceMeshingTest::RunMesher(CreateCornerFeatureInBox(), k_M3CTriangleGeomPath, true, [](Arguments&) {}); + SurfaceMeshingTest::MeshResult meshResult = + SurfaceMeshingTest::RunMesher(CreateCornerFeatureInBox(), k_M3CTriangleGeomPath, BoundingBoxSkinMode::k_BackgroundBackedWallsOnly, [](Arguments&) {}); const auto labelPairs = SurfaceMeshingTest::CollectLabelPairs(meshResult); CHECK(labelPairs.count({-1, 1}) == 1); CHECK(labelPairs.count({0, 1}) == 1); diff --git a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp index 88894fb9ef..4c5666c957 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp +++ b/src/Plugins/SimplnxCore/test/SurfaceMeshingTestUtils.hpp @@ -134,6 +134,49 @@ inline DataStructure CreateAllBackground() return dataStructure; } +/** + * @brief Builds a 12x12x12 ImageGeom where Feature Id 1 fills the entire volume EXCEPT for a small + * interior pocket of Feature Id 0 (background), fully enclosed away from all six bounding-box walls + * (interior porosity). Every wall voxel is Feature 1, so no bounding-box wall face is + * background-backed: omitting the bounding box skin must prune zero faces and warn (code -56342), + * even though the volume is full of Feature Id 0 internally. This is the counterexample that + * distinguishes "no wall face is background-backed" from "the volume has no background voxels" -- + * CreateFullyIndexedPolycrystal() covers the latter, this covers the former without the latter. + */ +inline DataStructure CreateEnclosedPorosity() +{ + DataStructure dataStructure; + + auto* imageGeomPtr = ImageGeom::Create(dataStructure, "ImageGeom"); + const std::vector dims = {k_BoxDim, k_BoxDim, k_BoxDim}; + imageGeomPtr->setDimensions(dims); + imageGeomPtr->setSpacing({1.0F, 1.0F, 1.0F}); + imageGeomPtr->setOrigin({0.0F, 0.0F, 0.0F}); + + auto* cellAMPtr = AttributeMatrix::Create(dataStructure, "CellData", {dims[2], dims[1], dims[0]}, imageGeomPtr->getId()); + imageGeomPtr->setCellData(*cellAMPtr); + auto* featureIdsPtr = Int32Array::CreateWithStore(dataStructure, "FeatureIds", {dims[2], dims[1], dims[0]}, {1}, cellAMPtr->getId()); + featureIdsPtr->fill(1); + + // A 4x4x4 pocket of background centered in the box, at least two voxels inset from every wall on + // every axis so it can never be mistaken for a wall-adjacent (and therefore prunable) voxel. + constexpr usize k_PocketMin = 4; + constexpr usize k_PocketMax = 7; + auto& featureIdsRef = featureIdsPtr->getDataStoreRef(); + for(usize z = k_PocketMin; z <= k_PocketMax; z++) + { + for(usize y = k_PocketMin; y <= k_PocketMax; y++) + { + for(usize x = k_PocketMin; x <= k_PocketMax; x++) + { + featureIdsRef[(z * k_BoxDim * k_BoxDim) + (y * k_BoxDim) + x] = 0; + } + } + } + + return dataStructure; +} + struct EdgeUseCounts { usize TotalEdges = 0; diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp index 0e4d1121ba..86fa5eab60 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsFaceLabelsTest.cpp @@ -5,6 +5,7 @@ #include "simplnx/Parameters/BoolParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" #include "simplnx/UnitTest/UnitTestCommon.hpp" +#include "simplnx/Utilities/Meshing/TriangleUtilities.hpp" #include @@ -22,7 +23,7 @@ const DataPath k_TriangleGeomPath({"SurfaceNets"}); // per test file. SurfaceMeshingTest::MeshResult RunSurfaceNetsForFaceLabels() { - return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_TriangleGeomPath, false, [](Arguments& args) { + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_TriangleGeomPath, BoundingBoxSkinMode::k_Off, [](Arguments& args) { args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp index 891794a272..4557882c98 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsNodeTypesTest.cpp @@ -7,6 +7,7 @@ #include "simplnx/Parameters/BoolParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" #include "simplnx/UnitTest/UnitTestCommon.hpp" +#include "simplnx/Utilities/Meshing/TriangleUtilities.hpp" #include @@ -27,7 +28,7 @@ const DataPath k_QuickMeshTriangleGeomPath({"QuickMesh"}); // per test file. SurfaceMeshingTest::MeshResult RunSurfaceNetsForNodeTypes() { - return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_SurfaceNetsTriangleGeomPath, false, [](Arguments& args) { + return SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_SurfaceNetsTriangleGeomPath, BoundingBoxSkinMode::k_Off, [](Arguments& args) { args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); @@ -86,7 +87,7 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Node Types agree with QuickSurfaceMes // argument in the design spec rather than trusting it. SurfaceMeshingTest::MeshResult surfaceNetsResult = RunSurfaceNetsForNodeTypes(); SurfaceMeshingTest::MeshResult quickMeshResult = - SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_QuickMeshTriangleGeomPath, false, + SurfaceMeshingTest::RunMesher(SurfaceMeshingTest::CreateCylinderInBox(true), k_QuickMeshTriangleGeomPath, BoundingBoxSkinMode::k_Off, [](Arguments& args) { args.insertOrAssign(QuickSurfaceMeshFilter::k_FixProblemVoxels_Key, std::make_any(false)); }); // Both meshers should produce the same number of nodes, since both emit one per grid diff --git a/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp b/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp index 8c4f90bfee..82be4163cd 100644 --- a/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp +++ b/src/Plugins/SimplnxCore/test/SurfaceNetsTest.cpp @@ -8,6 +8,7 @@ #include "simplnx/Parameters/BoolParameter.hpp" #include "simplnx/Parameters/MultiArraySelectionParameter.hpp" #include "simplnx/UnitTest/UnitTestCommon.hpp" +#include "simplnx/Utilities/Meshing/TriangleUtilities.hpp" #include @@ -28,7 +29,7 @@ TEST_CASE("SimplnxCore::SurfaceNetsFilter: Anisotropic spacing places Z correctl DataStructure dataStructure = SurfaceMeshingTest::CreateCylinderInBox(/*flushWithBottom=*/true, k_Spacing); const DataPath k_TriangleGeomPath({"SurfaceNets"}); - SurfaceMeshingTest::MeshResult meshResult = SurfaceMeshingTest::RunMesher(std::move(dataStructure), k_TriangleGeomPath, false, [](Arguments& args) { + SurfaceMeshingTest::MeshResult meshResult = SurfaceMeshingTest::RunMesher(std::move(dataStructure), k_TriangleGeomPath, BoundingBoxSkinMode::k_Off, [](Arguments& args) { args.insertOrAssign(SurfaceNetsFilter::k_ApplySmoothing_Key, std::make_any(false)); args.insertOrAssign(SurfaceNetsFilter::k_SmoothingIterations_Key, std::make_any(20)); args.insertOrAssign(SurfaceNetsFilter::k_MaxDistanceFromVoxelCenter_Key, std::make_any(1.0F)); diff --git a/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp b/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp index 1a14cc7911..39858064c8 100644 --- a/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp +++ b/src/simplnx/Utilities/Meshing/TriangleUtilities.cpp @@ -411,16 +411,30 @@ Result<> MeshingUtilities::MakeEmptyMeshWarning(const DataPath& triangleGeomPath Result<> MeshingUtilities::MakeNoFacesPrunedWarning(const DataPath& triangleGeomPath) { return MakeWarningVoidResult(k_NoFacesPrunedWarning, - fmt::format("The 'Bounding Box Skin' option's 'Background-Backed Walls Only' mode removed 0 faces of geometry '{}' because the input volume contains no background " - "(Feature Id 0) voxels. There is nothing for this option to prune on this input; the output is identical to leaving it off.", + fmt::format("The 'Bounding Box Skin' option's 'Background-Backed Walls Only' mode removed 0 faces of geometry '{}': no bounding-box wall face is backed by " + "background (Feature Id 0). This says nothing about the volume's interior -- a volume whose background is fully enclosed as interior porosity " + "reaches this same warning, because none of that background borders a wall. There is nothing for this option to prune on this input; the output " + "is identical to leaving it off.", triangleGeomPath.toString())); } -Result<> MeshingUtilities::ValidateFeatureIdsAgainstSentinels(const Int32AbstractDataStore& featureIdsStore, const DataPath& featureIdsPath, bool rejectMaxInt32) +Result<> MeshingUtilities::ValidateFeatureIdsAgainstSentinels(const Int32AbstractDataStore& featureIdsStore, const DataPath& featureIdsPath, bool rejectMaxInt32, const std::atomic_bool& shouldCancel, + const IFilter::MessageHandler& mesgHandler) { const usize numTuples = featureIdsStore.getNumberOfTuples(); + mesgHandler(fmt::format("Validating {} Feature Ids against internal sentinel values...", numTuples)); + + // Polled every k_CancelCheckInterval tuples rather than every tuple: at 512^3 (~134M tuples) this + // loop is a full streaming pass under the out-of-core backend, and a per-tuple cancel check would + // add overhead to what is otherwise a tight, uncontested read loop. + constexpr usize k_CancelCheckInterval = 1'000'000; for(usize i = 0; i < numTuples; i++) { + if(i % k_CancelCheckInterval == 0 && shouldCancel) + { + return {}; + } + const int32 featureId = featureIdsStore[i]; if(featureId < 0) { diff --git a/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp b/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp index 5bc3b4acbb..2dccc12420 100644 --- a/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp +++ b/src/simplnx/Utilities/Meshing/TriangleUtilities.hpp @@ -6,7 +6,6 @@ #include "simplnx/DataStructure/Geometry/IGeometry.hpp" #include "simplnx/DataStructure/Geometry/INodeGeometry2D.hpp" #include "simplnx/Filter/IFilter.hpp" -#include "simplnx/Parameters/ChoicesParameter.hpp" namespace nx::core { @@ -14,11 +13,14 @@ namespace nx::core * @brief Shared values for the "Bounding Box Skin" ChoicesParameter used by QuickSurfaceMeshFilter, * SurfaceNetsFilter, and M3CSurfaceMeshingFilter. Named here (rather than as bare literals) so a * future third mode can be added without every `== 1` comparison needing to be rediscovered. + * Typed as `uint64` (rather than `ChoicesParameter::ValueType`, which is itself just an alias for + * `uint64`) so this header does not need to pull in ChoicesParameter.hpp; every use site compares or + * assigns against a `ChoicesParameter::ValueType`, so the two types are interchangeable here. */ namespace BoundingBoxSkinMode { -inline constexpr ChoicesParameter::ValueType k_Off = 0; -inline constexpr ChoicesParameter::ValueType k_BackgroundBackedWallsOnly = 1; +inline constexpr uint64 k_Off = 0; +inline constexpr uint64 k_BackgroundBackedWallsOnly = 1; } // namespace BoundingBoxSkinMode } // namespace nx::core @@ -35,11 +37,13 @@ inline constexpr int32 k_EmptyMeshAfterSkinRemovalWarning = -56340; /** * @brief Warning emitted when the 'Bounding Box Skin' option's 'Background-Backed Walls Only' mode - * (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) is enabled but suppressed zero faces -- i.e. the - * input volume contains no background (Feature Id 0) - * voxels, so the option had nothing to prune and the output is identical to leaving it off. This is the - * most common dataset shape in practice, so silent no-feedback behavior here is not acceptable. See - * MakeNoFacesPrunedWarning(). + * (BoundingBoxSkinMode::k_BackgroundBackedWallsOnly) is enabled but suppressed zero bounding-box wall + * faces -- i.e. no wall face is backed by background (Feature Id 0), so the option had nothing to + * prune and the output is identical to leaving it off. This says nothing about whether the volume + * contains background elsewhere: a volume whose background is fully enclosed as interior porosity + * also reaches this warning, because none of that background borders a bounding-box wall. This is + * the most common dataset shape in practice, so silent no-feedback behavior here is not acceptable. + * See MakeNoFacesPrunedWarning(). */ inline constexpr int32 k_NoFacesPrunedWarning = -56342; @@ -77,15 +81,20 @@ SIMPLNX_EXPORT Result<> MakeNoFacesPrunedWarning(const DataPath& triangleGeomPat * separately as simplnx#1705. * * Call this from an algorithm's execute entry point, never from preflight: a full-volume scan (e.g. - * ~134M reads at 512^3) is too expensive to repeat on every GUI parameter edit. + * ~134M reads at 512^3) is too expensive to repeat on every GUI parameter edit. Because that same + * full-volume scan is otherwise silent and uncancellable, this emits a message before scanning and + * polls shouldCancel periodically (not on every tuple, to keep the inner loop tight). * @param featureIdsStore The Feature Ids to validate. * @param featureIdsPath Path to the array, named in the error message so the user can locate it. * @param rejectMaxInt32 When true, also reject a Feature Id of exactly INT32_MAX (SurfaceNets and * M3CSurfaceMeshing both need this; QuickSurfaceMesh only collides on negative values, so it passes false). + * @param shouldCancel Checked periodically so the scan can be interrupted. + * @param mesgHandler Used to report that the scan is running before it starts. * @returns An invalid Result<> naming the offending value, its tuple index, and featureIdsPath on the - * first rejected value found; an empty valid Result<> otherwise. + * first rejected value found; an empty valid Result<> otherwise (including if cancelled). */ -SIMPLNX_EXPORT Result<> ValidateFeatureIdsAgainstSentinels(const Int32AbstractDataStore& featureIdsStore, const DataPath& featureIdsPath, bool rejectMaxInt32); +SIMPLNX_EXPORT Result<> ValidateFeatureIdsAgainstSentinels(const Int32AbstractDataStore& featureIdsStore, const DataPath& featureIdsPath, bool rejectMaxInt32, const std::atomic_bool& shouldCancel, + const IFilter::MessageHandler& mesgHandler); namespace detail {

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
XtHOhJPy<(uKZ?9XF7b+@j`>k1C#;DMtLk% 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�kB}EqWE&qV zkO&GXk2a%ythgZon)P{>RYSgZp>TiUSlL=v1KCH3%mreZW$$sRLUlpkOi@L1bm+`Cjcxdq=>}Hgi9$Tg=7H$IvdqQ%8@{@4}Oar+&|3-7Xv>8 ziW(9*c+CXMIL>6vbnpX52K5l{5TXQ=CFD7(*x*myqJ}#yW@Z4oA*K;*eerVFa^dpb zvi7pyIS(E}X{hn8j-${|Q5_sRXgfMPo*HC#oTbRKe)zo`5ByHHO;p0bqn*Z^&?noc z_b25idLMxgP@zx*fCCX2QWBI>pOi3Few;(nw3vq!7O_&KnW(!Fn4+MLjE?-ehz+?O z=>w_+;FRp!Xfm3J6lpb4Y9bEcND>iXucD$7qq?qQRsm4CRUK17sL)Y4QGEt15@{!L z?XQ@Cd*XW%KC?d4Kf{L#GnGCmBvG!UxTa{0X^xSOL8@j{R8y;~=4F&><*yd47QZOP zmYJ0dsbyBCRjO6EXymp(}Ym7s*r1tJmJE5+{VuPoL&w<+nw*MZDmx&W$T%InnXL>H6Upuqi}1J3s9*8#AX< zq?zw2+$aG%!@RU>Wol8q#9id7eKv>oPIXSzM`c~YDsz%?tLI(O65pcG0q9VCO?#lg z4~y%TYo8R)Hp>og$I_+QNNc<*-yBXBA~Ug<(m2Z)4*LWf z9Gfb}4ciqf7K*Gt#&e;6M9(G2j2V9F4&U|bM%P&~MyaM4hjn94FMrw*L0 z+eCV6ddGvNLK8#^M8-r2!nH!jM6~<2>$dA;4H5e$`igfZkconD>#24P$yl6(_G?)j zSxC**e*2)95;n6|@MU1|F|^aa=*HOpe);iQk5M1B+``%XbH%aQ@oMjVS9;eQrG$c3 z`e#yECZ(i}WFN&K`GqV_&VhjSc-6I+{l(U)KM_SiSrvFRbd_kSBJ!CSW9uloc)M<2S6Rhfo1Q1JGiJC=06F|WbUOZC*BzvuJ`pv&tpnr>gw7wdra(>wgI;ZF!a*y zFj#6^HMtDVZknE(cBF}nE2p&{r0=8e|2cv@T&g0f2I$|cNp+->(`?m5=`U#I=_lw< zKZw!|avgLx>tlHpWPQ!FV znr+D%yUnW(J$<+8j`oa3xq4g4?Ymp=Lk&JZ4^G8>WmF~qMap?+BaMT)a!`XA>Dy^XFx@9y*D%d_&x3NH0CEp6>m_10emHR|(-m$_Y^FTmZPbnxu( z9XQQ6(TG98QNdGwk{<^T`3WMn;hN#NaX;|Od8K%?=E2zL>~O3wI3AnGT3iTV`4<;Y zXT0v!*YqFpIk@#4h3^Jll8chTDY~=A_}F~3++GH;XVQPQc-lTreaq_dv^#8zyCXhg z(1ZHv(2~93cUo{Xxc7aX0l(vS`?}BIfz+JpQKf{x^T&lnxU|F^+mbci(nd|I+vG9t z%E5-~Vc1qIEJqth?K({Nf+x?zL-ys$2A?~aJH(~gy00t4(dNke8{{&i7-Bi1G~o$f z#mC0&;}F639MmqqE_Ff)fnQt0SKc2Ii-ftausI4jDg0l3k-WZ`A;b*R37Mm(jbz535AqJB>yIqjh#$Q z?VK&_T@nacr@yLNv{cb>(U6tlHnz8=H#D&~GNt#hb@3tj{2lrKki@^l{7>$eocUpR8UAa|_+d!tO*4Ri1c4+) zg;YF%&$~PmOjcYs-JQ0+Yjw1H<@z!P+XA7W0VC-E&6+@^$bt_9*aQ_wj-deKexn*! znO0l&w{TP_Dt8!>210;1ud^H%C6Wn~?PI}%6Q#m4LjqLn{5)+nFTyZNF6FkRv`oqK9-F`5MXtj2DCe_@7rG z5XJbQ|2umd84CFtj99d9%j>^s|HH~3w7vBIQWc|kj|9??#*_EItNsr;K_F;+00k7J zAG8P1f3^FcLSryqAuQvaE6@Mk3<57m4iVlH`8M$X(ciy(F<)IXj0x>N`ag%Vjm-H) z8sxD3Jpl6m8s}H%P(zq7K63u|Shv4Oq5A^$K?s2Uw|siAfaU-H0sa3o^#6Uyc`PG8 z)f2u7&E;rtl;D_qMp6B)P8aereqR7I>(SUoDna-*}($d$3%i^dA;4 z3=|`&&n$d=+5B4v`(2;Y8 z$oDUOunjC^Ktbg(sOS4>cx%pY02yxU>!eVc-hIZBg3v$gv9N`t4xlBL>R z)2Gm)`*ubCHYY!l*TVaDba?$D5_R~24AE;wf)G#iL*Sn+u z$v?`sU+Rv49xTP+?d@(#D?#32FfnM#=dg91Y^cb9mbl&34Omk_ka%-kn?k!@&2fdg zcrI;=+b(osFYP>~iqQUMhB%4rIP`TS;+1#?DtL6KI<8Un9vsq z#_#SQts0N;rL}muk7lO^zBH{z1ky4c{_M0E3>tof=8UOv0-<`6jTT4!&F+L*LP@9L9bQLZtm1sy$Z8Z(@~*S`A<%4 zm}jLOuVJdpU}jF)S;~3lcOj#h?z$t&<@o?+Y=!4p`=I|H~9#KM;MHp0(i0t;(s?B3oMUsfu)1h?u^Iw*Gllg12bebN&LH@I61p|66l4BJ2wo(v7pTU5k zrzr~i!NORXvn{q(kpjIg8~!M%ns95_lF;>M6=VXZLxqn(!`_{p`)Ifd&jMlPb(2Z zRR)JChdAsPlqAEZ0~hMdg_X>xS-J&CB7B^3`fE+I@|hiG@gY@o^ITe4>T>J8v?Zn( zv>QGWtg7xTdpc)zC#0?69H%@19^QXcT~~w z4Y?2mqJ%_IubyVlup-#vJZQyY&Xi)Uw(0ZTbP*%*Xdn{7Bog7?W2?pd{g5tqAbM-m zM$7df%XK%Cz2k*{eEx`bb5xtgzu)tsFc^)%S28r=<>yo!bmR~gZi&vl(CFX>2p4!d z4Iq)7R`^oT?yL;GMUFA7la$`e|K}fNS?kgzd?BnPq-sDf|KoLWZ08`@nU-E_klcWD#Y=p|YmO21H@p0S!f2yUTBUf1>BP8e8*Om#1Bvf-pbPTO7AOHuRq)Fp4eHUyw$g;&w)d zxreXqc}S)wY&3mOarEv=@Gn&_L<`O9X~5TLdE;WrY;ZNYBIyT+6PqgjEU>;5rOa;J-&<68j^HfC zfK{p~Po$ES9#oX@i-czs`!ZHctta&wKk95xUWjQ_;(2O$;=C#L5@+;ye89^m;WNWh zcvtYW9%chJp~TikCe{Y$dlEs!u(VcGaZ45mfg68;wi#0NyKHP!%qlc!I)&udz5z#s zZE`4ukfPVO#X><(+iI7&*)rlclLLm*SF*;Geikg#{$Zs#j?&|4%?ryzGS2(bocuivaNjwFzzGY#T584IvSp5Lqn zQ_ar>-a~T_ClsLuI^0rh76>|BsCs5T|B8~g{c8(eALnQbu>3_SbVNvps3F-g^0{2r zwSISOuhpN2pAD=K{$wc5VGSr22Zp(JGpIz(X5SC(HOM#esw^g*DvxgpMN!LUQEh${ zU_Eq+PP8CoH>+7K%vMv;EK^DAQYE`94DZRe&8kdXXoq@y>!3KkMx zrP8{CQpwpOD+RO?fNIYKiW{z+vK%Fzx+I=vk>o$8kb85TrQu+NMu5G1{`!;1al$#O zH>0$VP`1_(0bo#ce@$XysP&iGQ!VN{K%$H{jQAkbRLt^4f=6xxu#wS>Ax#ibVHdDQ z&(|my@7@xm+zHl*3rJ6jdM&&>V-(d`rwfhe zkY%6}KG1sBTWHT<5;1aF4+S$(ts=QpVf12gM9+CVjCoJrb$IiKyc67K$Y){v3q%oM ze7S@k8j~r6rC(O@x`h}iDX8Ph1ka->Jd$8Hr{=ED-RX=Kkw(L9FM^yT36|f+Xjb@VK3cIg`*!UD(R) zn`2ySFp_a_oQB8Yg#=fC^`U&Oln!JJ`nK7VdA}RJ`BpDf>uaq;fFIUfl77=Ko4o+jsC+Wm48uWog0zYXH z9>Qf5!YXy3YG|a!H{Rks@XxUoawg!Jp~Fxvoc zXAUW{Ba**Uae@3|OoGr3fmJrV}4B?dWCDPc#oKDLkVZOE!s zi-VIS28oiHr!SD+gZw~%o3lL`r<7x1;@z5fbG827o)C(jSuuREa`tp@josnH8J$9I zijR_kN`^LGrykUZ5b&}V|%<1l;_UfO0tyZjby28tT|M)MDr z2V<+`ZXR+{<4yrlpLujri8R1}Ra9+6<2addLxLH+98kW4qX>dYN8Cq(osttDWZ&#D zb9x|621w?V6$rJ+t(g{;4nvC22%1W2)wOE9*q@DfgNsv>T50Z!$)4=TtsU|`XR1%x{UU2|6`dq zzx`EQnE`(~{(RZ#OGFSuexV;GK8L@#I=q$gm?U=k^jM>>~hb)W&*H3crFCU#qp*WR+csg07kU45ysR(-Yuw=$7fkrUPDDF1@H`59x&L zbQa$sCG~Wg%}TYZ4!snDreJ{ojk{a7p~|7AHv?v<`ZvMnct zLbD~5A|Hx`U23B^iDg86M3KTwMIj~X04g*%Yx-+*31SQ zjINFZd#z(SCOm4xkIrkzyu&1^P(&Gnx!s=0_07ks;}cUxpw(URzr2V0!@`+TEyNwog$&f14f1t(u8RHHDq`DD#Umkp(e4t-G0(=&lE~2 zb0h~ksPr@%6@E~MFjzS^Qy!R0I*2!*MJkp{DiU6rXC&bsKyy3M^BZSVIv0D*N3a!z zc?QeOiB;>MQztbTOD%>m4ro{5OU_w1l)92-trLc%j&gUR70>v5D?}vroIdy2y}xum zC-nYOfW%+gFa+@Q7lUu-3mYhL-|rH3hv2g|5Waf*Z=_gOG0{+8a-w2$-c`INW=9kkbol_GNT;zy#d>k0qN(EinYc)B z$fb3<>1{g-9aok|sao6lm(kh2mkO$5hZ0F*TYORUdoj*kLQ_L!$UZeGvG=N^Fj}z! zLGOcBKwjB-#o`Y@l$XkJD)F9cNXTqGb)nXjo?)a*S%oMGm~r$YN!k^>treS<1dWO# z3CXlH{DrZ+-)LzULx{ z?U7)+$0+`%k>G@zOo{E8zrkyX*SD7yPcQ%!F!HPDjwAC;SvGx%3H}LW(FjsdSiyfSbGC8!@_z zN^@yi_o)+l7#VFLX+!_SkBMfK2NQUE4@(PaEMI?iF};2V6N<%?uLkOiSAMV=TTEFG zTLiexdWNf>-Wjf%*o<4a>K4I@LY85nm2zo*3^AG4iH|Pi9hS4Wh)i`-Baa3Xj)X+~ zOgU-M`Dt?!HkLSvT)ji;QdLvJ*q3}Coq&u$wY{$iCc-(SHNp|s*G2?XNoK#NsZJ*0 zPwK^SZvq(4gOJ7^_Vtp#Cnjc!IRN7$E>JAeP3V(hF%9(!aw>}va9>%BVvAP7rxJFN z7;0aHrU;z_7BjdQSk;tJW7d7)Q7H|MfCLjZK|tLY?RU8(Q8Ac(Q*l$>H}4EBV(7&0 zcIxovkls0k_mOGCNK$ciCaY&@b#d)Y0?eWS8c0%dT@%5tPl{;vxvDf89R~l5kJ!;` z1YXI+P^OWv3JnnRS_#H|xe){XUuPu<7=OL9sxPZ_hU{^SghZvl-&=1iAzQSaxy5PR zeIxL8wGT$y=2UQ_F`EQ%6Zf!oo(Lr}5@ZPIVt4(Ms;oh9M9>DZ;Q0boly*a1N*gYe zvzgKVL-;6m2XoK>=Ff)r#aV1lay_~6^r&zaN7lY}XLqDpuj+B)3=W-sov{C)5!q3W z$iwVJ5nY#XZpdUx<#FL&IQLz?HT8qIMCWHMml9Bo>t)V9Uc;KGL_EBhZ|4{v+`#Xx@WB6F{27FW2Q=R&!}2^dw9H#=bqI)(sPf+2uuF z><+ARtWj=;3bcb5*L`D8Zdr3~YqeAT=1rYpdPjnqZ_#QNq!$&D7GyVrUsR&d69Ry)4Pb89r0m9kn-=y*VUMQU#ciXgi7xj|mnMxz5PafS`e= zLhZCO7uzrb)Wn1SMQr|wJI&47n^5C*Yo8tK-iwVdKhCDp<)k`W`I9QXC-`re9C3E# z+W6+n4AcImz@os;ZMFa9wfM0j;0Z3zNU%;e@v|fn3ymRv;TyU^ESSEDKq5f{2^(r= z0&2OVCWo4{XaVyb{@F|}P;28jI;Cxy%yA40`+=$-MGKUkDYn}wAjTWJ_RCskd-zFe zT^6-?AZSW;n4~Xe9pFR*3`>|&w$kf2-rt79Oax)37mq|?zPxCqW@k%McgcGgwM{|c zxgSmh5A?c4!$Zd#__CtX$T=T;hKvNYC;=#SaAMM1VJU1 zI9pH7?i{PHH#G(^B-D%;GhpKI&;d^=#C++%vS%=Ct4FeH#Sg}!EVpUPY31PXJAGVX ztsO^1=?nYL$%t;7-T0oS78{lYRvj$B)O=7&K~;$vhhhvAf6s!b)cb!=}Fo6hYw$#RdAj$+rQ zZGiW5=icccPp5^ldakPyzU9u<#Ig@fskM#IV3=hQoowaz8ZAEmQ3z#G^a_!oA9-0v zbBi_=E|!VM;(w~~EOG@k8`k2hm?Q%MR?@9kia$v)JQp{D--} zEP|g+G*(gycBb|#5PTy^+TfnHT#Yuw)s?l%oh72P#k4j%9*MLgbe1g{g(Xc>nX`Vj z>x(nF4L6tMz8_WzbDs&3Bh3`OVz8OvpcxU@&2swzH7>h6*OVQF*>`!`)nYPcD(X{8 z5!Eg<<~T}&<(szG=E&b89+zg*tw&|QSVc^UPM#p?Xqs`@7jRa-Ib})F8V!C-$0Z6d zH8R&}`ERz2-L+)IBF#uT5hU6svVO$bZ_^iQW|u-Px(!)&GzrIt|y@*C@8ykg>dl8(E$1iULlcT51*R@ znC;{ZMTr_C?`P9030nY$CfaQ*i@0SZGRa34%!|X`7g9lH(>L-Wc#JJnik{~9PwxTz zjK77UTN)~VB;7;jHN>~rwOD2ESKM`)hw)`vyI;2;(xu0&6@N6v&Zd~+&(mRAu0kl= zDn77@UwrJB0fMgKiVR@VVUfWn)5p<08iPBAA1NfcFN@f#^?sVcdyzy~fDbt*kiB0g zfh6T{>BAo`(CUYxz^!-QXG_ldzWAYxU8h*WQM1qlF_S#|0p+WMS0aqgC<25KZZpdX zoc3ip4I--Sj@a8K(et4sovwWV1o!D3sq`mZ{4Yd*<@fUoxe5LBu6pD73YiDC2K2;{ z?P2QI+xwi!Uo8E4LsW#_QB`BE-$zs_7;Q4QJss-E+9BHL8dIx?DI$T%-v8EoyEH;k zmc$VdxWQ>hg#t)@dd;(~2&}y=bKR$nEsvh$;_i40s&t!Un6FL}kY)&>8=nW|QjGe5 zlp%}oQt*^$wioy4{v)(h75gp;RZ{^#=DiuKhsvl8L~elRBV6qM&Q$Xl!73SFW5sp5 zK9-CZ>?1i<`>1X{Wh_|hh$j^rRC=wBEuV<`U4yO=9#sAvv%#b2AeDgpwMCUTx?bJ2 z3r~k{l6Cb_h;h-Ra!)Fpo;JH_(PDEV7}S7r3~2pgbo2d3>$)2({E)T)>LD5&3fX}j z?&Mf77BW{vptT!nyq7G2YtkIyEFkcZl4NN_zZFA~l6<-J%-Lh7wDmybUR)tvZE-TV zu3WSlN*Fh&#JNCjNdyp#G9@Nue7cj@(42A=>sp>OkRc-?jGRVHJMo-j!S1On7e5l|I zzL_uFjd3DT!rD#LfFO-*W1my285+&kXgFih7R67HFQ+X#Hy)V}@J*{ zqCVgW)=7nCD9U?6Vwym2|bYat0ody?tp@z z4l5LmB`5ccjKJopw<*R->;uR~kjWo&ZpstSB{Pd?Ce9n!t_$2}IVj~bTs4lYB{==2 z-(-g2dm85KMkXeAcY z7O|}5(5s0$psRTz>a^!LND+-`L2emIZm&Bl5Z3nM1rGIi9Z84~yFXt)TjN<{c5WXL zIRC=DYw+#TE97NFFgL02UzcvrjRLQ09$=CxVs5jl?|)_+R7-w|EG>g)uKFx`R;wd+ zpOS#0r5^>wn?Ow&y5uABh9K${^~fsa_+=g2QX~H%WzESb_{A$q5xiem zC+BY3w4I+={WyNd0Qyq|dRnfRUuqzxE3DHa=!a8n+X zPW=P5a5eSOCC3PkiuXf`zw6}BuyZA~oKPbz95o!B=Y%QQ_;zQU>=IrS4p*;-)UUPTir zN0f|IsO%yp9Z^$BZ2vQ)1rIOuifcx5C&hw4R3_%YGsr`T8G+}ELws+guC=avUKrDe z!n)0KtnSJS)i%z4JYz%dhrkRb4OXz5LxPg%p|?A zQgo=YswqIFkzEu*JCs}k0q=Q3FHUn`>SPFRmUATRmY%HL=v^$b3=IBAIKZXJ0sc-l z?``FX|B)%8kLBSe{xhKK?bg$KH`21hVTbK?V(aay5Ao~psV7jJh?2)KkN7(IFZS7l z0ZA^}9u)X6ZjGLGCL9nP)V86Z&5Y6FcbhPKVbI1*l`M8$FDZ~;em=2BCDv%%Jxpfr zc+-p46*B8tcyp5-+2`_6V3#DC7Z5^E+8;bGqILn_?Bn6LeO^Fi_df8>QdiNFvt_W;ojzcxDL@=uswgMa^xjR)i^4!~bk#X+lMpJ+ALg_;@G{plk-~A}WS^*g8jvu5hrl8S%7KXgCzpR zto=6VFUdS(U;BWKke-^HEWJ3d&pLZfILB-Ky%;bey5@z=#%7J;-)0fNK+Fr@bY7Kx zFyXGv_F;ERu+Jp!G>FxATN@9<1qBe|D7zJbUSwbJOJY46SBSMJ`QWcp{frb38%(M;uO!#3)<$!V^M1k)(5@B!Kjk71>Yt}n?pyyHE??U|?^6g=>w9+p zbFnOthomkTt@A$0`?Hk)(Rz|+c>?}Cl3+;Jd;?~jEd}|i-X1SX)1EcO-Vl~Fd_xC}szSp-s6A7_b)6>F#H31?uv`)fU~PVLWQ ztVF`ZVfLcDbbTkKDw|Z4V$poG=asG+f^%#ue6Y;% z*i7ODR=904xv=MF$8*M!LFDmtMrgb5r1Sa}BsBThsc^Qoh}>KbVelvsZaZNMx9WIY zBQ6O{Wx-ca(1@uiDV;PMjh(-4rN$zhJ)uM~RSZk?e%S=eWG{`t3o<9$;x+89Qqer- zIEF>{12eq#cgbP}W0{SWTO2UCu$+wmtZFJ0?GC_h5mBZhaYU7mE(T892bnG>&FNQK zbMoLQZp#6rBdU}t@(TQax@t}~CfI`J)Z6dF{c(+p+bB{-UM_HDYG?FX47UZ~Svr5Xez(|?hJ1D0iy*6Fk##Kso+37lYKqKf z8yCGQp>0Ga+wk9U_uK4ZBLnxkPK_G+VhWi`N z$A>zXVJ28fXE{0-A$*~|5^^Viw@Mo}njhh4|1kPZCfTFv`Fm&`{Y=r6GEBWzgX<*b z7*ZFe-guW6OX&~AY(LT9F`x-XjR=z{m|knhoa$u z?Y6=6#bUrdtEsOz*~6bjPO9isaOYd?VSiU_EcHacm;{k<>;Rh+0*+EZBLt4944~*D z`LnLhrVZD3yyevmynJ3M@{baqN}1LR?q{ za=GFU5~+7q)$;XjxY+%M#Yj^1@gyJup>X*Wx&*n9SkCR zZoxUR_IFkZGz$FhQ&<4lSlR`F5KGKJ$o^`0ES^O}l*dmnX&Xo}=oG<~LTJ?vzyey! z`Ve%co*&1d%(_)*G}*G>T4Iz?3XCik-UXDZ+8Aa+qzRtTbTx{LYA9eqmEePpRVCOp zuS}sr)u{`A|M<$Jr3y<-YhJ$|7a+Yzs`5Sk+l-IrrjvCz9nTLENFi10Af+0^g`#l6 z@1xjY%g5=Gk}5H66qeWO=gQSoVq1~op>f*@VH5piJHo<+$Jgkt#uM=! z%Jmg^1dZ*nQ_8En+1-`rF8n6UmaZW)6Qq5BKfBR7gT`TAI|JPu=osNsB0NY?G0$t0 z6tMv-=zONgR;>5aD)uD06R-Ylh>FMMgp?keGbs;Oe}thls!44c&1 z>g@zM?sSNqsBs(1Nkn!$1+AD0xpuL6aFUH=(Zv0TWFGB>hrk+-ACR5sxe0(HGN_Cq z7zUP7SV6~kELBH!QuG+>=i2^FrXt$|{5ydM(ZLnJ`Cm_4pSnr0 zgoPcq1zoqd)(?ESZ=PpI-In99s%ttwoK-th?rRG`z$1ciXsC5&WM_wiE%Io(#@xGx zjoBDgu+=aQK?52HgCw?lzw}ZF=CHd+4D}iO<-D*V^87wQn<~9UNOFlkJ0&@|Ala~(Mt;@8 zdTjCLZHQf|CD4%92Hxh^qO+*f0fi~=L)%4S<7{s*O}t|WZyc8Ewd$^0gME-x`&cHy z!4G6WaLil>8}}A=r+YF8pPCp23DE40vgPooT?2Khq=n?nr<1|mJT(7sEobRmH?Z2k9DdyjeKuiKX4 z{Y1G$0Ok*P3S1aKU=afk!*ri0^v_usbu)QwOkc;0A(^&VQngEgP!0XfU-Pp4+lKuL zA;YQ|C{&dC1+$Y)rfTt8CvS+!W(f$VwaWe7YVG?Git%;>r{}aOD5BU6xbd2BN^GZ< zFJr7>bV@i2MkbkLke89+ZvxoIQE2m$zwG36-EeMg4minm1-6|O#J3xa3$1ODfFt_y zpGY5jRK5E$FY5w%NAu8fNX+6m%N+6iv)6IRwK_WO_s6ux3aea8C`H=Y&MIEYY^>`- zol38dI|#$4y760)FiaR`ryz%DO%mU-EULs;)@Y9B)Tl1JHV(^N7Bsm+72o-zk+=Y4 zix*Ze)OT0Qp-Qv#GRf<4V00aN1tCYsnKeq|xiI=t8Ss2Z_QS{a8%L8@-6VvdW0Ta8 z++Z#hXZk0jv4a?I21?FqY< zF+hRHHqKMZ<^xUC`=QRiJ zGM#cx^|Hn&ZK#K}jXn`zf; z2wFvn3?YWOKY@XqT%$YGw&+whIt_PaFVK9&K?069ms-w|JmCO&Si@%}Z5RcpQIs{N0$*2%x{_2gsTft>%=e~N$ z`l$U_pB%u*F*zI|Y9%(ds!0~IV(lYQkfteMba%G3=LdSt*%S0?|q@Z>yL16l@LkjDODJ-`v?#jvB?!vxOZh~ z`MI4}oLETBLeXa&G(-z!l4ddN6{sR1Frir7)TxA!^`q9~>CG`A;qsPm1@Q{g_Ftjo zfLf#dua9cB69o-gUCNelS8qad-3Zq7TI>qXkr=RtmVw|I#M5G!u~m}5%KFQ>7sp`f zuc~4g$Wb1c*(xV<7dvQMy~Z%6KA`kAdOGN*zrp_s2NtDR>glnZNl(+_Nn7JK3s?7p z>ZiCWqVLTD*%QPXjZmN$##Bl6e^&yqvUH#W>$Zz4p7_T7SW#gUM+s9IRF(2+>hMNPWPS z=glrs7fU=_4z@uUWl5$EO4ID^=2LAQIu2hsSg1BWU~3&_0VQf!GLw%fIES*pwkD<1 zauy!tMkP?B>cp|8=nXORFR47kHSbK~X%k5@X4>4_NI5FUQW)3g`?` zwz_2AypGJoN!S}iQv)kO=4w+f6#hq^2xwzJyZ-_7kT;gn0N9GKQ=Rjc`zs}$$n^)2 z7E%Jp2I9x=Lny;r7Ag352K$vZ=geeS1uC75Ftw0o?c2Vakq2 zmV=~VCO@1JveU*RP^AD?v&-8@?n0t@>F`u#7tvAOX$l3!l7pCiJ3o;)acY*q4Ra%` z!k%jd8$+}_akM;Dja{Ea*c~SdEdEp%lZXnXf? zL7=b@a>+K0>|jNIfQea{qmV%_XO#J`WzB;0MR;6%Zb;ILl~!0T9-i@KCMPi?bj=9k z?KZpFk)b|uO`&)ga;V2_#V0lSANyv+ zYdO6uWa8GIs|EK^*n;hp=a&6;ne_=zg#PR7h{)AaV%dT8lBza>>C@}&qyW3$zZn+8 zn;iM?&5;2pPL)Qf85&5C$c4*5_MFHuJ<}5Axx)M+k(#4zeIqer4;5?f@j0+#?+Gjh zKZN=Q?E8eP$2Gj!yZD>dRXZ<^Zq;J(N?zt+tNi2Wpc93^+4Y`1OxW=VpeBIuVe-~m z1V#}@pp`Y=e0_rR1u4Ju*$!07?>H#faERAk*b0C!k6MHEbEz%0ZiAFh|KgrR6`Kx3 zJT6i|Qom>s4N-p-Rt&UoC;tBfx6by>1;<6!pyW_8TmyWQOi3MkClTcww1T`0eK&`jByICu4bEH7 zjf8bK67 zMsd0^>#!Ykh;~3GR&W}`G0-nfO_7Ur=;#7mN6V1^4kb&*J?U>BOTgJ}^ z-!DDZcTMmFCdXu6fk?quzOrIp{_?jb_Hpaok%#~|b;&7EWg?xQz;O{A&z)1od_DU# zg-{!mk-cce7$hJ=<3`Sx2(QkSByuil;0QvVHB+)Ey-!4f_h-f5I(GkzN8n*Zz!QXr z@vQkVA1DNFCK->@TcYbRB@9U@P7X>KO$j0)GZ+$WI{dCX z8G*(dqj{1fL^9k4cz7FyRX&5!8oz9*+98{{{2pg$4iX|0vcDcgvtew6h38e?ba{po zojkSnPr38eC!eC7-f%K0tq09p+U?15lsb1Zj^yRO*DZ_+Xg?}3*}~IapSc97+$35h z?`_saEvD9?mZAB_3UuRB^g>dIWBRRoSas%>I~_0W6tG%C}QD~%5RQ2F!J>< zkTN?FvK}xHr6Gv_PalTX?Jcb^4NY(wmS2 z);7fx)Ob#7N0qKb$OcqdDs0VLsvVTkjdy6yCn*ucAO^t`IY@~VfSb;iwg;;^mK&1) z&m(Z(5%2`zzMld=0FS^<1a>AFU$WD5GCuy-p63FG;n#!+aFL(xzRy}*Brg@H^No&t z7(I>QD~SaaUkIn?8Vl}%$eVZW{N|(a#U8uM87~pT*pSB%gD5nhWjIQ9BTc%zb*`f@ zdS!X&<*klmjE0g18J)WL#xcH>%Mciz`u`5rp zldIfk6102HVdO(N$f%agMP5~D_nR5YQKpccrA`!-|M;YtKmI;M-%~R zWmlb{tH=s&fA_KoQKo(vLl@2b&2pmpKJDDMBT;%*-$(wmP4*FRk43cDl;{nJL?Ei} zd?|TXm}a)9PPXxkGn^$^a+}Kd@=wG?zd8DD$OwnE-5jHS10?ZLbYuhx8YH)WE979H zoA%%T>Aztwyyty1G5aC=d&#yK<89lH>im7b88qU>9VuX8-^|07*naRLcO6{yqiikRc)? zLB^$eBIp7y(jb}0*3?Dv9g1A+r${0_W=V`gU9j(VOOVshi(y#0`AvRG^9@OXo)3&8 zC2z_YRT6P?ddbq=Rh!w2+p)`K%Uz7ydZ}yQ%_gicI&RT+&Ssj3P10>=Pz?G7Yt~O# zo4Kv#kkz!BJddP^ghr8}UIya{X_kzhIK&_((gU8tJcb8aNzH+zDo7p;v6>w9TfZO7 zPoEFUtzvkE2BW;xKp_w9FvghZDcjA_tSWhfv0k$jUh_V$r;+9yUVXxvB$y`fo+=uo zEhGo-!JGOo7*j|}WQZy{(4@O`8$(TgT2T4)}IymmW)cdF*0uD1y4fC zMFh$lPeDo{=wKE|mN;+QQm=7$3*eS=Qrq ziJ-Ib^)oj0`JbX%(@`hO>Q9BGMs?0wE>e@P5&hZr=1)coZk;K#iLoepqTG-Hzd@>~ zmTk_n*2$-VKxnRkgM+TrkclF%kAFjSj`!ZiQIWl0_s@C+4jKZUARM$a?&tf!Ah44Z z{0j^dk_Nx$F)pH~TnFA0y-&Ies0KVB*-(a3uqj7Coj~g@*;F|Iy69JCzU$-=3bV_5 zmTet!QUO)&xYsQV!HaZ6W0L74tc4C-p?(?n`N~OmagK4}R?=mMD1(efNqTl~PLs}O z<;84La#S8om9rG7Ng`WvzS%#7--qfcrSTl|`yFYD()e}~v)3M|f z1G@L#K%?wr4MYzXDULI_rJPdeh}&mKGzckx8O9`k^5!}%I0Q(>v`CN)IhEh+(%7pR zRl;K+yHI37diN}m8W}8mM`}WYchV>cp9@D8L~?|yG}R8143Y`vt0YRN2}gUbMBKz6 z4^|z^M%FAfyo@QkYU#~3r5cBpC1JIiOxniWoSo06F$Rg8WLjWK60ag5P7Wps68Q#H zVA^{N#}m)Q^J4&7ka-KoNwzBBs@f>%M6iMDe|G2k^{CX%$h4B1RWi5Dy4N|$Ru9|E>bp6=;||2ZVKJ9kgZr^*O>1o{ z3Zcl03}{6HMfCN%qFZ6q<(xM9S9!f}N%9v8tgE>?m6+BBRwki2TFlt_A|0R)Q*{V} zs!ri^EAL|8oLiEpf9Ie563ND=f@I^DU$?*XZ~aF!E_;=Z{|Bp>`{K|u7Ka?SGa z{yVZlVs$T8rQ7idw@z+9=OCXWLcRrG_U%9bozAI9r0-#ha~tLt1TShGhim!vdktP0 zzwhkXb>A%QPH_3x4+H|YUcC>*wEZMK0`~`jNmB6QOJ8%wQ2D(d#NfiSM`~SqRCWfj zjB9z<_TH$!j=?3bo4oj~!io#GC-96H*Pp=CH|-3wy+3|g1bHQu@L4Ne#>l*i!Pa7&3#ci0o~laCX}r+PDcva8Of6%D zM#3uO4Qv!ilBQd43!|oshB(_KqC%bXncn*YeY&P2TY==x;I5i<>HZrTdwahY>aB&X z{^Ze>XSG#YvMOXIN)ASE=F!|hWwDY)9*XUgvg=f5R%={W!Kp}^4MZ%XPS$ai{b%a!!Q@289_3e80$oJ znlylmvW^OM2vi#*&XJoyMiGoMASc0C0|QBhyS5?5X%B-|au?!N@DlXz7>$S4=`zi5 z@@+iFhnHq8=8RM#Qar(W zpxO{*LC?n`DJyj9R&F-z*cJ)#SNg1jxaG@ndnJ>%O6!>YOA$2Idvq0|!T64|zGP6l z#9$0!7wuxr$oO?tx>&0srfzQA>+&W!aL?}7f8({~q+fi8_5EleI)a1PaQu)Ogs zA(HEZa*LY_($yJubri{@oD?gAO1ey$ErPlqh+P# zfz@U<=}R!MGsinrZ(@z|I~O<{hD1NfB_N@=ABC`x^OLJBx-QM(cQL?&F;2*hG;T?s z^iNVMMOIXKD_>P&x}sHm<}|s^-w4S7Z+$Os_nm#CPy5$A0*^8Ro*+ERXV=f|z9SIk z6Fm0VDGNFoU$Ae!`d$0!zx7Y?CN5De<*X(0(>8ng1sZlyEr*0!ZMs13waI{MQ+l&b zt@<{)WyyPTnbynQGz9>8BXE>cb!;oypNpA9vAeJ7>QLY+8Pp)D|9p7q@*Q13c46g ziIZlnBR1H0&Qkrnm9S-$D2-*}1|I6J-^?uD%zK@Tg@kSCs8wMni^f^{ekH}W$iEn3 zuq)?7vIZrwD*07^iYyG{NRis|cB%}g&LbLl3^RFgak?{~o+XnjNST&wzRPW;XjP1x ze&iYJVIV8X+$CIM_{hMOL`V^%P7XN@oq9{ic(QdQ6?o<)+mRuv$V#7xfe4$**alj0 zjKLuZyI?#lVVo1)QF&UItjTd0pw1L)h3Ewy zN7QENq$Og{Sd;|$exq$O&dv;EZ;EosNSEhco@<>aR~l3vYZ;yx@v6J;B4Ruq5p9Z- zET5%sN50v#e7(XSWj|9>L})_@~pvB0QSg0(XkMWlo{ zSntklm?W(3P5b&^I3|rp1dHzp=YELnX(ZVb3q(DJsAeB=+29IYZXJWpriK(cq8C|7RvhQ03s=e13Ausdb16G_-CPz-@c7$C9k z+VqDw5tqMKw;#80Y5nf{kBOO#o}_u=43lUt92Zdq@8^Ct@rmP0%P1? zd+nV4)K5Ks>j(Wa9)SaffF}qC?1cO2zWoSIe2q@VXYG4F@?Y9~XUz%&5-Eol z?CI!+RqZkRc6`oC8^@e66_SJ7jZj99^N3=&WoRaqz#vtKzKvv|o54V&I*Fu3D%+Q@ zA8{VzFdy%B`@H@0;|u0wRT5mp)-90`nN=3Fycw7goG{%b9+(y>sYB8%Kx!5XA zksr~qt>hL&fcM~`o$fX9bgJ46aAAC=B*VyWVP6|E5Dkc zFT#i>W7wqP9oV59RMzMNvF#j35INFwloFP)P07$Kot0CqHOsHj!52ALJ({tNV^g7G5ZHU@vHX2yI+75{GjVqFoH0? z@Dsm7+1%M+4e~A(DbR0Jy?BMsZrN(|f|W-QNPZv68$~-5ov}(330V6m3E4zF$-x+^ zIvUlPYUD8Wi6H2E73FcJK@SOt?_QgTpU8mzl((SY9G3^NPY@2t;qjYCz$3tS+JoQ` z@Ce*H0z0HbFTX^Rao47v{|FUzxY%YYHabcfN4k{0mciJnk0{Cb92Ypc!eUfLN$iuv z0?Y3W2NFgEf@&No>lDy=qsdmXuBydkdWW23M+70lMOI`&-sQXBc3)xf+C~{4WgD}j ziY>G*Vk=y+2C|Q>Cfat48bm|3HkU-7A9zkBxfu~vh$9n8VLYg0;@q_lIr%_k=5?z~ zf5*~zp-VTOMj~|#t$5EWg|ir>n|K(bBse2a!U-&Ww!D-Gq`AdDyWgxTqQzR6BG0!=49@ra}CSf~IC*tICF(6PF-mWVda+o$o z&6GUHP6k8mdq+ATQ;JeRzA)XXRE6Y%Xv)F{avx+@jrn#MG2U2m>(i5 zTAtuI{PLWtINnDy+5tET5 zM>+&#C?Ev4?*GAfMnp-*J8!E$QyO{o$|uu6^Q%f5_C? z`0Tk=`@oO?&zw_o2FQQvm5HViHIOVQLy-ji)(D3Yq;ilvZA(*&R zJ35-8d0Ce8t#dw&LtvS|>&WF|E&`z(5|<+Z5m#sF$!!2pi4m2F(zP09z(#I`@JF^K zlHejD5Yjid>HXWJcl(21`O53|%fI~LH@6%AZjZnth`<|LB#+>P{ggZc`-Q*`Qt;9% zZnq0hf0zqv)ecoF_G}h;N~350-yx(0>7?CI;$?@V$t<#*#0p-r1@y>70`U5Wm1gcV zHYF3HMRA5yw3D#n@T7H{^Z-ED-x*XW;dsIl7$B;+BX8WB+jPN|7mm#WcqCIa+|AoaW^B53^ zt-SoKlefsAl^$NQnKp^1UE~W%42WWdl85O2C3TR;{XyA;38~CZY7tM;JT7_NHs~#| zhD@i2M>G}+F^b8!T+L-|VQ_2;}zkb|B3y}L&uPs)L4AU#v>17YFF3dzmT1Y}M` z3y3U5IDV$OK=q(wflm8w=-gcgKCF-{qosdaYK=_SEB4PCI_gUiyQGl*t)iuo{C5kJi>iaacs{}$DV z7Hz81wp^c*$W8W3iP`1cvz9Lq-69&;i5B5XC7WB$TCIQ_Pt~sIOQ42slI=^PM0MffBIY z@}1x8-{BEB00?-3Z~#uSpW^-@Fi8qtdhzS_>Nme_pZ@f3U?h^Lijf>Qw6nd(?Mk+a zaZEQ`$wX3{T*JCF?K)%`8gXT|Ynlg|dhC5Jig&vyiBmESY0gy(oGT~Cs5lQ?vPDuT z(io8l()8|jm%LAgsuE_EL`;OBco}mxK{D{OHdlF{^9s78RlTn(o$rWx@)$^X|0DDn zh!aOBwkkH;T*U}(T4gR}uazJ^Xspwn$1zF~-ZLB}W%fvd+?qYZ*jHVmZ*lDjJ96Pi z7{hqH_n#bK&SSL8E7_)kj=Y@h6fzOyHJJ^S#5_jL{F6iu=D;nGy~wDMkrEnPz3hf1 zsO*xeQ-7a`jw&;S=X=i+L)1h@QaRp1d^wP#aW2(hu(bLvS5Zik zobkB`&dL7IHY5eXp2u=Q)-8$AsSZi^Bzyn!-}(o91BXsR^y2^fC-%Sn=|8u>_oXi( zTYJn(haPtymYh*!K*a_`5R|t<=_(owLiFRS5T6Zu{>lbxo;;W)UA&PGHIW$AxL*1aw%3$IRY&bt%#e}bem*-m!~3<03i_xQ*R9&PZ71ntK>QjtE}O=&9@uY z=u+mG^QFj^2(C*yzuVm8{Ri6b(IfE4A>awZBX>&ug!U7GFrUCB8Hb&W|NNWwqyO>G zA~iv7!UZl~%(-M$G!$I?$P=J@t1fCX=95S#WKgTd|A53i8TGoz$~cghUj{`KBO~yX z-TCS!!?l;Gy9=j`>?p~E=^9-_(fp6N@Twt@tFGfbZ=uns+rVo$zQth2fYDeg3*WU? zeBD*gDXlzZ<+Z1{*lv%7kEsEYJm50oZyG-sK9WWal$1N_+Zs`kbv&r@GAi*f-C@qz zEfNx6cTowIos6mrEcNL#cp8h9$DKi%L zAcMCZ15}BjaU>hr`cb^gB>r;VW$;ImoCipu5{4&B$V%Ve!y8=BUvqgWB9Mv@#EDEu zj>Jho##BY_LiHs_YHmeGYm13<4oPz6J=&)X;6C$lm8zJdJmv$A!=zbfBx$pb(~Vi1 z!svA}rHSe>lALJG@7_Xku>1M9`?1!$41cX{m!Gj60nmNPW|T~=?_m_89}^L0E-nhk z`(j9gQd@^yo=58XjC);QDJ5hJpKyzC9*3MKeb3vuRXp>mTtr?1N##@PPlFLTHIO46 zQ&EFZCKi5ve{T0C1un$L0ix1(v3>D(e$m~2{No=E@(OS(JoBl4WSf*r-kke35yBw} z#NTBeYmlI_!$@mL6^C4BXO$a85!IO{pCZNgqPb<)`W1WEwG}&dl?WJf+ya|rlIPcx zB1_}7AVQFog_*5M5XjwI;5H5M(esgdwqr95Y~B*lB{&j zuGLRM4wUqaQ-tr~?MwK&sk;BdNWu7-@SboBelvZuv=9@2dyo!Rm3|a8(C!iM3fSz}ahjW{rz;*0P&Nt*l4^hD+$pyh#pj8N{UF z5s(hz3C{RTkUuaWp|p!fxr;&FqluE6243%x(*?&-x==}n2t>M3hRAR{fG)&Hqtx>t^xTK!Ktt3ykXKxKYI)?H@y9s{ z3{c1eMv^MPv?9xnn>jfV=Uhg6&<{XsAZS7tr^HddzepL$ITC~ePi=^*AVtn$9>rZ4+@-9UJT%vM9RcnyR zaUxUd$Sh)a6kK*CkepKsyN#RnS5>XxbNhBM+!Kk$q&$mbt>rajE zBx@^don)S@Y1V3>v8VJX_sgxP9Tq|5C&|dRqc7}J+hjtv){*{*;jn9RL0IDhWO)4{ zGCUDMj9wA=Odp;7_I}(>_U*s%_cM$X>?Q@D{p=6e```bxg`_}-{^&=)>PDb3#%7dY z&DdE-J;tt++(}Zwh_a=LCi1B&>!5#_^>W?e#Du}gkR#Gbn{uujqo%D6)@^E~W2IW# zs{9tlh$4(f<_@)eJjw>s|750f#PXeGn{AA&K6A~k%!?E#TETA#Yf!{llE;navQ@fE z_VhBPoj0B)>HD~CMotnnRdO`HMEi*8`SX{2FNE=_^7jrX0-hio&=c>cy%T{Q(xI1L zv0iUri;F+$q(dqdNilw_PhH1wq%jqqWND1mbjcYT>`F$PnmhHW*)MOhjP?N+wgH}2 zl?>dmIXh(N8V!{Q;mg3>ZS?JU|Mml2z~yn2WG74M&mP{je)@uoSfuGBs!qzuE{1F@ z!~Hzo%bHcEE?BF09&c!u*XT0bID*{c37c7ZKLjH1W@`6u{^AXO3X_Ji#{V9Sl0vm)APZb?8a470A~_azt|TkRC;* zWYj7G60Q+pGN32KgS=_{P7VXWpHSJl$|Oq>)G|TDBLt z3FohQ2gHNu(l%DA+|^YzF=_c}c&B5eNx02aAbdy)MI^(uG`XL9$1waJYEMd<*5kmz z5Xc@SeT>@|zVLI76e!vF+_}x0q+s&+np05j6p}!MD$yb`x*dU1g1K7X%UAA(ZUu@`wnjr-K=)0>eOQ0;^m(_7;94zPi;vei^s3g9f9(v zo%)t#i9TLfAP;9-(xf%Z0qlH|-#@B;b#hUh3^R6kMFim(SvHg!=3MHW1|@doc(~h5 zcm?B_{KSwvq8JiCzj*`>G6J3;9OScqz~{c36zBpQk^)sx8K(O#QCEhY zuQT){50U{TV^9%;die_S3+Zy@UFE_<{dQ||v68h%op=1LTv(@VdhIzbw()gLP3g>nt=N_-wUMI}VCT$BnKQwE7yahcu-B!a8iRFCBE&G{?t zeLBvNUK!2?!pMqr=+S_YoMx`GS3ls4s!0PW9OLde@2^q2d++=I*hS`;r?8h~rIW0X zxD5`jk`%;^^%_Msqextu=!oQ6T93h+d?N!B0~j(Od7q>=N;+2Atq749k*Fm5%WWNp z_=foifms}`hy9u9_V2*<&Vp#cIO-?~QAi4&eDY+_+4yT0_ap^7#{)Hj7-VY5B8hvp zadJo!7s%rv07OLO%#b0TPR&@0e2NCYeCrAVV zqEhGgmjv%bcZTI15Z1}>(9XHt`B5M}y7T+|J3Imh1p!YG4$7JK^K=M^6eyqI*s-Jb z5|M&eU;PW0WE_pEydW3Im`dw$v4sdkN%$?V7oBn4b+QrU0vH+kQ{^2cfMOYA`00X7 z2}3TNC#nN#%x_tNTK=^})V8vC(fZR?@4t&s_`GsVotI8Jb=A?AoJF2ZdF7-{mls(V zTl{M-w60qxLBgp~oogZ&@Z z?e{1mB2Bm|?L^{KD~TY_qD*59vKGh7tg(+e0Xew+Uf%jEA_Fp5U2h0Q5ir0+^7@jU zK}dmjtk;|Rl@txjNjqzdK9JZWCRc~rjHn**WZwOM1?^BAB zvnir=im)jHU?8{&N*7$>a+zY!DE0-v@MgJ6{1d4{L)UYZo zX?~$(N@P{oWn&N^MHe7NE*j(BM^z#sUOEr8a>iaiaRW(`k)P71kz)(;w70o2qCdwV zLJm%xhJT5Kz2}OOl2w(+?DAa3)=K;)Q?6HY?IX{8{aBtTU(#kE6jS{+@+2kh?=i7A z{nU6TzFFFv2G4)s5kz3`Z|oyDQ9q@Fi9nc7Fz#f0&VKiIf8T!lxBm#8c1Q|H;@rN_ z?nX&^bIApyl}(R=hFPlBE|0LH1TyxV!7D;BqQ*Pz&uaXuI>CQC^NV@{krqWnJOaTWtaR!$C6HZNF<}4zr;ndMY1f$ z-_nyd-G6+W0Bm2}7}JQdmVrlYe8Jm2uX}qONExIM5V;YF84>7T*x+Kl+O*y>opHhH zw9Qj{1g|_@lVJzWBd>}&_hXZ+Xy9@Ly4FOJL$7AKBOkT-E8idF03e&uw!cQ*tuxhn zic{W^vyCxNQa2VGp1 zuul0L(xN}Xfjw}!B!@12pOb+oLa}?(ymlL~yWjILK9(^m0(>*aptR(229ipgzVRG} zE^;s4qs>XPCMNktq(G80MR?jsz9dz0`2~<$b*YxA+9o>IFC!6S|N4tN(jo1B4kKAI zCJ}lWuJ=N?c79iGmsjw`FaDyNRY(f-Aj~UpFYNgr-$%Z{Avp-&qVcAPtSCC_NP_$Q zk<2Gx+jncuP)#30ch+0u*>?bQ&Fri$b+#fj27xg7fr_BGz~e%$lT z()I&IzmJC<0Z$Mf_A}_me+vR3DVR(${?Lbh$-OTc4Lan;@W{T|3rl#hm%*V@k6gc; zF{k~wG=oUqx>2;;gBnSt%l7o(oMqNm?D7#xBvQqrLOx#-Ig2i^$zF+lbRA*1zW8<6 z1@1B>{H6J$LXawZWV%hu4#^`ZAYqEGQLX5t&24_rdGx{tVne3|AIl4F0b^gEa1+*~ z1LJ~u)C(kiQnf|8>vf9%_fnLI1e@51B{@K5*y9$9o%Fb%JbXEk%U{m z?h+ldGKA zRg$9gF-l`3@@4z=p z8)M<`9b5!FK{&YQ{*jvb?tFsDBxC7uMGVGa`8PZD;DVhPkQl7QIm(Ocj3XI3;#cRZvtd_dzJT{yYIdC z>@(l~X-7gr5(u$NauH*LO$8ZJ6~|yvK`B*IahceT?KlYu!30yOl8lYyGLRVj2?#c+ z*wKQ7j0JHD3kyjI>09TUy{GrS`%Hm|Mz{K zbDndKZIoUn9zl6xI3IZ?C>+$pikxe7?aXrB&RoS6PbJ(Jitn~Y3T-^rxLKD9>6`-* zh~(gQuj1~%zkL;!!xDbN1E#fr%VI8&b+0x_90cT~(f43+ z0(+HvKCi0IiP<3I0`LfcA5MzNy{}ZMGnK(61~3nZYY}jgrd=r-^$?&+VyX2S1zBPR zngctwwqmmcdrqvj`R%No&%ec*DS(vM-cVfvfi4B34uR#~XK{2t3GGJP2&@APCHGMr zfF}bW2w!m(<>kjijR8Pw1fzEvKQZcI5Ma)C(B^Y&rIPLC2q*^#E5N(5^o$4FOO6Bd z_6ELv(y6|S{U;Bdb`$P*&0FEIzhGlOfsy~Bmmofme6-8Uc#p^Hh=1?$Ro-%s18ty9 z*Q`F01Sxn{DAp)RrbvPlxgf*x@y>fC0_wvCwUZ}^oT(S*@FYx=L5y~M_t#hLS&FK4 z2}IsVP+OyL%;iiX2lD8Oka^t+CoeZY&&>nf@+rh2jEkk+vZ2ObcqCe2Ob{N4Zhkl~ zawjR!0vm&jMGCg!3GVpv<>JmcfU8w5Bj>nc6WtY?TkP41MPwZ7SP9X8ZxnO(#Zt+N zcHH9tR2!f@0nqPLA(+fZXWLl7*5_=o`6espoV^nZ=Hs{dxn7@SJ^R z>YMDVS&DCwH(Wuy#Q6qG@+MHYm43UCxSxL4a2 z@W$dR?}1XxDgfE#VV)v%l2ZY~-IeU)?yn{uUow<5QVn^P)Wym))yod7LM7T#a}i0= z5UN4Pvk89xAs`xAHu53{=*S-NVEYcZb86r8j^)Vg&^R-9>;xC3I zPxFqvgCYhW{pgR`?FAb%$_bp-7N6r0_I?(?zI%`@lAw4OCkc@CRyovys8%lUKCv9k z6`n>`9v;&7mXZ01)XP}n8M^S8T|G|B0Wn=_pHs_IHh=vITOXW5Qg@1ZB?L-mo1vb^ z?Gv%RTOfR*zPbB$xYbd{pO0JMD73(sARL8W8lU4<3+y|{cH-IKqvP`u=?(KxFPPOd$nGV+7c>pNsB)ch_T~Z(e+P{iDy_m3*U&NxFFWDE5zhW1jBG|x&P=AN_`dL*LMut{dqg}7t zLi!S;AYt~Y<7m!P5lj({o$P^Kj1zYh!OccBwWOHE*;3Z`2yN3^=Ea{E1 zBPsQ!q)*}eM#lkT$SW=Ln`{&BB;Xm(BtNiU|Cyg=1SIV}-}CKW#B4vo#u}5m#TCT1 zy74&z;rM*xH}2$}5C9(PDJUty^88oaP@ujF0s364Qa}^GB}rUm?W|?`#BM-}L@t!^ z?JB{^I;*7$@}-SD1?o-_?EDObS@R?JGTYtsck~qaj`sL(Tr6#mh8e&8$h5$iAUrZ% zeKapL#uMCWknzo~T9zvXAZ|>MM}FcGQg5X(#q)rbsE)VZA(NY4p0~R@F+~m#xyfWZj8to%ZfnCor2k$UGqVF7GwmZEJQveX^}F;6wvmUnr8u0 zWL=U4k#vdoDkxTM)yYFt02`8>sOXshTyf=bKOaeZ5&{}n5eqh1 zhXm?XF*sy;i2DG(sidDbVWrp?$nR$FD<)NN|HYJ$`FH=BU&?#G^S$<| zfA_l>92{rnE+uW_-o z!)e#?UXM--j0wWg>8nTPOm|9$6i=|wAAuaB&%2@ zkrkwyN(rhA9S_E)h1&yu$tho(gaFZ&vY={HhNUc-PrM)$-y79#ANJXctf*a+6lxP7 zY3Ctv^nIo_VWn6__%^_h09~7);TqQKP8K4Fr$nICH;yA<<#8ywe#S~5O9HAPKYXcr z%0XcQ%dtBN=zH~boj~aZ1kh8O_5hMtOVf`7y(2kOXSv9zlxx19#IVx-K*|h#2clcTm3B{TOi0h zLol=CblN|NxZ93c6O2#yL1=-Uq(J918c%SuAY(0_vSe>e zQ8id{02Y%p+GI&Ux`4eE78O~vlp?Q$rF&xeNhbp_3xSe8* zVUa7Xtl5PUmdsqwUYa$#l9?mh$GdFuB_t5YYV>{dAuKnteJb7LP$w>nyR2kgGX1D3 zt{y!+5qb2?C8RL2yd`8I20*rv?xd*0a6dOETL59@;%|}zzKca0Ed;=rb^r($HcmLH zkwsk#xVC#m4rFoGF>4S$om-Fg%2HjmeC;Wlg=o=h{`vlO;i08n%7ewY+@p3whFSzp zEUQ?0SG`iM7hMQSXfUmKk z;{*Z`j;nE^F*YD5xtB>%Asc|%W}J~ubC9~izNryQW)vD+M8U@aC$a->AE}yQw*7NSi{yc2&TJ+F3aS?fe zd`8ls`9QA)W_NnY^7NtZ4_VEf7!ac*&y~K{EifNY1S~x$*>ivA?>Z?^W#boKyl!v% z-v6B%0Bg1}dEQbdf@f2|aiRg)(D=GNQlRl5&>Mj7y&N5C8&&xhNl>kXAz5JVOOf0G zPmDJ8VU_zslB_hDxc2e*;Ki^ZQzTYkAdj%N_fN9g>DG;`L;wvnHJu59gPS7CM`%7fK zkYyggFTl+Ux8!SK+PO(9zxy@>T(V4S;clX5UnpPj<+il?1}iTRHvkZffVfZX0cnPB zwrSyX01EJ*SbN-Bjdk}PG$yVfRZ7{!hO%=|hzKyU6L{QgzlZY~MTuCjJ6Qi@tyS8` z4%Y52X*#kAo+jeq| zx&?LOQ_?oEaMH?4?{GPiJXqRXuEzQ4UjX)c#uJgi5)BC`_LoVKyFlRWHGtK!)lTK? z`ApW;fm>IxOh15I>^D`}_H0)Wr#@pV0qD(9j4KHt z6Ij&eY9HO><=Q;s337mUDsFeupYgW`@f^p7i2inhGMq2;9eDs9No}pm>^OYrn>V`$G!0 zwJ)cjIjo2WPwk|8Nppza6KT>MSDPU1F!QRsFb(cAOEY$R;T{p`6(OoHM|wqSd5m0M z7vaibl7eAhj*F#j>(%iek6;VLJMIy@^zkL%j~3V#Wc;arV_*2AFWZm&$j`B;N?L;~ zXDc0PI6DDOEuw2PFZu#H$Rq8*a+lknk|~u@kH7qGw^qgKu+p>&%qB=9>OrN<_kD_D z-OlE68URdn;sRMqu-;Notwbh``AZa{f^Hw^?7aT5%X2?au+QyKygc^pJC znk6JO`L7XVeU;Dq$SRIoY4I(zYZ{LMUM8ewWh&CjtEB3{gT8|1r!7yBJ-57zP*P#} zLD*zD7GW2N7Gd*Lr1VvtEMQ6Q@50(inIFENWL#-%$>J`Fk=jS^>pp(4w_!i( zJVgpZ--h=^7DEQ2zsmaqi$%$k4jFa6HH_I~dmv5~ycy@{F+c-_n|xwI{ZH%#?K zVo*x4w#m7{*j(c~F<6>#|eB_J|_<*&*m>@i09rCc9&bA<9fZNxf zf5CqBx##RRe*Rai)ymmgnRIq(w8els*O`)Srd?T~QtSfy-DSW+!Yj>67UWha00=AP z2p|QH0M-s-6Ht*XB$2hRU5}Eg6Ks$Vd+E=y(*eO1BHhSI%&)#{hg- z4gsa^@yNCzBv&lmK+g?%^@S|y#g)@GNz8`4Gs7OiKl76uY zIm4TS{#igq;6?yVl9B{jtlAXEsw0zVl<@qdHY~q(0@>QzoIDB`3nfH{mR_G$2}!zp47Mcek9ggfLC5VVm9LY zq_MfT7qRc7?M4dp zHjE?d)Yk>B?^EYfAw1-C8Wt@k@907fR$Vervgo-ZSLpV5TPp$5OU2Ko4o!S zq$6ZFp-@&z3+R0SeL6p-T2zs-B()?u5T(W>5&$x@C`3d3<%>7pleTy#Y&p1oiC~Op zOpNU;GA{toKrg>YN*}#)hv4&ekpa`g>fh^FqqE?$n`9?~%=p^~p5ou5XUBV+QjvP; zqVHE@OJKK;`=JX7=*$p%0Z7YYsUH-3p7yfW$8$h{dS>;wO<#H)<3sWo?U(;x1-r@2 zG`>Uvw@3j2&>5sPMM%N)B7F{s+8Sd>g%Sj}DuENMvy8V}=qloSj}!2LM$J2~d|u@gK6+Rt`Uu3l5N84Y4y53u&#Q?(1fkxhrbNpgTl=z|UgH|6U2=Us>-U3*kpjfGZ|aZ3z5WoW zJT8{Dz1_!uJ&G+bCJ2vWuOGrSkCK8<{qCn(2?qAIx8#vSlx=zK8EecuX{p+?0OPdH zZ4huq@SdkB+)M>1V5PsMw;gT==N%aCGrW=%Lf!yr%$*brx&$CUX7lIY>7XnY_=>=7 z=kM?IZ`B7#wn=Zwg5OD!+LD0fGz(=;S%3(jmNogHk9j-iD)6s`T{?TE_LLQH`sy2z z6CIa9*f%ZDJ-*|hc)W{$~JTgG3n_PuAv}UCXA+% zG!Hl`H0B|ISVg%;9aDfiZaPnqi5l{Y267^eQOPx?ufEAif!K&F@AsM<`27MYkOWTY zMkO^%L1c=nXKeCy9BvC^Ot z^Ampmi(H8isx4KOIormIz_YCGp})6}vEADGL3}TggLrNV^p_W5X7L%DY7LOewQRYx zY7_RVWl3+UhXT}f@5+Osdt!8KY3}s64eqDX`e~0@iTl2t=ST!@{EhnhXtwo@*D`)* z+yZyr0%L-3=WX}M|8kTReEQSB%bYr}ZR4I)%Nqr>-fgZI-FFt?pH*7f2_y~$ zE3~*q%GE7)*HFG)w^ygywnoOH68kyRz?*b^%1Wz>yHGY2r8y<@5c>Hzwqu*f1E4XL z#RA$Rpt+Z?TSDLuLM+LRfZ!I1;aYl1Yg$B31Ucc_n9jpbtPq*bUYERTUmfgW+Y*JLmr_i&!o#+oaF zZ1D2boGoOht(YXGX?hVEBX=L+Cry!qO_Jb73rN0#xD|(^%IzZDF45$5dE@kEI@H|> z>fKz&xLDfVwBGo)N4*8c1mURn;5|P7Z9&G6f-ijGEA~VG=}%$xq_9zu_<<*}nxd;# zfM-^kV+9?f%|%IlkI(eR!wGz++PJmRap%)B*5(`=(-*Pq0z?5~`SodEpd(?qaS!`> zCx8qU>Jk8yCB6yp6X+XcvCOB}gD`|lGzyFrkWFAgjuu);k0dP$fGaMh`#J9Ie@EU7 z>xOs^5u(Ci-gVC+GM=Jy`Wo#qi40)b=GMq8Lq*d*j)SGrG~kAQ1>i)GyZ@ty_8I;D zmTV(QR-S&%(uzMJYg9LL#VYl*HEL&VQ2jPQG8L$agXoYeUbPA&IZ}KCHE-P#@B55R zmd4849oV^zYc^5u*s*m2z5yODJ=wJ7lcY`Ld(#_)5-&Gxveq+t0FQ)Oy+HcXdcsaE zv>*#}R-4P)*GrIuQrf;&X8aT`LpatQsEhP@!8D#TSVWb=R$ht@eZE0}dyN#1vX&Mh zf>T#s=duwx*H3e_-PGqQmY0S+1goiP0Muy%QsI^%4GQFhi{ww|5w}PV;@?N}dHZ+_V^Qyg_d{GklDL8&^UE6s8(*{E{LNVL zxoQ9aKmbWZK~yi_@{)HeVkQrQh`E5Tyb>A<{Ul=xIgY9d2O~iM(YHLnk^I82&C|r5 ztdz=l<>suEVlGal$!tX|SdKzQg7XdbB#g9-|-#aX6Mgeu;-tDk)mb)1!pp_%%JSRtTnl2 z)#;aAZZUQ3^#mjmI{;XUQke%qVjuvnVCEWtr#5xLtx%H`BAS1dz)-+l%$jm1`($*<}IDAra8)UI~|Y8KS^qHnBW!Ph5Hp06R%g@{4x$#2>mfJWEy@NvtGS zkpx9xQQ4S+we4^^K8bWeo7yHtz_>MMfknVR(httmuaTjL;%(iRY%rU#Kbp*0eV&TG z{3a#Mzk&^W%2EQT$0{Gdu{;bx+Oz$P1qikSo)Ewb3=>F7QS%{v%?e#orcMAziGjE> zn6pMEY1d|8B*X$FkstIF1R-mEihXH!)QjL`*~z9y!<&oG$(EzfQUsV^Oix;2_L!ZA z0`#Xyi%Oc%ZVN(DsN2d!%Pv$>mhTWe4q3D|aW4b_CsJG|F$Y#sEsKr~It_HwEdaXm z((_xa{Q~Ya2v!<7QzpZ2AX*CO?vqU@*Qr@%?X;b`@EYqAK+VaAjnh>-g*L)2jD<9i zK>#AxCSWKly#pVBkjRDFM;Wg4o&dQ5$5o|Tq~f5qaBqkdEI|sEkTzYW4M`5LPK?Ag z9eWze`e_*f(1cCm?OSHX>x8E~2 zJLXaSOmnBmQZJFUi?ew7`aR~sfi<%Ww!$qLDx*_W5^tKMcj4Zs2QLCf0?oVfx+v~N z@>O|b?re*5l*R+Ipqid-Tr4fL!}$M4vjxTk;nD2(n_l%!>5wWJt7w_FOn(wjK^Jg~ zOh;Kun52so&C25}DAi?S>gSPOyF0*nV^L5?6vlz>FA1i>mt zz3N5C0)DB2T&GKxqArDsTBP@EQgOOU%0jH!@`gyBrQH4kmu~%rD8#({Dvl&8X#~Ha zK?6#Tu?0FtonYNYg|-_|?HVh4rSV2fFTUMl2~>2hfZR(3v-DlbYE)HK5+MNrS=wb) z1WovHGLqbo@k#xn>rt#h$T$_RlXjJUA8&%>T!|I>1}~0)uK=PXLD~Xwq1_3VRK+{; z8#w_=NO~koFW-}grJe6uxxI??Xv2z~MVoA{&_`XXWscdOoFYRNdEHlw81q^9UT0=|7180bSit1f_(=Y@3@{o z3e?rR5#;S(c0+)?2#i-50c4bjdi(9)eE9#;Js|04k=Pt1Y&*O5$5!l;MT|>-b-rcS z=1FJFIQ1AI8DW@z21*)1`)PBj;b!~MnEu}Qzi|tUTi{??U`!AWrX7#`UUrfKUC@n{ zi~&hZ#{Rqfb`HU6w!w(I2;$V0_8D43;o6v!PQ zKT;7PD2#hKBwJEpEP+a0n*bl^fmoi;YwCH$Ye5ofrYNZh9-7*deBSAp~MXVRg{o08u2vQ$N=CXn86 zO(m)e&%OE%zZO|f1&Ec_lf3}k0p|c`hXIh!ompNkC{@=&U@b^oG_)egzl{Sva901HNNzj-^)H{#=YI2xicR9u%3gVAl#2r zOCgh2lHz|kvKpOR`=ZS@uG=xP8i^#ldb(;G8N3T*b}Camt%o;3MGR>y_vlGtB#G9+ zZNo7$E|zw1tvcS*(QAP*K{$GSc3@|GBPl?8ji(?knyHikm?q0OVM;HHHJfy#spgzj znrl=;y@GYVX0yv?E3LEqeau>bMgh3t?{v!A$GuzZy16=qIgx^RdQ8A8i%9`XY=H`` zk`(P1{AdwZ#pWuO?gsLqTxZHAmYy;#YO zZgi@asn*F})FeG8GL&A=766&+r8&ERM5a5-xe{30kyRf3eSbja4nU=r3=kuE?cc| z4P*I|EhEWk*&IK>nwQWyy-2SmD9)wyvuNaXJOIB)in1Doj6hUXrj5H;?#Ib3s za|QeQWS$s_4M;5B83Lt)lnV(L_mjL1+E?(*>`e+~p%&p%9DzIpo~D*tud@7;aZ?EJ-Pa%lhb0COl2D_n_cVMsnrHS%hT3QowQ_;f`!a; zs)a*ic>;h9WUZ1IN%kj_a3i_8`&JwmOS}6v9Pi=iw!oMm9NoUVqcguT$oNm}hky8I zSv0jM0eGAg3>VV~?9*6xdH^|904^pk5zuldku1nG_*39aav~My>9KgoyCDm)Bq)4>tmV1`Tj{zbSJ{1| z7#3iCefDMI23B0(S|-ED?7|y;A=htI#HyaBP!{qGWz`r^;H{-XM-%z(9+fq3F>fC`+Ti52z53*W#z5WJ9YxnU>J1iwG#C zr!x3R*R1PSV4qTu%3`15{Rrx1A$AW4K)#8zrh%>OPkhT>a>Ta_^l#l%HshR@LM@+3q%Si}uoq^EQD8@x;|< z?0V(|GR`?XnVZHCk!9vs5#6QvFVk+CCj-gS{deb^#>%kIw4ZUYv^#Ij@h^{l3ycZE z(eJ~XUcv4`#vkfNWSs^8Sr(uH2u%)D)Q5-z zeQ$EXGquRdEWj$=XavHe`wf$Dn2du(R-Yb>epJ@-JcXokjcLI9dI-8yg<`xOMI;pZ zOcpv>{o@vcG*un9K79$GPh15x38t@72n#*Eta{pl23(7M&KGn^Z0bmjBxNZrKW;M{ zZ*j1GLvXfq@<7HxO2QghpN9lY9vNBB1?0mq$Z_wOW>XUn_!AfxanSLV7hE!@5G*U1 zkAh}v0P~J#xhYrAacy`lB>Ta7EU(5OO`mC>ZHlx(8p?}jZMyb)2Q305>Li_8*vR6; z!klV^LTw^kP8iVLM}neMuq`qONg|WN(;-4A;H>uOXBit56DxH)Hc1oDQt&N(xqyu2 ztYslhtrR(Nr2U61Jvy6rD3=>O5E=oxe>4sh2SFSM0pAYvV;_%LM%AwBZ!2Z7W1Zh%o=%PaUOZMqwLd_xSD z^2~qPNvj}xEHfqLH!3!__!M4Q5d@Lsf=jzvjBO=ZKq<;^kr*+L$s;2})Z7uc}F@SZG~{XQN8fTnG6qx^Hcn8@_!%b`?(zr3MRFhupxoKg(ATD4s zg6;5rv1OM@lX{s#aFr9ssTxdxag+Fpw1|lM?C#rS_p^SG-=)=eXUu-mkt~XUrW(T_ zZvh{*d2DYzckl!?Dho6tlD|ZrerOS0(Xk4|Jl9UxV+)U2_u5;nYVt@i&2w)I;}{;~ zHoDchZ67y#k%D^>Y#h!s&Oh;a_w(2Nt2sm@L8NYjVsn)h6-b+bAk4W%+~Y;KuiUt@ z@3^AfkN4oeJM2dpW@OCJ+$~ROy|irC@)au)@GVblxmcj$_;F@qBzhv&cnOl+BZ|qA zal+>yyq@yZ$(V9GTOlOQ6zH->;|Xp~3Wkj! z9jBx!(l0BsO}DUtRX9OSgE=fUNdO4e8oRGK0Y0%q$oNR9BK$O|BXG($dk6^W9>C*+L}yYBsV&*f41 zzS>trN^Pua+X)Dt6IaGvhBhxCNt)}ltpp9I;5EpQD)PmtoP7x*yGW6@YylY;fK+h| z?q$F-EfA`@8{wYXJC5POYvUoH+(`=bcX-^JVB;ZhygdLZ@1}y>J;O5O)$ zjapY|UExMSTvs{%L3Vv1E{FiRX0$psdD z^bvsaFccH*P&7SD(97Bv{(7h!R;hBsQy zQ+>}ZyLd2MPmgy>)?j%q0+ukS~&@ivsYpGz3|j@n!X zg(PjHc__3~hx=rf`(&Q^Fc7vt3`c(WkiYct$lR*H`i-eqd@d`m5s%PR7Ow+49gJyy0%tYC9swasP*o1Oi2v$fygS6?&Dcu90 zHvktZIwMOu=3q+@#F$bdYQUz;bCBa;76t+0=0*QrUVqYx*H2lI3Ay0X6z1cIQ(4DZ z?`$JAZyQwORsQseB|HiMczs6(eu0BQTRK|;U>oF-N3xWGoManQ4z^{1uA=8}Vfk!k z$;V%og`eE=EUFn&Ln=?aD!R63IcI=-H;r|)vu-ChYWC#$X}ey1hHH7JEzDfD#gl)C zjAk869a&_Il$2mn1y-MKe$C1?(hQQ+=)&o;SI(_XzG4kB(WtRh^h!iR=c>#_y&_%& zwDdFU6?^RBgw3qwZJq2sYvonWp8!*`{sc>GY>2}hGg=HiAWxDlNql%zso1LkVgbk^ z3**${YrU=ff^<5g80!E}PoPf$u!?c0PZF$6bz_l|$?LE2beW1Vh-4r>AK>91;$3a; zFnP3EWQB517v3(_V1N!1TQF;-);R~8L1sqKJ)XEi3n_*IUXdkj#j0$Ml`aN=HpD{Y zPT6xr7y?mH>f9jN(D)C8A$TkHZs_e}zNM`n?4V{kW>jdgDfW1sfE!tjZ%bNjX4>KEHT*Kb3gY7X{91+;w}AgPhoHF;-l zk0hv{LSF~(bZGx^v9w2H9FDK@#ugY8gd5xBfqEyBf?*}&m+bBD`f&&Gy&T}4qDrYE zmfOlTtb+hpd0Jcf(m-2j@suSCbw_^4BOu0dUiK5-=(+H!J{ zxD5hiwP42>j4>(LyB)WG62Rk@muKrkz%dq4uiMa?cFU*&jQf!J0hy0d>p72=$&+q) z=N7Eglz4Nw3UM?L2E{QrVeq(-&CFDcb&-!G*4L!;-1Ki+^9F!Sy7=f>kY_0BztykG zj?@FN$%~<4iCx_@+`pQCbbsfFcad~Z<5uHA@{gFOUh|Eo=@ns6U61I^;C@v`F3E3% zr^CDv+a@eiAN$w`{8HcZo^Q3!e)biA{cYd&iJg~!!{4z^L43a93pc!>`{y9zFdM#ZBWz z<5M0ndCt_gHR{u7d@8oeW2PwJIo`%CFm8c6Z-FsExbwCfa4CD`Nq5l!%Zzd>kF_-*6-Yk9i=A? z?rlxF%A>yZJ=W-6f_?3|g++YNk8kpU76Vmb9@G@Thb~^nN=7|@u=2IhS}){|+a-dc zl~Po-2+|OoTzkq+UOUYqK_(?YhoDqAZvYf-i!S|Wv(ctsTNWJNX7vGOxutg z_@4*%pN^q(aWF{x4*)Zgy0joGDZr$_jp8&Uy;7Tux9u$;!0gsx`dHvac%Ztr5PuH zuQXn=EUA7OHlAES@*|P`1O^7B{LMFKJ=>9hmnvoVvTf3^E;GI$*J%Ps@!07-FZ#fk zV1jU9sCwPBz*Z=e#j>+{Wkya%EQ5h?;&LG7?MxH3w301? zn^go%H5DYq5Fm0%1|F6SF%!{SGCb6c=b!*l1@Kn!nuzR($b^~#NDi=ksp!~1fEyB2 zTsvd)ufEg0A){bHZ5F!g@BxGtSOGO%tEy2q3QL5Oq`c^syeArKAW*j$N3t@!{)hjS zgM3DwgA!TlUCx7bos3-_VrV2EQ5(vlskjx5HxXS~NtIDcgxG<4f>;h%YYs`@6h)#c zkmgwe&NIyckutNkeEg(c%BF3#2!YK)&SY6-42sZ8qM`9Gowmk_vTcb#`ezUn4Hl)Q zZIFCGW4oILm|~4p&^VaY8q>>Uz{SdMf8unyP^VbcfHBrU(wCus`y~SYPk3ySh`eM& z(MzEoj$_m35uFF)Q=7h{F_NI-w8n_O=NXy2MnjN+sD0$QYZfRF2;q?zAq)Bc7eDp$ z_TKOQZaaTr!Crh}&A$EJpWfQ9?|j$)G=J!^UrT%>>+yNlo!-@(aX!;dBo~wXGJ@eY z9$mGG=3KR%dwEpDg84ynLIF=|^t_IqgvOKRyf$((8Ah@gKVqAYe(&hKX1@1!QG5o( zmw8Z<)0@pFP7E;aR8}ANajyHS$=oE*mJ?D4hT2sG{cg8$v9!Bw!SU~pY72}B!hP(y z8%e=vC1VznB<@o(bZF7*;~8k?7kS3|MplO_C$F$D%-GZhGN2l=A<0gV0?4(mEiT&k z@$zo_(0!#L1;A7*=;{Gc9SS=Y+VfZ^k9*}{RzbI#vNYcIzIXq@C@>g;dDl$?g0v8O zFf_nLz}>SuO;I_T_=FUsK(!Lm1Vbx`IamTAIj{sL4S+UnTIkdl3Z#}5zA?K*o_dOu zHPhs*KWWA02_zT+6iBx{vHAq^FZK)gi{$Qp^`)-K3FBtW0~Z6tA!AG%LIg2zSrH5H z-3LDJ-a8M{yY8J5m<4&S2Ho%g98+&VR#DZ6Q0$DrpE7f){{?zn zW+OQu(uqv#go9{VOB3#u;$FvNcezlt3saB>h(lLnh+~UbHgFe;lqfJ9B<1&uyg2ei z2{gKVMOJwasF&_P0D9F~$WjHoo#LDmWPO>YdULO8^J@^1D{VWD!9hfDCHc5ruAKFB zxD~9k72R_lbENxYc#o)W_B$>Ec$FuEELPkXk~lJqd~7)ZhbXBM_jCW?zq4nbe##y@ z_n3X^-~WzH{Ix%86@pbOYmZs6LeM>Ox}E2s^AI7}KPm8E=vR7i=$niNfh6$k{Ud3W z(w*WVV7}A1s8_D=o(dKAoE)f41Z?Gf(KV~x!j|wD6cIp;J4wbQr%_ODi7N4tpdI=} z9q<7(&j!*Y@`Pc?y-ou9x>wS>jx!Np&6OJ8@;qr|>OPR1O(}o1j%fb6eS)Apg|QLh z5C-F7X$RcjE)+8k>V8#~_fo26_ z^|MW6Ij5~$e+&?S1(7%c>HQJa9O0G;r!IgZ>yN;dfOQ#QkVlJ}Baqn_+IzI9``NHg zxZb|F0Js-9AR`O!$-9z9+ub6j;p(Z++n@koCT62jtJv9lW?$l@;#k`562cNi=?0$3^JSE&VJ zA>tu#gI7l8o)GX6aMH8DrS28a@Wp;Jo2hz3a57#n>SE}(12S@fw5aTzKt`0X$$H1m zzTB}XWQm1l&#q>V*;i(#7`MzM%r}|NhUFoFltJ;iC4h1Pr`y@Ke?NHjg04^Ptqep6 zpX{Ih!iU&t!rt?qciHcJ?ko23PyD|9^q2mctC+qskj{I17&5XUsX3^8l3+RLZ@l>1C+f|qKdmx39G-o zqPhqIgi%Dn$1Gz~-z(IPJ6Jxz)4eCV644Y95D^kl=#iq@4HI|+hNS1lzSCzVB&zbx zg)wTjbmBkwJ*$`(k@)c0-Caf-kJfk_x4@&=0%L-3$h{s(!7#}9MSJHvKj=r@tCF!6 zePsmMm?r;zo^+tfD8&3I?fb;Frx|Jve`=zhCGrCJPdzSnXn`^9;Vml zto$;So3ZvPjq5_GZdYem#7_XK6E8ZTR;pG3P=5eM6;!Up@j(DFYG>unmv&viH%p&L z2BYG5-ai0l$r@z&D-dk1;8X$8u-&+jZ+>vkpVXd`U^v(Sga}l5a4mH&T>c{fCIF44 zQ2;~#WO;`Pg%}pRb*dJgt<88a_%tyfvPcTd@Kt`hyC-Y(ehm75_Q{6$1tPWmH^boM z?SMK0BS|UJ5RSB0whk#DwJ*0qa~_f0=slO7Y)VzawF+D}++r_7gJGpkD|Wz|cA>Il zFP)@63+tAzQLmyoV-ss+LIP|hNs+93F~m6dp7q~8w(Zvt>J{j{@cykT8#fBqZEc48 zW17Nzcvmzps8V^fmbdXJ>M^nOgpa>lpHLi&@%h%jIQVbq+NrNXdkU}?+6_B(9!qzb zc$88DiKyAjCtk7@NT0@5Ab*luDpsWK7IDe?RIpG)B9H_Tgpg1|#6a_sh^PY0WlcYd zn@fxsqq?``X%S%x_mTQ;@BWk5MFtBcYiN-0B14Rrdk?tZ8^0I&?#B1W z?~GgE(P)7&K{$kd-YFd#1{s4ryppk`L&Jqrk^xz$C9A2HN%hHs;MszDNrDGixN)T_ z9jLyiRHfSXJNX^LpQJO>(!0c3`_34t$maFZ>LnedfB3iLX7 z3nD4lPq4B2R9?g&8z~?pTw#o*os_OmzJ$?$NF+QfH*f!Vvhn#Qr+$wa_(hY%_(k-c7u4U&6R3d!QTyvh{;$Xg5V^9{b;R- z^P)UQ8V@1~BBTP?M{V<}$jr4O^^z>g10VwK*8;h^)uww|<5rJm`8va1P6|Hfdp&(xnTOC<%AKCtocwn?9^ge2 zn80!$Ep7olX=UxKrx=aEL@P!l2fOX!!GAAI@&W+@Vl{NP%AwyOaI%0$q`dq%i(3H4 z?lBOsyRVx7Mkq|B^A%z1B&i=ka51Yr0h=>qn8lh*@U)835qiqAQoD{UX1vs2%FvRj zmwge}f+wILJ$h?Wsb|}kQWlw*GL<%n3;*F?emK|d3#Z~K@O(gaI$20UqJl-4>{&e) z>;~x=L7fv-$xmjuo}C~}`_m)7AND`|d;eDyyeYC`hrnCUego*2XRQl3l7(FFx%OWk zHi4oJeL?%VR|ac&9{swC{)I}yN{bkRAa#m6t^dLLPM5&e+@FQ|3EGOlXF%t0+il;We}~47`1kh8#?L&% zy`3oAi!ZL&&C-&Jj5s*}4CgoIsMt=`bG%gyNT2(nv`X^B=q=fPe!HFH@EiB?)lfRd z9l@AXm0-1XlhnYA{mWLd%l7809V>SgE*9=nTZy6GnTxO}? z3&f^LlHh4$MI;#aPWb3g5d<3MUS8&b9c#;jz_|1KlWWoSXbj4ueydHyR^Er;g$Z+m z+DmmqG^TE~MRMQ=-FAxkkd*yAL@`hob z4gq}tNIRQ*ixiQysEIXDo(O5zC$3S{jKw}QMEF(c`<-KEc&wfKzO%oF=P5w!!Ql{7 zJxfBQfcU9q)sA&mYngKMX1XijWm+`!O}1 z_Od?5v9^;qY~RCC{|lK*t^w%0PL?ISEV4)gMis-5Zydw=N-PO!Put8#0#zyE5S*w< zZnV|EVeCXw5btrdjEJ%xAN}ZG@rH`^3V!RiuGw$?=9h2Lc=R!ILZLd#blJm$7P5qC z?rfHc{otPy1bK!a)k7d0?~V9;i^Cl1$Ge|{2&>w&#au63Pt z!nj!4t$JYm`NP-(V}fvpy{gy(#T97#`+xr**+)J?z$$u@becsr&MI5`4vVTJG+LBp z1?`ZzMjnB7k!&J-oa**Sd$~ka+?p3DbJ@f0>&@0)AG{agI(0#*0iFUDEfx2wV<~R} zI#4>;BmuhxFkc$U&T=8^Rd}wR5)Iy@;37ks`RGYX$fai6% zOV6tlPhWX6mT27gzVzsfZrw2=1(N2dsF*-^2R*g=zR;QrU<|K97i*#xAr+2ta64lC z+dhPDeY{(@lln&cAt-v&OVKK>`B-dDT*rdBVe{yt=LnuWMiuNVsV-lc%-Qp&i;xg#= zVu&d7NFLxnMFF^H*|&-zMFJq}qC9EaE&Orsfn4dY7!MIYd6b_+A1IbVBr8kNH5Fe= zk#`4SfN<4UYE>L$qAcYoUnOFc(o{kFlY7ploMseCb>t9dqDGq7r;b< zD8MUnT%}e@o0=B#G;B~+UEYc^h75u2qqJ=Se94R$tD28JI3F*e=9ybXOe?#l!zx&vBB{+Zh>(N?5_pJ1Yv*ewClIdpTB4y|M(~E{qO&CJigDK zd+uLD6n+oT7r(BBPgaXfV1{)q+nuxw*(N$YEO@yE%O%NK4xpL3MlfuLs;FCQUieMi z(}VlGb+Hb1b)Fr7ZyKnWPpsH%ZOMu&%T{hJ+j2f>3&*EzF-L$a6=3Jq0mcfz^lUx> zq~D9{99r}NrC9YP_puD@r5jR|7FbATFTa%qScRp6)oDl$_IHL_;8J)+ipZzZS>h=G zyt0UkfOOFFw@TDg0Az;+pKL~iJ*Q}gLXF(?@~&V-9gZU%^X>qUlL8h=$rY3@yaC|S zmM5lQ=F%IGIl%#tKAoRfvgaSaZuvpk@=J3zwJ_rVrCnU-{5khLbv6d;Hr2gur)zzx z<}!M*jxHBUwmMZ&=r*99x(R@xXw{b$Z*)^Wc**IM9jGyd6_jgLn@?VQz2|<{V!x9h z2J3%_zZu=v`1NirFuW&y?ja3t4{NkQWDIg`7n)?)TDM8adX`!Xg$?xHWLB#t*RWz^ z$<9k^)?)mVR+W^#@(L+%)bEEB{mBshpk}A-~WBmv=;4KzUyDQ4t%$> zitokDL-9GjAD=aDDyxtAy`lFM%d-lB2p)t`c~}SPS?3Jzc>;yri36g-@w z1zVb$uo_;dELL2l+SH=CzxEhjYdqgb3KZlRNrAvgapjC1KmRVihJ1tcowd>>>rbkH z7Fm8&$(lvE-6wO=B>mg!FfK{8>mDzxwpf}6gAKc$P1wZ}AZ8YFlNQBQ%0;AdGGY?0f9fpZ|TbbYTeiTkpo(^R!K_JY|#Vr}iKS!Ar0gDcE^sy8jCs z$E=lEv3mZhpS$EyA_g8m!MyVz69m2Ay};uTrJ8r-+?H7Wovz8N_} z-a((NXtHkQI`h_UvS^}vcKtJeT^4*v1r&Iv#m+PM=ozw*1z@TvbPn!r=67yoVi6Vi z-5tQk2_L}&U`R5W2DJ>dK&!x+Bn zX#;|O(RQn#+63<{Bh^WFt^=+b_Cld-=TB=vLm!@4=6lPov(I!Uec^X`fwxNt;8a@; zuUl~*!*h^K!>#YMmtq}63>xLjw0=5}f>+<=mdN4njRH%jtY0UsAd9DGSpj&3)QLRv zx{7Q;g}Y?IEUX{n``_pwW`M_Ked;B=FI3Az>1`hNI|&X=yesoQ}MPS&k=ZRD?h$0%L0xNg$HX3b99tSag!2nKt?(O zWi{6+2weAL4-%egQ4|eQAn-d-`eyFw?b{&a_h^1G0QO9VmR zSw~i*`&Rd0o_;sxnuB($5FlOM< zCf09l=6U*o@kt#aCr%q@T;4kR`{BB)Nj3Cmh(j0`OB=S+_|>D-0%L-3*S(GVzK1o3 z^rZ?+7GV2@U-*Ch@e@BGufqH6{Xg_)D2jI8e(XR0s4Y)^#n#Tg=+-4I5)?&7ZUV^4 zFhL@>5rEy2x^JCZM1f(_+IssAUnpBi0K=StFSZ>A{fZZm^+`Zc3o&Mva0IF|>)etG zycRg`5!Bdi+Ud2IZMuUcuZ9HR;z=~0kK0<7EGU5eWCFc7>t0NI=p+D;DQj528La8i zx)zR!b-!{It0uqWhi*XF$bx$Sh3xV1-wsE-RJN;kRDH%tdz)BSvQwq&r09xZf6u1^-9Inx(50x7| z00z!o3n3{Pl@-#zCyhU@cp3dg$}&y# zzuu;jsQ~^UX5D-!)Rg4>)t~JQvM6FLvdLAOY36NmqhQMuq^_N>S`A{^PfXeI>rYTm zf;s|>pFZ^=bi$Dw+-X~ne-~R|ICg{AsDrnTELkE28iQC+v$bi?oHny zuHl~18(}~4dhQH1{>*1yp`z>+`;FhY?mtV*d!#YLL*vA~3@X?KK@d9FBC8 z|8@WEKDWsODXX#`nyYjy&ymmkG$bN7+4Vj6Xn38&YtXrAtam2XZDaCP?r%J+%n1sv zSB(dOc->C|zPousbYEwX+Gva9VDwT%{sgAwT~u(ng7?)nlJjYwA|IN=BcT}m?SuL{ zk{(@`+9o6{xJElnSP@z7&8|hCsp__Z+kIU?qNR4N()Qgn1eTbU_34*90fSZEqIBJ@+~w7?z8H8l&G1wG?^{@W;%qep z0(&i}@ptiA3zdRpwQx&b)5X=Q#cF^h#n)s3M9FKIlm$GMcYCsh1%`>%-L)({+JKNO zKwj`Nm8MVklgu`ouGpt=buNJ9ece73)al;Rrs#joS8 z=bDqtwmN^zzEt5e77ckY1f*nTi=fDNdWZk1-xOO=SJh>-^`4`gc1^K(OWKjIVqGUg zlOzJFtB|Bm6f7stf(MK$4r4P7sup)A3(ZY03l_&NWWi$=x=66NzGSzCb+AA|Hsz>K z+T!$rSK01h9WJh&vbl?jpHOaejT<0?ldSC*C+~_jfrgF%(&wq@~t3|a##wiC!y`c_XL!@~TGT_E;knLPV>#*Ijs zz}`W$yI;T~``_qXpw=V-ErdYCps5tPxn;&WV-G?)*?5+FX?oaFc(MX{pgtw2)0ehVa>dyZcS(5Vu57wM80HAGT&^DWM4@p<=et6IFv z4mCe@(bs3GEX_Tlaq9=({b%>=-O)A~J*WrWa*xGe;TA+q6_I7(&LJVqNOq`sgE?A+f6auF&4XOW1bu&EtHbmIK5GWS(27<4mh z5A9UO>aV}|+O)Q)Zjjaj8B}~tz~I!L`XcK9lDa|Hnl71>_XdL;?c#v#y-&d z@%3Iu9=|_sfrqmN#suLm`}M+wi}s-peJ8=m1nI#Hg5`|03lpq73OVw{|Ly<#XYH~7 z?JpvC`G|e!uYM<91%jIY<3CTF!Y4eaS*IX1iYCHgP;)r3VBOPxHA#(5RB=KZeJ{vr zTvmXbW@GX^7Q{v7R8`rO{DTE${c+dZYk|_@B@&>8cCQ)>?gsZjYre!eXff($a%B3U zFjbL?w0Ii|6r7rBzR{%!$*$7!;U!=KzSSmcmn_l(v&vc{(5}U7G)1LAtM;XH?}$X; zu8$8{=+z|B>Pv&#$>I4h9as8O9yzRR1pVe3uccD#w9PCb+d=lEMM%d!s7-CCYc33q zah_%Cv~-RN=p}m*=WJxB>gFg&)misrYatX+aA3Z<;Efi!${_z3G{_W#N1<87`bEmo ze1Fx>)F1%et6WdQR!aoo5eJYb5V~?@&Kg&w*M1YaX8KbF+E^?Df?`y8pEca05p>Za zNLU^>JuqsEc4;$!H7$=vuzu#L^^l-HK7=^P+6)QC`<$8md5t^Y9ZXJ=c5zk>mSmgHX1{U_;=NP)Zs zs*{{wJ!NHr&lO`6Vmsuq;rnt6dHaX`#Q3O>ee47N`EI1ZKiK6z2XitkU?oqrsQ`@e zKtx^-w~BAZC~f~~yyxQc_D^^IB@Y>QuuZQ~K#_QfZj1UMiK;avGji)VV|;(R+PUjP z|2qK~9pLrU`3a;;ZdgFtC_pdik364#|6$Y!7je56f(&Wn6!VR|i@{K$_EIHkf$8Xp zlmt+7O_&c3{j%@s0Gg-dq4qI_v`l1Yjo@poi+(-)JwdA1VA$FFP+HeiT(p%Xa~{oF zO{eWm3lyDeGk@XbZ1hQxz&a7ufOwDHy8Xw+()Moi@h1;w3ycZEUH0osFTHGUee3I4 z4F1iw1vmhD1=?XHKSmiXf;%%vWPbYB{}20bKlwk{|Mb4U15xh4}FV3NFKAs|=+86aA&Xs!f6I?aMP?H0K{@~9fx_bwLwW`;_pWxz#ih0l~bpZEqyi58-R+O%lp z@De2Z$6Ukj*4!=WZ8&QolFZkQm-1Uy7Y-#j3FOwybsbpOTH!j zEoR=(9m;r;hD>$P?gI2wsI83jNnk>OkpqD+`lCZT_pr(dbaXghZ4NvkIm*B!&s2@- z-`8hfa_g}OXqgxrCwzb+CyH?m9+QK847aVu^6!TGUN6J@o<0~$eW<4qBt**4Qdozi zUw<7^jALQ^J3(izP<#O+D&E7A4r$v@Wn=&1uKy{n2Fo|(G^rQ?#z79gUc zxhl?A!*}<5#XaAq;;;+>O+0h2y@cno##n49IG18$gEi`MNRCH*L`Po0(d{;lGy1aw zc&&LkC2v}986v-7y-vec;bcBnGKXoC97sXP^2lla4cncavvm9N>M1x}Bti3sh{*D> zKXz%20Jr8(f$Q?d>CIz3xKARyI%j_{Pm3Vv+}CEl&iJAp0`K*?j++sLp+`sYSQwo2 zfMC=x7QN~GI(NbGTUt72bC=%k8g!8iS#2a;axjV>T^4c4Yc#1l zCJHxwB|-XV!p2aUb}wF0yIX{1Kkw5^w3wbe5(SfY)E73*T6gSCtW zG2JAtAg^G=NxV%ND-$CzNg#JGwTQbM$r76W<;5omV17G~l&vcTpxopDv}B7^mDDHb z5)UG>r0h|W@C*d}H2~Fxvi7q$8pnkp;7P)(g*Ty4@N4&sy#U&qR|XSr_VV0ccH(MnckftK;MpB7MO#ZB{v z{*KS;x-?@8LQtR{Ko)OL>I#*-@s6#YvFYk*2q9@SH=9~xV3ZX2eaBdgaRvLWY#h%< z&oWj>%dI&__jw4sRhBYRQ!<9s=P`KL=L5!eOmr~1pPRjo;7%!UrQ3H>3Q4$h@~XY@ zQl0BWwx;U1Sb%F7To&`l;S}q1&o|9sp}*w0)cqoBb(=V%C$Ay71XR^Wp6XN{&aF-Ry7PHayOI1x(nQHtGbE2tQij!8fHn8Dz_r>^8I3ewKB$`r zg2t-aRK$nbhGq#dU7E8szGScv8M@Wx`(kW*>>P7fn}GXHHf5(Uw7fboMT}I=)+!{I zPM>g3OlbWZ`#|?$Fv!twePpa;pBr!E7I;)zU`!D1vZrIZ(@|@`BreJuo?voL^y@Z( zOZm$2e{UrAw9@JcTRr`!Ox$hKYre(-SImGEiGot4e)`k@*1qtCuetP|E5WNHe07t-aXH$U?x_cBwNwElLA(p ztwS60tfnp6>ZTh^|M4L}6M03%KjTa$xBzH|u*<$$#Tgf6Tply3u0`UZ_ z$j(v#z^ADzuwF>oI!>R(99sPW1(C4cm)4an3Ms)R=qF;q+cb~XU)7K0G19)e#00be zO=+x{(|AiN5QoVcdRwv!)$A1GXWr^~ACy;KeGoti3*ap*XzHgxG!yWoMJg}i@Qc{eS|iWL#5l!r+~tW|7KRFFPws2`Onii|j^ z73*@}5BkUP*i@{Q0-ys(8A;a2P53?1^QyYso7@*7XwUuJfA2u+J@0w9efF~oHr`KV zV}7#f!Hmzsu(gTH0Aba{AejMUSLt&_7Ie%IL<|^3ZWPAWtvfi9g3)hk4C%a8d0q3K zWtQwx_Y#%ISM1E1;W>jCAazR(@Q7i68E(24hxhvM{eyia;v7hU+Cefx5)5!Zw;;|- z-D~#DHR280YupnM>F%;Mn)6g3KkFo3^I{KzmEPuIIf(NM^3OQOT8ZL^$j{b95+E?a z8jnGNEP4;B~WJC9t`s@5zj4((t zpSa#&2|3SPh_Ph?(m=XvjpYiGyaZ{0Z`{KC9^M}tJ8o>B@jDN53+#4BJj~a7DA%TR zr@!<|AF?0)(SOYT<<1Wal`Ic>xllY~-}IF~u-|)f(Q@5ccgwp)Hlez+nsmY>6p4a< z^NYXuS2k0n{u%q{zxAB`jZgeN03-o!?J1k6K4Znpo06VQPk}VK+E-X`M;FPk@0%~2 z`c9CxxCfwo9Ub|G2RfG5=I!LQrva&DTba0Oizoibt%w5_Igx=}ZPqRHCtmqhw-{?d zk2?1lDwJsAax!-Fk8*orDoe+&0@g^r01~24=8vhkfKz1a#6b%LyHAcnuFb9+afK1!01>y z-v))yR`XbRS5g6W- zd}wrh+`2`A_drF~R8IlG18_skVCChf?D(a3vd>8ewBelg=dQo?Q6J84U^Z|-qP7$; z>FL2haqkRdkAdVDjyR9G!fXW+*uo1{XZ#nNJ+ee~Y43}Sokd$ambVMVvbEFlib?jz z4`d+b-udL;dd_coFJeZ$f&}p*@BE(MV62P+>KofQl7aX<`VIHi;gRbg-BWfL#n&|O zU`k?CT0adr2?4|cq{HCP(LD@b??w#brw;5SHQ`=pO|D>|xN1dYRYuK*>MHG0Yg--y zo*Jl-o8p$_Exb3I<~AnPPFWWqXzq4`{FUM)C^{EB3 z8JnfP7Rf$PBF$tFvOO`+;Tfbeyg`CQ=LIJxaX!|wOO7;wJW$&Ja&QJCOOSsidLjO- zhUePHl*X0Txm&bd{9JN8Ev+Km^-RjX^7y1(oI~Q(#)F%m z%X59ZJTplkE=Andsjl04#zD6-@+ez`ES}o5@M%$3VK9#sK$74!53nvu0^>3mGX2yi zLC(k^To2EA%AM@4a9OhP3iyUrUW6gjBSj~c%sDj2Q|kmQQtfqvYyK(|_F{s}I$3gG zx6fGRD$*NSvhev+IF4l%q_@C0|4hik!z=IZsBR_Nlf{5ySx0R()0t2 zm3>9A9kSFX8DDGV6f5S%0c#ueLjphRW&X59C? zIv2&VsqmhAnHk%f4?|6aa4mc7EZk=hI45s-Zzuxk3qkZC_Xc=qGkB(o)*Y}0k@c<8 zP^wvZq_@YuIkUjCr+ZKj)wAg6{uyuM7I=hOU`!AWptEDTQ!_2ln(#*_eTs24lJ?5! z$LuvPEZbL~#Ab{fgcY7|#YI9VAwVzdp%%R0g^+giXa3p$Wqr>yO5GT8WHM+PKTL|o*Ldthzh%5giz zf-S3eI6v(-Y>^zqzxAvMT^TiGtyF4H$x&o2Rl3zwPr0f?9fPQAm-QT!>%d*bvy>f2 zzo}7;xrMG?l`vO273*QKUMH?W0OB;@q0NHq=|xF>+Mc^irl6`HQyN@ZAyp`6ova?R zW@_OS5K{oIJPKY{z@JC!D2!gkUatcn5gF-ITR{~~6CyJiK^3yDP%|QBfH?H{I)(@7 z`mP8V#=BA{KBF;tnMN8oDVV$bHV0Udti)_admTNz&ygT>YNI9|izd2bFIa}`LLQxo zjb~k2ECwmlCC3MOWbEXrUIt5Pz#_HAy^$eI@#7H!Ge?uEVWcK18+}; z0NF&J)Pg+%v?UvR;H;AIs_yNx2%5;FG~r&4fcDb(C_>sw*Iy6Fo$)cMe$-5$_6`Bx zvd&)wlqfZE!|N9m)&b!iQslBv#SwTKN5JNw)3Xo##P`@Ye&cKHJ@0v!efBf2u%C{7 z!=L+zEt4X0b@pr4%j2D3jB1>^CY#c6667L~L9_Bv7~sHn%-*BM1-!z9Vv!ZOz!~WC`gC@i~y0 zY8it`lU~O&^CF2Nw63T9p4OY1 z;^Abtg4||_y^@C-p`@+OeT_?2`c(GI=Q6PPoGLFIo8oOYC=#j9og^?8e)$i+WPkl9 zeq`ri$A6Do;Gu1SF+n(>t_|r$sFS7T%aH82XYqyf=f?4&t&`>f=ZS7 z<)R(G{0?8ZeXZC!5B(+*1*S5BQU^?4Kl`g6_qqyNQ)8^c``^Das5vaC!4f!Jn74Zs zMi(X)FMzyw3bqoTTnl8gnO=UK%SKcPOOvv2WC;2l1(aJSeA5?N2tC*pNs(klqnpk| zUXpx6)Av4AtFYr*yt;Sv>u*~bFp0e8GzFyvN{k!~Y+ zDU_B|i-kV-+5-dx%R(gUdW&?B0&nTf0BS9wdU#%USw;n*AUN8jU)3>nUb+VDGk&J` zwD`KUo&~44Le{92*Z95y0OLF%Jt8nQ2uu@smc~VX~D0RI_9l6#T_Vx zB01Dq;K>Y68!Gs?h=mJJ0t;fMzD7Z;qE)K&AAqirED)oC#h;3}0`UTx;T&Us%EDds z_6cB;I0n2P3NrRSV=VV`#5$lkuji>RQJuEQ1v2K4mB~pEZL2L__pPtt;rxb3sX)Cz zipH5TSZR#sH}EKtVMzCu+SKnUwUqY0=*HzF*k_v#kmQpM7dv*YQvZ{DeSN1)0-Vo3RCa$>*t? z$$j{;zUK3oxSt4uh`k;OzZL;1YF{W3fM=KqnX5!1bsYk#y3W0}5ai3fDKHMfk3if> zDA~6}8hqoL!PQo!_~F{|WveW|Vr9i_;6+j9CI`7rPWAn8&T50<>#&=>{&!gl*6JW3 z8aa>M2!h^YjuD8>5OY*m)BHoS0eR7QPwAz7nb?XTvS@w?0$)ZW)AB6ir@FrT#6dP3R{P>x?9<#PrG2sdk9586mZ{_7nCc znU=`G8kMP)vRdPDkv<=9;}&?7T3}2N4ydWj4&GChV{oFq%@rz|sFv6bnsdJb(&cNSw6B2iFK^ZD}^w=y6N zj~@t1ob+@ICkrgxvT9bTxZB18o$E|fUHG_7y!s5_84$cVNk$+uJgd8Twf*{hPw49< zQ<0U`EnA9fU;&jCI!C4_Ed&CrJ%IX7xk3c$0!-;Tx_ZEZ&NmcG6RZF%dwd4qR@pCD zEVOWjMG>t&lfB|CL>7F}5J_+_Bag~D$5oLbg64Q%pia+jRYb<4m;uRc3V{8}+LKOl zGOEP@QILgKeXG=;((CI%+9CyDAj^To$a*K>jYLQ1F01bCY~q~`@_C`aWyPcZWVHYyv_%U&T7SaLQH(=dfJk&CyBIPdB>eZ|7=`{&!_TmvpU3`?;q;fE=K& zfc1&RXFUC{tm+XM?!2e`_aYUNAF0UM1f+sK&hz`q+S67bz%@&ID>(n7AN^5pFt1ne zndj|a{-0m9|L51f%zb|ERcm3w%3RK!dmNcV!q&&{_0lH$A( z=OX<^F+>`-lCy{;=z2t0m8>AsS#<#F_ZZitdsbF$Wf6<}(mvcm&w0p85_J5MBFf^6 zlublI*T6lfYiM%~1&RVr)|VN#)ct5fq6oSF>SKUKh^db4HAiF(2MFH2H$esfti+qg zb;%INk3>cD(*Muio4`qyUFDr8W69WZ->S0qrMuM|MruogS!83WWdT3tH-L@12gWmF z3u83$7-T>&gU2=)8=Jv19)plDi`bDgV8IVtfU!U$Hc5bl)Ka&4sp{G*_dO$H&-s7n z#?6Sx%B;$&%B*g+;&n$w#`fNQ_uY5z_nq^dbK>91Ql_mJV^1IT4BS#L(CHR?flpOB z50-lwET%>;S}(+Uh(Pnr9&}MVOo6_`ef&otS=VQ9>8#IZnz!_jY-dfDb1hh1U~rk0h-krz$Qd1D@`SxTa{oPEHu(3|78#!HIvasBzrgx;^lP(*w6! zDZX%e;x5lLraN_WyiD>+Y3JJ}0Bz8wCob9Ro*%cTWzi^3x)t0PRjfAgd(A(1YON$d zWE-A;#AeQX$X5F=HuG7B&m&RL?;=^))vLgMd?8@LRhmL(K&wDh6wupH$~{?$k%6;O&a|)UJ8l@5#%XAE>KcSk=wr+7vb(`0D^ld{KtxazykqDmUPFX zMaigvp2l~Zs5Pt)&qZl)%1XpRq{*a`#IjmRP_qCc&_f_;ojMFE>Ci((>D zK^9n)MOWM2$wBLcdL-iklzFvWq+liD7%B;Juh*zWLF_|@D%cI;NCaxqMcP6xc7ZQ} ztz?RRr($lEcJ>l4lP#fNN2)SBd&K&yU&cNNf(1+#0APJR>lCMw-nwXiF=+NVNKbN< z%HK6Cr&!mN=RQ>j5CJ>{NF*t1Uts+NU!ngvFb14T)B^(mZ?eqOAak-NKtCMuvNCXzn5UqjkS% zzG){XIvW8`C;O2Uw3C2#`H+YL_n372X^aaw3X?@r;MQnJKztpaC9{&ZQQ&)HW5(x! zE$PB`J&o0DW|1lp+ z(&nD7=Hju5;YhJoTE{n87l(-%%#tMJ;+5<6<~M((DSKge>-NAay$8AkVV|z>_H?Hh z>4mv{lNF?qoVWQx$yP@`ZiS0q$A@V21;%3lRYyD8C(It#_%7haF0=6W)v(|)p=)ao zYK~-~ohUs2{DrMlsi_7QaHiV|3#sHyn(QRsDPUdEq^gxmmcmX8XIyC8+oL1zbql{& z-Gq8_1Gxiv{Usyl2gI-tCmS0!u)bm0#~jmgF206WRC^;h-s35L zo_vjrLJsHysMqz7_C7~V2^Gl`u-AR0?Z)$$S4+X^s(h?qWyl@Gq8E~tU7N6>>-YOL zlZF1<{?{)duHaR~6@0n<-tS+~uOJ0K>!eTQwmhXm+;_vHLSy3>C| zy3=>Jfpr%_8eTxw#ojU@hz?&~+Ry{n&XdJGGk494gog zePgyxp|D;i{}cX{-=n|K)#$hK0AhXGc^ zV2~Xug~uR6jf5l`caN9Ih1v``H1qO!4`Tku(VGI$7Ah_}^w;j4cGxEfcy`Df~!dsX2nwMsgR%ilk&Ab+GO$Nlj#wz{}PahtSdB z9bU+Wp*E|H6}(Z$7S^$-0@U(=%GEW?RX6R@_@>Q`tAcVC?**PTY3=!8SzfL+>U`wJ zyaIQPbgYpysFJwAozAZg7|hbP0)eTr!Yiwj69gwX{hlQ$v)0Sl&#|A+*%z%}b8kWx zqA=UHY(-Uq=oNS*AhoT=fcHP+c1uDeuK<1DP6(t`*K0|LG<)?j_WO|AM6W<30`av- zmk6OqK_r6V`ZGPyw|YN#T7rZyfKOS#*SYsPX# zpbTjAParXPHg&OIqD}W&15hr{oIFV-s=ya!uiLArq+KaOjHx74q_zyLC9Vo%1=maS zTbb|5%RRa>2rUs{e%a1mV;t6(Aqeb; zf|W~nw>OD@2}Tdr+y+K~j&<`T>a6ZzyFG9ZdZ0@X4xp12K&m)^P%KRcAUKtDrgH$d z)%^XoF#ar3p;N+|O&}S*(`rfp*{#=Pydkw=V-hO|5)ipaTieb=K_tQKqdp1#{kNaC zC%@rId-ChPnK*?Hdhs=B>er$^t<1&+av2fjk;u4_b zoGQJ}K0>e_Sy;%JGC#0vv%|{&9s-K%EbTRlZB??sTHM^h!X+KAbn=q!gaGEa5XWQP z>e++LlskQE+uo;JAGj;oJsiltHV7!LlFccFbSNvy&c<;C#ZNV0N=yH zp$f`caJkRkaiK^nIhObOC5;>sZfV!57}nrK?nM(mEayF zSv?tVnKE%8)LPI&s}!wH5}HBb9_R-dlw~|6a0D=QlEC6Cz^K1v!IUSWeVloNUxxpL zfcX*`RAz#Nh&T<@(3V}9w8G4zE>}>tt>_JkV<4VNB-(LYy!^`}KeRf7t_P@3WI9kK-+P!Cw2OUuw#3klm4DIB4Rf(Fee~#a%_Y(2;Y`i8!SxK)ryU* z)JZp4qxx_!vjHhOYsZo0(RRkaya`z}|4HI&Qq?u~dz~@JeMVf*!L(&fTjoypfU6x{n#D=-A)kj{iqzxW8=gGdx&-|aRhDe*!i z3F>MYc>K|n7RKM-%V)K*;ruK`(em z6r&d7*mOJvn2RJNOMPT3y1?~eJVI7y8BbqydCEO=RS3dL8Bap-tP?1CSYT8K+Zo-x zcYEMv)B|0Du#Xp`mG1PN>@_UHnwaI@cEF28_1xG=J6a*b0@l}F0!$;Y>ug3`z+0eJ znP&=Adt4a*jEzpcIsnp+9|_P2tZEZr4PFJgj{o&9|GNE)_y3apv#%wIgsggcJSccWVmvfTTC||*S zPB3Y!Jm37DL;mHg|--_E`h8Z(?%vsOY2==$57Z_G$Vsz9V4-skcri0ttkJPTM# zT`HmgaK=3#E2NeUM8Ty2vMw?#N$+%OdnsF_2m9e>iSL!;$D{UYAo?oPs6YecgT*0sX#s&L@ z-})~B%nmjsH(24@t=s|V5t! ziwK;@LaeMVBAR>Mf>EILZC%67z9~-|?Am&=Bo%t5Y#=#pgHuQB$aFtcbJW&*Ms0(1 zx0TE^L>n0#fJ^t2&b5ZuLsfk}gHlswlVbeccbVW~Vs=CjGTdt$Q~}>$+>{%q@gfxH zgHJOl0>XeR~w zo4G~>85MBcA_9>RK&s@qXc7d;oLUm1R=@1_mrGY%VkA!j-EMIVweE|~Jvxb_Jp%Re;3!}{cmPy)Ab@?v ze=R4j+I1w4i5#Az%?l*>SRvS2wLu^TRG`-!8Kgyv?#0yjkFqosaMU%_+Np6XvZ+n| zkZ5|3<>}F2QkEyJ1$oHROnJ&qU%YIaWP)3rf4~+}Cs?Bf7*Az;>NC&VH+=mUb)HQ3 zRksITp*_$g2>X0tB{O=@d*0?%m3y>`u|Tg3UvL+BmNyyN4=V6obpR+3SR%Nqf|o$<@&*%XkE$1|nleCYnBq3_07T2G zXPamOrjE0uxdMn;vXgA~4Ee*vWw!p!VsZF%zEU z&CtSMCiBvgyW^+uI?x5{wHSSPC%##CA|%PoAVKecV5P zpUVOz$A}~*cnWkJ^_4c=FX5S6j*Wo$1eL9kCFJY#Rv_l1uuRdu^ql=~KmVKh)ZXy; z8|_0M`3r!1&K~=!pM^L`GQ?wu$Cihn`5t4~Ndg`%wP9kG!embQ2%X>54CUiEdsiozM;8B*GN^qH>jXoDO|Gw_FJew zXoWoY71hfJ7yIpaZHR(k&p5N-)Q(Kt+rk_PDlXz5fDLXU0 zZpY?T898rdsw1x^mTaZ>GM<49g(Zd>}G5*#$&K|^mghIZQB>cA!U&;(r;&ooXE!YW6RbL3C|`nc6@%)CZ|pjuLa>|o$`5(qz>J! z+XG)HJXP<70>)<8%3_r5U{=F=I8^! zGC@|Fg3TWLxE($BMl6&{kr{!Vb`pV0*kK)ayB6bKfM6BiQw7w^60dE0P_w)W|MkEA zp?&fb&)UC#_wN$Kb_rMRB?r;yRNOGyQwG!#?5u@e8f;l;bWVX3gmj(3vfAFJ(3YM4 zjo`(>1CpW)R#{~{aj!xtSf&Lel#W#12?YVmHLT=Dz zCkBiomm+cP1;iChC~y)oB84&Ed5(Iewzhw^z3uvJ`+NFb+Xk?d-dufL0+5um^T>UM z8Ba&(YYKiL;S#vk*77{H{hrUFWmLof>Jz+I#C+6~WQ!s&b&2dk-}Q~(XOF$+F?-V+ z-ekY~@!vzcOfLMlf32ro>?7~IVIOcZ97zHM!3hJeC7V$88$-IIVXJdei;e=M`($zF zF@V*5pjabwQO@QDr8B4A3L1ZcO=y!W?a|B8-uB!7TSQ953l;n;!d~g!v}pp|dm#sz zzCNt~1Ro~`tV(vI$?Lj522nnw_v6+MDC2v3 zd6tyL!6)Y{ucv^wlLW43ob&dwpM(64DqaWDmh-zMcmQdiB$GbgZtv)~OAgexy4RIn zd3^v68*7u30}Mk7_U~_I^O7M!bK?2QDTu-nqyUdh52>4rken?^STG=I?vXLfNgqaw z439V$Y`>OT!*p#t%{88U)f>{fBJ%XqsdH8$W8M4!CKibIAT@5t9nCmS*{^@#d3*bJ zy#Dq&r~B=04}6~XK$jrw^M#Yl=tqC-hnUo;G)w;LbgdtY-U*vJ@kc%ZsQ?%vTR{vK z+9H4(3&x%{z#J3Q(EO`xar{%Bu1>|*+)J?qhytjIlcIo>GKUl;{UNZjl$mwQc$6RM zura7vK<6ia^6%Q;e)3H`9w(^zefBSZ>3!&Ok2S#@9t#Y-!L{FM2~&DhRzCI?kFPyP zkkiITklQ^d=%fXtGq|%o#sJ_Pyf%y82Lc_Qjb)ovxFwHKE`Ep+mRniuGi28p zU3oQq8mjR6#Z$ql1Kj*NiU2s^Cvz6(D1am@xq}d;+vFTYVifQzTB(KEJqq$HDE0&} zs$gsZ7!jwSi`F;_Qa6p?79i34;j?gB@%)kRCt5lBy137f@sst=D z=E26Q!_l$7?c=w(UlBUaNtujP2yVzj@-@ ztf%iqt57VjI#>hD(gsQCI8R9*)F19eV1M-<3IwiHY-|Cq5nh7J6Wq61P&0Cz8icN# z>aml2eq^y^;~QnNnoUAaj#y>$7=1^8uzPXjS;JM-;gC_gl(mKaXNj=WOSl>u)J_GNGR}BQ$Vp0STTGz}O_+rnVRzUaz~9a&qnd4PVB!2iky71+tpba|v`v-v*DZ{Cl=1Aw@a zBgN^0O^rY@kepPL)QTyj?a?c9c4UQ=r)4rWQGl_sb`o-N22vo|P_Qg-5rn44Ky!}3 zYUjMNTd(ZpeFeb=uZ!;4Qf}7gGm(ULE&N{gbWq=M(#L$NcBYsgH19~BxjJys!MO;N zyn=VPY0Q#Vm-%d`ed&IaS66e!+7KyhH^#}hbe|IhS^q`U1^7kUb$_bDc$U<<8b>0W zx{g~?Fee9^Hx;jvxg`47dmIDjj4^2AAUEMLK*hVBt-maMke&{!zuSs*IzO(-lKvzg-` zwG%IV4U0Nj-CJ&2n0u(kc?QYSIa|wL#*I&If0w^(|8WZdXn~S7xfh}!3wvT&vIz%z9rBmSNQf#5)ZfHBBydMLJq)1hL;8!=}Sm3>KiAhJ8{?& z87xEu5pw|m^H3v>+vrGj@vh_mpM-38*IeFzW- z%l%$S>D~20Bn#0)q}Rc-5J0gCj0w;RoRqORml=xH~p{Q7Iafm`v_gi1FpL-~06^>iy;q4Uz zZr&5&Ioux}^TI%rr8A}}-58znv6q1qeDMGHmCj(}$A8h~L65GL>`RivR;~~{$v7JU z;GF9#+NFtSTz04|EH!xwkOU4x3JwGO^VI8*cc7m06MRWSZ~iA zox&5cWQ+Z2yYKqCz3ST2+yVrx5-3_Hn7cB6l-PoCo6bW#3V1LJ6#gQnW{vMGqD7xM zG;eFUBpJuj_Q16@JA!<(WXC;VdxgG9I2pjg%ySB|kOhDW97l`({*eQnf5>Dc`Hqg! zF5wYLNFgtKsW%aXEfNDLUh}l4VT?#tnn%l@r!ZLTpPkzq$5a>*`i^Q)=o~%Z7-Nk{ zd137+*PP&U#zou&&^0DBo^;Pjs@hNSITbaNH!o(glC0AIhQ#>T#tY}(AC0Fno@5b& zCh_9{zWbZEIkZ6JcZl(+`9%Tz+PC(rF{*x1s@kcEr)`{CF*0ySgxTG?J@AFr16_h} z09Rab2*33&f5G1T{of4ukd_k56`&;DLnU9pP?0LTnt)f1{5hmy&L^q8H3OK;Bs((u zsLdVvQ)?_xH-L#gZc+9SU+Y<*(WOlz=dsLEylE!-kJ(pSP_u**S|kNXzxO}=i2d82 z{;+-bH~+02gPH}L+G7=H#MU7rQP3N~%G>%Z051Pz>-%^1M_35t9#*Q>Vn0EVxS`7l z+|w!;Mpfus@qYR>R6myNCiFW&ZCbPdrggX6A~li~je=;3S=b~yiUQSSp^{a;{k-n1 zojd=E-os){+yfE|Nik$i-rBTaYGbiewdNX&XOi|OJaf?q=hO<6)#9o`KpGPsPr>&k zvGPi~D&D0)OzFo<%6x)$T*_X9-tS$o4}4(8e(raE+s~s)uyGk;b~#HBZE?fCcpmTp;Tfyc z>=0>iN8tpYE{PvK=cYQ_3dyfl+!H=;UtqaX6mHLI2hjK*8GF=c}kj++~krX30ik%ITp zH^cPJX_8|eVf-L1axlppD2oDf)?R>QIG@}9cME)r*z$9~KN(Y+heUv14x5O3c!)^$ zKoTzbv+f_YQ{=s0Qn-$5yIadKRuEhq2xXI4`uI`My|Q0z_*h8bB~})+a*p|$@gy>@ z>!8d+>L__mhvyz_c>$Q)B>hu-h`_uONQ77sf^blmlZhsee4z$FsN|3!AVpBB z!~TVnE^&}+bBUba)5H^;IQKVv0oiL)29Yc+j(^U|1aoC7igO5n*=JbaNqimlC@Y;T z%8iDKgP~7m(Q4nqf+^yFECo-4T)#^r&)U1+^)YHHeAE}zTLm@yg4ugGMqJ!`TOezam$jowV!+PhsI?fx$^v^(6gr?0l6a9YxMUyDmUi<0T~JvWouj$Dg-a) zvUd3}Kpqc}Ckln;n@Q(k7Q&0w? zKnis0eZ^P&_EzsDaumlJxQr2Cig8x7s|9KX5^c1VA4RI6tE(TdxP`AF1G# z#Z#htRCAQeND#}9%pn;Z2x)Zn-s(`VJ#|*#Q+>mArjIkSN+V~IL`0zPUTgxhktB%n zdjK#%Q(*Juu=#ZXT)TG<^67INV?dq+zov{u8CW)n+Yl(e*%rOY>twPEwF%k?0%J(` zlp6r>Ca6A#=35yt6qKwO1Q`Z;xSuswYkrUcr5*GOoQwFX;G6DgkpKfh{JzP!rnGDCX*je4@S9A|_3Bmzf-k9z* zPiCK59V@WXcmhOaU6Bh_nsDU>KXmm=?8-wQaL}lL-&=12SjsJ4wTI80po-|zcKF4w z;4LkBk_hmxzOuCl`U?Qq7y*7&8(2Hx!N-H>Ji`_~Z@%zJSK3bnh%Jvk&37-OC&q%r zwo_2^#fw+ABuF}bJa$|#;(jAh(Cav{$ItY;uwxYk^Ua=fM0amj&tb z2%MF*skP76Q3SdLf`Y}8-0A=q&zhk^P6K3WLN1|2NCoW#K=j?X&(>aU?=S5`*F2B{ zsz{TrPZg{S1idNXT#})XqBUeyN>DvkvLjj3L@1)9YWH@8x&$;7LPLfoekU>^U@E{V z??jL&DPvHO>$ruP;|jcJ;lJAj_V#*2-`4d8rfID5pL;t1$X;2P7#VRpdE8Q)r!BQ6 zPXpH1+B(pIc%2@dgCtk7^h+W_prwM!u}W$TXw&sqF|KMF-8_Ams3}_su?+eSL}G|> z5D8*6Td_20H7D2BNpCn086XP|#qX9=1zSsx;#oLpiB!M+)4%gI_SmZ*wa4H1di#A< zHl|IlfBo<1aLw`TfBHWjd*PPIq^J5^B1n8>kqkuF%w{O+rA$L(G{aU6vIszy1@$`l;8zE+o)guJqsT^PHn7So zo$21T?f0R8lEwyu0>FKhajR6IO=%ItK<72Ec-F1|n!lt`7n!DGohbBf86DJuJ+^}1 z%5yWgr0i$9uIRv($`^0Zi-!YAm{=kN90HlZlQg(=9P$=CY!T4ucY_Of3wc%`weFua z2-Y(vuUdL7NyfLD4M7t7%0z_U!%ZF&$>V_XdgOPdBi>FSYCoW!R92uUF;_d)ylHv z3F4P5c7vD>0x&+~XuB~K7zx=L$V*m5E{3u=o01Fa` zbedp3(wp`#opg(Y0+f5n#GpXEy%B`C@B*xQj@aR~PXL(b2?E3F?~<79CnMc{)ieHN zn3$82+>nt-U`ejs)?c7TmM8(szz5Bv-AlbcFAKIM4P~ZHYWstU2OvF0>yjVSeOAs z9?aK6_8|5bJR_0^M4i9R7vK#z4%LnWS#VH5zsVxI^Vr#23vTr-Ex77;0gjOBk=*C9 zm;(;#0Fp|g$YM)n;+3&xmZgwIM(xuz)^8J7k+msXkjC>)Tf2r_#3553^RETc>OXd1 zq3k{q4^(>5_;CCx-i52fs}RH?Yg8cw4LmQTGE`OHU-@@$wZ|X-3a@N@?%d)QDQG{w z#&ZN3dS4(nNvuJNYQ9Ng0BU&%M{&iLsWyC_rVl|x)>1P7jv+fzdKLXZ6=l4O8j~Ak zg0^|ArTXkDa--~OkBvZ*stLyYTEQl1TTf*aYq$V&M9iU^w>&Anz3b!1J!{!1}T7?Yv|d@c-C;kieYK8p z<6mJ8=zPBqoqC3QP#!e_Y60x)qZg4HLE_fvhZ%r=g-XOos3ap{HF@uxa6tHakgjGor|l4O zzTsjO>0FI#Ng+i%r-cQiVn~Zh5CZ}6{0f=Fkb)`hK*U!>Rr?enZEfxS)jm0Pj^Ebz z@BA+}#;}$SA>SJz$;j2C=WKqGI2h)g2877vpo&rBx^}m254_TQpi2-A^a?B377HI1 zd`VR_sVe=ZK%lIrvJfA-@>lHo*$?9?e~1ZaZ)OQuP|As6d*I@@edK|svEpD&N3x_X z1ah(*Hs?{fiI+xRU=pXoD)Iq&Ekstd0JpZz30QK9!Ik^4oV@73T-i~ywFfopbtDVz zMB(}8FW4tO@l0D?1zG$AOhgn~$B9HCe5SpH&twq>`g{LKLY+=x*(xkMNf60VmI_IQ z9B4N!KR3u1w7VTP&ziA`)ssyGAl*vAUUt7F{k^XLW8f}3Sw-7HakS^9Z-5^#yTOau_hV024s zp0uu7^gXcjW;?#a&tiXsqGNyoVl4t0Vo-9Kdk6rOmnKUP#LRW@lQSw$`=AmEPPAK;vskVoC(GN`6zvvRQB7-D3u<=OK0E+E1Z&|KLCS zVSC`d`|ae36ZWD1?=$vSzv6ctw6q;;mp=m$=GJzvMf6x?kkgH5i3BcPmD#oTZD7Kd3{lp-Nj55?!K<OgRL|y<3f`O%3zlqv^ zm!@?NlU??-KW~e;`y4_a=~MP0me(CkOU-) zn$Hxh?8PU!_KHmj5=i7jF3nVIfs7D5c&%8IaXeUqRqm^0ra zY-*@#bEAvgeQ8fos&V9G6T+()DP2F!zk!hK(BK>1+TRPRbw_a&6DupM$HX`FBVj8Q z?fjuxn<3j>9m1)#_tVdO*8cVzzy5~Sbl>Rqz$>i>x&+~Xu4t4QZEpS;3j%sr08pF^ zwQ$K&r!7o|LG~a3yO&M-svxsj9GJA%zwinBqf=Qcq>gUwQ~QW=BOTipBo?d^saLm- z4G6w*(|dX-Thduu8h^&65Bch0|7r|sZV`n5LfVPKYhLr92R1+P#8+>V9|e8scA}s~ z%H=~!^{E915>-v%F+h5u0BjYl%C3*t(DZ|DRgxuIo2;d`y9tCisHw3KC4zZHlNSk6I6qm5q@wS)ahu9E2KJ*4H5AB{37_buzFKK>fm`#tqO& z1Ww}~iKDLfR=c+C^KM?MuRUf;=LgwU&nwGS0Qx&sB5uuNBBsInkfm=ZCWx2FNrDpv z+FaW~wsJR(-SM|!{?tc42Dp}bu2U?}Gir$>K(hAp-rKPmdwf%4uYc*3&wD){EKl*d z;peS5FyrG(BtQnP5Qjq5VtI3UFUD}ykWH2{i_C*Fwz*iQmc^0{kiD;(U!z_}0}n!t z;PaFh_N%0m6!l9XTRp?$gwG3JOGh3t9`Yb)ob7Gf>-YAyHx*|q=BJ$m6??b`rl;(I zs~C=o%cL7-E+PJBDSgE6$@=M+N09m6&aC^bZV%jf4|EB_o%h`>e|h=x6&5yvg0cL` zqOS#gjSNPzn8rue(Ti_n z5h^u*8vv3lK&rzqO$BBxRGR2-lrx3zwhoGP1usJX{Aqy0g2y4Wdp9C55*%ugh2T*z z`xD*fD(xJsHN@TQ8afp9?z*mV}k!O+aZWSkji(a(F| zt9{$INDj8Yf9J2ak7K=#kFeJsGFFK+{LD}NFaFu%kAInc=)<3di>}+)+n%)LvFFI1 zG-89Pvwkn>{tcuewu*j*eYfs`_PWLcBElhc;(FB&@EQik#sQv75h%>?A4ssoES6pM?vEzMu;Zi61 z&f__#rx1dngXBe5Q)7FlP5mYVKzvm2($py$SBH$bw9@Vsu%m^#7n|fDS*2(l-Vhla zG*{^Hav=!nM~ywj%jGuK368%`cB~#-8Jo4s;~@q`LA>qbL`EE+&lqc!(Ira_6p+A; zV~ogHf8v}K<}ca<*ELp}QcCK1DCoRS4Hl&n*5y+S%Mh_6k``%Q3=+YeuWRSE-phA7 zf3e%E_OYZnQib~zKhe-!P`_-86ze-NO?ut*VH>CB$7Wt$jzN3>e>!LHc+0WfcH4cw z+XJtd9_SK;1H6>y&%bCt_fv1Tzxxl~#bTaw5LzZsOAE3xGDI*c$%j&&3QTHIx%s9E zvd1MFYeQG;Ddwrabmc+&^r=q}#CsjU8iVn|_as-4+cXqW!rDU+*^LAtPP&>h!=?pJ zllR=wKchICtf)I#-vpEbfN3WRB17+b*Pr;~t#AF(&Qz)I|DgTQFa3h84_^QnRnerL zvWcs&bx(?NVQZ1^AR{-Bf>s-SrHKvR_AC%2&qU0}9jtfA6wqut>A+g1>)<3uM2E$0 z=X31bvDzmqn#jh+&{g1DoyGAG=W)_A4r$-f^AO2F=N|U|l`?L~)$i7O#XS%JFTH+t zd6FQ_hh3H>Koa^jUh6w+hsLMU#A+P5r(obZJ+Q$S} zR3OA{&*8|4M40B@_O{oXJY0`I{^g#QRG%sXk@{_A_`D^D$*KgA63JG(CEJmu)U&xX zC35ZY24U|v{;TiHg6$80Jm}Ca9VUAVAW7+Tdyx&LH@Jt_APaT$+{u`rK*65zT;g-M zkGGB@5G-;a@}Yh6aR9+VhO>#6!kfwuqRepXxBQ`V6WDVru(agJl|n`thytm1Q^{!? z=tXx;%F{D5!(;|qx7jklZ-Z=3&3^Iz;og#N{UElM6XB(0NwUY z_q=}V5Bf&B@hCCU`R-l1vVG5Y@*3|M`ZcvzUJY$gVx+O<0pb3xuJhg9lfIif`X?S2 zUy!6@q~ASp1vyb49@h0`8^rp5aq@yKO)UHTqA{1j@FB0X`qQ~L^QJtdt0OPskxkkV zMw7uZHAax_4OKs9nFa{}RMUf41f8i;&?*RB8H?m?(=`j^;Eqn!pboY@T~~hOBs*+z?r`25n;Ikgbo5F~8xV!`so_x;^lP&;vKl zvR?>ieUHxZGoN|JUiHAk6!5uB>O}?Mk>->MY3AskGC7iidHJNbLk+)fcOp^HYkkJV-$W--epDQ|X5aaD{yWIRoBi?L_y2~y z^T$5k1VsEsKf|lgXp?LB-h4m$P{+_av5o$z{$Xo>ulWwdLUIi)d?E+M!Zki<5DcrJ zxDmJTE1g|C8416<@n0=0k`W0=D(F~2rScH;&7XC!;_(nHn%W{cxN$H0`;N5j3Luo6 zs8k5G6zTxJ43ez=#WM~-L<$u2$$)5{r}}ZHE%a~elg|DW7*kAxr&3iwt!gX~%r3Cd zH-Cnh5Yk?@dwS^egWo#OrA1J~`;ipLW1tG*A_bQ&k)n`bF;mmz3S{gT^k4R0`WXtN(GIY86)60r$Aq%Fr+%|B?D1mxlSc#fXf~w zbF$oee1m%_g0;LQqd`)`IP3^I*QKO+k=STVsDia>4g{c&l&H5Er-B@FJ+J)UKc{d}kA5ay`xYuyvx9@?VkM$_{mI3a{`8wNeHW>o%8tH6(|4x86Z3rt$cb z1#5J6f_u4UMY1q;w{8!7A@o3(ARORT{+-|Xu)XbV-|CZT4Oe%yvg$y+0kB&dea-`m zwcu+JJ9PE0*wqJr%>iG_y0ly42%-hdWY*ET*D7}5*sP6D|7E*=`Xe5YJlGbntmDcp zs*FT6(iRQ?9t9|NvcR>D78VUH&hjEGQ@MFy>9kws!gu1L62MsNcls-mg&;o?QP85< zgEj5{{FPs`fBL~6vG4zH-)c{O;}iBh-}R5|##E_0$0}$M4V)upjfrj0FQQNn=`4 z|KhfPJVmCH1Z8-_iil-VR(WM}@hZnV#_PnL#QuuUv`aFeCOObOB+Ip8Lx_r|I2*MO zsIM?U4TI!{ij3i5*}5KapY6~3Fz!1%>sktw33P@)?+afap9mL3$2Re*w#B`4Yg8K4JeN zO}ei{=v!^m-uG!^x1rxe+(PP78BJD5w%`PTYSyw~D*#{MjyJas9OX&g|MXEic{-4` zZXNl?KLSw<9*qz*O@(0y_S(P|x{e};c-sylj^oCb?CqTfWIBZ|v7F{U$RzF9)LByg zP9m=%1!LZ7Dp|MCR4Ej$Ird_mY`D>G0BN4$cH44 z$**8hTRUmX<1cv1Ke=&bF=wd-Ad}O5^fQh_vc(afG(CT{4t$eMi?O^M%2mAxp_#b$ zS_jRopTr5hwLr(u1U4l<3Z4YC`dDCQNB@k)q|bifSAX8#{qLXluih$FL5uqKz~->e z0GzbYNOLXVqWs#P5>+5ZE^zv#7lI>;sulr>U8Kc#t8T}_q^7jaL7>W|2@r(MBn5o< z{U$(sli+3tM*uU)v;?%GOw3Q_9{m&b%d&ba?m#jaZx`pSe((oYvIR41|vE8JQ7#-vLQ&y64vp80n_yV$|TV{2_18L=vkmtqwFFU9%EN**lF zSfJ@+^;PGlajAWT{e&^u`i8)}OJ$nU1rY?rtSAsZOPXHED>NqE!Y!+It2wQm_+K}E z5UuMX36if=h!c_rLZE#kI|adMuZSFqRtb#C;w~^9Bo%63)+&XI7%c`#XH1&WW{iqF zZ!773yD*%yzA9O05@WWMm>_QAbAcp46hgb{mo{*|t>Jh4Qu9ub83m7y&Q}CMWNig+ zreY^VhD7%DU4g;4ZCUK;8v$3pkCBb&xdlYyw-5H&!7tvVOgUwTXE$x(=q03VN@Fae zLe1}6WtY>rhAocu8?X8Pw)DpRtF2Wea2F>?@r&iZFU@nY-$w9~9!?&$)g2^K~*#sKTbF#KWR@`EpOnmW7yOVcFw=So+9nF?1PWNYyL34$VA5e^aQ6^N${b zmx3I$`kuB*JIi%cYEuEG3YCYA3>+c`AwV$1Syb~_Td6MGTcVmYY5OuofM1Df*<>17 z$s<#uk7{Vn<&E&=THQ^BV&_bZ+07~-94oVL8cz`1kZ=B=q(q%#NDT=9yam#Ow;*9Z z^;2*0W<^q<7dP`3_?Nf-X_8O+Fv^PrI+Fk$2c&?~Aj44w*q9wi_~>SGBR-c5h_M~O zDj=8fnF8b%sGKeko+|;6d<-g$ENgr#&;;VYmo6aj_B%<#;(4G1u+?#a~A-C>Qa({xJk~X zzW4rTA4)47wf})kw8l{U&A~hqUd}K+HO2K^25{zTcD%T1pSkY}Bmv19*`PG%>s<2d zlO9vnYKO-E&Bs9NyLb5)b6rS<94zC-JokI=00g1HSizGtkhdJ;c7XaDEg4*o7plzQ znbth2zScF6!Aj#Y5HaTc-mIOQAPGd0O83OJ!ul zC(-g2P@!35pzRT4MS&owcx0kEhBTJA`J6aZ#wh4kp0$PQj7`@G(4Q;Y?7*j3hpPlF zS8Oe#!f>o3A{Z(9i8#VKmAaF~NbK&a`Q0CPd*Ef;16_h}z?UYbJ1zadybZ5B%p?=Q zs}@>mX;tiKgg{blvJ6W+D5L9uNoY4RmE!fJGp&A19>LWH}pRz*j5ZcKBmKh#Q zhO*$-8zJb@wf8s4Dc;^Cvb>GVKWOXyS8V|@a+o>_fmmz@aq(AiVQYP^%sK1G8C2w` zPJpW{{uSg8S+d;3t(_<+ko4lkpWjt}q{Xw{dJEd&f6|Lq2YCztl;~S5=vsVb+0t_j z5M1OTlAsilvaDCD6tCm8WHX>`+DN5lT<4|SjPm4 zwXO_NxafGs=CK$mm8?KjT3L1gRJuMP4kQG^3k0Ztl$pu3^nhP&dm)$p#oPL)HD>g) z;4NqYx+o!f+uQys!N#xJ@)YR1dnEig%6ljqAi$l#|GYLR^Kii3u#p5g^aOAoGtvUIc@wnu4O6F&aF} zqa<&Y<{Sma9~40d*CFGiTs^4kvyL=JZPoqkL*LOw8bROYe2{8yF3fk|% zZ-GGS>eqU*Hc1JR!UEOWS4b}mAph){Yj}DU=u4n?BL`ueIQS;D9YK90{l5agHJ_9* zT6sltfOVO|n=&F@B{NaqO5P|*X+z}_u?THD;7{E%BDsT$_qnkk%sb)z_)U%X6ytP$ zu-`6@5}QDFq@nB#@;c^Tmx)1IJy3qb?+ab8+uQIK#5yl+q#zOm$%)EHO)296*%>AN z?~HqXC8;ao6&K*=2G>M`fu&?m-JiDA0gP^g>$aI-~dmmu7Oi>7p^L#t<5>{Kv~0#+>ClE74{n7T^#6s3EMvXNm5rmbSF zUmX3M>2HDG-8O;Z9M;_FBOkMq&wrJJ#MIiucD(#qf~@|W0z>!Nc`P`2NW`JVaeMCc zAKQ`hf6cYzlKL<&?rBro6uYo8{;aL8UiPAEECp@9-DyYR^N{Y3z)!UCTDa@TAPTF< zmI(OG6qRvF*5M|g<&}s+NR|4YT`M(*-{|ln3ITlSRoHp}2P{lQ)iVf$$h`@8Fq|lm z_g+>-S%MM?D&0~rD~YByR}PDHFDYS%uYEaf1++D>se^9^-a112c{dMv7f)KOwMfbX zAZus@G+tLhKn!BwX)9GHz`-1Sjpa*VJ<0V?0C;+9RDo7tIG{60f8`P-u``k>@5=f>3G2YNf3qLYBFKZxi=l8<@cxN(tqxrZH6Jmn_GmlbAG7xUJ&u-L~fDzt{CsT$$!WCkPM)#YT8mGGeZh7z+w`jZ-z%=aCVD;%>Xld+veV z<#2v4HN82|30oX_3gRj6k79fjFB6U*JSiJKFS!hEm;LGOn|TYiib9Gka1Tflm0cmY zn&%ACDAlLY-#WGugKUs&LF;2NGk|DwJBNB)idt?zt?4KF@onF>`J z0TF2yxe61r;tmd7{xTN*a5xjC)#A6&1rO+W#2Y$;13qU{*=!i zlA4p13@-tm0c9VdY-rfmwtpiz*!K2azU&+)ffQ($;e57}g1rVCw>K)1f%x41*-n2u z5LTa4i$ijw6a-PRHyWQV15%%1ZOsvwsW<{%CzSH^HvqgoZyEai%7_SpH2=Xe8q$Xn z^vJc>jVD5`aUuCq0AnQfCU0^$qQ;2d~`cg@G0??yh=pQ+? z{CiDcyS=6R`C9WszksUbf!uR374aHI6(=e3oY9W|0ZSyaJW z)tK|t>DbS$^V)P?#~OP68bP|VxdH|Am{X8!_STu6yfdn-}xj!BY^=p-deEZOX1DIjoX%XfE~#BtWkfJLW`l@G|q>b%OCl z9ym|rbS?$vZ+RE4599Gh7TmYQd|#56nf)+FrZPT@CYHPn1HU&I_lmL4IidqCET?nrGAbaqlZh)&TOFY4< zvVJLm&gD5+s}vlXp-S|?;%Q&JL}=u>2v#}39(}$WKo{{+8yq*%-91g~cpZzSky5ut zNOlGiWJzgeAuxDuvg<7TSkXK!DWvltEUBT_clx(ACiLlcQlQu2vG-u(8;=rz^j=9p z_^a3HY5@p-9x`s`ZlbBv(hHyk4=Zg)-G* zCI3>9sbzjoCF`p6*&_~!yr>!D$HxH2y!jUIC-qm%-W7fkg2l0rGxoCOv<;Q8ijs;n zQ>88k091bukb7Ra><36!*-NprG>`u3BA=zK&bX`1AG6Ztq|IkS?2f!xiYwS|kq`aR zBu=ux%G>1N{NMwBC4o{}Vr9qSj&LHQtXi=jy&X=DTYc#STI7Jf(RC~psPfBx{67f4 zJUc4FsQGk1ykgt0jb9u7NzU&Qvi{Wt27+8IGi=0>c8q8H!2DvMzuf8rK?+dpL}bqv(ZHtb#mR z415e)&mz$g^a%UYv7Cf6C$^8hn|ljltO4^IF*cH~=9}Jv4r0(G3E7QNpQHW0;L^o(r!}M;ZaLp1xCwBl1+PGWRxg^y<*{c0sfQg@D5dDg>_ce&pSDf19chw| z50QmlCkkq~7Mr@KNWF6Azu3yq=g?U`1mGO97Y>iwI9B?6A#IZog{u=ayK=N_k6oRz z%ZW!R7$$H@3tH>yEqh{c>6E7$6z~yv-5p@I77~3&mUHP^fq*PR!Uk@(b=iowK01+CUnZQa4nT9+&>IYfE1e&C26&cYr zk_A&TF115|M1WD2LM@c)gP`jlasm+-Exznq?AN`3mmU!n@1M{|vdFFGNypbrPbv>V zmT@&q78{MB*1q+-gWg)#O-I^J3iRH71RLub-w`Qj0u;4F0Mb1*0+j$Kf#Na&n+#H} zFMT=!kmC9(2)NXXEFn+D?4ETyF~4B>>IwzV$cjSR(&`3Mu}ax4j}h2QYRH1;kCzn_ z?-cieu9YmN8v8ol9d7`wft5|`ui$}OBH*8~*%G#gF_T!OG9iI2eDXl zFRde+SO)JE*2e58DNQ#T4@ z&sJ;!^K^_UXn!v2w`{>%aK=f@PQ)M-1r761$2`m0=k*Wp=z4W|C+oyW;Jw#)mrPZ} zUNLNG2!iCWx?iaY%~A1+SMVZqw{8!-!h7Ie%}B5CZoKvBDc$LB|MOq5zxmzYYs1Ro z(A;E|oVfZro05KQ=70xW8AKeQK^_9)v*;Swr)(=%%OEVJ$(V|GAS2LmV2eE+50ANIYeBtuJFs+;fDEk!U|6P58edH}ig*UrY#AAYygr$Yc}p>_@;wW7d|}=O zmzVG=5JQ5Tr@ns7s&mI|Ju&Q7YLNq3VN+!VZH6Fu1^TuK!tQNqZ>7eLuA#tFnc(B& z3q>rU4ahA-CcA-@h@xveMj!^+D#VmjlN-syxCvVNka>^+5h^w??aKd?4mz z?*i=WzNeBAWoju%Yc3B=i~-s2#!4Ef%G|1;yN{gGck@`DWHPE(_ ztGsXZgj=YG@i<(5=$hT1`j}P9_u1*oIeYHDOpSSmH{dzIDsC?OQ800H(?Xj-{?Xd_2E^gcw{Xt! zdI^&$uvxn5bPckYg0$4@$jKm`&(80#>_^oG+ zt@iQN`egfG0f0)=57EPOP)bq11G&!WnIhwWw2kvgnL)`yHM z58ywt1PPrwW0m@Zm1^7@co{P2mqqR+T~JXok$S%tP7wFjF11tFS>ssORXN-%fZ?m@ zX-h0#x6^YQ$p4TM)ksxKHQY*ajLa(oR!IyHi!$iX8gC}V{QL5X38;%Cw0o%9f4?7p>)wm85VCq}Q%sZq zosO?DE-)_djDlX}u~cC{1)*+%a(*LkkiedZmL6LG+4p!i|EO2OJs@!DHBtcmt3wx% zEG}~I(YIuTYU9bg7vfvg4z;~~F1eeQbpBRzr{>MpyE=c(O_K2F{Q1Y{HeJhhiBGt1 z+J4yD#h(A_L-rG5dXVWzqQiBP2VD1SoQG9DPU zB}0;r!G$yKg^1+9v#d3VLdz4Nx%y7#x^N9O*7}!^ZOzqw?ex*M?b4-%Zn3m&ebRmT z%IbkGLAXcPGp0N3UpUpYY*G2PZIh;7i<&0TWlvYQ>_J;{cM43Wd+{8|LdL_10gf8DAqQfIEN+l%8POvb|=eabDfX;S)mfG)ogInd_;Ft;y4 z?K5%v`{5`pDT#~*$=<}2kpd6&4%!%6iO+ZOC7PP z^rUSJOg8s}Mb#I0?N`TbZ$~`C*q)s}i{II==Xk8JzbMZMZ3AZ@^-xOEdIp_5q|3cc zsU@;@kY{}P0nceK>uJcq1OPY?a}{ZE87hSH_Zd;c(8LA4-x6k$aZRG|S{nPY@J8ya?JU zowUjr+Wsa%NJEgLWqz;VMV=-Va&n29WNH8>wNaK<5rtC!qUDlTt&pCw{;5G*OB`#G z0+EA23`7!~C?p3-ZF$(9G4^)0i3JO^3e;Mz57 zP={r6Va+a2Y}&PP5nsqFAHLCk^v6H!M-7v9Xn-bcrCv*u>0){O zb5_h_nOr^Q5|I>(ZjH%ME>;l)O_b8ZOL`t8CM6+k1vg+7xNQGFp0x=v>cS#ez-h*q&>Ka-296irFJWH4pln{p?lBBF?D;QL2%!47feld_?vAReOVq-MnawQy; z3z(Bt$ARU(5E|VVVJ>Je37(`tTA3JwS|0L5{evrG4ZAifxf5S&-a;+15(vwFcrzk^ zji-C-erMa$;bxQFW>wQ{U!&ypCR%ruC0pB zYil&fFh`NX?$+&rS85M*3Bo71}7NfBeFO*i{I5Ct7ylXn2D!3&`J06*~lU$l4r z%n#bz{>SgLC;#R*+4ub8?`%tz`VkJHW9s~Mi~y`#?Fst~-{IXRz~GB*TWoV|W7|jm zXZ$?8?=E~1C=Zwpg^Cob;PMFvKL9ZTEzuTt(RW0U$s-b#W0K@ufM ziV`>dCQ5un{28DQz-8@SK}I9VieioSSGE(69-cd6A!viVV)RW9WUkh{j-W-}yGfr@ z-niZyB}Q1yF%q<5K{}6j`>(<{RDraH_1f`SVnOKF3It(rqhX`#ReSmb#UkTyrI{Y5 z1X)o#B5}C=P8h{KQ-^J-SE-j3AWU)&(n^O6LJ$M89kti75IMLv zn=V+}MY}f#?H;Au121_G>?ewN$xr6x-T8{EdiIGvX!ytJw@usTq|fg9_eP!vg8%emU`hdbik?(>zgkCGq`<+ zT!Sk;sWt}`d?w4}`rs8Czy4SgNNiuo<0PzKZU0Q~-TZScLXsf$KvYB&lrl8cDA>wC z!hZVQ-*5l+Js*Y~O_D10%eTcU{6X`0A{OB|J+eRoK7vjd>prptS=uFD$0p7|J zFZqt74U!bN??0jP?|5tGBTnN*|_%rVbIa-cS(h+oqFT%tojwjnbVp_k=- zW#oCr89I0j5lSS`P7d^2&w3+?55E@?(0!pmVcjDdpE_58TzTa*_77r{aY2Aq1`TQa zvv^iL4JCaeuZC)oY#_DNv){<=&EW6BwJO)9YQ3AwR>TKXC2(8!Z975mAk^FN_O!rw z`@z82Btobpvo=UlgfmwNNKaCo1Q}Wyc2LJFe7fHc#H<~kfvHsoWML5Vj&nC`?$6G2*QhGRss5JgD=`FF*L(HD|Wg3 zAi?#+c6e&U77|Bnvw&;}f}l79rN!2Kcrf0ATb*R*HQoO0r=B`z-|!8OZhyP`y4wS< zm>%d7gnM`?W4cqO<6V!cg>G)*(-dDqV~eLiljMyXS$SBfa{vNaTCSY^kUewyWA^xk zQ}&^UrtNS1dEQP>HSA-Ltl6389wE4kz&sZ8!TGbum!7xrxyQ)Ra>yDBbx6Z`8(ci= z`@8WtJHI19Ftnh;X_vk5jRF)yb_diiOy&Y$T68l22^D-(E^=AIHR%gD>G!wRxyC-) z4pd{CcKponwPd8arpfi4lD0KP(Drvz~zRe=`dRbih5mGWPH@u(G+ z4)a}f=`70153Yq-U`1JxL>}r?8-*nZX*h|{SyuoS0&vPuBoZc1j%OTE0OVFTZT%5D z>NcM{e;+(DQAPw%qyU??mvgZ3%}!X}ER9cDGRxdw!HW>cfhue(a6dzpW0y1tr0{)# z&?PMOHjt%CIl1H0kn~N1NkhQfuh#aesm4KuY4(Q$zIVd835~z*iS7TV@L12ErHxVWsw~yj!y4Q-Fzs^IJ zX5Dwv&`aK=`)xy3YJjlXr~-1Qrq^w#Ne~LPMe0A0S;)9IAvC&&L~JTe&rzQHOMQK- ztp$AbP2D$fP9h!|lGZ>HxY*%9Q1nunI9+d0S-I6WI<6if3VO(>akrbUmFD{j za;UF;6S&pq=N?AH3u>#J`y8ao%4+yI_H zVZUt;-S@ja@cGsQx1I$*-_Gb|-d?3Ueb0OTq5ZwT_ijMejah`Wz-qByA@3-&%AHLomd-bD8kAB`RUb;hY;0CJGwNEY~ulfDJOh^^voE1s(pw!DZ7dT zOOXVM+6kn2bz1>0)0>xIexa&bLa1)Oe=t%8%e>P z1RMJz-}Lb8)PkMgi*1k3JAdnT-VIjhQ0t(^{Uwqs5+~r9S4|QKZpaiSd4mW->va;M zFqiGez8tOdA)r&W0VE0Yu}))j-NLma7-4I>vvY8ZIoDfNUPFppyj581^;(`gk;JV_ zZSpv_$lTVU;~(6I0@QixVyGX|g??K@r!T8Jh%yjV#+&x9v8b`u+Q=fKfKc8OVN$x~ z1iw+6JXNK}t&d$S^Ni)r-?sL0w||MGXnu53z`ZF$iMI!mpmWl>Ch?~A!9;w-3! zP1WML!HgZ5FWK3tq76{VzCqoJrSy_rA0V^SAQGiis9oUl8@xzL=%Bt8sEwP_%j*7) z+ir3mc`(XkjoU0iJQyoANJ5eT_Y~wnS+Q1$XYq~O&Jzt_FbO0<-i*5=2nvv1>tjqa z*UBTdKConCS1#H3I^H7Ad6iln8&uFfH*^FqFrFy1{C-`j5Uf6x>`Ze~`+3Lnz1wH? zR{{?yv*y+@=5r@4+ed*)sumZK%$A6k>0fT96+H;8(`}tZ`#jqEVZ81i_`oyv_P2j| z>x1rJ-5z*_^+1;(yhIl?$c(g5bb>QAM;7^2>IO)2oIw5~YxT}s03E7uygG8xo*7@T zZ+)&{?>V+%50Po;%(XR2#$O^>@)W={NF9bL1ha7X(=6(jNN;!uufqMdbO?~Y1Q}sb zy`624VrP;j$X%_1Z#bv{85<6)lxay8xfIr-3`LoOoFfD=CIDWyzeRv`V}FHx#n1KJ z29hv9DZlsmBUkO{RWd_WRY(caLNPU2rDQexH}Cy_E%D1AZ~*=t-$GFHH#|vD^M7ye zd;bURM}GDW8ps z9>zL`w*W6hh(VB5ENohcog@Ib1iEys9bnRrH8ku_8t^Kpk1IV$1CWr(%Ov8GtSQes z7E}uPNQWJeqRv0|Me`s#K6UnEAO-qj=sUd*kGlyrrX_e>ZeKp6cI@RG^u62LoYX=5 z9MnVZ1gKQFF28m-Tweg7uCqUMP54`&P(WR>8|k<^t@C)0Ai*I{lm!e^04RWN33po!=H@)!oC z*W^CK^6qjoikyikh!`lCUGW(u=B~neOz9f#W3@;9Rm#k{*H`mijeQJmUa~>r5PFcN zB`_3l_3#XH-?iO(v9F^S;ZFN4dNVYqX-upmQI%n&#yGrIy=wiNSM9zf-djIHy518Q zj$}Xz#n42!dI<(rpLt=iw)Wj=d)j{&pFpe2>7!jDv z+JF9%|E(tNv~`Q6?bIvx{=G~lWAA_e&#+$g*l+*#hfoOo^j0H=hllLve(uL@17iH- zlW$>o?Q$`xqtz@$LDOitxxjFMIhjC;7|Lna7d~8>B@4qC?NHZ#h@dPW--p3i;U-uIbL+k0O0CVTm9&$D;E^YwTZj#Gf`-qaWAI?Qu?}luH)z_u0 z2mw%KWD$i}i9SUyUr3UOhCMnSO&rh(i zj;!`pw^{G4^hS{|toxFM=~(_BU88X6D2t;9=VowM*0PvF2At58CNS1FEj9RWfU-!4H%0c3$tXGIGAO^DX2OwVEp6dRK zUPsTNFV$WV8dYl-`H50p>KHN_xV)$=dzsIYtaFfcU2~J_45)27SN&FmJ9s$GOj@F^`*#_;+WKz+Ny!|V*OG5x#|n(8jo^5L!_hbFZEa> zMuvEjipj)|ZOQMjk;#o@wQ6_r>-7mB2$7cYbTV#LAAh0OYL}A)NU4tF@h&oeVQ{$+ zx4H48?*Hlc)rHvh|5w_yb?fG-d*#L(AB$J#ZFbpZ*ZS#i-@e74@44s4_SLU`)^54w zrDxPF&BUXL9Hi4}`}@EDus!W*&$Grx-8=Jd-QA?Sj^jxz7A+PFkXx@sRzCKzzpzI= z>LzP%k7`2Azn}B*$tpoO552B*r*C=7Q|%)k`91@iC7(qC96PmX5l;?n^aVVF^-C7; zxi@4q03LzL)WCLvm3P}iE#vmoBb^Y0w2ch!z+H<)6YIAM(`XZLX``rG|MojPXt{;O zRMnCDx7WyfUuIjw0PovLd!7iY)-DF4CAF#^@h#!C$fZIalYOH6<$t|EG z!r(!4lX?5_-+c>0@I&9*8{as)09$mJY>YIPb?aF!$QaXtBmtt7uO(Gx4aK!;scwwr zv6iA+HN`qWRfhu%RdxV_MxaCFAX@yQxPpr**f{F{#hwLn!x$txQQ1l? zpeL(v=>6zguqR&1Ti~)C|Fa@5(O3^#)%X1kWf-IH30@Bmq+ftk&kh9On{~$!0Jm0|n(%&Q>j_rn zcLMhT;VivvhqcR)2~X&~>>4F$%~e6Y?Gq)UN#rz>A>keiA8AHXwaZ!NnpI zE=__I$ortNm2Vm%OHbUI3zuSufmDzZv;9=7t*xPmopsshSQ7cqai4>L zq`PK}IC$m;jqcawbW9YtBF_*VVY|1s*kG!j0(o`TLWZr_r~>S_*(nH%;;RDrUD}vg zPCMrMt|XZn%QAX-92etQL|2|M-K(>=bJMQb$DR33bZe_e9P)~Um$ zQYm}<;~#6icnOslVEgv)+5Pw5Z>bb(J)11~FMs*1_Q*#*!ZvN%V8@P~urGY!-|Tze zyK`zkdXY-C*f0IkOTE@bXJ>~!{P1qO>#iUBceKB{I__1-fxf5xJ>n5p*@g{keScs6 z@>lKK-~NGrx3{;?p8f2XKoauywXc26?!5C(yYa>w?U~Pfrj3p=m*nzx+ikCP!k{1g z!Y{nokGpf{9(&ij-eYfg!)xvG%XiqvKmO15!WTZrUl$5R`{_>~vcLV?f3)#&=B@I! zSX=b9*4C80_O-uckAC#^PFgj`jqZ)S$50b?wk?piA_g`xdT={*wn?*1-d^HOj8Fm1aHKaF; z@QsK_D!tXxBYVhUz6apE84`iZd2BC1yt|e`5JH1x8BdIEge2T$Yj$1F@ls^U*yCVT z?rKf%?mlO64VGB~l|^b?5;NnZPy5ek5z!=Gy@`Br>b%`BjvGC*!49t}*~Sy38O4Gq zZ;7(n)MXS5$C4Z`AR`zgQ<2gpj=5f2dkaC$cTNR0s{q^Ww}0P$@{^z0M?d-<06O2V z$5M=3A)Dx9pZyjm$gZ($$xNW#ju>Et98}sFKtS25ty8H5;FEczz1T~i4dMYAwE7w< z!`2R4Z=#;Ua|CKaM26yISE_@Iu-H!8kY_-WPF_|zY2x+lL7XlJA^TDl3zfu5f1aOU zW1V|+%_{w{Qm+IwLXaj>55}EHv;dsTM#?0?t9nCLOITTJu%zo=2{Mnx0*f`qqPBx_yu%bmL!sZJgLZYJl}@Cf0K<}KRrg*Xnre`@`b-XY zR)4E`RO^bi)naL(AI|5$5efME*S`)Be>ULvHTJf*{Wjo#yIpe0HgDQ}_uc0NVcWJX z_TT^eZ`se5mkuC;4zQ6 z-XHqHz4zYh`@8nqs{!$Eb67hM{n_g%C_HX}Y3F7N!ZZl{9nV+xz zeHMB^=}s@ZY&(0Fg|ga8Svi<2^F_p!$!RVnA;2WaT;2_|sWR9Ma?;3Dm6sXk{X)(u#D_KRDhbhYKElpH_tSnED=gLU*h5=q5&BoA1okuVjgva7(%44Uu^SxPc3{rufW zAoU>N1@H?osD*(1{ontZedjxWWCsrXJ(iG-_M|8MhrQwzKeXTbyx;rjgny}dW@m5A59&>Yj!9+80YyW3jHDDlax=u zELgymrgI_i9<{$R#sqfUdm|4H0n08QD}Sw6m*L(#86+f1AIfp6$JMm6#1o)4=)Os} z9`wgZEA7>Tc9*aQ3tTyw0f6f~1uEy=-?W`q{;1aBs@CtyHA4FrHRfCL^kOh%S8E@ph2qbG} z<3bblug@EtqvF-{+riFVK8I`k2y};J2>K>ti@D}xXFsx|-L(H{bFi*Yc<7#s=7$w-#97>(ilwb?=eGwUg7BdaeF(y~-=6&B zCj*$nJrjK;*dV9w^-dqOd z?}Z4YY~8wb0O>bRov8MA*=3je{t}4>tp2}fZEbB3k2P5TU*X@o_15Rv;lul;epB6+ z*4B0#85t#pfdmn3mtML9!ZJ?U+~?z!XtaO&r+=~^{pd$_(@jtHcIZ2w|NQ5j7_42p zmhZhpZ{Y>G7B9dsgrjvyZMpKw%bXnS+_{tAwA*k0_Pg!R{_M}}p@)9L@vD<+`0iJ< zno`)~>c5NjK$PxuA#kOILl&l}YBP82{QslW*&LI+aK_Jjw`?peQ; zxBx0Klfj4id1@0d5YW|@#6wY!3tjtAU|)iq?@d&?90oY0Slk3e7T>VC15#S4&OFk7 zkc>u$?9!9<$c`wO)DW!lT6tCfK-Qy`lNK%BG99;KapN`r$4Sp12Wm#60}>SYa)hB2$w%G!Tb$S0MtkOiu&)@fBoZb)&2FiTy4K_+l%cNUiK1# zn!jux{m75Pp|$uiN#W4vw*u8+!m4gp9e_gFi$tFC^+CU!Q*~s1lNeY>?)}HPJfaa2 zrVA&FZtwzxi>SqSf`Dkxm;<2mOh|cUKf-EGRohH+AJ$=lnDO!yOF8@eAHS3K)Y>zi z{uKMxHxJquzu3d1!+=@B7RGAzc`Wv$>hoRfyDR&-=gG%XuL{KDjlB*~M6`8H6}SmC zBlWLRnUW@ySOY!F)1rG$<5VD5*73>~olE7N>Q@3d`o74r_LCeXg)jm8t}*95T^E7w z;Gu{JNEPq~bY{5^l|e?HE7!YAuHuhSw9WPK1lmeE!_65$yZ||*!Oj4SOUkCU`vVD1 zkphaNtsH~qsUM1ppJ0BGOsASSiBwNcATugTW)$ipD4UnZFwiEA$>7ci(s;M4LG=v$CiZ#((A`g;e zce=)^YqPXDKWf1u&v?MH7-A&nD|o#gWLtO-R2#=@kq|_!z<%9tB9ppDbnjdoTY0=( z9F6_Ix|LcF|J9zLUb+Vp?7b0W7^EYt^cz^bpWzFesuP`cBP zfBdZrraSFEdA%LI>>HkuLaF;^ZjED9oz#ND;!(#!Um|Va$@OX5+#9!^E@TWWU=c3W zjTFFTSShp^DZqGW?ZehaW+P3|9mFDx5nwskxzoCP9>v5hYvo8nNLtxz`-&kp}<1b+c8Exh(YTIa7{EH zqi+Cm6pCsZUxzn@1*?{zL0NkN;gc-t>c?RH*Z#sjwaEVe|L{%w-LL++{o!-p21&Th z-t~^RR8?yJUirK77U-M=umK^w%8`{wi?|l=tg_wkpGZN|z_m`+hq#H8Jdq8E zf^X&H^W?D#1*8f9UB#N@0m32(C4!@iq`CdlpZ-sNF=;nH^=A9eAAZ+Uw_fwY594XN z)B$aIhjTtf1U7n}^GmbdRG)`2HtVBv^#*`j(is)g(zTM8$gQyed4XNU87PIRK(D7V zg&;&ab%Dauk;W)6znRQoieag5RPBUD8*Mq_o*c!1IQWMEI8neu;Q+gQb2`!EJrNpZ z(-B~c2#o+=4g#rmDXD+}r#xZO)(0}Pm?Uc9PFMU>eJ*a@14PkK?RTO%Yx|KXrXdGG zCZ)_iqfYXbjY*eQZHv-q3c$*1qD)I6csc|r>$exeru#kz`Bs~YJhq=o+m@r81n1e7 z!MHI_LV@n24JJCV_J>rT4)!U~r6OHkONDqId6_bJb+go15Ww~CD7Jy?97ut(0EJ9I zPB5GxRJ-gIcpUCq^^4{r&54l*RtX%`xso=e+mNM^eaM5C6BP18wxn!I@+ymr1|lF* zK&*q4$cRiT{sEGJXILaf#6<)_0o5U^90lam2Ie%)^NL5y$9a!&sI=1x>|U{raiv0f z%BG}osy3^>OBSPr2!Y>+GE&h`QE>Z;9s8{9NY`)r+_qXQ?W}e7l6I_sVOj7`o;+zi zJw1?uAKL3*|0~FIe%bE3?;*!LyLRn%InkpY6~Oi_*r~(w)A( z9*D!G{{E*v^-0^jc{||!5mRkx!0?&R=j~@d`xzSk8~lBFA@rEJ$x5HcV5d!O+^}Jt zla&V^c)%X}*r)jWk`Uc=)8m{V+<4=Y{CmIu`@e4|PMq)n=*a8v+0TBK*oh_rnxEip z)sOS}AbHerBrnpoSX=h&*=PUtU*EB(VuC9 z1v>!MaFR)+KmA(lS%74{(LPfHJ1k8MLEGS^WliYPI;3^r5*ww)!axgN1uUJZae`y{ zub#AzA*Ef#`n9w@uGF`p2^~q%XtyPs)>xr!oQzLLYVrErE4nK&bUlkLLJ&pZ(wVS0B005Yg3dm$OCpl?X}G2z3*mt=C0s9ARv}&Ka%3Rq{lmY%E%`IBI)0AG2W!YPmP6febzr z^HZwb5TB!rJ^{cwAO)!EJX9AUk{RiIMSPaqpUXdo>A%oIAFfFliwYVZZ9D9QCJWf^ zw-eT4C+*taqIHieLsY93Cf8ZMjhF)NoiHZw9;kms66k-CvSgwg0NrEbB4=d}fs+TW zvu8>|G9;oPIg@~YCF|An_CW7I@sje}N*GPRQItFi3ww z(DZs5IS52SzpW?fLi6xeZ?n=?hjCpW2o7_Ph=OE@I);kL)e|cf{)ZZ zNRY;Xq))+^d zKm6g3k<329Uh|qD^|}B4`>?X79H6VUg+c-A{MM<4Kkf5M^50xpSAtG^A3k{?)yE_xtlx zp7IoeoFC!D-~%7{fO|F)2@2kpvoI+RV#9_lQ{+HoW5t>siEAJktL8pFch2>8L)3Rf1668|U!#Qqr9&-QAj_kFz6J zl8avfj#aWBS@+Xq9crXz!WawSSmFc=d#9y(F0;K`dM!>A|0HfG@B^Cw?QHO-ps*w| zq@ImGvdsiTYcg-A_?h(1{iHozf9T2n-oo9Y{qkUP_iRYp?yKU=ctE7^o%dh!$g6Yh5-$D$}_( zkp!j>9_192NQJT#i<70Swope<^Bo@89I_wX!j1U4P=M|8|6;%MsRq&gfA$jK${55-~HXM*fXAS6RyW0+q-wr9{K!_x)y%~ zJ$_vWaTSu!NQ%TmZLRTR3lN8E7!e@f;iCV9_JrRq`sH)>1p#JRW8GT?= zq1*B!)bp6Iy&KFT+aAZ}8tpUew&⁣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 z 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%0DO<9^g$_G5DLRVk5R^;9HrcM~yK>EK-{HS#= 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 z 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