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; }
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 MapgenV7P::generateTerrain() { MapNode n_stone(c_stone); MapNode n_bedrock(c_bedrock); MapNode n_water(c_water_source); MapNode n_air(CONTENT_AIR); //// Calculate noise for terrain generation noise_terrain_persist->perlinMap2D(node_min.X, node_min.Z); float *persistmap = noise_terrain_persist->result; noise_terrain_base ->perlinMap2D(node_min.X, node_min.Z, persistmap); noise_terrain_alt ->perlinMap2D(node_min.X, node_min.Z, persistmap); noise_height_select->perlinMap2D(node_min.X, node_min.Z); if (spflags & MGV7P_MOUNTAINS) { noise_mount_height->perlinMap2D(node_min.X, node_min.Z); noise_mountain ->perlinMap2D(node_min.X, node_min.Z); } //// Place nodes const v3s16 &em = vm->m_area.getExtent(); s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT; u32 index2d = 0; for (s16 z = node_min.Z; z <= node_max.Z; z++) for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) { s16 surface_y = baseTerrainLevelFromMap(index2d); if (spflags & MGV7P_MOUNTAINS) surface_y = MYMAX(mountainLevelFromMap(index2d), surface_y); if (surface_y > stone_surface_max_y) stone_surface_max_y = surface_y; u32 vi = 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[vi].getContent() == CONTENT_IGNORE) { if (y <= surface_y) { if (y <= bedrock_level) vm->m_data[vi] = n_bedrock; // Bedrock else vm->m_data[vi] = n_stone; // Base and mountain terrain } else if (y <= water_level) { vm->m_data[vi] = n_water; // Water } else { vm->m_data[vi] = n_air; // Air } } vm->m_area.add_y(em, vi, 1); } } return stone_surface_max_y; }
int MapgenV6::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); 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; BiomeV6Type bt = getBiome(v3POS(x, node_min.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 v3s16 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].getContent() == CONTENT_IGNORE) { if (y <= surface_y) { vm->m_data[i] = (y >= MGV6_DESERT_STONE_BASE - surface_y && bt == BT_DESERT) ? n_desert_stone : n_stone; } else if (y <= water_level) { vm->m_data[i] = ((heat < 0 && y > heat/3) || (y >= MGV6_ICE_BASE && bt == BT_TUNDRA)) ? 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 MapgenV7::generateTerrain() { MapNode n_air(CONTENT_AIR); MapNode n_stone(c_stone); MapNode n_water(c_water_source); v3s16 em = vm->m_area.getExtent(); s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT; u32 index2d = 0; bool mountain_flag = spflags & MGV7_MOUNTAINS; for (s16 z = node_min.Z; z <= node_max.Z; z++) for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) { s16 surface_y = baseTerrainLevelFromMap(index2d); heightmap[index2d] = surface_y; // Create base terrain heightmap ridge_heightmap[index2d] = surface_y; if (surface_y > stone_surface_max_y) stone_surface_max_y = surface_y; u32 vi = vm->m_area.index(x, node_min.Y - 1, z); u32 index3d = (z - node_min.Z) * zstride_1u1d + (x - node_min.X); for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) { if (vm->m_data[vi].getContent() == CONTENT_IGNORE) { if (y <= surface_y) { vm->m_data[vi] = n_stone; // Base terrain } else if (mountain_flag && getMountainTerrainFromMap(index3d, index2d, y)) { vm->m_data[vi] = n_stone; // Mountain terrain if (y > stone_surface_max_y) stone_surface_max_y = y; } else if (y <= water_level) { vm->m_data[vi] = n_water; } else { vm->m_data[vi] = n_air; } } vm->m_area.add_y(em, vi, 1); index3d += ystride; } } return stone_surface_max_y; }
int MapgenV7::calcHeightMap() { int stone_surface_max_y = -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 > stone_surface_max_y) stone_surface_max_y = surface_y; } return stone_surface_max_y; }
int MapgenV6::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); int stone_surface_max_y = -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; BiomeV6Type bt = getBiome(v2s16(x, z)); // Fill ground with stone v3s16 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].getContent() == CONTENT_IGNORE) { if (y <= surface_y) { vm->m_data[i] = (y >= DESERT_STONE_BASE && bt == BT_DESERT) ? n_desert_stone : n_stone; } else if (y <= water_level) { vm->m_data[i] = (y >= ICE_BASE && bt == BT_TUNDRA) ? n_ice : n_water_source; } else { vm->m_data[i] = n_air; } } vm->m_area.add_y(em, i, 1); } } return stone_surface_max_y; }
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); 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; 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) vm->m_data[i] = n_stone; else if (y <= water_level) vm->m_data[i] = n_water; 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 MapgenV6::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); int stone_surface_max_y = -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; BiomeType bt = getBiome(index, v2s16(x, z)); // Fill ground with stone v3s16 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].getContent() == CONTENT_IGNORE) { if (y <= surface_y) { vm->m_data[i] = (y > water_level - surface_y && bt == BT_DESERT) ? n_desert_stone : n_stone; } else if (y <= water_level) { s16 heat = emerge->env->m_use_weather ? emerge->env->getServerMap().updateBlockHeat(emerge->env, v3s16(x,y,z)) : 0; vm->m_data[i] = (heat < 0 && y > heat/3) ? n_ice : n_water_source; } else { vm->m_data[i] = n_air; } } vm->m_area.add_y(em, i, 1); } } return stone_surface_max_y; }
float MapgenV6::baseTerrainLevelFromMap(v2s16 p) { int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); return baseTerrainLevelFromMap(index); }
int MapgenV7::generateTerrain() { MapNode n_air(CONTENT_AIR); MapNode n_stone(c_stone); MapNode n_water(c_water_source); //// Calculate noise for terrain generation noise_terrain_persist->perlinMap2D(node_min.X, node_min.Z); float *persistmap = noise_terrain_persist->result; noise_terrain_base->perlinMap2D(node_min.X, node_min.Z, persistmap); noise_terrain_alt->perlinMap2D(node_min.X, node_min.Z, persistmap); noise_height_select->perlinMap2D(node_min.X, node_min.Z); if ((spflags & MGV7_MOUNTAINS) || (spflags & MGV7_FLOATLANDS)) { noise_mountain->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z); } if (spflags & MGV7_MOUNTAINS) { noise_mount_height->perlinMap2D(node_min.X, node_min.Z); } if (spflags & MGV7_FLOATLANDS) { noise_floatland_base->perlinMap2D(node_min.X, node_min.Z); noise_float_base_height->perlinMap2D(node_min.X, node_min.Z); } //// Place nodes v3s16 em = vm->m_area.getExtent(); s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT; u32 index2d = 0; for (s16 z = node_min.Z; z <= node_max.Z; z++) for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) { s16 surface_y = baseTerrainLevelFromMap(index2d); if (surface_y > stone_surface_max_y) stone_surface_max_y = surface_y; // Get extent of floatland base terrain // '+1' to avoid a layer of stone at y = MAX_MAP_GENERATION_LIMIT s16 float_base_min = MAX_MAP_GENERATION_LIMIT + 1; s16 float_base_max = MAX_MAP_GENERATION_LIMIT; if (spflags & MGV7_FLOATLANDS) floatBaseExtentFromMap(&float_base_min, &float_base_max, index2d); u32 vi = vm->m_area.index(x, node_min.Y - 1, z); u32 index3d = (z - node_min.Z) * zstride_1u1d + (x - node_min.X); for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) { if (vm->m_data[vi].getContent() == CONTENT_IGNORE) { if (y <= surface_y) { vm->m_data[vi] = n_stone; // Base terrain } else if ((spflags & MGV7_MOUNTAINS) && getMountainTerrainFromMap(index3d, index2d, y)) { vm->m_data[vi] = n_stone; // Mountain terrain if (y > stone_surface_max_y) stone_surface_max_y = y; } else if ((spflags & MGV7_FLOATLANDS) && ((y >= float_base_min && y <= float_base_max) || getFloatlandMountainFromMap(index3d, index2d, y))) { vm->m_data[vi] = n_stone; // Floatland terrain stone_surface_max_y = node_max.Y; } else if (y <= water_level) { vm->m_data[vi] = n_water; // Ground level water } else if ((spflags & MGV7_FLOATLANDS) && (y >= float_base_max && y <= floatland_level)) { vm->m_data[vi] = n_water; // Floatland water } else { vm->m_data[vi] = n_air; } } vm->m_area.add_y(em, vi, 1); index3d += ystride; } } return stone_surface_max_y; }