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
|