VoronoiMap: Added Jitter and OddRowOffset params.
This commit is contained in:
parent
18743540bc
commit
96f45a48d4
@ -10,11 +10,13 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
cVoronoiMap::cVoronoiMap(int a_Seed, int a_CellSize) :
|
cVoronoiMap::cVoronoiMap(int a_Seed, int a_CellSize, int a_JitterSize) :
|
||||||
m_Noise1(a_Seed + 1),
|
m_Noise1(a_Seed + 1),
|
||||||
m_Noise2(a_Seed + 2),
|
m_Noise2(a_Seed + 2),
|
||||||
m_Noise3(a_Seed + 3),
|
m_Noise3(a_Seed + 3),
|
||||||
m_CellSize(a_CellSize),
|
m_CellSize(std::max(a_CellSize, 2)),
|
||||||
|
m_JitterSize(Clamp(a_JitterSize, 1, a_CellSize)),
|
||||||
|
m_OddRowOffset(0),
|
||||||
m_CurrentCellX(9999999), // Cell coords that are definitely out of the range for normal generator, so that the first query will overwrite them
|
m_CurrentCellX(9999999), // Cell coords that are definitely out of the range for normal generator, so that the first query will overwrite them
|
||||||
m_CurrentCellZ(9999999)
|
m_CurrentCellZ(9999999)
|
||||||
{
|
{
|
||||||
@ -26,7 +28,29 @@ cVoronoiMap::cVoronoiMap(int a_Seed, int a_CellSize) :
|
|||||||
|
|
||||||
void cVoronoiMap::SetCellSize(int a_CellSize)
|
void cVoronoiMap::SetCellSize(int a_CellSize)
|
||||||
{
|
{
|
||||||
|
a_CellSize = std::max(a_CellSize, 2); // Cell size must be at least 2
|
||||||
m_CellSize = a_CellSize;
|
m_CellSize = a_CellSize;
|
||||||
|
|
||||||
|
// For compatibility with previous version, which didn't have the jitter, we set jitter here as well.
|
||||||
|
m_JitterSize = a_CellSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cVoronoiMap::SetJitterSize(int a_JitterSize)
|
||||||
|
{
|
||||||
|
m_JitterSize = Clamp(a_JitterSize, 1, m_CellSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cVoronoiMap::SetOddRowOffset(int a_OddRowOffset)
|
||||||
|
{
|
||||||
|
m_OddRowOffset = Clamp(a_OddRowOffset, -m_CellSize, m_CellSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -111,12 +135,13 @@ void cVoronoiMap::UpdateCell(int a_CellX, int a_CellZ)
|
|||||||
for (int x = 0; x < 5; x++)
|
for (int x = 0; x < 5; x++)
|
||||||
{
|
{
|
||||||
int BaseX = (NoiseBaseX + x) * m_CellSize;
|
int BaseX = (NoiseBaseX + x) * m_CellSize;
|
||||||
|
int OddRowOffset = ((NoiseBaseX + x) & 0x01) * m_OddRowOffset;
|
||||||
for (int z = 0; z < 5; z++)
|
for (int z = 0; z < 5; z++)
|
||||||
{
|
{
|
||||||
int OffsetX = (m_Noise1.IntNoise2DInt(NoiseBaseX + x, NoiseBaseZ + z) / 8) % m_CellSize;
|
int OffsetX = (m_Noise1.IntNoise2DInt(NoiseBaseX + x, NoiseBaseZ + z) / 8) % m_JitterSize;
|
||||||
int OffsetZ = (m_Noise2.IntNoise2DInt(NoiseBaseX + x, NoiseBaseZ + z) / 8) % m_CellSize;
|
int OffsetZ = (m_Noise2.IntNoise2DInt(NoiseBaseX + x, NoiseBaseZ + z) / 8) % m_JitterSize;
|
||||||
m_SeedX[x][z] = BaseX + OffsetX;
|
m_SeedX[x][z] = BaseX + OffsetX;
|
||||||
m_SeedZ[x][z] = (NoiseBaseZ + z) * m_CellSize + OffsetZ;
|
m_SeedZ[x][z] = (NoiseBaseZ + z) * m_CellSize + OddRowOffset + OffsetZ;
|
||||||
} // for z
|
} // for z
|
||||||
} // for x
|
} // for x
|
||||||
m_CurrentCellX = a_CellX;
|
m_CurrentCellX = a_CellX;
|
||||||
|
@ -18,18 +18,28 @@
|
|||||||
class cVoronoiMap
|
class cVoronoiMap
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cVoronoiMap(int a_Seed, int a_CellSize = 128);
|
cVoronoiMap(int a_Seed, int a_CellSize = 128, int a_JitterSize = 128);
|
||||||
|
|
||||||
/// Sets the cell size used for generating the Voronoi seeds
|
/** Sets both the cell size and jitter size used for generating the Voronoi seeds. */
|
||||||
void SetCellSize(int a_CellSize);
|
void SetCellSize(int a_CellSize);
|
||||||
|
|
||||||
/// Returns the value in the cell into which the specified point lies
|
/** Sets the jitter size. Clamps it to current cell size. */
|
||||||
|
void SetJitterSize(int a_JitterSize);
|
||||||
|
|
||||||
|
/** Sets the offset that is added to each odd row of cells.
|
||||||
|
This offset makes the voronoi cells align to a non-grid.
|
||||||
|
Clamps the value to [-m_CellSize, +m_CellSize]. */
|
||||||
|
void SetOddRowOffset(int a_OddRowOffset);
|
||||||
|
|
||||||
|
/** Returns the value in the cell into which the specified point lies. */
|
||||||
int GetValueAt(int a_X, int a_Y);
|
int GetValueAt(int a_X, int a_Y);
|
||||||
|
|
||||||
/// Returns the value in the cell into which the specified point lies, and the distance to the nearest Voronoi seed
|
/** Returns the value in the cell into which the specified point lies,
|
||||||
|
and the distance to the nearest Voronoi seed. */
|
||||||
int GetValueAt(int a_X, int a_Y, int & a_MinDistance);
|
int GetValueAt(int a_X, int a_Y, int & a_MinDistance);
|
||||||
|
|
||||||
/// Returns the value in the cell into which the specified point lies, and the distances to the 2 nearest Voronoi seeds. Uses a cache
|
/** Returns the value in the cell into which the specified point lies,
|
||||||
|
and the distances to the 2 nearest Voronoi seeds. Uses a cache. */
|
||||||
int GetValueAt(int a_X, int a_Y, int & a_MinDistance1, int & a_MinDistance2);
|
int GetValueAt(int a_X, int a_Y, int & a_MinDistance1, int & a_MinDistance2);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -38,9 +48,18 @@ protected:
|
|||||||
cNoise m_Noise2;
|
cNoise m_Noise2;
|
||||||
cNoise m_Noise3;
|
cNoise m_Noise3;
|
||||||
|
|
||||||
/// Size of the Voronoi cells (avg X/Y distance between the seeds)
|
/** Size of the Voronoi cells (avg X/Y distance between the seeds). Expected to be at least 2. */
|
||||||
int m_CellSize;
|
int m_CellSize;
|
||||||
|
|
||||||
|
/** The amount that the cell seeds may be offset from the grid.
|
||||||
|
Expected to be at least 1 and less than m_CellSize. */
|
||||||
|
int m_JitterSize;
|
||||||
|
|
||||||
|
/** The constant amount that the cell seeds of every odd row will be offset from the grid.
|
||||||
|
This allows us to have non-rectangular grids.
|
||||||
|
Expected to be between -m_CellSize and +m_CellSize. */
|
||||||
|
int m_OddRowOffset;
|
||||||
|
|
||||||
/** The X coordinate of the currently cached cell neighborhood */
|
/** The X coordinate of the currently cached cell neighborhood */
|
||||||
int m_CurrentCellX;
|
int m_CurrentCellX;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user