1
0

Voronoi biomegen: Added JitterSize and OddRowOffset.

This commit is contained in:
madmaxoft
2014-09-17 23:24:22 +02:00
parent c979d46548
commit 6f5aa487ed
3 changed files with 164 additions and 88 deletions

View File

@@ -59,8 +59,8 @@ void cVoronoiMap::SetOddRowOffset(int a_OddRowOffset)
int cVoronoiMap::GetValueAt(int a_X, int a_Y)
{
int MinDist1, MinDist2;
return GetValueAt(a_X, a_Y, MinDist1, MinDist2);
int SeedX, SeedY, MinDist2;
return GetValueAt(a_X, a_Y, SeedX, SeedY, MinDist2);
}
@@ -69,41 +69,47 @@ int cVoronoiMap::GetValueAt(int a_X, int a_Y)
int cVoronoiMap::GetValueAt(int a_X, int a_Y, int & a_MinDist)
{
int MinDist2;
return GetValueAt(a_X, a_Y, a_MinDist, MinDist2);
int SeedX, SeedY, MinDist2;
int res = GetValueAt(a_X, a_Y, SeedX, SeedY, MinDist2);
a_MinDist = (a_X - SeedX) * (a_X - SeedX) + (a_Y - SeedY) * (a_Y - SeedY);
return res;
}
int cVoronoiMap::GetValueAt(int a_X, int a_Y, int & a_MinDist1, int & a_MinDist2)
int cVoronoiMap::GetValueAt(
int a_X, int a_Y, // Coords to query
int & a_NearestSeedX, int & a_NearestSeedY, // Coords of the closest cell
int & a_MinDist2 // Distance to the second closest cell
)
{
// Note that due to historical reasons, the algorithm uses XZ coords, while the input uses XY coords.
// This is because the algorithm was first implemented directly in the biome generators which use MC coords.
int CellX = a_X / m_CellSize;
int CellZ = a_Y / m_CellSize;
int CellY = a_Y / m_CellSize;
UpdateCell(CellX, CellZ);
UpdateCell(CellX, CellY);
// Get 5x5 neighboring cell seeds, compare distance to each. Return the value in the minumim-distance cell
int NearestSeedX = 0, NearestSeedY = 0;
int MinDist = m_CellSize * m_CellSize * 16; // There has to be a cell closer than this
int MinDist2 = MinDist;
int res = 0; // Will be overriden
for (int x = 0; x < 5; x++)
{
for (int z = 0; z < 5; z++)
for (int y = 0; y < 5; y++)
{
int SeedX = m_SeedX[x][z];
int SeedZ = m_SeedZ[x][z];
int SeedX = m_SeedX[x][y];
int SeedY = m_SeedZ[x][y];
int Dist = (SeedX - a_X) * (SeedX - a_X) + (SeedZ - a_Y) * (SeedZ - a_Y);
int Dist = (SeedX - a_X) * (SeedX - a_X) + (SeedY - a_Y) * (SeedY - a_Y);
if (Dist < MinDist)
{
NearestSeedX = SeedX;
NearestSeedY = SeedY;
MinDist2 = MinDist;
MinDist = Dist;
res = m_Noise3.IntNoise2DInt(x + CellX - 2, z + CellZ - 2);
res = m_Noise3.IntNoise2DInt(x + CellX - 2, y + CellY - 2);
}
else if (Dist < MinDist2)
{
@@ -112,7 +118,8 @@ int cVoronoiMap::GetValueAt(int a_X, int a_Y, int & a_MinDist1, int & a_MinDist2
} // for z
} // for x
a_MinDist1 = MinDist;
a_NearestSeedX = NearestSeedX;
a_NearestSeedY = NearestSeedY;
a_MinDist2 = MinDist2;
return res;
}
@@ -121,6 +128,58 @@ int cVoronoiMap::GetValueAt(int a_X, int a_Y, int & a_MinDist1, int & a_MinDist2
void cVoronoiMap::FindNearestSeeds(
int a_X, int a_Y,
int & a_NearestSeedX, int & a_NearestSeedY,
int & a_SecondNearestSeedX, int & a_SecondNearestSeedY
)
{
int CellX = a_X / m_CellSize;
int CellY = a_Y / m_CellSize;
UpdateCell(CellX, CellY);
// Get 5x5 neighboring cell seeds, compare distance to each. Return the value in the minumim-distance cell
int NearestSeedX = 0, NearestSeedY = 0;
int SecondNearestSeedX = 0, SecondNearestSeedY = 0;
int MinDist = m_CellSize * m_CellSize * 16; // There has to be a cell closer than this
int MinDist2 = MinDist;
for (int x = 0; x < 5; x++)
{
for (int y = 0; y < 5; y++)
{
int SeedX = m_SeedX[x][y];
int SeedY = m_SeedZ[x][y];
int Dist = (SeedX - a_X) * (SeedX - a_X) + (SeedY - a_Y) * (SeedY - a_Y);
if (Dist < MinDist)
{
SecondNearestSeedX = NearestSeedX;
SecondNearestSeedY = NearestSeedY;
MinDist2 = MinDist;
NearestSeedX = SeedX;
NearestSeedY = SeedY;
MinDist = Dist;
}
else if (Dist < MinDist2)
{
SecondNearestSeedX = SeedX;
SecondNearestSeedY = SeedY;
MinDist2 = Dist;
}
} // for z
} // for x
a_NearestSeedX = NearestSeedX;
a_NearestSeedY = NearestSeedY;
a_SecondNearestSeedX = SecondNearestSeedX;
a_SecondNearestSeedY = SecondNearestSeedY;
}
void cVoronoiMap::UpdateCell(int a_CellX, int a_CellZ)
{
// If the specified cell is currently cached, bail out: