summaryrefslogtreecommitdiffstats
path: root/src/Generating/StructGen.h
blob: d3b0b55440adf4343582be3238109f88ede57f2d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193

// StructGen.h

/* Interfaces to the various structure generators:
	- cStructGenTrees
	- cStructGenMarbleCaves
	- cStructGenOres
*/





#pragma once

#include "ComposableGenerator.h"
#include "../Noise/Noise.h"





class cStructGenTrees :
	public cFinishGen
{
public:
	cStructGenTrees(int a_Seed, cBiomeGenPtr a_BiomeGen, cTerrainHeightGenPtr a_HeightGen, cTerrainCompositionGenPtr a_CompositionGen) :
		m_Seed(a_Seed),
		m_Noise(a_Seed),
		m_BiomeGen(a_BiomeGen),
		m_HeightGen(a_HeightGen),
		m_CompositionGen(a_CompositionGen)
	{}
	
protected:

	int m_Seed;
	cNoise m_Noise;
	cBiomeGenPtr              m_BiomeGen;
	cTerrainHeightGenPtr      m_HeightGen;
	cTerrainCompositionGenPtr m_CompositionGen;
	
	/** Generates and applies an image of a single tree.
	Parts of the tree inside the chunk are applied to a_BlockX.
	Parts of the tree outside the chunk are stored in a_OutsideX
	*/
	void GenerateSingleTree(
		int a_ChunkX, int a_ChunkZ, int a_Seq,
		cChunkDesc & a_ChunkDesc,
		sSetBlockVector & a_OutsideLogs,
		sSetBlockVector & a_OutsideOther
	) ;
	
	/// Applies an image into chunk blockdata; all blocks outside the chunk will be appended to a_Overflow
	void ApplyTreeImage(
		int a_ChunkX, int a_ChunkZ,
		cChunkDesc & a_ChunkDesc,
		const sSetBlockVector & a_Image,
		sSetBlockVector & a_Overflow
	);

	int GetNumTrees(
		int a_ChunkX, int a_ChunkZ,
		const cChunkDef::BiomeMap & a_Biomes
	);
	
	// cFinishGen override:
	virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
} ;





class cStructGenOreNests :
	public cFinishGen
{
public:
	struct OreInfo
	{
		BLOCKTYPE  BlockType;  // The type of the nest.
		NIBBLETYPE BlockMeta;  // The block meta
		int        MaxHeight;  // The highest possible a nest can occur
		int        NumNests;   // How many nests per chunk
		int        NestSize;   // The amount of blocks a nest can have.

		OreInfo() :
			BlockType(0),
			BlockMeta(0),
			MaxHeight(0),
			NumNests(0),
			NestSize(0)
		{
		}
	};

	typedef std::vector<OreInfo> OreList;

	cStructGenOreNests(int a_Seed, OreList a_OreList, BLOCKTYPE a_ToReplace) :
		m_Noise(a_Seed),
		m_Seed(a_Seed),
		m_OreList(a_OreList),
		m_ToReplace(a_ToReplace)
	{}

protected:
	cNoise  m_Noise;
	int     m_Seed;

	OreList   m_OreList;  // A list of possible ores.
	BLOCKTYPE m_ToReplace;
	
	// cFinishGen override:
	virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
	
	void GenerateOre(int a_ChunkX, int a_ChunkZ, BLOCKTYPE a_OreType, NIBBLETYPE a_BlockMeta, int a_MaxHeight, int a_NumNests, int a_NestSize, cChunkDef::BlockTypes & a_BlockTypes, cChunkDesc::BlockNibbleBytes & a_BlockMetas, int a_Seq);
} ;





class cStructGenLakes :
	public cFinishGen
{
public:
	cStructGenLakes(int a_Seed, BLOCKTYPE a_Fluid, cTerrainHeightGenPtr a_HeiGen, int a_Probability) :
		m_Noise(a_Seed),
		m_Seed(a_Seed),
		m_Fluid(a_Fluid),
		m_HeiGen(a_HeiGen),
		m_Probability(a_Probability)
	{
	}
	
protected:
	cNoise               m_Noise;
	int                  m_Seed;
	BLOCKTYPE            m_Fluid;
	cTerrainHeightGenPtr m_HeiGen;
	int                  m_Probability;  ///< Chance, 0 .. 100, of a chunk having the lake
	
	// cFinishGen override:
	virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
	
	/// Creates a lake image for the specified chunk into a_Lake
	void CreateLakeImage(int a_ChunkX, int a_ChunkZ, cBlockArea & a_Lake);
} ;






class cStructGenDirectOverhangs :
	public cFinishGen
{
public:
	cStructGenDirectOverhangs(int a_Seed);

protected:
	cNoise    m_Noise1;
	cNoise    m_Noise2;
	
	// cFinishGen override:
	virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;

	bool HasWantedBiome(cChunkDesc & a_ChunkDesc) const;
} ;





class cStructGenDistortedMembraneOverhangs :
	public cFinishGen
{
public:
	cStructGenDistortedMembraneOverhangs(int a_Seed);

protected:
	cNoise m_NoiseX;
	cNoise m_NoiseY;
	cNoise m_NoiseZ;
	cNoise m_NoiseH;
	
	// cFinishGen override:
	virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
} ;