def init_pn(): global nl pn = PerlinNoise(size=(1, nel)) l = pn.getData([1, nel]) l2 = [abs(int(l[i])) for i in range(len(l))] mx = max(l2) mn = min(l2) nl = [mp(l2[i], mn, mx, 0, 1) for i in range(len(l2))]
def set_seed(self, seed): self.base_gen = PerlinNoise(seed) self.base_gen.octave = 8 self.ocean_gen = PerlinNoise(seed + 11) self.ocean_gen.octave = 8 self.river_gen = PerlinNoise(seed + 31) self.river_gen.octave = 8 self.mount_gen = PerlinNoise(seed + 41) self.hill_gen = PerlinNoise(seed + 71) self.cave_gen = PerlinNoise(seed + 141) self.biome_gen = BiomeGenerator(seed) self.seed = seed
def __init__(self, seed): super(TerrainGenerator, self).__init__(seed) self.base_gen = PerlinNoise(seed) self.base_gen.octave = 8 self.ocean_gen = PerlinNoise(seed + 11) self.ocean_gen.octave = 8 self.river_gen = PerlinNoise(seed + 31) self.river_gen.octave = 8 self.mount_gen = PerlinNoise(seed + 41) self.hill_gen = PerlinNoise(seed + 71) self.cave_gen = PerlinNoise(seed + 141) self.biome_gen = BiomeGenerator(seed)
class TerrainGenerator(TerrainGeneratorBase): def __init__(self, seed): super(TerrainGenerator, self).__init__(seed) self.base_gen = PerlinNoise(seed) self.base_gen.octave = 8 self.ocean_gen = PerlinNoise(seed + 11) self.ocean_gen.octave = 8 self.river_gen = PerlinNoise(seed + 31) self.river_gen.octave = 8 self.mount_gen = PerlinNoise(seed + 41) self.hill_gen = PerlinNoise(seed + 71) self.cave_gen = PerlinNoise(seed + 141) self.biome_gen = BiomeGenerator(seed) def set_seed(self, seed): self.base_gen = PerlinNoise(seed) self.base_gen.octave = 8 self.ocean_gen = PerlinNoise(seed + 11) self.ocean_gen.octave = 8 self.river_gen = PerlinNoise(seed + 31) self.river_gen.octave = 8 self.mount_gen = PerlinNoise(seed + 41) self.hill_gen = PerlinNoise(seed + 71) self.cave_gen = PerlinNoise(seed + 141) self.biome_gen = BiomeGenerator(seed) self.seed = seed def generate_chunk(self, chunk_x, chunk_y, chunk_z): c = Chunk(position=(chunk_x, chunk_y, chunk_z)) # density map d_map = init_3d_list(c.x_size + 1, c.y_size + 1, c.z_size + 1) for x in range(0, c.x_size + SAMPLE_RATE_HOR, SAMPLE_RATE_HOR): for z in range(0, c.z_size + SAMPLE_RATE_HOR, SAMPLE_RATE_HOR): for y in range(0, c.y_size + SAMPLE_RATE_VER, SAMPLE_RATE_VER): d_map[x][y][z] = self.density(c.world_block_xpos(x), y, c.world_block_zpos(z)) #print d_map[x][y][z] # interpolate the missing values self.tri_lerp_d_map(d_map) for x in range(CHUNK_X_SIZE): for z in range(CHUNK_Z_SIZE): biome_type = self.biome_gen.get_biome_type(x, z) first_block = -1 for y in range(CHUNK_Y_SIZE - 1, 0, -1): if y == 0: c.set_block(x, y, z, B.bed_block) break # 32: sea level if 0 < y <= 32: c.set_block(x, y, z, B.water_block) den = d_map[x][y][z] if 0 <= den < 32: if first_block == -1: first_block = y if self.cave_density(c.world_block_xpos(x), y, c.world_block_zpos(z)) > -0.7: c = self.gen_outer_layer(x, y, z, first_block, c, biome_type) else: c.set_block(x, y, z, B.air_block) continue elif den >= 32: if first_block == -1: first_block = y if self.cave_density(c.world_block_xpos(x), y, c.world_block_zpos(z)) > -0.6: c = self.gen_inner_layer(x, y, z, c) else: c.set_block(x, y, z, B.air_block) continue first_block = -1 return c def gen_inner_layer(self, x, y, z, c): # Mineral generation should be here also c.set_block(x, y, z, B.stone_block) return c def gen_outer_layer(self, x, y, z, first_block, c, biome_type): depth = int(first_block - y) if biome_type == G.PLAINS or biome_type == G.MOUNTAINS or biome_type == G.FOREST: if 28 <= y <= 34: c.set_block(x, y, z, B.sand_block) elif depth == 0 and 32 < y < 128: c.set_block(x, y, z, B.grass_block) elif depth > 32: c.set_block(x, y, z, B.stone_block) else: c.set_block(x, y, z, B.dirt_block) elif biome_type == G.SNOW: if depth == 0 and y >= 32: c.set_block(x, y, z, B.snow_block) elif depth > 32: c.set_block(x, y, z, B.stone_block) else: c.set_block(x, y, z, B.dirt_block) elif biome_type == G.DESERT: if depth > 8: c.set_block(x, y, z, B.stone_block) else: c.set_block(x, y, z, B.sand_block) return c def lerp(self, x, x1, x2, v00, v01): return (float(x2 - x) / float(x2 - x1)) * v00 + (float(x - x1) / float(x2 - x1)) * v01 def tri_lerp(self, x, y, z, v000, v001, v010, v011, v100, v101, v110, v111, x1, x2, y1, y2, z1, z2): x00 = self.lerp(x, x1, x2, v000, v100) x10 = self.lerp(x, x1, x2, v010, v110) x01 = self.lerp(x, x1, x2, v001, v101) x11 = self.lerp(x, x1, x2, v011, v111) u = self.lerp(y, y1, y2, x00, x01) v = self.lerp(y, y1, y2, x10, x11) return self.lerp(z, z1, z2, u, v) def tri_lerp_d_map(self, d_map): for x in range(CHUNK_X_SIZE): for y in range(CHUNK_Y_SIZE): for z in range(CHUNK_Z_SIZE): if not (x % SAMPLE_RATE_HOR == 0 and y % SAMPLE_RATE_VER == 0 and z % SAMPLE_RATE_HOR == 0): offsetX = int((x / SAMPLE_RATE_HOR) * SAMPLE_RATE_HOR) offsetY = int((y / SAMPLE_RATE_VER) * SAMPLE_RATE_VER) offsetZ = int((z / SAMPLE_RATE_HOR) * SAMPLE_RATE_HOR) d_map[x][y][z] = self.tri_lerp( x, y, z, d_map[offsetX][offsetY][offsetZ], d_map[offsetX][SAMPLE_RATE_VER + offsetY][offsetZ], d_map[offsetX][offsetY][offsetZ + SAMPLE_RATE_HOR], d_map[offsetX][offsetY + SAMPLE_RATE_VER][offsetZ + SAMPLE_RATE_HOR], d_map[SAMPLE_RATE_HOR + offsetX][offsetY][offsetZ], d_map[SAMPLE_RATE_HOR + offsetX][offsetY + SAMPLE_RATE_VER][offsetZ], d_map[SAMPLE_RATE_HOR + offsetX][offsetY][offsetZ + SAMPLE_RATE_HOR], d_map[SAMPLE_RATE_HOR + offsetX][offsetY + SAMPLE_RATE_VER][offsetZ + SAMPLE_RATE_HOR], offsetX, SAMPLE_RATE_HOR + offsetX, offsetY, SAMPLE_RATE_VER + offsetY, offsetZ, offsetZ + SAMPLE_RATE_HOR) def _clamp(self, a): if a > 1: return 1 elif a < 0: return 0 else: return a def density(self, x, y, z): height = self.base_terrain(x, z) ocean = self.ocean_terrain(x, z) river = self.rive_terrain(x, z) mountains = self.mount_density(x, y, z) hills = self.hill_density(x, y, z) flatten = self._clamp( ((CHUNK_Y_SIZE - 16) - y) / int(CHUNK_Y_SIZE * 0.10)) return -y + (((32.0 + height * 32.0) * self._clamp(river + 0.25) * self._clamp(ocean + 0.25)) + mountains * 1024.0 + hills * 128.0) * flatten def base_terrain(self, x, z): return self._clamp( (self.base_gen.fBm(0.004 * x, 0, 0.004 * z) + 1.0) / 2.0) def ocean_terrain(self, x, z): return self._clamp(self.ocean_gen.fBm(0.0009 * x, 0, 0.0009 * z) * 8.0) def rive_terrain(self, x, z): return self._clamp( (sqrt(abs(self.river_gen.fBm(0.0008 * x, 0, 0.0008 * z))) - 0.1) * 7.0) def mount_density(self, x, y, z): ret = self.mount_gen.fBm(x * 0.002, y * 0.001, z * 0.002) return ret if ret > 0 else 0 def hill_density(self, x, y, z): ret = self.hill_gen.fBm(x * 0.008, y * 0.006, z * 0.008) - 0.1 return ret if ret > 0 else 0 def cave_density(self, x, y, z): return self.cave_gen.fBm(x * 0.02, y * 0.02, z * 0.02)
class TerrainGenerator(TerrainGeneratorBase): def __init__(self, seed): super(TerrainGenerator, self).__init__(seed) self.base_gen = PerlinNoise(seed) self.base_gen.octave = 8 self.ocean_gen = PerlinNoise(seed + 11) self.ocean_gen.octave = 8 self.river_gen = PerlinNoise(seed + 31) self.river_gen.octave = 8 self.mount_gen = PerlinNoise(seed + 41) self.hill_gen = PerlinNoise(seed + 71) self.cave_gen = PerlinNoise(seed + 141) self.biome_gen = BiomeGenerator(seed) def set_seed(self, seed): self.base_gen = PerlinNoise(seed) self.base_gen.octave = 8 self.ocean_gen = PerlinNoise(seed + 11) self.ocean_gen.octave = 8 self.river_gen = PerlinNoise(seed + 31) self.river_gen.octave = 8 self.mount_gen = PerlinNoise(seed + 41) self.hill_gen = PerlinNoise(seed + 71) self.cave_gen = PerlinNoise(seed + 141) self.biome_gen = BiomeGenerator(seed) self.seed = seed def generate_chunk(self, chunk_x, chunk_y, chunk_z): c = Chunk(position=(chunk_x, chunk_y, chunk_z)) # density map d_map = init_3d_list(c.x_size + 1, c.y_size + 1, c.z_size + 1) for x in range(0, c.x_size + SAMPLE_RATE_HOR, SAMPLE_RATE_HOR): for z in range(0, c.z_size + SAMPLE_RATE_HOR, SAMPLE_RATE_HOR): for y in range(0, c.y_size + SAMPLE_RATE_VER, SAMPLE_RATE_VER): d_map[x][y][z] = self.density(c.world_block_xpos(x), y, c.world_block_zpos(z)) #print d_map[x][y][z] # interpolate the missing values self.tri_lerp_d_map(d_map) for x in range(CHUNK_X_SIZE): for z in range(CHUNK_Z_SIZE): biome_type = self.biome_gen.get_biome_type(x, z) first_block = -1 for y in range(CHUNK_Y_SIZE - 1, 0, -1): if y == 0: c.set_block(x, y, z, B.bed_block) break # 32: sea level if 0 < y <= 32: c.set_block(x, y, z, B.water_block) den = d_map[x][y][z] if 0 <= den < 32: if first_block == -1: first_block = y if self.cave_density(c.world_block_xpos(x), y, c.world_block_zpos(z)) > -0.7: c = self.gen_outer_layer(x, y, z, first_block, c, biome_type) else: c.set_block(x, y, z, B.air_block) continue elif den >= 32: if first_block == -1: first_block = y if self.cave_density(c.world_block_xpos(x), y, c.world_block_zpos(z)) > -0.6: c = self.gen_inner_layer(x, y, z, c) else: c.set_block(x, y, z, B.air_block) continue first_block = -1 return c def gen_inner_layer(self, x, y, z, c): # Mineral generation should be here also c.set_block(x, y, z, B.stone_block) return c def gen_outer_layer(self, x, y, z, first_block, c, biome_type): depth = int(first_block - y) if biome_type == G.PLAINS or biome_type == G.MOUNTAINS or biome_type == G.FOREST: if 28 <= y <= 34: c.set_block(x, y, z, B.sand_block) elif depth == 0 and 32 < y < 128: c.set_block(x, y, z, B.grass_block) elif depth > 32: c.set_block(x, y, z, B.stone_block) else: c.set_block(x, y, z, B.dirt_block) elif biome_type == G.SNOW: if depth == 0 and y >= 32: c.set_block(x, y, z, B.snow_block) elif depth > 32: c.set_block(x, y, z, B.stone_block) else: c.set_block(x, y, z, B.dirt_block) elif biome_type == G.DESERT: if depth > 8: c.set_block(x, y, z, B.stone_block) else: c.set_block(x, y, z, B.sand_block) return c def lerp(self, x, x1, x2, v00, v01): return (float(x2 - x) / float(x2 - x1)) * v00 + (float(x - x1) / float(x2 - x1)) * v01 def tri_lerp(self,x, y, z, v000, v001, v010, v011, v100, v101, v110, v111, x1, x2, y1, y2, z1, z2): x00 = self.lerp(x, x1, x2, v000, v100) x10 = self.lerp(x, x1, x2, v010, v110) x01 = self.lerp(x, x1, x2, v001, v101) x11 = self.lerp(x, x1, x2, v011, v111) u = self.lerp(y, y1, y2, x00, x01) v = self.lerp(y, y1, y2, x10, x11) return self.lerp(z, z1, z2, u, v) def tri_lerp_d_map(self, d_map): for x in range(CHUNK_X_SIZE): for y in range(CHUNK_Y_SIZE): for z in range(CHUNK_Z_SIZE): if not (x % SAMPLE_RATE_HOR == 0 and y % SAMPLE_RATE_VER == 0 and z % SAMPLE_RATE_HOR == 0): offsetX = int((x / SAMPLE_RATE_HOR) * SAMPLE_RATE_HOR) offsetY = int((y / SAMPLE_RATE_VER) * SAMPLE_RATE_VER) offsetZ = int((z / SAMPLE_RATE_HOR) * SAMPLE_RATE_HOR) d_map[x][y][z] = self.tri_lerp(x, y, z, d_map[offsetX][offsetY][offsetZ], d_map[offsetX][SAMPLE_RATE_VER + offsetY][offsetZ], d_map[offsetX][offsetY][offsetZ + SAMPLE_RATE_HOR], d_map[offsetX][offsetY + SAMPLE_RATE_VER][offsetZ + SAMPLE_RATE_HOR], d_map[SAMPLE_RATE_HOR + offsetX][offsetY][offsetZ], d_map[SAMPLE_RATE_HOR + offsetX][offsetY + SAMPLE_RATE_VER][offsetZ], d_map[SAMPLE_RATE_HOR + offsetX][offsetY][offsetZ + SAMPLE_RATE_HOR], d_map[SAMPLE_RATE_HOR + offsetX][offsetY + SAMPLE_RATE_VER][offsetZ + SAMPLE_RATE_HOR], offsetX, SAMPLE_RATE_HOR + offsetX, offsetY, SAMPLE_RATE_VER + offsetY, offsetZ, offsetZ + SAMPLE_RATE_HOR) def _clamp(self, a): if a > 1: return 1 elif a < 0: return 0 else: return a def density(self, x, y, z): height = self.base_terrain(x, z) ocean = self.ocean_terrain(x, z) river = self.rive_terrain(x, z) mountains = self.mount_density(x, y, z) hills = self.hill_density(x, y, z) flatten = self._clamp(((CHUNK_Y_SIZE - 16) - y) / int(CHUNK_Y_SIZE * 0.10)) return -y + (((32.0 + height * 32.0) * self._clamp(river + 0.25) * self._clamp(ocean + 0.25)) + mountains * 1024.0 + hills * 128.0) * flatten def base_terrain(self, x, z): return self._clamp((self.base_gen.fBm(0.004 * x, 0, 0.004 * z) + 1.0) / 2.0) def ocean_terrain(self, x, z): return self._clamp(self.ocean_gen.fBm(0.0009 * x, 0, 0.0009 * z) * 8.0) def rive_terrain(self, x, z): return self._clamp((sqrt(abs(self.river_gen.fBm(0.0008 * x, 0, 0.0008 * z))) - 0.1) * 7.0) def mount_density(self, x, y, z): ret = self.mount_gen.fBm(x * 0.002, y * 0.001, z * 0.002) return ret if ret > 0 else 0 def hill_density(self, x, y, z): ret = self.hill_gen.fBm(x * 0.008, y * 0.006, z * 0.008) - 0.1 return ret if ret > 0 else 0 def cave_density(self, x, y, z): return self.cave_gen.fBm(x * 0.02, y * 0.02, z * 0.02)