void MapgenV7::generateBaseTerrain(s16 *stone_surface_min_y, s16 *stone_surface_max_y) { MapNode n_air(CONTENT_AIR); MapNode n_stone(c_stone); MapNode n_water(c_water_source); MapNode n_ice(c_ice); v3s16 em = vm->m_area.getExtent(); s16 surface_min_y = MAX_MAP_GENERATION_LIMIT; s16 surface_max_y = -MAX_MAP_GENERATION_LIMIT; u32 index = 0; for (s16 z = node_min.Z; z <= node_max.Z; z++) for (s16 x = node_min.X; x <= node_max.X; x++, index++) { float surface_height = baseTerrainLevelFromMap(index); s16 surface_y = (s16)surface_height; heightmap[index] = surface_y; ridge_heightmap[index] = surface_y; if (surface_y < surface_min_y) surface_min_y = surface_y; if (surface_y > surface_max_y) surface_max_y = surface_y; s16 heat = m_emerge->env->m_use_weather ? m_emerge->env->getServerMap().updateBlockHeat(m_emerge->env, v3POS(x,node_max.Y,z), nullptr, &heat_cache) : 0; u32 i = vm->m_area.index(x, node_min.Y - 1, z); for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) { if (vm->m_data[i].getContent() == CONTENT_IGNORE) { if (y <= surface_y) { int index3 = (z - node_min.Z) * zstride + (y - node_min.Y + 1) * ystride + (x - node_min.X); vm->m_data[i] = layers_get(index3); } else if (y <= water_level) { vm->m_data[i] = (heat < 0 && y > heat/3) ? n_ice : n_water; if (liquid_pressure && y <= 0) vm->m_data[i].addLevel(m_emerge->ndef, water_level - y, 1); } else vm->m_data[i] = n_air; } vm->m_area.add_y(em, i, 1); } } *stone_surface_min_y = surface_min_y; *stone_surface_max_y = surface_max_y; }
int MapgenV5::generateBaseTerrain() { u32 index = 0; u32 index2d = 0; int stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT; noise_factor->perlinMap2D(node_min.X, node_min.Z); noise_height->perlinMap2D(node_min.X, node_min.Z); noise_ground->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z); 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++, index2d++) { if (vm->m_data[vi].getContent() != CONTENT_IGNORE) continue; float f = 0.55 + noise_factor->result[index2d]; if (f < 0.01) f = 0.01; else if (f >= 1.0) f *= 1.6; float h = noise_height->result[index2d]; if (noise_ground->result[index] * f < y - h) { if (y <= water_level) { vm->m_data[vi] = MapNode(c_water_source); if (liquid_pressure && y <= 0) vm->m_data[vi].addLevel(m_emerge->ndef, water_level - y, 1); } else vm->m_data[vi] = MapNode(CONTENT_AIR); } else { vm->m_data[vi] = layers_get(index); if (y > stone_surface_max_y) stone_surface_max_y = y; } } index2d -= ystride; } index2d += ystride; } return stone_surface_max_y; }
int Mapgen_features::float_islands_generate(const v3POS & node_min, const v3POS & node_max, int min_y, MMVManip *vm) { int generated = 0; if (node_min.Y < min_y) return generated; // originally from http://forum.minetest.net/viewtopic.php?id=4776 float RAR = 0.8 * farscale(0.4, node_min.Y); // 0.4; // Island rarity in chunk layer. -0.4 = thick layer with holes, 0 = 50%, 0.4 = desert rarity, 0.7 = very rare. float AMPY = 24; // 24; // Amplitude of island centre y variation. float TGRAD = 24; // 24; // Noise gradient to create top surface. Tallness of island top. float BGRAD = 24; // 24; // Noise gradient to create bottom surface. Tallness of island bottom. v3POS p0(node_min.X, node_min.Y, node_min.Z); float xl = node_max.X - node_min.X; float yl = node_max.Y - node_min.Y; float zl = node_max.Z - node_min.Z; u32 zstride = xl + y_offset; float midy = node_min.Y + yl * 0.5; u32 index = 0; for (int z1 = 0; z1 <= zl; ++z1) for (int y1 = 0; y1 <= yl; ++y1) for (int x1 = 0; x1 <= xl; ++x1, ++index) { int y = y1 + node_min.Y; u32 index2d = z1 * zstride + x1; float noise3 = noise_float_islands3->result[index2d]; float pmidy = midy + noise3 / 1.5 * AMPY; float noise1 = noise_float_islands1->result[index]; float offset = y > pmidy ? (y - pmidy) / TGRAD : (pmidy - y) / BGRAD; float noise1off = noise1 - offset - RAR; if (noise1off > 0 && noise1off < 0.7) { float noise2 = noise_float_islands2->result[index]; if (noise2 - noise1off > -0.7) { v3POS p = p0 + v3POS(x1, y1, z1); u32 i = vm->m_area.index(p); if (!vm->m_area.contains(i)) continue; // Cancel if not air if (vm->m_data[i].getContent() != CONTENT_AIR) continue; vm->m_data[i] = layers_get(index); ++generated; } } } return generated; }
int MapgenIndev::generateGround() { //TimeTaker timer1("Generating ground level"); MapNode n_air(CONTENT_AIR), n_water_source(c_water_source); MapNode n_stone(c_stone), n_desert_stone(c_desert_stone); MapNode n_ice(c_ice), n_dirt(c_dirt),n_sand(c_sand), n_gravel(c_gravel), n_lava_source(c_lava_source); int stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT; u32 index = 0; for (s16 z = node_min.Z; z <= node_max.Z; z++) for (s16 x = node_min.X; x <= node_max.X; x++, index++) { // Surface height s16 surface_y = (s16)baseTerrainLevelFromMap(index); // Log it if (surface_y > stone_surface_max_y) stone_surface_max_y = surface_y; auto bt = getBiome(index, v3POS(x, surface_y, z)); s16 heat = m_emerge->env->m_use_weather ? m_emerge->env->getServerMap().updateBlockHeat(m_emerge->env, v3POS(x,node_max.Y,z), nullptr, &heat_cache) : 0; // Fill ground with stone v3POS em = vm->m_area.getExtent(); u32 i = vm->m_area.index(x, node_min.Y, z); for (s16 y = node_min.Y; y <= node_max.Y; y++) { if (!vm->m_data[i]) { if (y <= surface_y) { int index3 = (z - node_min.Z) * zstride + (y - node_min.Y) * ystride + (x - node_min.X) * xstride; if (cave_noise_threshold && noise_cave_indev->result[index3] > cave_noise_threshold) { vm->m_data[i] = n_air; } else { auto n = (y > water_level - surface_y && bt == BT_DESERT) ? n_desert_stone : layers_get(index3); bool protect = n.getContent() != CONTENT_AIR; if (cave_noise_threshold && noise_cave_indev->result[index3] > cave_noise_threshold - 50) { vm->m_data[i] = protect ? n_stone : n; //cave shell without layers protect = true; } else { vm->m_data[i] = n; } if (protect) vm->m_flags[i] |= VOXELFLAG_CHECKED2; // no cave liquid } } else if (y <= water_level) { vm->m_data[i] = (heat < 0 && y > heat/3) ? n_ice : n_water_source; if (liquid_pressure && y <= 0) vm->m_data[i].addLevel(m_emerge->ndef, water_level - y, 1); } else { vm->m_data[i] = n_air; } } vm->m_area.add_y(em, i, 1); } } return stone_surface_max_y; }
int MapgenMath::generateTerrain() { MapNode n_ice(c_ice); u32 index = 0; v3POS em = vm->m_area.getExtent(); auto zstride_1d = csize.X * (csize.Y + 1); /* debug v3f vec0 = (v3f(node_min.X, node_min.Y, node_min.Z) - center) * scale ; errorstream << " X=" << node_min.X << " Y=" << node_min.Y << " Z=" << node_min.Z //<< " N="<< mengersponge(vec0.X, vec0.Y, vec0.Z, distance, iterations) << " N=" << (*func)(vec0.X, vec0.Y, vec0.Z, distance, iterations) << " Sc=" << scale << " gen=" << params["generator"].asString() << " J=" << Json::FastWriter().write(params) << std::endl; */ //errorstream << Json::StyledWriter().write( mg_params->params ).c_str()<< std::endl; //errorstream << " iterations="<<iterations<< " scale="<<scale <<" invert="<<invert<< std::endl; #if USE_MANDELBULBER v3f vec0(node_min.X, node_min.Y, node_min.Z); vec0 = (vec0 - center) * scale; /* errorstream << " X=" << node_min.X << " Y=" << node_min.Y << " Z=" << node_min.Z << " N=" << Compute<normal_mode>(CVector3(vec0.X, vec0.Y, vec0.Z), mg_params->par) //<<" F="<< Compute<fake_AO>(CVector3(node_min.X,node_min.Y,node_min.Z), par) //<<" L="<<node_min.getLength()<< " -="<<node_min.getLength() - Compute<normal_mode>(CVector3(node_min.X,node_min.Y,node_min.Z), par) << " Sc=" << scale << " internal=" << internal << std::endl; */ #endif double d = 0; for (s16 z = node_min.Z; z <= node_max.Z; z++) { for (s16 x = node_min.X; x <= node_max.X; x++, index++) { s16 heat = m_emerge->env->m_use_weather ? m_emerge->env->getServerMap().updateBlockHeat(m_emerge->env, v3POS(x,node_max.Y,z), nullptr, &heat_cache) : 0; u32 i = vm->m_area.index(x, node_min.Y, z); for (s16 y = node_min.Y; y <= node_max.Y; y++) { v3f vec = (v3f(x, y, z) - center) * scale ; if (invert_xy) std::swap(vec.X, vec.Y); if (invert_yz) std::swap(vec.Y, vec.Z); #if USE_MANDELBULBER if (!internal) d = Compute<normal_mode>(CVector3(vec.X, vec.Y, vec.Z), mg_params->par); else #endif if (internal) d = (*func)(vec.X, vec.Y, vec.Z, scale.X, iterations); if ((!invert && d > 0) || (invert && d == 0) ) { if (!vm->m_data[i]) { //vm->m_data[i] = (y > water_level + biome->filler) ? // MapNode(biome->c_filler) : n_stone; if (invert) { int index3 = (z - node_min.Z) * zstride_1d + (y - node_min.Y) * ystride + (x - node_min.X); vm->m_data[i] = Mapgen_features::layers_get(index3); } else { vm->m_data[i] = layers_get(d, result_max); } // vm->m_data[i] = (y > water_level + biome->filler) ? // MapNode(biome->c_filler) : layers_get(d, result_max); } } else if (y <= water_level) { vm->m_data[i] = (heat < 0 && y > heat/3) ? n_ice : n_water; } else { vm->m_data[i] = n_air; } vm->m_area.add_y(em, i, 1); } } } return 0; }