diff options
-rw-r--r-- | src/Generating/BioGen.cpp | 56 | ||||
-rw-r--r-- | src/Generating/BioGen.h | 25 | ||||
-rw-r--r-- | src/VoronoiMap.cpp | 2 |
3 files changed, 29 insertions, 54 deletions
diff --git a/src/Generating/BioGen.cpp b/src/Generating/BioGen.cpp index 1cd7c70e7..8b2b227a8 100644 --- a/src/Generating/BioGen.cpp +++ b/src/Generating/BioGen.cpp @@ -267,7 +267,8 @@ void cBioGenVoronoi::GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & int AbsoluteZ = BaseZ + z; for (int x = 0; x < cChunkDef::Width; x++) { - cChunkDef::SetBiome(a_BiomeMap, x, z, VoronoiBiome(BaseX + x, AbsoluteZ)); + int VoronoiCellValue = m_Voronoi.GetValueAt(BaseX + x, AbsoluteZ) / 8; + cChunkDef::SetBiome(a_BiomeMap, x, z, m_Biomes[VoronoiCellValue % m_BiomesCount]); } // for x } // for z } @@ -279,45 +280,8 @@ void cBioGenVoronoi::GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & void cBioGenVoronoi::InitializeBiomeGen(cIniFile & a_IniFile) { super::InitializeBiomeGen(a_IniFile); - m_CellSize = a_IniFile.GetValueSetI("Generator", "VoronoiCellSize", 64); - AString Biomes = a_IniFile.GetValueSet ("Generator", "VoronoiBiomes", ""); - InitializeBiomes(Biomes); -} - - - - - -EMCSBiome cBioGenVoronoi::VoronoiBiome(int a_BlockX, int a_BlockZ) -{ - int CellX = a_BlockX / m_CellSize; - int CellZ = a_BlockZ / m_CellSize; - - // Note that Noise values need to be divided by 8 to gain a uniform modulo-2^n distribution - - // Get 5x5 neighboring cell seeds, compare distance to each. Return the biome in the minumim-distance cell - int MinDist = m_CellSize * m_CellSize * 16; // There has to be a cell closer than this - EMCSBiome res = biPlains; // Will be overriden - for (int x = CellX - 2; x <= CellX + 2; x++) - { - int BaseX = x * m_CellSize; - for (int z = CellZ - 2; z < CellZ + 2; z++) - { - int OffsetX = (m_Noise.IntNoise3DInt(x, 16 * x + 32 * z, z) / 8) % m_CellSize; - int OffsetZ = (m_Noise.IntNoise3DInt(x, 32 * x - 16 * z, z) / 8) % m_CellSize; - int SeedX = BaseX + OffsetX; - int SeedZ = z * m_CellSize + OffsetZ; - - int Dist = (SeedX - a_BlockX) * (SeedX - a_BlockX) + (SeedZ - a_BlockZ) * (SeedZ - a_BlockZ); - if (Dist < MinDist) - { - MinDist = Dist; - res = m_Biomes[(m_Noise.IntNoise3DInt(x, x - z + 1000, z) / 8) % m_BiomesCount]; - } - } // for z - } // for x - - return res; + m_Voronoi.SetCellSize(a_IniFile.GetValueSetI("Generator", "VoronoiCellSize", 64)); + InitializeBiomes (a_IniFile.GetValueSet ("Generator", "VoronoiBiomes", "")); } @@ -348,8 +312,8 @@ void cBioGenDistortedVoronoi::GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::B int AbsoluteZ = BaseZ + z; for (int x = 0; x < cChunkDef::Width; x++) { - // Distort(BaseX + x, AbsoluteZ, DistX, DistZ); - cChunkDef::SetBiome(a_BiomeMap, x, z, VoronoiBiome(DistortX[x][z], DistortZ[x][z])); + int VoronoiCellValue = m_Voronoi.GetValueAt(DistortX[x][z], DistortZ[x][z]) / 8; + cChunkDef::SetBiome(a_BiomeMap, x, z, m_Biomes[VoronoiCellValue % m_BiomesCount]); } // for x } // for z } @@ -360,10 +324,10 @@ void cBioGenDistortedVoronoi::GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::B void cBioGenDistortedVoronoi::InitializeBiomeGen(cIniFile & a_IniFile) { - // Do NOT call super::InitializeBiomeGen(), as it would try to read Voronoi params instead of DistortedVoronoi params - m_CellSize = a_IniFile.GetValueSetI("Generator", "DistortedVoronoiCellSize", 96); - AString Biomes = a_IniFile.GetValueSet ("Generator", "DistortedVoronoiBiomes", ""); - InitializeBiomes(Biomes); + super::InitializeBiomeGen(a_IniFile); + m_CellSize = a_IniFile.GetValueSetI("Generator", "DistortedVoronoiCellSize", 96); + m_Voronoi.SetCellSize(m_CellSize); + InitializeBiomes(a_IniFile.GetValueSet("Generator", "DistortedVoronoiBiomes", "")); } diff --git a/src/Generating/BioGen.h b/src/Generating/BioGen.h index bc70bfab2..892168bb6 100644 --- a/src/Generating/BioGen.h +++ b/src/Generating/BioGen.h @@ -16,6 +16,7 @@ Interfaces to the various biome generators: #include "ComposableGenerator.h" #include "../Noise.h" +#include "../VoronoiMap.h" @@ -123,15 +124,13 @@ class cBioGenVoronoi : public: cBioGenVoronoi(int a_Seed) : - m_Noise(a_Seed) + m_Voronoi(a_Seed) { } protected: - int m_CellSize; + cVoronoiMap m_Voronoi; - cNoise m_Noise; - // cBiomeGen overrides: virtual void GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) override; virtual void InitializeBiomeGen(cIniFile & a_IniFile) override; @@ -144,16 +143,28 @@ protected: class cBioGenDistortedVoronoi : - public cBioGenVoronoi + public cBiomeGenList { - typedef cBioGenVoronoi super; + typedef cBiomeGenList super; + public: cBioGenDistortedVoronoi(int a_Seed) : - cBioGenVoronoi(a_Seed) + m_Noise(a_Seed), + m_Voronoi(a_Seed), + m_CellSize(0) { } protected: + /// Noise used for the distortion + cNoise m_Noise; + + /// The underlying Voronoi map of the biomes + cVoronoiMap m_Voronoi; + + /// Size of the Voronoi cells, also used for distortion amplitude + int m_CellSize; + // cBiomeGen overrides: virtual void GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) override; virtual void InitializeBiomeGen(cIniFile & a_IniFile) override; diff --git a/src/VoronoiMap.cpp b/src/VoronoiMap.cpp index e95cb0bfa..7a36edebc 100644 --- a/src/VoronoiMap.cpp +++ b/src/VoronoiMap.cpp @@ -11,7 +11,7 @@ cVoronoiMap::cVoronoiMap(int a_Seed, int a_CellSize) : - m_Noise(a_Seed * 13 + 7), + m_Noise(a_Seed), m_CellSize(a_CellSize) { } |