diff options
author | paramat <mat.gregory@virginmedia.com> | 2016-01-31 04:23:46 +0000 |
---|---|---|
committer | paramat <mat.gregory@virginmedia.com> | 2016-02-02 06:37:01 +0000 |
commit | 0a8af8814787654dcbe0459a28255586fbfa3bd1 (patch) | |
tree | a39f134cbe4e2a4d12110202f614e1a5495a0fa1 /src/mapgen_v5.cpp | |
parent | 80c7612e76ca83fa69a6e709213026478edfe5ab (diff) | |
download | hax-minetest-server-0a8af8814787654dcbe0459a28255586fbfa3bd1.tar.gz hax-minetest-server-0a8af8814787654dcbe0459a28255586fbfa3bd1.zip |
Mgv5/v7/flat/fractal: Move tunnel noise calculation into generateCaves
Tunnel 3D noises are only calculated when solid terrain is present
in mapchunk, avoiding large amounts of unnecessary calculations
Change 'int' to 's16' in calculateNoise
Change 'i' to 'vi' for voxelmanip indexes for consistency
Keep 'u32 index3d' local to a smaller part of tunnel code
Mgv7: Don't call CaveV7 if no solid terrain in mapchunk
Give 'open' bool a more descriptive name
Diffstat (limited to 'src/mapgen_v5.cpp')
-rw-r--r-- | src/mapgen_v5.cpp | 60 |
1 files changed, 31 insertions, 29 deletions
diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp index 48b717292..06e5f1ca6 100644 --- a/src/mapgen_v5.cpp +++ b/src/mapgen_v5.cpp @@ -322,18 +322,16 @@ void MapgenV5::makeChunk(BlockMakeData *data) void MapgenV5::calculateNoise() { //TimeTaker t("calculateNoise", NULL, PRECISION_MICRO); - int x = node_min.X; - int y = node_min.Y - 1; - int z = node_min.Z; + s16 x = node_min.X; + s16 y = node_min.Y - 1; + s16 z = node_min.Z; noise_factor->perlinMap2D(x, z); noise_height->perlinMap2D(x, z); noise_ground->perlinMap3D(x, y, z); - if (flags & MG_CAVES) { - noise_cave1->perlinMap3D(x, y, z); - noise_cave2->perlinMap3D(x, y, z); - } + // Cave noises are calculated in generateCaves() + // only if solid terrain is present in mapchunk noise_filler_depth->perlinMap2D(x, z); noise_heat->perlinMap2D(x, z); @@ -377,9 +375,9 @@ int MapgenV5::generateBaseTerrain() for (s16 z=node_min.Z; z<=node_max.Z; z++) { for (s16 y=node_min.Y - 1; y<=node_max.Y + 1; y++) { - 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++) { - if (vm->m_data[i].getContent() != CONTENT_IGNORE) + u32 vi = vm->m_area.index(node_min.X, y, z); + for (s16 x=node_min.X; x<=node_max.X; x++, vi++, index++, index2d++) { + if (vm->m_data[vi].getContent() != CONTENT_IGNORE) continue; float f = 0.55 + noise_factor->result[index2d]; @@ -391,11 +389,11 @@ int MapgenV5::generateBaseTerrain() if (noise_ground->result[index] * f < y - h) { if (y <= water_level) - vm->m_data[i] = MapNode(c_water_source); + vm->m_data[vi] = MapNode(c_water_source); else - vm->m_data[i] = MapNode(CONTENT_AIR); + vm->m_data[vi] = MapNode(CONTENT_AIR); } else { - vm->m_data[i] = MapNode(c_stone); + vm->m_data[vi] = MapNode(c_stone); if (y > stone_surface_max_y) stone_surface_max_y = y; } @@ -508,22 +506,26 @@ MgStoneType MapgenV5::generateBiomes(float *heat_map, float *humidity_map) void MapgenV5::generateCaves(int max_stone_y) { - if (max_stone_y >= node_min.Y) { - u32 index = 0; - - for (s16 z = node_min.Z; z <= node_max.Z; z++) - for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) { - u32 i = vm->m_area.index(node_min.X, y, z); - for (s16 x = node_min.X; x <= node_max.X; x++, i++, index++) { - float d1 = contour(noise_cave1->result[index]); - float d2 = contour(noise_cave2->result[index]); - if (d1 * d2 > 0.125f) { - content_t c = vm->m_data[i].getContent(); - if (!ndef->get(c).is_ground_content || c == CONTENT_AIR) - continue; - - vm->m_data[i] = MapNode(CONTENT_AIR); - } + if (max_stone_y < node_min.Y) + return; + + noise_cave1->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z); + noise_cave2->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z); + + u32 index = 0; + + for (s16 z = node_min.Z; z <= node_max.Z; z++) + for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) { + u32 vi = vm->m_area.index(node_min.X, y, z); + for (s16 x = node_min.X; x <= node_max.X; x++, vi++, index++) { + float d1 = contour(noise_cave1->result[index]); + float d2 = contour(noise_cave2->result[index]); + if (d1 * d2 > 0.125f) { + content_t c = vm->m_data[vi].getContent(); + if (!ndef->get(c).is_ground_content || c == CONTENT_AIR) + continue; + + vm->m_data[vi] = MapNode(CONTENT_AIR); } } } |