refactoring : terraforming.py

This commit is contained in:
WhyteTiger
2024-09-28 11:01:20 +02:00
parent 12cdacba4e
commit 3a48815279

View File

@@ -1,10 +1,10 @@
from typing import Union from typing import Union
import numpy as np import numpy as np
from gdpc import Editor, Block, geometry, lookup from gdpc import Editor, Block, geometry, lookup
from PIL import Image as img from PIL import Image as img
from PIL.Image import Image from PIL.Image import Image
from skimage import morphology from skimage import morphology
from world_maker.data_analysis import handle_import_image from world_maker.data_analysis import handle_import_image
@@ -21,23 +21,21 @@ def remove_trees(heightmap: Union[str, Image], treesmap: Union[str, Image], mask
max(build_rectangle.end[1], build_rectangle.begin[1]) - min(build_rectangle.end[1], build_rectangle.begin[1])) 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')
treesmap = handle_import_image(treesmap).convert('L') treesmap = handle_import_image(treesmap).convert('L')
mask = handle_import_image(mask) mask = handle_import_image(mask)
removed_treesmap = img.new("L", distance, 0) removed_treesmap = img.new("L", distance, 0)
for (x, z) in [(x, z) for x in range(distance[0]) for z in range(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: if mask.getpixel((x, z)) != 0 and treesmap.getpixel((x, z)) > 0:
tree_area = morphology.flood(treesmap, (z, x), tolerance=1) tree_area = morphology.flood(treesmap, (z, x), tolerance=1)
removed_treesmap = img.fromarray( removed_treesmap = img.fromarray(np.where(tree_area, treesmap, 0).astype(np.uint8))
np.where(tree_area, treesmap, 0).astype(np.uint8))
y = heightmap.getpixel((x, z)) y = heightmap.getpixel((x, z))
y_top = removed_treesmap.getpixel((x, z)) y_top = removed_treesmap.getpixel((x, z))
geometry.placeLine( geometry.placeLine(editor, (start[0] + x, y+1, start[1] + z), (start[0] + x, y_top, start[1] + z), Block('air'))
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') removed_treesmap.save('./world_maker/data/removed_treesmap.png')
print("[Remove tree] Done.") print("[Remove tree] Done.")
@@ -55,40 +53,36 @@ def smooth_terrain(heightmap: Union[str, Image], heightmap_smooth: Union[str, Im
distance = (max(build_rectangle.end[0], build_rectangle.begin[0]) - min(build_rectangle.end[0], build_rectangle.begin[0]), 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])) 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') 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 = img.new("RGB", distance, 0) smooth_terrain_delta = img.new("RGB", distance, 0)
slice = editor.loadWorldSlice(build_rectangle) slice = editor.loadWorldSlice(build_rectangle)
smoothable_blocks = lookup.OVERWORLD_SOILS | lookup.OVERWORLD_STONES | lookup.SNOWS smoothable_blocks = lookup.OVERWORLD_SOILS | lookup.OVERWORLD_STONES | lookup.SNOWS
for x in range(0, distance[0]): for (x, z) in [(x, z) for x in range(distance[0]) for z in range(distance[1])] :
for z in range(0, distance[1]):
if mask.getpixel((x, z)) == 0: if mask.getpixel((x, z)) == 0:
continue continue
y = heightmap.getpixel((x, z)) y = heightmap.getpixel((x, z))
y_smooth = heightmap_smooth.getpixel((x, z)) y_smooth = heightmap_smooth.getpixel((x, z))
delta = y - y_smooth delta = y - y_smooth
smooth_terrain_delta.putpixel((x, z), delta) smooth_terrain_delta.putpixel((x, z), delta)
if delta == 0: if delta == 0:
continue continue
block = slice.getBlock((x, y, z)) block = slice.getBlock((x, y, z))
if block.id not in smoothable_blocks: if block.id not in smoothable_blocks:
continue continue
if delta > 0: if delta > 0:
geometry.placeLine( geometry.placeLine(editor, (start[0] + x, y, start[1] + z), (start[0] + x, y_smooth, start[1] + z), Block('air'))
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)
editor.placeBlock(
(start[0] + x, y_smooth, start[1] + z), block)
else: else:
geometry.placeLine( geometry.placeLine(editor, (start[0] + x, y, start[1] + z), (start[0] + x, y_smooth, start[1] + z), block)
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') smooth_terrain_delta.save('./world_maker/data/smooth_terrain_delta.png')
print("[Smooth terrain] Done.") print("[Smooth terrain] Done.")