Skip to content

Commit d6638b4

Browse files
committedMar 22, 2015
Mgv7: 1 up , 1 down overgeneration for chunk border continuity
Fixes biome layer at y = 47 when base/alt terrain exceeds it Also fixes missing dust glitch at y = 47 Mgv5/mgv7:Cleanup code
1 parent 008d7e0 commit d6638b4

File tree

2 files changed

+32
-52
lines changed

2 files changed

+32
-52
lines changed
 

Diff for: ‎src/mapgen_v5.cpp

+11-17
Original file line numberDiff line numberDiff line change
@@ -377,9 +377,9 @@ int MapgenV5::generateBaseTerrain()
377377
stone_surface_max_y = y;
378378
}
379379
}
380-
index2d = index2d - ystride;
380+
index2d -= ystride;
381381
}
382-
index2d = index2d + ystride;
382+
index2d += ystride;
383383
}
384384

385385
return stone_surface_max_y;
@@ -391,10 +391,6 @@ bool MapgenV5::generateBiomes(float *heat_map, float *humidity_map)
391391
if (node_max.Y < water_level)
392392
return false;
393393

394-
MapNode n_air(CONTENT_AIR);
395-
MapNode n_stone(c_stone);
396-
MapNode n_water(c_water_source);
397-
398394
v3s16 em = vm->m_area.getExtent();
399395
u32 index = 0;
400396
bool desert_stone = false;
@@ -496,9 +492,9 @@ void MapgenV5::generateCaves(int max_stone_y)
496492
if (d1*d2 > 0.125)
497493
vm->m_data[i] = MapNode(CONTENT_AIR);
498494
}
499-
index2d = index2d - ystride;
495+
index2d -= ystride;
500496
}
501-
index2d = index2d + ystride;
497+
index2d += ystride;
502498
}
503499

504500
if (node_max.Y > LARGE_CAVE_DEPTH)
@@ -528,27 +524,25 @@ void MapgenV5::dustTopNodes()
528524
if (biome->c_dust == CONTENT_IGNORE)
529525
continue;
530526

531-
s16 y_full_max = full_node_max.Y;
532-
u32 vi_full_max = vm->m_area.index(x, y_full_max, z);
533-
content_t c_full_max = vm->m_data[vi_full_max].getContent();
527+
u32 vi = vm->m_area.index(x, full_node_max.Y, z);
528+
content_t c_full_max = vm->m_data[vi].getContent();
534529
s16 y_start;
535530

536531
if (c_full_max == CONTENT_AIR) {
537-
y_start = y_full_max - 1;
532+
y_start = full_node_max.Y - 1;
538533
} else if (c_full_max == CONTENT_IGNORE) {
539-
s16 y_max = node_max.Y;
540-
u32 vi_max = vm->m_area.index(x, y_max, z);
541-
content_t c_max = vm->m_data[vi_max].getContent();
534+
vi = vm->m_area.index(x, node_max.Y + 1, z);
535+
content_t c_max = vm->m_data[vi].getContent();
542536

543537
if (c_max == CONTENT_AIR)
544-
y_start = y_max - 1;
538+
y_start = node_max.Y;
545539
else
546540
continue;
547541
} else {
548542
continue;
549543
}
550544

551-
u32 vi = vm->m_area.index(x, y_start, z);
545+
vi = vm->m_area.index(x, y_start, z);
552546
for (s16 y = y_start; y >= node_min.Y - 1; y--) {
553547
if (vm->m_data[vi].getContent() != CONTENT_AIR)
554548
break;

Diff for: ‎src/mapgen_v7.cpp

+21-35
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ MapgenV7::MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge)
5858
//// amount of elements to skip for the next index
5959
//// for noise/height/biome maps (not vmanip)
6060
this->ystride = csize.X;
61-
this->zstride = csize.X * csize.Y;
61+
this->zstride = csize.X * (csize.Y + 2);
6262

6363
this->biomemap = new u8[csize.X * csize.Z];
6464
this->heightmap = new s16[csize.X * csize.Z];
@@ -77,10 +77,10 @@ MapgenV7::MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge)
7777
noise_ridge_uwater = new Noise(&sp->np_ridge_uwater, seed, csize.X, csize.Z);
7878

7979
//// 3d terrain noise
80-
noise_mountain = new Noise(&sp->np_mountain, seed, csize.X, csize.Y, csize.Z);
81-
noise_ridge = new Noise(&sp->np_ridge, seed, csize.X, csize.Y, csize.Z);
82-
noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y, csize.Z);
83-
noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y, csize.Z);
80+
noise_mountain = new Noise(&sp->np_mountain, seed, csize.X, csize.Y + 2, csize.Z);
81+
noise_ridge = new Noise(&sp->np_ridge, seed, csize.X, csize.Y + 2, csize.Z);
82+
noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 2, csize.Z);
83+
noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 2, csize.Z);
8484

8585
//// Biome noise
8686
noise_heat = new Noise(&params->np_biome_heat, seed, csize.X, csize.Z);
@@ -314,7 +314,9 @@ void MapgenV7::makeChunk(BlockMakeData *data)
314314
updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
315315

316316
if (flags & MG_LIGHT)
317-
calcLighting(node_min, node_max);
317+
calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0),
318+
full_node_min, full_node_max);
319+
318320
//setLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE,
319321
// node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE, 0xFF);
320322

@@ -326,7 +328,7 @@ void MapgenV7::calculateNoise()
326328
{
327329
//TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
328330
int x = node_min.X;
329-
int y = node_min.Y;
331+
int y = node_min.Y - 1;
330332
int z = node_min.Z;
331333

332334
noise_terrain_persist->perlinMap2D(x, z);
@@ -489,8 +491,8 @@ int MapgenV7::generateBaseTerrain()
489491
if (surface_y > stone_surface_max_y)
490492
stone_surface_max_y = surface_y;
491493

492-
u32 i = vm->m_area.index(x, node_min.Y, z);
493-
for (s16 y = node_min.Y; y <= node_max.Y; y++) {
494+
u32 i = vm->m_area.index(x, node_min.Y - 1, z);
495+
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
494496
if (vm->m_data[i].getContent() == CONTENT_IGNORE) {
495497
if (y <= surface_y)
496498
vm->m_data[i] = n_stone;
@@ -516,7 +518,7 @@ int MapgenV7::generateMountainTerrain(int ymax)
516518
u32 j = 0;
517519

518520
for (s16 z = node_min.Z; z <= node_max.Z; z++)
519-
for (s16 y = node_min.Y; y <= node_max.Y; y++) {
521+
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
520522
u32 vi = vm->m_area.index(node_min.X, y, z);
521523
for (s16 x = node_min.X; x <= node_max.X; x++) {
522524
int index = (z - node_min.Z) * csize.X + (x - node_min.X);
@@ -549,7 +551,7 @@ void MapgenV7::generateRidgeTerrain()
549551
float width = 0.2; // TODO: figure out acceptable perlin noise values
550552

551553
for (s16 z = node_min.Z; z <= node_max.Z; z++)
552-
for (s16 y = node_min.Y; y <= node_max.Y; y++) {
554+
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
553555
u32 vi = vm->m_area.index(node_min.X, y, z);
554556
for (s16 x = node_min.X; x <= node_max.X; x++, index++, vi++) {
555557
int j = (z - node_min.Z) * csize.X + (x - node_min.X);
@@ -583,10 +585,6 @@ bool MapgenV7::generateBiomes(float *heat_map, float *humidity_map)
583585
if (node_max.Y < water_level)
584586
return false;
585587

586-
MapNode n_air(CONTENT_AIR);
587-
MapNode n_stone(c_stone);
588-
MapNode n_water(c_water_source);
589-
590588
v3s16 em = vm->m_area.getExtent();
591589
u32 index = 0;
592590
bool desert_stone = false;
@@ -608,16 +606,6 @@ bool MapgenV7::generateBiomes(float *heat_map, float *humidity_map)
608606
for (s16 y = node_max.Y; y >= node_min.Y; y--) {
609607
content_t c = vm->m_data[i].getContent();
610608

611-
// It could be the case that the elevation is equal to the chunk
612-
// boundary, but the chunk above has not been generated yet
613-
if (y == node_max.Y && c_above == CONTENT_IGNORE &&
614-
y == heightmap[index] && c == c_stone) {
615-
int j = (z - node_min.Z) * zstride +
616-
(y - node_min.Y) * ystride +
617-
(x - node_min.X);
618-
have_air = !getMountainTerrainFromMap(j, index, y);
619-
}
620-
621609
if (c != CONTENT_IGNORE && c != CONTENT_AIR && (y == node_max.Y || have_air)) {
622610
biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
623611
dfiller = biome->depth_filler + noise_filler_depth->result[index];
@@ -691,27 +679,25 @@ void MapgenV7::dustTopNodes()
691679
if (biome->c_dust == CONTENT_IGNORE)
692680
continue;
693681

694-
s16 y_full_max = full_node_max.Y;
695-
u32 vi_full_max = vm->m_area.index(x, y_full_max, z);
696-
content_t c_full_max = vm->m_data[vi_full_max].getContent();
682+
u32 vi = vm->m_area.index(x, full_node_max.Y, z);
683+
content_t c_full_max = vm->m_data[vi].getContent();
697684
s16 y_start;
698685

699686
if (c_full_max == CONTENT_AIR) {
700-
y_start = y_full_max - 1;
687+
y_start = full_node_max.Y - 1;
701688
} else if (c_full_max == CONTENT_IGNORE) {
702-
s16 y_max = node_max.Y;
703-
u32 vi_max = vm->m_area.index(x, y_max, z);
704-
content_t c_max = vm->m_data[vi_max].getContent();
689+
vi = vm->m_area.index(x, node_max.Y + 1, z);
690+
content_t c_max = vm->m_data[vi].getContent();
705691

706692
if (c_max == CONTENT_AIR)
707-
y_start = y_max - 1;
693+
y_start = node_max.Y;
708694
else
709695
continue;
710696
} else {
711697
continue;
712698
}
713699

714-
u32 vi = vm->m_area.index(x, y_start, z);
700+
vi = vm->m_area.index(x, y_start, z);
715701
for (s16 y = y_start; y >= node_min.Y - 1; y--) {
716702
if (vm->m_data[vi].getContent() != CONTENT_AIR)
717703
break;
@@ -831,7 +817,7 @@ void MapgenV7::generateCaves(int max_stone_y)
831817
u32 index2d = 0;
832818

833819
for (s16 z = node_min.Z; z <= node_max.Z; z++) {
834-
for (s16 y = node_min.Y; y <= node_max.Y; y++) {
820+
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
835821
u32 i = vm->m_area.index(node_min.X, y, z);
836822
for (s16 x = node_min.X; x <= node_max.X;
837823
x++, i++, index++, index2d++) {

0 commit comments

Comments
 (0)
Please sign in to comment.