summaryrefslogtreecommitdiffstats
path: root/BiomeVisualiser/BiomeRenderer.cpp
blob: 00d6d684da915a53e10d33282580d1bcefe8560b (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

// BiomeRenderer.cpp

// Implements the cBiomeRenderer class representing the rendering engine

#include "Globals.h"
#include "BiomeRenderer.h"
#include "Pixmap.h"
#include "Timer.h"





cBiomeRenderer::cBiomeRenderer(void) :
	m_OriginX(160),
	m_OriginY(160),
	m_Zoom(1)
{
}




void cBiomeRenderer::SetSource(cBiomeSource * a_Source)
{
	m_Cache.SetSource(a_Source);
}





bool cBiomeRenderer::Render(cPixmap & a_Pixmap)
{
	cTimer Timer("cBiomeRenderer::Render");
	
	int Wid = a_Pixmap.GetWidth();
	int Hei = a_Pixmap.GetHeight();
	
	// Hint the approximate view area to the biome source so that it can adjust its caches:
	int MinBlockX = (    - m_OriginX) / m_Zoom;
	int MaxBlockX = (Wid - m_OriginX) / m_Zoom;
	int MinBlockZ = (    - m_OriginY) / m_Zoom;
	int MaxBlockZ = (Hei - m_OriginY) / m_Zoom;
	m_Cache.HintViewArea(MinBlockX / 16 - 1, MaxBlockX / 16 + 1, MinBlockZ / 16 - 1, MaxBlockZ / 16 + 1);
	
	// Hold one current chunk of biome data:
	int CurChunkX = MAXINT32;
	int CurChunkZ = MAXINT32;
	cChunkDef::BiomeMap CurBiomes;
	
	bool res = false;
	
	for (int y = 0; y < Hei; y++)
	{
		int BlockZ = (y - m_OriginY) / m_Zoom;
		int ChunkZ = (BlockZ >= 0) ? (BlockZ / 16) : ((BlockZ + 1) / 16 - 1);
		int RelZ = BlockZ - ChunkZ * 16;
		for (int x = 0; x < Wid; x++)
		{
			int BlockX = (x - m_OriginX) / m_Zoom;
			int ChunkX = (BlockX >= 0) ? (BlockX / 16) : ((BlockX + 1) / 16 - 1);
			int RelX = BlockX - ChunkX * 16;
			if ((ChunkZ != CurChunkZ) || (ChunkX != CurChunkX))
			{
				CurChunkX = ChunkX;
				CurChunkZ = ChunkZ;
				switch (m_Cache.GetBiome(CurChunkX, CurChunkZ, CurBiomes))
				{
					case cBiomeSource::baLater:
					{
						res = true; 
						// fallthrough:
					}
					case cBiomeSource::baNever:
					{
						for (int i = 0; i < ARRAYCOUNT(CurBiomes); i++)
						{
							CurBiomes[i] = (EMCSBiome)-1;
						}
						break;
					}
				}  // switch (Biome availability)
			}
			EMCSBiome Biome = cChunkDef::GetBiome(CurBiomes, RelX, RelZ);
			a_Pixmap.SetPixel(x, y, GetBiomeColor(Biome));
		}  // for x
	}  // for y
	return res;
}





int cBiomeRenderer::GetBiomeColor(EMCSBiome a_Biome)
{
	if ((a_Biome < 0) || (a_Biome > biMaxBiome))
	{
		return 0xcfcfcf;  // LtGray for unknown biomes
	}
	
	static int BiomeColor[] =
	{
		// RGB:
		0x0000ff, /* Ocean */
		0x00cf3f, /* Plains */
		0xffff00, /* Desert */
		0x7f7f7f, /* Extreme Hills */
		0x00cf00, /* Forest */
		0x007f3f, /* Taiga */
		0x3f7f00, /* Swampland */
		0x003fff, /* River */
		0x7f0000, /* Hell */
		0x007fff, /* Sky */
		0x3f3fff, /* Frozen Ocean */
		0x3f3fff, /* Frozen River */
		0x7fffcf, /* Ice Plains */
		0x3fcf7f, /* Ice Mountains */
		0xcf00cf, /* Mushroom Island */
		0x7f00ff, /* Mushroom Island Shore */
		0xffff3f, /* Beach */
		0xcfcf00, /* Desert Hills */
		0x00cf3f, /* Forest Hills */
		0x006f1f, /* Taiga Hills */
		0x7f8f7f, /* Extreme Hills Edge */
		0x004f00, /* Jungle */
		0x003f00, /* Jungle Hills */
	} ;
	
	return BiomeColor[a_Biome];
}





void cBiomeRenderer::MoveViewBy(int a_OffsX, int a_OffsY)
{
	m_OriginX += a_OffsX;
	m_OriginY += a_OffsY;
}