diff --git a/include/PolyVox/MarchingCubesSurfaceExtractor.h b/include/PolyVox/MarchingCubesSurfaceExtractor.h index 0c7b649e..05ab9c3b 100644 --- a/include/PolyVox/MarchingCubesSurfaceExtractor.h +++ b/include/PolyVox/MarchingCubesSurfaceExtractor.h @@ -153,13 +153,11 @@ namespace PolyVox class MarchingCubesSurfaceExtractor { public: - MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, MeshType* result, ControllerType controller); + MarchingCubesSurfaceExtractor(); - void execute(); + void execute(VolumeType* volData, Region region, MeshType* result, ControllerType controller); private: - //Compute the cell bitmask for a particular slice in z. - void computeBitmaskForSlice(); //////////////////////////////////////////////////////////////////////////////// // NOTE: These two functions are in the .h file rather than the .inl due to an apparent bug in VC2010. @@ -307,8 +305,8 @@ namespace PolyVox template< typename VolumeType, typename MeshType, typename ControllerType = DefaultMarchingCubesController > void extractMarchingCubesMeshCustom(VolumeType* volData, Region region, MeshType* result, ControllerType controller = ControllerType()) { - MarchingCubesSurfaceExtractor extractor(volData, region, result, controller); - extractor.execute(); + MarchingCubesSurfaceExtractor extractor; + extractor.execute(volData, region, result, controller); } template< typename VolumeType, typename ControllerType = DefaultMarchingCubesController > diff --git a/include/PolyVox/MarchingCubesSurfaceExtractor.inl b/include/PolyVox/MarchingCubesSurfaceExtractor.inl index 1d75e73f..defb2b82 100644 --- a/include/PolyVox/MarchingCubesSurfaceExtractor.inl +++ b/include/PolyVox/MarchingCubesSurfaceExtractor.inl @@ -26,34 +26,24 @@ freely, subject to the following restrictions: namespace PolyVox { template - MarchingCubesSurfaceExtractor::MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, MeshType* result, ControllerType controller) - :m_volData(volData) - ,m_meshCurrent(result) - ,m_regSizeInVoxels(region) - ,m_controller(controller) - ,m_tThreshold(m_controller.getThreshold()) - { - POLYVOX_THROW_IF(m_meshCurrent == nullptr, std::invalid_argument, "Provided mesh cannot be null"); + MarchingCubesSurfaceExtractor::MarchingCubesSurfaceExtractor() + { } template - void MarchingCubesSurfaceExtractor::execute() + void MarchingCubesSurfaceExtractor::execute(VolumeType* volData, Region region, MeshType* result, ControllerType controller) { + POLYVOX_THROW_IF(result == nullptr, std::invalid_argument, "Provided mesh cannot be null"); + + m_volData = volData; + m_meshCurrent = result; + m_regSizeInVoxels = region; + m_controller = controller; + m_tThreshold = m_controller.getThreshold(); + Timer timer; m_meshCurrent->clear(); - computeBitmaskForSlice(); - - m_meshCurrent->setOffset(m_regSizeInVoxels.getLowerCorner()); - - POLYVOX_LOG_TRACE("Marching cubes surface extraction took ", timer.elapsedTimeInMilliSeconds(), - "ms (Region size = ", m_regSizeInVoxels.getWidthInVoxels(), "x", m_regSizeInVoxels.getHeightInVoxels(), - "x", m_regSizeInVoxels.getDepthInVoxels(), ")"); - } - - template - void MarchingCubesSurfaceExtractor::computeBitmaskForSlice() - { const uint32_t uArrayWidth = m_regSizeInVoxels.getUpperX() - m_regSizeInVoxels.getLowerX() + 2; const uint32_t uArrayHeight = m_regSizeInVoxels.getUpperY() - m_regSizeInVoxels.getLowerY() + 2; const uint32_t uArrayDepth = m_regSizeInVoxels.getUpperZ() - m_regSizeInVoxels.getLowerZ() + 2; @@ -321,5 +311,11 @@ namespace PolyVox } // For Y startOfSlice.movePositiveZ(); } // For Z - } + + m_meshCurrent->setOffset(m_regSizeInVoxels.getLowerCorner()); + + POLYVOX_LOG_TRACE("Marching cubes surface extraction took ", timer.elapsedTimeInMilliSeconds(), + "ms (Region size = ", m_regSizeInVoxels.getWidthInVoxels(), "x", m_regSizeInVoxels.getHeightInVoxels(), + "x", m_regSizeInVoxels.getDepthInVoxels(), ")"); + } }