diff --git a/main.py b/main.py index 823e1c1..c0a9208 100644 --- a/main.py +++ b/main.py @@ -15,7 +15,8 @@ from networks.geometry.Point3D import Point3D from networks.geometry.Point2D import Point2D from networks.geometry.Circle import Circle -from PIL import Image +from PIL import Image as img +from PIL.Image import Image from utils.JsonReader import JsonReader from utils.YamlReader import YamlReader from buildings.Building import Building @@ -44,6 +45,7 @@ def main(): time_remove_tree = time.time() - start_time print(f"[TIME] Remove tree {time_remove_tree}") + """ start_time = time.time() smooth_terrain('./world_maker/data/heightmap.png', './world_maker/data/heightmap_smooth.png', './world_maker/data/smooth_sobel_watermap.png') @@ -117,17 +119,17 @@ def main(): entranceDirection[random.randint(0, 3)], blocks) house.build() time_houses = time.time() - start_time - print(f"[TIME] Houses {time_houses}") + print(f"[TIME] Houses {time_houses}") """ print("[GDMC] Done!\n\n") print(f"[TIME] Total {time.time() - start_time_all}") print(f"[TIME] World_maker {time_world_maker}") print(f"[TIME] Remove tree {time_remove_tree}") - print(f"[TIME] Smooth terrain {time_smooth_terrain}") - print(f"[TIME] Roads {time_roads}") - print(f"[TIME] Buildings {time_buildings}") - print(f"[TIME] Houses {time_houses}") + #print(f"[TIME] Smooth terrain {time_smooth_terrain}") + #print(f"[TIME] Roads {time_roads}") + #print(f"[TIME] Buildings {time_buildings}") + #print(f"[TIME] Houses {time_houses}") def get_height_building_from_center(center, position, length_world): @@ -162,7 +164,7 @@ def set_roads(skeleton: Skeleton, origin): for j in range(len(skeleton.lines[i])): xyz = transpose_form_heightmap('./world_maker/data/heightmap.png', skeleton.coordinates[skeleton.lines[i][j]], origin) - heightmap_smooth = Image.open( + heightmap_smooth = img.open( './world_maker/data/road_heightmap.png') skeleton.lines[i][j] = [xyz[0], heightmap_smooth.getpixel( (skeleton.coordinates[skeleton.lines[i][j]][0], skeleton.coordinates[skeleton.lines[i][j]][-1])), xyz[2]] diff --git a/world_maker/Skeleton.py b/world_maker/Skeleton.py index 0075d4b..53db242 100644 --- a/world_maker/Skeleton.py +++ b/world_maker/Skeleton.py @@ -4,7 +4,8 @@ from typing import List, Union import numpy as np from gdpc import Editor -from PIL import Image, ImageDraw +from PIL.Image import Image +from PIL import Image as img, ImageDraw from skan.csr import skeleton_to_csgraph from skimage.morphology import skeletonize from networks.geometry.Point3D import Point3D @@ -12,7 +13,7 @@ from networks.geometry.Point3D import Point3D def handle_import_image(image: Union[str, Image]) -> Image: if isinstance(image, str): - return Image.open(image) + return img.open(image) return image @@ -203,7 +204,7 @@ class Skeleton: # xzDistance = (max(buildRect.end[0], buildRect.begin[0]) - min(buildRect.end[0], buildRect.begin[0]), # max(buildRect.end[1], buildRect.begin[1]) - min(buildRect.end[1], buildRect.begin[1])) - heightmap = Image.open( + heightmap = img.open( "./world_maker/data/heightmap.png").convert('RGB') # roadsArea = Image.new("L", xzDistance, 0) # width, height = heightmap.size @@ -264,9 +265,9 @@ class Skeleton: def road_area(self, name: str, radius: int = 10) -> Image: print("[Skeleton] Start mapping the road area...") - heightmap = Image.open("./world_maker/data/heightmap.png") + heightmap = img.open("./world_maker/data/heightmap.png") width, height = heightmap.size - road_area_map = Image.new("L", (width, height), 0) + road_area_map = img.new("L", (width, height), 0) road_area_map_draw = ImageDraw.Draw(road_area_map) # Lines diff --git a/world_maker/terraforming.py b/world_maker/terraforming.py index e7eb67d..e23c79e 100644 --- a/world_maker/terraforming.py +++ b/world_maker/terraforming.py @@ -2,7 +2,8 @@ from typing import Union import numpy as np from gdpc import Editor, Block, geometry, lookup -from PIL import Image +from PIL import Image as img +from PIL.Image import Image from skimage import morphology from world_maker.data_analysis import handle_import_image @@ -16,38 +17,28 @@ def remove_trees(heightmap: Union[str, Image], treesmap: Union[str, Image], mask start = build_rectangle.begin - distance = (max(build_rectangle.end[0], build_rectangle.begin[0]) - min(build_rectangle.end[0], build_rectangle.begin[0]), max( - build_rectangle.end[1], build_rectangle.begin[1]) - min(build_rectangle.end[1], build_rectangle.begin[1])) + distance = (max(build_rectangle.end[0], build_rectangle.begin[0]) - min(build_rectangle.end[0], build_rectangle.begin[0]), + max(build_rectangle.end[1], build_rectangle.begin[1]) - min(build_rectangle.end[1], build_rectangle.begin[1])) heightmap = handle_import_image(heightmap).convert('L') - treesmap = handle_import_image(treesmap).convert('L') - mask = handle_import_image(mask) + treesmap = handle_import_image(treesmap ).convert('L') + mask = handle_import_image(mask) - removed_treesmap = Image.new("L", distance, 0) + removed_treesmap = img.new("L", distance, 0) - removed = [] - for x in range(0, distance[0]): - for z in range(0, distance[1]): + for (x,z) in [(x,z) for x in range(distance[0]) for z in range(distance[1])] : - if mask.getpixel((x, z)) != 0 and treesmap.getpixel((x, z)) > 0 and (x, z) not in removed: + if mask.getpixel((x, z)) != 0 and treesmap.getpixel((x, z)) > 0 : - tree_area = morphology.flood(treesmap, (z, x), tolerance=1) - blend = Image.blend(Image.fromarray(tree_area).convert( - 'L'), removed_treesmap.convert('L'), 0.5) + tree_area = morphology.flood(treesmap, (z, x), tolerance=1) + blend = img.blend(img.fromarray(tree_area).convert('L'), removed_treesmap.convert('L'), 0.5) + array = np.array(blend.convert('L')) + bool_array = array > 1 + removed_treesmap = img.fromarray(bool_array) - array = np.array(blend.convert('L')) - bool_array = array > 1 - removed_treesmap = Image.fromarray(bool_array) - - removed.append((x, z)) - - for x in range(0, distance[0]): - for z in range(0, distance[1]): - if removed_treesmap.getpixel((x, z)) != 0: - y = heightmap.getpixel((x, z)) - y_top = removed_treesmap.getpixel((x, z)) - geometry.placeLine( - editor, (start[0] + x, y+1, start[1] + z), (start[0] + x, y_top, start[1] + z), Block('air')) + y = heightmap.getpixel((x, z)) + y_top = removed_treesmap.getpixel((x, z)) + geometry.placeLine(editor, (start[0] + x, y+1, start[1] + z), (start[0] + x, y_top, start[1] + z), Block('air')) removed_treesmap.save('./world_maker/data/removed_treesmap.png') print("[Remove tree] Done.") @@ -62,14 +53,14 @@ def smooth_terrain(heightmap: Union[str, Image], heightmap_smooth: Union[str, Im start = build_rectangle.begin - distance = (max(build_rectangle.end[0], build_rectangle.begin[0]) - min(build_rectangle.end[0], build_rectangle.begin[0]), max( - build_rectangle.end[1], build_rectangle.begin[1]) - min(build_rectangle.end[1], build_rectangle.begin[1])) + distance = (max(build_rectangle.end[0], build_rectangle.begin[0]) - min(build_rectangle.end[0], build_rectangle.begin[0]), + max(build_rectangle.end[1], build_rectangle.begin[1]) - min(build_rectangle.end[1], build_rectangle.begin[1])) - heightmap = handle_import_image(heightmap).convert('L') + heightmap = handle_import_image(heightmap).convert('L') heightmap_smooth = handle_import_image(heightmap_smooth).convert('L') - mask = handle_import_image(mask).convert('L') + mask = handle_import_image(mask).convert('L') - smooth_terrain_delta = Image.new("RGB", distance, 0) + smooth_terrain_delta = img.new("RGB", distance, 0) slice = editor.loadWorldSlice(build_rectangle) smoothable_blocks = lookup.OVERWORLD_SOILS | lookup.OVERWORLD_STONES | lookup.SNOWS @@ -77,24 +68,25 @@ def smooth_terrain(heightmap: Union[str, Image], heightmap_smooth: Union[str, Im for x in range(0, distance[0]): for z in range(0, distance[1]): - if mask.getpixel((x, z)) != 0: - y = heightmap.getpixel((x, z)) - y_smooth = heightmap_smooth.getpixel((x, z)) - delta = y - y_smooth - smooth_terrain_delta.putpixel((x, z), delta) + if mask.getpixel((x, z)) == 0: + continue + y = heightmap.getpixel((x, z)) + y_smooth = heightmap_smooth.getpixel((x, z)) + delta = y - y_smooth + smooth_terrain_delta.putpixel((x, z), delta) - if delta != 0: - block = slice.getBlock((x, y, z)) - if block.id in smoothable_blocks: - if delta > 0: - geometry.placeLine( - editor, (start[0] + x, y, start[1] + z), (start[0] + x, y_smooth, start[1] + z), Block('air')) - editor.placeBlock( - (start[0] + x, y_smooth, start[1] + z), block) + if delta == 0: + continue + block = slice.getBlock((x, y, z)) - else: - geometry.placeLine( - editor, (start[0] + x, y, start[1] + z), (start[0] + x, y_smooth, start[1] + z), block) + if block.id not in smoothable_blocks: + continue + if delta > 0: + geometry.placeLine(editor, (start[0] + x, y, start[1] + z), (start[0] + x, y_smooth, start[1] + z), Block('air')) + editor.placeBlock((start[0] + x, y_smooth, start[1] + z), block) + + else: + geometry.placeLine(editor, (start[0] + x, y, start[1] + z), (start[0] + x, y_smooth, start[1] + z), block) smooth_terrain_delta.save('./world_maker/data/smooth_terrain_delta.png') print("[Smooth terrain] Done.")