Replaced usage of our 'Array' class with native C array and got significant performance increase.
This commit is contained in:
		| @@ -156,6 +156,8 @@ namespace PolyVox | ||||
| 	template< typename VolumeType, typename MeshType, typename ControllerType> | ||||
| 	class MarchingCubesSurfaceExtractor | ||||
| 	{ | ||||
| 	private: | ||||
| 		const static int BitmaskSize = 128; | ||||
| 	public: | ||||
| 		MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, MeshType* result, ControllerType controller, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType()); | ||||
|  | ||||
| @@ -164,14 +166,14 @@ namespace PolyVox | ||||
| 	private: | ||||
| 		//Compute the cell bitmask for a particular slice in z. | ||||
| 		template<bool isPrevZAvail> | ||||
| 		uint32_t computeBitmaskForSlice(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask); | ||||
| 		uint32_t computeBitmaskForSlice(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize]); | ||||
|  | ||||
| 		//Compute the cell bitmask for a given cell. | ||||
| 		template<bool isPrevXAvail, bool isPrevYAvail, bool isPrevZAvail> | ||||
| 		void computeBitmaskForCell(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask, uint32_t uXRegSpace, uint32_t uYRegSpace); | ||||
| 		void computeBitmaskForCell(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize], uint32_t uXRegSpace, uint32_t uYRegSpace); | ||||
|  | ||||
| 		//Use the cell bitmasks to generate all the vertices needed for that slice | ||||
| 		void generateVerticesForSlice(const Array2DUint8& pCurrentBitmask, | ||||
| 		void generateVerticesForSlice(uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize], | ||||
| 			Array2DInt32& m_pCurrentVertexIndicesX, | ||||
| 			Array2DInt32& m_pCurrentVertexIndicesY, | ||||
| 			Array2DInt32& m_pCurrentVertexIndicesZ); | ||||
| @@ -291,7 +293,7 @@ namespace PolyVox | ||||
| 		//////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| 		//Use the cell bitmasks to generate all the indices needed for that slice | ||||
| 		void generateIndicesForSlice(const Array2DUint8& pPreviousBitmask, | ||||
| 		void generateIndicesForSlice(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], | ||||
| 			const Array2DInt32& m_pPreviousVertexIndicesX, | ||||
| 			const Array2DInt32& m_pPreviousVertexIndicesY, | ||||
| 			const Array2DInt32& m_pPreviousVertexIndicesZ, | ||||
|   | ||||
| @@ -52,6 +52,12 @@ namespace PolyVox | ||||
| 		const uint32_t uArrayHeight = m_regSizeInVoxels.getUpperY() - m_regSizeInVoxels.getLowerY() + 1; | ||||
| 		const uint32_t arraySizes[2]= {uArrayWidth, uArrayHeight}; // Array dimensions | ||||
|  | ||||
| 		// PolyVox has a hardcoded limit on how big the regions it can extract are. This lets us allocate various | ||||
| 		// arrays at compile time rather than run time. If you *really* need to you can increase this by changing | ||||
| 		// the 'BitmaskSize' constant, but you should be sure you really know what you are doing.  | ||||
| 		POLYVOX_THROW_IF(uArrayWidth > BitmaskSize, std::invalid_argument, "Requested extraction region is too large"); | ||||
| 		POLYVOX_THROW_IF(uArrayHeight > BitmaskSize, std::invalid_argument, "Requested extraction region is too large"); | ||||
|  | ||||
| 		//For edge indices | ||||
| 		Array2DInt32 m_pPreviousVertexIndicesX(arraySizes); | ||||
| 		Array2DInt32 m_pPreviousVertexIndicesY(arraySizes); | ||||
| @@ -60,8 +66,8 @@ namespace PolyVox | ||||
| 		Array2DInt32 m_pCurrentVertexIndicesY(arraySizes); | ||||
| 		Array2DInt32 m_pCurrentVertexIndicesZ(arraySizes); | ||||
|  | ||||
| 		Array2DUint8 pPreviousBitmask(arraySizes); | ||||
| 		Array2DUint8 pCurrentBitmask(arraySizes); | ||||
| 		uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize]; | ||||
| 		uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize]; | ||||
|  | ||||
| 		//Create a region corresponding to the first slice | ||||
| 		m_regSlicePrevious = m_regSizeInVoxels; | ||||
| @@ -86,7 +92,8 @@ namespace PolyVox | ||||
| 		} | ||||
|  | ||||
| 		std::swap(uNoOfNonEmptyCellsForSlice0, uNoOfNonEmptyCellsForSlice1); | ||||
| 		pPreviousBitmask.swap(pCurrentBitmask); | ||||
| 		//pPreviousBitmask.swap(pCurrentBitmask); | ||||
| 		memcpy(pPreviousBitmask, pCurrentBitmask, BitmaskSize * BitmaskSize); | ||||
| 		m_pPreviousVertexIndicesX.swap(m_pCurrentVertexIndicesX); | ||||
| 		m_pPreviousVertexIndicesY.swap(m_pCurrentVertexIndicesY); | ||||
| 		m_pPreviousVertexIndicesZ.swap(m_pCurrentVertexIndicesZ); | ||||
| @@ -114,7 +121,8 @@ namespace PolyVox | ||||
| 			} | ||||
|  | ||||
| 			std::swap(uNoOfNonEmptyCellsForSlice0, uNoOfNonEmptyCellsForSlice1); | ||||
| 			pPreviousBitmask.swap(pCurrentBitmask); | ||||
| 			//pPreviousBitmask.swap(pCurrentBitmask); | ||||
| 			memcpy(pPreviousBitmask, pCurrentBitmask, BitmaskSize * BitmaskSize); | ||||
| 			m_pPreviousVertexIndicesX.swap(m_pCurrentVertexIndicesX); | ||||
| 			m_pPreviousVertexIndicesY.swap(m_pCurrentVertexIndicesY); | ||||
| 			m_pPreviousVertexIndicesZ.swap(m_pCurrentVertexIndicesZ); | ||||
| @@ -132,7 +140,7 @@ namespace PolyVox | ||||
|  | ||||
| 	template<typename VolumeType, typename MeshType, typename ControllerType> | ||||
| 	template<bool isPrevZAvail> | ||||
| 	uint32_t MarchingCubesSurfaceExtractor<VolumeType, MeshType, ControllerType>::computeBitmaskForSlice(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask) | ||||
| 	uint32_t MarchingCubesSurfaceExtractor<VolumeType, MeshType, ControllerType>::computeBitmaskForSlice(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize]) | ||||
| 	{ | ||||
| 		m_uNoOfOccupiedCells = 0; | ||||
|  | ||||
| @@ -198,7 +206,7 @@ namespace PolyVox | ||||
|  | ||||
| 	template<typename VolumeType, typename MeshType, typename ControllerType> | ||||
| 	template<bool isPrevXAvail, bool isPrevYAvail, bool isPrevZAvail> | ||||
| 	void MarchingCubesSurfaceExtractor<VolumeType, MeshType, ControllerType>::computeBitmaskForCell(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask, uint32_t uXRegSpace, uint32_t uYRegSpace) | ||||
| 	void MarchingCubesSurfaceExtractor<VolumeType, MeshType, ControllerType>::computeBitmaskForCell(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize], uint32_t uXRegSpace, uint32_t uYRegSpace) | ||||
| 	{ | ||||
| 		uint8_t iCubeIndex = 0; | ||||
|  | ||||
| @@ -397,7 +405,7 @@ namespace PolyVox | ||||
| 	} | ||||
|  | ||||
| 	template<typename VolumeType, typename MeshType, typename ControllerType> | ||||
| 	void MarchingCubesSurfaceExtractor<VolumeType, MeshType, ControllerType>::generateVerticesForSlice(const Array2DUint8& pCurrentBitmask, | ||||
| 	void MarchingCubesSurfaceExtractor<VolumeType, MeshType, ControllerType>::generateVerticesForSlice(uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize], | ||||
| 		Array2DInt32& m_pCurrentVertexIndicesX, | ||||
| 		Array2DInt32& m_pCurrentVertexIndicesY, | ||||
| 		Array2DInt32& m_pCurrentVertexIndicesZ) | ||||
| @@ -537,7 +545,7 @@ namespace PolyVox | ||||
| 	} | ||||
|  | ||||
| 	template<typename VolumeType, typename MeshType, typename ControllerType> | ||||
| 	void MarchingCubesSurfaceExtractor<VolumeType, MeshType, ControllerType>::generateIndicesForSlice(const Array2DUint8& pPreviousBitmask, | ||||
| 	void MarchingCubesSurfaceExtractor<VolumeType, MeshType, ControllerType>::generateIndicesForSlice(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], | ||||
| 		const Array2DInt32& m_pPreviousVertexIndicesX, | ||||
| 		const Array2DInt32& m_pPreviousVertexIndicesY, | ||||
| 		const Array2DInt32& m_pPreviousVertexIndicesZ, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user