2012-06-14 13:06:06 +00:00
// HeiGen.h
/*
2014-11-12 20:24:26 +00:00
Interfaces to the various height - based terrain shape generators :
2012-06-14 13:06:06 +00:00
- cHeiGenFlat
- cHeiGenClassic
- cHeiGenBiomal
2014-11-12 20:24:26 +00:00
Also implements the heightmap cache
2012-06-14 13:06:06 +00:00
*/
# pragma once
2013-01-25 10:12:29 +00:00
# include "ComposableGenerator.h"
2014-11-18 11:07:08 +00:00
# include "../Noise/Noise.h"
2012-06-14 13:06:06 +00:00
2014-11-12 20:24:26 +00:00
/** A simple cache that stores N most recently generated chunks' heightmaps; N being settable upon creation */
2012-06-14 13:06:06 +00:00
class cHeiGenCache :
public cTerrainHeightGen
{
public :
2015-07-07 09:50:06 +00:00
cHeiGenCache ( cTerrainHeightGenPtr a_HeiGenToCache , size_t a_CacheSize ) ;
2012-06-14 13:06:06 +00:00
~ cHeiGenCache ( ) ;
2013-10-11 08:18:01 +00:00
// cTerrainHeightGen overrides:
2013-05-05 16:27:08 +00:00
virtual void GenHeightMap ( int a_ChunkX , int a_ChunkZ , cChunkDef : : HeightMap & a_HeightMap ) override ;
2015-11-11 09:32:42 +00:00
virtual HEIGHTTYPE GetHeightAt ( int a_BlockX , int a_BlockZ ) override ;
2013-05-05 16:27:08 +00:00
2014-11-12 20:24:26 +00:00
/** Retrieves height at the specified point in the cache, returns true if found, false if not found */
2013-05-06 12:20:25 +00:00
bool GetHeightAt ( int a_ChunkX , int a_ChunkZ , int a_RelX , int a_RelZ , HEIGHTTYPE & a_Height ) ;
2012-06-14 13:06:06 +00:00
protected :
struct sCacheData
{
int m_ChunkX ;
int m_ChunkZ ;
cChunkDef : : HeightMap m_HeightMap ;
} ;
2014-11-12 20:24:26 +00:00
/** The terrain height generator that is being cached. */
cTerrainHeightGenPtr m_HeiGenToCache ;
2012-06-14 13:06:06 +00:00
// To avoid moving large amounts of data for the MRU behavior, we MRU-ize indices to an array of the actual data
2015-07-07 09:50:06 +00:00
size_t m_CacheSize ;
size_t * m_CacheOrder ; // MRU-ized order, indices into m_CacheData array
2012-06-14 13:06:06 +00:00
sCacheData * m_CacheData ; // m_CacheData[m_CacheOrder[0]] is the most recently used
// Cache statistics
2015-07-07 09:50:06 +00:00
size_t m_NumHits ;
size_t m_NumMisses ;
size_t m_TotalChain ; // Number of cache items walked to get to a hit (only added for hits)
2012-06-14 13:06:06 +00:00
} ;
2014-11-13 20:28:50 +00:00
/** Caches heightmaps in multiple underlying caches to improve the distribution and lower the chain length. */
class cHeiGenMultiCache :
public cTerrainHeightGen
{
public :
cHeiGenMultiCache ( cTerrainHeightGenPtr a_HeightGenToCache , size_t a_SubCacheSize , size_t a_NumSubCaches ) ;
// cTerrainHeightGen overrides:
virtual void GenHeightMap ( int a_ChunkX , int a_ChunkZ , cChunkDef : : HeightMap & a_HeightMap ) override ;
2015-11-11 09:32:42 +00:00
virtual HEIGHTTYPE GetHeightAt ( int a_BlockX , int a_BlockZ ) override ;
2014-11-13 20:28:50 +00:00
/** Retrieves height at the specified point in the cache, returns true if found, false if not found */
bool GetHeightAt ( int a_ChunkX , int a_ChunkZ , int a_RelX , int a_RelZ , HEIGHTTYPE & a_Height ) ;
protected :
typedef SharedPtr < cHeiGenCache > cHeiGenCachePtr ;
typedef std : : vector < cHeiGenCachePtr > cHeiGenCachePtrs ;
/** The coefficient used to turn Z coords into index (x + Coeff * z). */
static const size_t m_CoeffZ = 5 ;
/** Number of sub-caches, pulled out of m_SubCaches.size() for performance reasons. */
size_t m_NumSubCaches ;
/** The individual sub-caches. */
cHeiGenCachePtrs m_SubCaches ;
} ;
2014-11-12 20:24:26 +00:00
class cHeiGenFlat :
public cTerrainHeightGen
{
public :
cHeiGenFlat ( void ) : m_Height ( 5 ) { }
protected :
2015-05-19 10:50:59 +00:00
HEIGHTTYPE m_Height ;
2014-11-12 20:24:26 +00:00
// cTerrainHeightGen overrides:
virtual void GenHeightMap ( int a_ChunkX , int a_ChunkZ , cChunkDef : : HeightMap & a_HeightMap ) override ;
virtual void InitializeHeightGen ( cIniFile & a_IniFile ) override ;
} ;
2012-06-14 13:06:06 +00:00
class cHeiGenClassic :
public cTerrainHeightGen
{
public :
2013-10-11 08:18:01 +00:00
cHeiGenClassic ( int a_Seed ) ;
2012-06-14 13:06:06 +00:00
protected :
int m_Seed ;
cNoise m_Noise ;
float m_HeightFreq1 , m_HeightAmp1 ;
float m_HeightFreq2 , m_HeightAmp2 ;
float m_HeightFreq3 , m_HeightAmp3 ;
float GetNoise ( float x , float y ) ;
2013-10-11 08:18:01 +00:00
// cTerrainHeightGen overrides:
2012-06-14 13:06:06 +00:00
virtual void GenHeightMap ( int a_ChunkX , int a_ChunkZ , cChunkDef : : HeightMap & a_HeightMap ) override ;
2014-06-09 21:40:51 +00:00
virtual void InitializeHeightGen ( cIniFile & a_IniFile ) override ;
} ;
class cHeiGenMountains :
public cTerrainHeightGen
{
public :
cHeiGenMountains ( int a_Seed ) ;
protected :
int m_Seed ;
2014-10-19 12:35:49 +00:00
cRidgedMultiNoise m_MountainNoise ;
cRidgedMultiNoise m_DitchNoise ;
2014-06-09 21:40:51 +00:00
cPerlinNoise m_Perlin ;
// cTerrainHeightGen overrides:
virtual void GenHeightMap ( int a_ChunkX , int a_ChunkZ , cChunkDef : : HeightMap & a_HeightMap ) override ;
2013-10-11 08:18:01 +00:00
virtual void InitializeHeightGen ( cIniFile & a_IniFile ) override ;
2012-06-14 13:06:06 +00:00
} ;
class cHeiGenBiomal :
public cTerrainHeightGen
{
2015-11-11 09:32:42 +00:00
typedef cTerrainHeightGen Super ;
2012-06-14 13:06:06 +00:00
public :
2014-10-19 12:01:59 +00:00
cHeiGenBiomal ( int a_Seed , cBiomeGenPtr a_BiomeGen ) :
2012-06-14 13:06:06 +00:00
m_Noise ( a_Seed ) ,
m_BiomeGen ( a_BiomeGen )
{
}
2014-11-23 17:16:20 +00:00
// cTerrainHeightGen overrides:
virtual void GenHeightMap ( int a_ChunkX , int a_ChunkZ , cChunkDef : : HeightMap & a_HeightMap ) override ;
2015-11-11 09:32:42 +00:00
virtual HEIGHTTYPE GetHeightAt ( int a_BlockX , int a_BlockZ ) override // Need to provide this override due to clang's overzealous detection of overloaded virtuals
{
return Super : : GetHeightAt ( a_BlockX , a_BlockZ ) ;
}
2014-11-23 17:16:20 +00:00
virtual void InitializeHeightGen ( cIniFile & a_IniFile ) override ;
2012-06-14 13:06:06 +00:00
protected :
typedef cChunkDef : : BiomeMap BiomeNeighbors [ 3 ] [ 3 ] ;
2014-10-19 12:01:59 +00:00
cNoise m_Noise ;
cBiomeGenPtr m_BiomeGen ;
2012-06-14 13:06:06 +00:00
// Per-biome terrain generator parameters:
struct sGenParam
{
float m_HeightFreq1 , m_HeightAmp1 ;
float m_HeightFreq2 , m_HeightAmp2 ;
float m_HeightFreq3 , m_HeightAmp3 ;
float m_BaseHeight ;
} ;
2013-11-28 20:15:50 +00:00
static const sGenParam m_GenParam [ 256 ] ;
2014-11-23 17:16:20 +00:00
2013-04-22 20:12:04 +00:00
NOISE_DATATYPE GetHeightAt ( int a_RelX , int a_RelZ , int a_ChunkX , int a_ChunkZ , const BiomeNeighbors & a_BiomeNeighbors ) ;
2012-06-14 13:06:06 +00:00
} ;