From b3ce982ef3d3b898ee64a93beff4a3ae9faf7ef8 Mon Sep 17 00:00:00 2001 From: David Williams Date: Mon, 25 May 2015 20:51:42 +0200 Subject: [PATCH] Removed some member variables. --- .../PolyVox/MarchingCubesSurfaceExtractor.h | 12 ----- .../PolyVox/MarchingCubesSurfaceExtractor.inl | 51 +++++++++---------- 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/include/PolyVox/MarchingCubesSurfaceExtractor.h b/include/PolyVox/MarchingCubesSurfaceExtractor.h index 05ab9c3b..46003e8b 100644 --- a/include/PolyVox/MarchingCubesSurfaceExtractor.h +++ b/include/PolyVox/MarchingCubesSurfaceExtractor.h @@ -273,20 +273,8 @@ namespace PolyVox // End of compiler bug workaroumd. //////////////////////////////////////////////////////////////////////////////// - //The volume data and a sampler to access it. - VolumeType* m_volData; - - //The surface patch we are currently filling. - MeshType* m_meshCurrent; - - //Information about the region we are currently processing - Region m_regSizeInVoxels; - //Used to convert arbitrary voxel types in densities and materials. ControllerType m_controller; - - //Our threshold value - typename ControllerType::DensityType m_tThreshold; }; // This version of the function performs the extraction into a user-provided mesh rather than allocating a mesh automatically. diff --git a/include/PolyVox/MarchingCubesSurfaceExtractor.inl b/include/PolyVox/MarchingCubesSurfaceExtractor.inl index defb2b82..fcccdbe3 100644 --- a/include/PolyVox/MarchingCubesSurfaceExtractor.inl +++ b/include/PolyVox/MarchingCubesSurfaceExtractor.inl @@ -35,18 +35,15 @@ namespace PolyVox { 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(); + typename ControllerType::DensityType tThreshold = m_controller.getThreshold(); Timer timer; - m_meshCurrent->clear(); + result->clear(); - 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; + const uint32_t uArrayWidth = region.getUpperX() - region.getLowerX() + 2; + const uint32_t uArrayHeight = region.getUpperY() - region.getLowerY() + 2; + const uint32_t uArrayDepth = region.getUpperZ() - region.getLowerZ() + 2; //For edge indices Array3DInt32 pIndicesX(uArrayWidth, uArrayHeight, uArrayDepth); @@ -64,26 +61,26 @@ namespace PolyVox uint8_t uPreviousCell = 0; - typename VolumeType::Sampler startOfSlice(m_volData); - startOfSlice.setPosition(m_regSizeInVoxels.getLowerX(), m_regSizeInVoxels.getLowerY(), m_regSizeInVoxels.getLowerZ()); + typename VolumeType::Sampler startOfSlice(volData); + startOfSlice.setPosition(region.getLowerX(), region.getLowerY(), region.getLowerZ()); - for (int32_t iZVolSpace = m_regSizeInVoxels.getLowerZ(); iZVolSpace <= m_regSizeInVoxels.getUpperZ(); iZVolSpace++) + for (int32_t iZVolSpace = region.getLowerZ(); iZVolSpace <= region.getUpperZ(); iZVolSpace++) { - const uint32_t uZRegSpace = iZVolSpace - m_regSizeInVoxels.getLowerZ(); + const uint32_t uZRegSpace = iZVolSpace - region.getLowerZ(); typename VolumeType::Sampler startOfRow = startOfSlice; - for (int32_t iYVolSpace = m_regSizeInVoxels.getLowerY(); iYVolSpace <= m_regSizeInVoxels.getUpperY(); iYVolSpace++) + for (int32_t iYVolSpace = region.getLowerY(); iYVolSpace <= region.getUpperY(); iYVolSpace++) { - const uint32_t uYRegSpace = iYVolSpace - m_regSizeInVoxels.getLowerY(); + const uint32_t uYRegSpace = iYVolSpace - region.getLowerY(); // Copying a sampler which is already pointing at the correct location seems (slightly) faster than // calling setPosition(). Therefore we make use of 'startOfRow' and 'startOfSlice' to reset the sampler. typename VolumeType::Sampler sampler = startOfRow; - for (int32_t iXVolSpace = m_regSizeInVoxels.getLowerX(); iXVolSpace <= m_regSizeInVoxels.getUpperX(); iXVolSpace++) + for (int32_t iXVolSpace = region.getLowerX(); iXVolSpace <= region.getUpperX(); iXVolSpace++) { - const uint32_t uXRegSpace = iXVolSpace - m_regSizeInVoxels.getLowerX(); + const uint32_t uXRegSpace = iXVolSpace - region.getLowerX(); uint8_t iCubeIndex = 0; @@ -110,7 +107,7 @@ namespace PolyVox // The last bit of our cube index is obtained by looking // at the relevant voxel and comparing it to the threshold typename VolumeType::VoxelType v111 = sampler.getVoxel(); - if (m_controller.convertToDensity(v111) < m_tThreshold) iCubeIndex |= 128; + if (m_controller.convertToDensity(v111) < tThreshold) iCubeIndex |= 128; // The current value becomes the previous value, ready for the next iteration. uPreviousCell = iCubeIndex; @@ -135,7 +132,7 @@ namespace PolyVox POLYVOX_ASSERT(v011 != v111, "Attempting to insert vertex between two voxels with the same value"); const Vector3DFloat n100 = computeCentralDifferenceGradient(sampler); - const float fInterp = static_cast(m_tThreshold - m_controller.convertToDensity(v011)) / static_cast(m_controller.convertToDensity(v111) - m_controller.convertToDensity(v011)); + const float fInterp = static_cast(tThreshold - m_controller.convertToDensity(v011)) / static_cast(m_controller.convertToDensity(v111) - m_controller.convertToDensity(v011)); const Vector3DFloat v3dPosition(static_cast(uXRegSpace - 1) + fInterp, static_cast(uYRegSpace), static_cast(uZRegSpace)); const Vector3DUint16 v3dScaledPosition(static_cast(v3dPosition.getX() * 256.0f), static_cast(v3dPosition.getY() * 256.0f), static_cast(v3dPosition.getZ() * 256.0f)); @@ -157,7 +154,7 @@ namespace PolyVox surfaceVertex.encodedNormal = encodeNormal(v3dNormal); surfaceVertex.data = uMaterial; - const uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); + const uint32_t uLastVertexIndex = result->addVertex(surfaceVertex); pIndicesX(uXRegSpace, uYRegSpace, uZRegSpace) = uLastVertexIndex; sampler.movePositiveX(); @@ -168,7 +165,7 @@ namespace PolyVox POLYVOX_ASSERT(v101 != v111, "Attempting to insert vertex between two voxels with the same value"); const Vector3DFloat n010 = computeCentralDifferenceGradient(sampler); - const float fInterp = static_cast(m_tThreshold - m_controller.convertToDensity(v101)) / static_cast(m_controller.convertToDensity(v111) - m_controller.convertToDensity(v101)); + const float fInterp = static_cast(tThreshold - m_controller.convertToDensity(v101)) / static_cast(m_controller.convertToDensity(v111) - m_controller.convertToDensity(v101)); const Vector3DFloat v3dPosition(static_cast(uXRegSpace), static_cast(uYRegSpace - 1) + fInterp, static_cast(uZRegSpace)); const Vector3DUint16 v3dScaledPosition(static_cast(v3dPosition.getX() * 256.0f), static_cast(v3dPosition.getY() * 256.0f), static_cast(v3dPosition.getZ() * 256.0f)); @@ -190,7 +187,7 @@ namespace PolyVox surfaceVertex.encodedNormal = encodeNormal(v3dNormal); surfaceVertex.data = uMaterial; - uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); + uint32_t uLastVertexIndex = result->addVertex(surfaceVertex); pIndicesY(uXRegSpace, uYRegSpace, uZRegSpace) = uLastVertexIndex; sampler.movePositiveY(); @@ -201,7 +198,7 @@ namespace PolyVox POLYVOX_ASSERT(v110 != v111, "Attempting to insert vertex between two voxels with the same value"); const Vector3DFloat n001 = computeCentralDifferenceGradient(sampler); - const float fInterp = static_cast(m_tThreshold - m_controller.convertToDensity(v110)) / static_cast(m_controller.convertToDensity(v111) - m_controller.convertToDensity(v110)); + const float fInterp = static_cast(tThreshold - m_controller.convertToDensity(v110)) / static_cast(m_controller.convertToDensity(v111) - m_controller.convertToDensity(v110)); const Vector3DFloat v3dPosition(static_cast(uXRegSpace), static_cast(uYRegSpace), static_cast(uZRegSpace - 1) + fInterp); const Vector3DUint16 v3dScaledPosition(static_cast(v3dPosition.getX() * 256.0f), static_cast(v3dPosition.getY() * 256.0f), static_cast(v3dPosition.getZ() * 256.0f)); @@ -222,7 +219,7 @@ namespace PolyVox surfaceVertex.encodedNormal = encodeNormal(v3dNormal); surfaceVertex.data = uMaterial; - const uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); + const uint32_t uLastVertexIndex = result->addVertex(surfaceVertex); pIndicesZ(uXRegSpace, uYRegSpace, uZRegSpace) = uLastVertexIndex; sampler.movePositiveZ(); @@ -299,7 +296,7 @@ namespace PolyVox if ((ind0 != -1) && (ind1 != -1) && (ind2 != -1)) { - m_meshCurrent->addTriangle(ind0, ind1, ind2); + result->addTriangle(ind0, ind1, ind2); } } // For each triangle } @@ -312,10 +309,10 @@ namespace PolyVox startOfSlice.movePositiveZ(); } // For Z - m_meshCurrent->setOffset(m_regSizeInVoxels.getLowerCorner()); + result->setOffset(region.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(), ")"); + "ms (Region size = ", region.getWidthInVoxels(), "x", region.getHeightInVoxels(), + "x", region.getDepthInVoxels(), ")"); } }