forked from Mirrorlandia_minetest/minetest
Mgv5 1 up 1 down overgeneration for biome surface continuity
This commit is contained in:
parent
d39887dadd
commit
fcdb1a8fc2
@ -63,7 +63,7 @@ MapgenV5::MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge_) {
|
|||||||
// amount of elements to skip for the next index
|
// amount of elements to skip for the next index
|
||||||
// for noise/height/biome maps (not vmanip)
|
// for noise/height/biome maps (not vmanip)
|
||||||
this->ystride = csize.X;
|
this->ystride = csize.X;
|
||||||
this->zstride = csize.X * csize.Y;
|
this->zstride = csize.X * (csize.Y + 2);
|
||||||
|
|
||||||
this->biomemap = new u8[csize.X * csize.Z];
|
this->biomemap = new u8[csize.X * csize.Z];
|
||||||
this->heightmap = new s16[csize.X * csize.Z];
|
this->heightmap = new s16[csize.X * csize.Z];
|
||||||
@ -78,11 +78,11 @@ MapgenV5::MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge_) {
|
|||||||
noise_height = new Noise(&sp->np_height, seed, csize.X, csize.Z);
|
noise_height = new Noise(&sp->np_height, seed, csize.X, csize.Z);
|
||||||
|
|
||||||
// 3D terrain noise
|
// 3D terrain noise
|
||||||
noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y, csize.Z);
|
noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 2, csize.Z);
|
||||||
noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y, csize.Z);
|
noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 2, csize.Z);
|
||||||
noise_ground = new Noise(&sp->np_ground, seed, csize.X, csize.Y, csize.Z);
|
noise_ground = new Noise(&sp->np_ground, seed, csize.X, csize.Y + 2, csize.Z);
|
||||||
noise_crumble = new Noise(&sp->np_crumble, seed, csize.X, csize.Y, csize.Z);
|
noise_crumble = new Noise(&sp->np_crumble, seed, csize.X, csize.Y + 2, csize.Z);
|
||||||
noise_wetness = new Noise(&sp->np_wetness, seed, csize.X, csize.Y, csize.Z);
|
noise_wetness = new Noise(&sp->np_wetness, seed, csize.X, csize.Y + 2, csize.Z);
|
||||||
|
|
||||||
// Biome noise
|
// Biome noise
|
||||||
noise_heat = new Noise(bmgr->np_heat, seed, csize.X, csize.Z);
|
noise_heat = new Noise(bmgr->np_heat, seed, csize.X, csize.Z);
|
||||||
@ -291,8 +291,8 @@ void MapgenV5::makeChunk(BlockMakeData *data) {
|
|||||||
|
|
||||||
// Calculate lighting
|
// Calculate lighting
|
||||||
if (flags & MG_LIGHT)
|
if (flags & MG_LIGHT)
|
||||||
calcLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE,
|
calcLighting(node_min - v3s16(0, 1, 0) - v3s16(1, 0, 1) * MAP_BLOCKSIZE,
|
||||||
node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE);
|
node_max + v3s16(0, 1, 0) + v3s16(1, 0, 1) * MAP_BLOCKSIZE);
|
||||||
|
|
||||||
this->generating = false;
|
this->generating = false;
|
||||||
}
|
}
|
||||||
@ -301,7 +301,7 @@ void MapgenV5::makeChunk(BlockMakeData *data) {
|
|||||||
void MapgenV5::calculateNoise() {
|
void MapgenV5::calculateNoise() {
|
||||||
//TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
|
//TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
|
||||||
int x = node_min.X;
|
int x = node_min.X;
|
||||||
int y = node_min.Y;
|
int y = node_min.Y - 1;
|
||||||
int z = node_min.Z;
|
int z = node_min.Z;
|
||||||
|
|
||||||
noise_filler_depth->perlinMap2D(x, z);
|
noise_filler_depth->perlinMap2D(x, z);
|
||||||
@ -352,7 +352,7 @@ void MapgenV5::generateBaseTerrain() {
|
|||||||
u32 index2d = 0;
|
u32 index2d = 0;
|
||||||
|
|
||||||
for(s16 z=node_min.Z; z<=node_max.Z; z++) {
|
for(s16 z=node_min.Z; z<=node_max.Z; z++) {
|
||||||
for(s16 y=node_min.Y; y<=node_max.Y; y++) {
|
for(s16 y=node_min.Y - 1; y<=node_max.Y + 1; y++) {
|
||||||
u32 i = vm->m_area.index(node_min.X, y, z);
|
u32 i = vm->m_area.index(node_min.X, y, z);
|
||||||
for(s16 x=node_min.X; x<=node_max.X; x++, i++, index++, index2d++) {
|
for(s16 x=node_min.X; x<=node_max.X; x++, i++, index++, index2d++) {
|
||||||
if(vm->m_data[i].getContent() != CONTENT_IGNORE)
|
if(vm->m_data[i].getContent() != CONTENT_IGNORE)
|
||||||
@ -366,6 +366,7 @@ void MapgenV5::generateBaseTerrain() {
|
|||||||
float h = water_level + noise_height->result[index2d];
|
float h = water_level + noise_height->result[index2d];
|
||||||
float d1 = contour(noise_cave1->result[index]);
|
float d1 = contour(noise_cave1->result[index]);
|
||||||
float d2 = contour(noise_cave2->result[index]);
|
float d2 = contour(noise_cave2->result[index]);
|
||||||
|
|
||||||
if(noise_ground->result[index] * f < y - h) {
|
if(noise_ground->result[index] * f < y - h) {
|
||||||
if(y <= water_level)
|
if(y <= water_level)
|
||||||
vm->m_data[i] = MapNode(c_water_source);
|
vm->m_data[i] = MapNode(c_water_source);
|
||||||
@ -389,7 +390,7 @@ void MapgenV5::generateBlobs() {
|
|||||||
u32 index = 0;
|
u32 index = 0;
|
||||||
|
|
||||||
for(s16 z=node_min.Z; z<=node_max.Z; z++) {
|
for(s16 z=node_min.Z; z<=node_max.Z; z++) {
|
||||||
for(s16 y=node_min.Y; y<=node_max.Y; y++) {
|
for(s16 y=node_min.Y - 1; y<=node_max.Y + 1; y++) {
|
||||||
u32 i = vm->m_area.index(node_min.X, y, z);
|
u32 i = vm->m_area.index(node_min.X, y, z);
|
||||||
for(s16 x=node_min.X; x<=node_max.X; x++, i++, index++) {
|
for(s16 x=node_min.X; x<=node_max.X; x++, i++, index++) {
|
||||||
content_t c = vm->m_data[i].getContent();
|
content_t c = vm->m_data[i].getContent();
|
||||||
@ -431,7 +432,7 @@ void MapgenV5::generateBiomes() {
|
|||||||
Biome *biome = (Biome *)bmgr->get(biomemap[index]);
|
Biome *biome = (Biome *)bmgr->get(biomemap[index]);
|
||||||
s16 dfiller = biome->depth_filler + noise_filler_depth->result[index];
|
s16 dfiller = biome->depth_filler + noise_filler_depth->result[index];
|
||||||
s16 y0_top = biome->depth_top;
|
s16 y0_top = biome->depth_top;
|
||||||
s16 y0_filler = biome->depth_filler + biome->depth_top + dfiller;
|
s16 y0_filler = biome->depth_top + dfiller;
|
||||||
|
|
||||||
s16 nplaced = 0;
|
s16 nplaced = 0;
|
||||||
u32 i = vm->m_area.index(x, node_max.Y, z);
|
u32 i = vm->m_area.index(x, node_max.Y, z);
|
||||||
@ -495,7 +496,7 @@ void MapgenV5::dustTopNodes() {
|
|||||||
if (biome->c_dust == CONTENT_IGNORE)
|
if (biome->c_dust == CONTENT_IGNORE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
s16 y = node_max.Y;
|
s16 y = node_max.Y + 1;
|
||||||
u32 vi = vm->m_area.index(x, y, z);
|
u32 vi = vm->m_area.index(x, y, z);
|
||||||
for (; y >= node_min.Y; y--) {
|
for (; y >= node_min.Y; y--) {
|
||||||
if (vm->m_data[vi].getContent() != CONTENT_AIR)
|
if (vm->m_data[vi].getContent() != CONTENT_AIR)
|
||||||
@ -506,12 +507,13 @@ void MapgenV5::dustTopNodes() {
|
|||||||
|
|
||||||
content_t c = vm->m_data[vi].getContent();
|
content_t c = vm->m_data[vi].getContent();
|
||||||
if (c == biome->c_water && biome->c_dust_water != CONTENT_IGNORE) {
|
if (c == biome->c_water && biome->c_dust_water != CONTENT_IGNORE) {
|
||||||
if (y < node_min.Y)
|
if (y < node_min.Y - 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
vm->m_data[vi] = MapNode(biome->c_dust_water);
|
vm->m_data[vi] = MapNode(biome->c_dust_water);
|
||||||
} else if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE) {
|
} else if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE
|
||||||
if (y == node_max.Y)
|
&& c != biome->c_dust) {
|
||||||
|
if (y == node_max.Y + 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
vm->m_area.add_y(em, vi, 1);
|
vm->m_area.add_y(em, vi, 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user