mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-04-04 06:23:33 +00:00
179 lines
4.8 KiB
C++
Executable File
179 lines
4.8 KiB
C++
Executable File
#include "BiomeSource.h"
|
|
#include "Biome.h"
|
|
#include "../Level.h"
|
|
#include "../ChunkPos.h"
|
|
|
|
const float BiomeSource::zoom = 2 * 1;
|
|
|
|
const float BiomeSource::tempScale = zoom / 80.0f;
|
|
const float BiomeSource::downfallScale = zoom / 40.0f;
|
|
const float BiomeSource::noiseScale = 1 / 4.0f;
|
|
|
|
BiomeSource::BiomeSource()
|
|
: temperatureMap(NULL),
|
|
downfallMap(NULL),
|
|
noiseMap(NULL),
|
|
lenTemperatures(0),
|
|
lenDownfalls(0),
|
|
lenNoises(0),
|
|
lenBiomes(0),
|
|
temperatures(NULL),
|
|
downfalls(NULL),
|
|
noises(NULL),
|
|
biomes(NULL)
|
|
{
|
|
biomes = new Biome*[16*16];
|
|
}
|
|
|
|
BiomeSource::BiomeSource( Level* level )
|
|
: rndTemperature(level->getSeed() * 9871),
|
|
rndDownfall(level->getSeed() * 39811),
|
|
rndNoise(level->getSeed() * 543321),
|
|
lenTemperatures(0),
|
|
lenDownfalls(0),
|
|
lenNoises(0),
|
|
lenBiomes(0),
|
|
temperatures(NULL),
|
|
downfalls(NULL),
|
|
noises(NULL),
|
|
biomes(NULL)
|
|
{
|
|
temperatureMap = new PerlinSimplexNoise(&rndTemperature, 4);
|
|
downfallMap = new PerlinSimplexNoise(&rndDownfall, 4);
|
|
noiseMap = new PerlinSimplexNoise(&rndNoise, 2);
|
|
|
|
biomes = new Biome*[16*16];
|
|
temperatures = new float[16*16];
|
|
}
|
|
|
|
BiomeSource::~BiomeSource() {
|
|
LOGI("Deleting biome maps...\n");
|
|
delete temperatureMap;
|
|
delete downfallMap;
|
|
delete noiseMap;
|
|
|
|
LOGI("Deleting biome data arrays...\n");
|
|
delete[] temperatures;
|
|
delete[] downfalls;
|
|
delete[] noises;
|
|
delete[] biomes;
|
|
}
|
|
|
|
Biome* BiomeSource::getBiome( const ChunkPos& chunk )
|
|
{
|
|
return getBiome(chunk.x << 4, chunk.z << 4);
|
|
}
|
|
|
|
Biome* BiomeSource::getBiome( int x, int z )
|
|
{
|
|
return getBiomeBlock(x, z, 1, 1)[0];
|
|
}
|
|
|
|
float BiomeSource::getTemperature( int x, int z )
|
|
{
|
|
temperatures = temperatureMap->getRegion(temperatures, x, z, 1, 1, tempScale, tempScale, 0.5f);
|
|
return temperatures[0];
|
|
}
|
|
|
|
Biome** BiomeSource::getBiomeBlock( int x, int z, int w, int h )
|
|
{
|
|
biomes = getBiomeBlock(biomes, x, z, w, h);
|
|
return biomes;
|
|
}
|
|
|
|
Biome** BiomeSource::getBiomeBlock( Biome** biomes__, int x, int z, int w, int h )
|
|
{
|
|
//for (int i = 0; i < w*h; ++i) biomes__[i] = Biome::tundra;
|
|
//const int size = w * h;
|
|
//if (lenBiomes < size) {
|
|
// //printf("changing to size: %d (was %d). %d, %d (%d, %d)\n", size, lenBiomes, x, z, w, h);
|
|
// if (biomes) delete[] biomes;
|
|
// biomes = new Biome*[size];
|
|
// lenBiomes = size;
|
|
//}
|
|
|
|
temperatures = temperatureMap->getRegion(temperatures, x, z, w, w, tempScale, tempScale, 0.25f);
|
|
downfalls = downfallMap->getRegion(downfalls, x, z, w, w, downfallScale, downfallScale, 0.3333f);
|
|
noises = noiseMap->getRegion(noises, x, z, w, w, noiseScale, noiseScale, 0.588f);
|
|
|
|
int pp = 0;
|
|
for (int yy = 0; yy < w; yy++) {
|
|
for (int xx = 0; xx < h; xx++) {
|
|
float noise = (noises[pp] * 1.1f + 0.5f);
|
|
|
|
float split2 = 0.01f;
|
|
float split1 = 1 - split2;
|
|
float temperature = (temperatures[pp] * 0.15f + 0.7f) * split1 + noise * split2;
|
|
split2 = 0.002f;
|
|
split1 = 1 - split2;
|
|
float downfall = (downfalls[pp] * 0.15f + 0.5f) * split1 + noise * split2;
|
|
temperature = 1 - ((1 - temperature) * (1 - temperature));
|
|
if (temperature < 0) temperature = 0;
|
|
if (downfall < 0) downfall = 0;
|
|
if (temperature > 1) temperature = 1;
|
|
if (downfall > 1) downfall = 1;
|
|
|
|
temperatures[pp] = temperature;
|
|
downfalls[pp] = downfall;
|
|
// System.out.println(downfall);
|
|
biomes[pp++] = Biome::getBiome(temperature, downfall);
|
|
}
|
|
}
|
|
|
|
return biomes;
|
|
}
|
|
|
|
float* BiomeSource::getTemperatureBlock( float* temperatures__, int x, int z, int w, int h )
|
|
{
|
|
//LOGI("gTempBlock: 1\n");
|
|
//const int size = w * h;
|
|
//if (lenTemperatures < size) {
|
|
// if (temperatures) delete[] temperatures;
|
|
// temperatures = new float[size];
|
|
// lenTemperatures = size;
|
|
//}
|
|
|
|
float * ot = temperatures;
|
|
temperatures = temperatureMap->getRegion(temperatures, x, z, w, h, tempScale, tempScale, 0.25f);
|
|
noises = noiseMap->getRegion(noises, x, z, w, h, noiseScale, noiseScale, 0.588f);
|
|
|
|
if (ot != temperatures) {
|
|
LOGI("tmp ptr changed\n");
|
|
}
|
|
|
|
int pp = 0;
|
|
for (int yy = 0; yy < w; yy++) {
|
|
for (int xx = 0; xx < h; xx++) {
|
|
float noise = (noises[pp] * 1.1f + 0.5f);
|
|
|
|
float split2 = 0.01f;
|
|
float split1 = 1 - split2;
|
|
float temperature = (temperatures[pp] * 0.15f + 0.7f) * split1 + noise * split2;
|
|
temperature = 1 - ((1 - temperature) * (1 - temperature));
|
|
|
|
if (temperature < 0) temperature = 0;
|
|
if (temperature > 1) temperature = 1;
|
|
|
|
temperatures[pp] = temperature;
|
|
pp++;
|
|
}
|
|
}
|
|
|
|
// System.out.println(min+", "+max);
|
|
|
|
return temperatures;
|
|
}
|
|
|
|
float* BiomeSource::getDownfallBlock( float* downfalls__, int x, int z, int w, int h )
|
|
{
|
|
// //const int size = w * h;
|
|
// //if (lenDownfalls < size) {
|
|
// // delete[] downfalls;
|
|
// // downfalls = new float[size];
|
|
// // lenDownfalls = size;
|
|
// //}
|
|
//
|
|
downfalls = downfallMap->getRegion(downfalls, x, z, w, w, downfallScale, downfallScale, 0.5f);
|
|
return downfalls;
|
|
}
|