Chunks of voxel data are stored in a map, and it is quite common to need to search the map for a particular chunk. The key type used to be a Vector3D (i.e. the position of the chunk in 3D space) which makes conceptual sense but is relatively slow. Using a Vector3D as a key seems to have overhead, probably in terms of copying and performing comparisons. It seems to be significantly faster to use an integer as a key, so we now take the 3D position and pack it into a single integer by bitshifting. Naturally this reduces the range of positions we can store - a 32-bit int can only encode 3 x 10-bit values, which means our volume can only be 1024 chunks in each direction (with a chunk often being 32x32x32 voxels). This should still be large enough for most uses, but an upcoming change will allow 64-bit keys to be used (at least on 64-bit builds) which then allows 21 bits of precision per component. This is so large that it's almost infinite for any practical purposes.
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*******************************************************************************
 | 
						|
Copyright (c) 2010 Matt Williams
 | 
						|
 | 
						|
This software is provided 'as-is', without any express or implied
 | 
						|
warranty. In no event will the authors be held liable for any damages
 | 
						|
arising from the use of this software.
 | 
						|
 | 
						|
Permission is granted to anyone to use this software for any purpose,
 | 
						|
including commercial applications, and to alter it and redistribute it
 | 
						|
freely, subject to the following restrictions:
 | 
						|
 | 
						|
    1. The origin of this software must not be misrepresented; you must not
 | 
						|
    claim that you wrote the original software. If you use this software
 | 
						|
    in a product, an acknowledgment in the product documentation would be
 | 
						|
    appreciated but is not required.
 | 
						|
 | 
						|
    2. Altered source versions must be plainly marked as such, and must not be
 | 
						|
    misrepresented as being the original software.
 | 
						|
 | 
						|
    3. This notice may not be removed or altered from any source
 | 
						|
    distribution.
 | 
						|
*******************************************************************************/
 | 
						|
 | 
						|
#ifndef __PolyVox_TestVolume_H__
 | 
						|
#define __PolyVox_TestVolume_H__
 | 
						|
 | 
						|
#include "PolyVox/PolyVoxForwardDeclarations.h"
 | 
						|
#include "PolyVox/Region.h"
 | 
						|
 | 
						|
#include <QObject>
 | 
						|
 | 
						|
class TestVolume: public QObject
 | 
						|
{
 | 
						|
	Q_OBJECT
 | 
						|
 | 
						|
public:
 | 
						|
	TestVolume();
 | 
						|
	~TestVolume();
 | 
						|
	
 | 
						|
private slots:
 | 
						|
	/*void testRawVolumeDirectAccessAllInternalForwards();
 | 
						|
	void testRawVolumeSamplersAllInternalForwards();
 | 
						|
	void testRawVolumeDirectAccessWithExternalForwards();
 | 
						|
	void testRawVolumeSamplersWithExternalForwards();
 | 
						|
	void testRawVolumeDirectAccessAllInternalBackwards();
 | 
						|
	void testRawVolumeSamplersAllInternalBackwards();
 | 
						|
	void testRawVolumeDirectAccessWithExternalBackwards();
 | 
						|
	void testRawVolumeSamplersWithExternalBackwards();*/
 | 
						|
 | 
						|
	void testPagedVolumeDirectAccessAllInternalForwards();
 | 
						|
	void testPagedVolumeSamplersAllInternalForwards();
 | 
						|
	void testPagedVolumeDirectAccessWithExternalForwards();
 | 
						|
	void testPagedVolumeSamplersWithExternalForwards();
 | 
						|
	void testPagedVolumeDirectAccessAllInternalBackwards();
 | 
						|
	void testPagedVolumeSamplersAllInternalBackwards();
 | 
						|
	void testPagedVolumeDirectAccessWithExternalBackwards();
 | 
						|
	void testPagedVolumeSamplersWithExternalBackwards();
 | 
						|
 | 
						|
private:
 | 
						|
	PolyVox::Region m_regVolume;
 | 
						|
	PolyVox::Region m_regInternal;
 | 
						|
	PolyVox::Region m_regExternal;
 | 
						|
	PolyVox::FilePager<int32_t>* m_pFilePager;
 | 
						|
 | 
						|
	PolyVox::RawVolume<int32_t>* m_pRawVolume;
 | 
						|
	PolyVox::PagedVolume<int32_t>* m_pPagedVolume;
 | 
						|
};
 | 
						|
 | 
						|
#endif
 |