From e2f43ebc5d8583e351f09908a511539cc22f70ee Mon Sep 17 00:00:00 2001 From: David Williams Date: Mon, 11 Aug 2014 23:46:01 +0200 Subject: [PATCH] More work on tests and surface extraction functions. --- .../MarchingCubesSurfaceExtractor.h | 8 ++++---- .../MarchingCubesSurfaceExtractor.inl | 3 ++- tests/TestSurfaceExtractor.cpp | 18 ++++++++++++------ 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h index c482abdf..3ecf78fb 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h +++ b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h @@ -151,7 +151,7 @@ namespace PolyVox class MarchingCubesSurfaceExtractor { public: - MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, MeshType* result, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), Controller controller = Controller()); + MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), Controller controller = Controller(), MeshType* result = nullptr); void execute(); @@ -321,9 +321,9 @@ namespace PolyVox // We don't provide a default MeshType here. If the user doesn't want to provide a MeshType then it probably makes // more sense to use the other variaent of this function where the mesh is a return value rather than a parameter. template< typename VolumeType, typename MeshType, typename Controller = DefaultMarchingCubesController > - void extractMarchingCubesMesh(VolumeType* volData, Region region, MeshType* result, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), Controller controller = Controller()) + void extractMarchingCubesMesh(VolumeType* volData, Region region, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), Controller controller = Controller(), MeshType* result = nullptr) { - MarchingCubesSurfaceExtractor extractor(volData, region, result, eWrapMode, tBorderValue, controller); + MarchingCubesSurfaceExtractor extractor(volData, region, eWrapMode, tBorderValue, controller, result); extractor.execute(); } @@ -331,7 +331,7 @@ namespace PolyVox Mesh > extractMarchingCubesMesh(VolumeType* volData, Region region, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), Controller controller = Controller()) { Mesh, IndexType > result; - extractMarchingCubesMesh(volData, region, &result, eWrapMode, tBorderValue, controller); + extractMarchingCubesMesh(volData, region, eWrapMode, tBorderValue, controller, &result); return result; } } diff --git a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl index 49f8ca0e..bc212cdc 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl +++ b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl @@ -26,7 +26,7 @@ freely, subject to the following restrictions: namespace PolyVox { template - MarchingCubesSurfaceExtractor::MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, MeshType* result, WrapMode eWrapMode, typename VolumeType::VoxelType tBorderValue, Controller controller) + MarchingCubesSurfaceExtractor::MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, WrapMode eWrapMode, typename VolumeType::VoxelType tBorderValue, Controller controller, MeshType* result = nullptr) :m_volData(volData) ,m_sampVolume(volData) ,m_meshCurrent(result) @@ -34,6 +34,7 @@ namespace PolyVox ,m_controller(controller) ,m_tThreshold(m_controller.getThreshold()) { + POLYVOX_THROW_IF(m_meshCurrent == nullptr, std::invalid_argument, "Provided mesh cannot be null"); //m_regSizeInVoxels.cropTo(m_volData->getEnclosingRegion()); m_regSizeInCells = m_regSizeInVoxels; m_regSizeInCells.setUpperCorner(m_regSizeInCells.getUpperCorner() - Vector3DInt32(1,1,1)); diff --git a/tests/TestSurfaceExtractor.cpp b/tests/TestSurfaceExtractor.cpp index c8a88e83..d15e8fed 100644 --- a/tests/TestSurfaceExtractor.cpp +++ b/tests/TestSurfaceExtractor.cpp @@ -178,7 +178,7 @@ void testCustomController(Mesh >& result) } CustomMarchingCubesController controller; - extractMarchingCubesMesh(&volData, volData.getEnclosingRegion(), &result, WrapModes::Border, 0, controller); + extractMarchingCubesMesh(&volData, volData.getEnclosingRegion(), WrapModes::Border, 0, controller, &result); } void TestSurfaceExtractor::testExecute() @@ -255,12 +255,18 @@ void TestSurfaceExtractor::testExecute() QCOMPARE(uintMesh.getNoOfIndices(), 35157u); // Verifies size of mesh QCOMPARE(uintMesh.getIndex(100), uint32_t(44)); // Verifies that we have 32-bit index buffer + auto floatVol = createAndFillVolume(); + CustomMarchingCubesController floatCustomController; + auto floatMesh = extractMarchingCubesMesh(floatVol, floatVol->getEnclosingRegion(), WrapModes::Border, float(0), floatCustomController); + QCOMPARE(floatMesh.getNoOfVertices(), 16113u); // Verifies size of mesh + QCOMPARE(floatMesh.getNoOfIndices(), 22053u); // Verifies size of mesh + QCOMPARE(floatMesh.getIndex(100), uint32_t(26)); // Verifies that we have 32-bit index buffer + auto intVol = createAndFillVolume(); - CustomMarchingCubesController intCustomController; - auto intMesh = extractMarchingCubesMesh(uintVol, uintVol->getEnclosingRegion(), WrapModes::Border, int8_t(0), intCustomController); - QCOMPARE(intMesh.getNoOfVertices(), 16113u); // Verifies size of mesh - QCOMPARE(intMesh.getNoOfIndices(), 22053u); // Verifies size of mesh - QCOMPARE(intMesh.getIndex(100), uint32_t(26)); // Verifies that we have 32-bit index buffer + auto intMesh = extractMarchingCubesMesh(intVol, intVol->getEnclosingRegion(), WrapModes::Border, int8_t(0), DefaultMarchingCubesController()); + QCOMPARE(intMesh.getNoOfVertices(), 11718u); // Verifies size of mesh + QCOMPARE(intMesh.getNoOfIndices(), 34041u); // Verifies size of mesh + QCOMPARE(intMesh.getIndex(100), uint32_t(29)); // Verifies that we have 32-bit index buffer } QTEST_MAIN(TestSurfaceExtractor)