summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/BioGen.cpp57
-rw-r--r--source/BioGen.h28
-rw-r--r--source/cChunkGenerator.cpp6
3 files changed, 91 insertions, 0 deletions
diff --git a/source/BioGen.cpp b/source/BioGen.cpp
index 9073ad721..d12d78fde 100644
--- a/source/BioGen.cpp
+++ b/source/BioGen.cpp
@@ -120,3 +120,60 @@ void cBioGenCheckerboard::GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::Biome
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// cBioGenVoronoi :
+
+void cBioGenVoronoi::GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap)
+{
+ int BaseZ = cChunkDef::Width * a_ChunkZ;
+ int BaseX = cChunkDef::Width * a_ChunkX;
+ for (int z = 0; z < cChunkDef::Width; z++)
+ {
+ int AbsoluteZ = BaseZ + z;
+ for (int x = 0; x < cChunkDef::Width; x++)
+ {
+ cChunkDef::SetBiome(a_BiomeMap, x, z, VoronoiBiome(BaseX + x, AbsoluteZ));
+ } // for x
+ } // for z
+}
+
+
+
+
+
+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
+ double MinDist = m_CellSize * m_CellSize; // 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;
+
+ double Dist = sqrt((double)((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;
+}
+
+
+
+
diff --git a/source/BioGen.h b/source/BioGen.h
index 659470af2..691ab9d90 100644
--- a/source/BioGen.h
+++ b/source/BioGen.h
@@ -15,6 +15,7 @@ Interfaces to the various biome generators:
#pragma once
#include "cChunkGenerator.h"
+#include "cNoise.h"
@@ -100,3 +101,30 @@ protected:
+
+class cBioGenVoronoi :
+ public cBiomeGenList
+{
+public:
+ cBioGenVoronoi(int a_Seed, int a_CellSize, const AString & a_Biomes) :
+ cBiomeGenList(a_Biomes),
+ m_CellSize(a_CellSize),
+ m_Noise(a_Seed)
+ {
+ }
+
+protected:
+
+ int m_CellSize;
+
+ cNoise m_Noise;
+
+ // cBiomeGen override:
+ virtual void GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) override;
+
+ EMCSBiome VoronoiBiome(int a_BlockX, int a_BlockZ);
+} ;
+
+
+
+
diff --git a/source/cChunkGenerator.cpp b/source/cChunkGenerator.cpp
index 72e293b3f..e5514ca1f 100644
--- a/source/cChunkGenerator.cpp
+++ b/source/cChunkGenerator.cpp
@@ -127,6 +127,12 @@ void cChunkGenerator::InitBiomeGen(cIniFile & a_IniFile)
AString Biomes = a_IniFile.GetValue("Generator", "CheckerBoardBiomes", "");
m_BiomeGen = new cBioGenCheckerboard(BiomeSize, Biomes);
}
+ else if (NoCaseCompare(BiomeGenName, "voronoi") == 0)
+ {
+ int CellSize = a_IniFile.GetValueI("Generator", "VoronoiCellSize", 64);
+ AString Biomes = a_IniFile.GetValue("Generator", "VoronoiBiomes", "");
+ m_BiomeGen = new cBioGenVoronoi(m_Seed, CellSize, Biomes);
+ }
else
{
if (NoCaseCompare(BiomeGenName, "distortedvoronoi") != 0)