示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
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;
}
示例#5
0
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;
}