Add depth to building map

This commit is contained in:
2024-06-16 20:47:27 +02:00
parent 66d6cd17e6
commit 8f3c92bd1d
24 changed files with 50 additions and 15 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 387 B

After

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 645 B

After

Width:  |  Height:  |  Size: 77 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 809 B

After

Width:  |  Height:  |  Size: 602 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 454 B

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 888 B

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 748 B

After

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 658 B

After

Width:  |  Height:  |  Size: 249 B

View File

@@ -156,6 +156,30 @@ def subtract_map(image: Union[str, Image], substractImage: Union[str, Image]) ->
return Image.fromarray(array_heightmap) return Image.fromarray(array_heightmap)
def overide_map(base: Image, top: Image) -> Image:
base = handle_import_image(base).convert('L')
top = handle_import_image(top).convert('L')
width, height = base.size
if top.size != (width, height):
raise ValueError("Mismatching images sizes")
result_image = Image.new('L', (width, height))
for x in range(width):
for y in range(height):
pixel1 = base.getpixel((x, y))
pixel2 = top.getpixel((x, y))
if pixel1 != 0:
result_image.putpixel((x, y), pixel1)
else:
result_image.putpixel((x, y), pixel2)
return result_image
def group_map(image1: Union[str, Image], image2: Union[str, Image]) -> Image: def group_map(image1: Union[str, Image], image2: Union[str, Image]) -> Image:
image1 = handle_import_image(image1).convert('L') image1 = handle_import_image(image1).convert('L')
image2 = handle_import_image(image2).convert('L') image2 = handle_import_image(image2).convert('L')

View File

@@ -29,7 +29,8 @@ class Bin:
best_spot_empty_area = empty_area best_spot_empty_area = empty_area
if best_spot is not None: if best_spot is not None:
self.rectangles.append((best_spot, (best_spot[0] + rectangle.width, best_spot[1] + rectangle.height))) self.rectangles.append(
(best_spot, (best_spot[0] + rectangle.width, best_spot[1] + rectangle.height)))
self.update_grid(rectangle, *best_spot) self.update_grid(rectangle, *best_spot)
return True return True
@@ -57,7 +58,8 @@ class Bin:
def pack_rectangles(rectangles, grid): def pack_rectangles(rectangles, grid):
rectangles = sorted(rectangles, key=lambda r: r.width * r.height, reverse=True) rectangles = sorted(
rectangles, key=lambda r: r.width * r.height, reverse=True)
bins = [Bin(grid)] bins = [Bin(grid)]
for rectangle in rectangles: for rectangle in rectangles:
@@ -90,21 +92,23 @@ def pack_rectangles(grid, min_width: int = 10, max_width: int = 25):
return bin.rectangles return bin.rectangles
def draw_rectangles(rectangles, grid): def draw_rectangles(rectangles, grid, heightmap):
image = Image.new('RGB', (len(grid[0]), len(grid)), (0, 0, 0)) heightmap = handle_import_image(heightmap).convert('L')
image = Image.new('L', (len(grid[0]), len(grid)), (0))
for rectangle in rectangles: for rectangle in rectangles:
start, end = rectangle start, end = rectangle
for x in range(start[0], end[0]): for x in range(start[0], end[0]):
for y in range(start[1], end[1]): for y in range(start[1], end[1]):
image.putpixel((x, y), (144, 255, 144)) image.putpixel((x, y), heightmap.getpixel((x, y)))
return image return image
def generate_building(image: Union[str, Image], min_width: int = 10, max_width: int = 25): def generate_building(image: Union[str, Image], heightmap: Union[str, Image], output: str = './world_maker/data/building.png', min_width: int = 10, max_width: int = 25):
image = handle_import_image(image).convert('L') image = handle_import_image(image).convert('L')
grid = np.array(image) grid = np.array(image)
rectangles = pack_rectangles(grid, min_width, max_width) rectangles = pack_rectangles(grid, min_width, max_width)
draw_rectangles(rectangles, grid).save('./world_maker/data/building.png') draw_rectangles(rectangles, grid, heightmap).save(
output)
return rectangles return rectangles

View File

@@ -9,7 +9,7 @@ from world_maker.data_analysis import handle_import_image
def remove_trees(heightmap: Union[str, Image], treesmap: Union[str, Image], mask: Union[str, Image]): def remove_trees(heightmap: Union[str, Image], treesmap: Union[str, Image], mask: Union[str, Image]):
print(["Remove tree"] Starting...) print("[Remove tree] Starting...")
editor = Editor(buffering=True) editor = Editor(buffering=True)
build_area = editor.getBuildArea() build_area = editor.getBuildArea()
build_rectangle = build_area.toRect() build_rectangle = build_area.toRect()
@@ -44,7 +44,6 @@ def remove_trees(heightmap: Union[str, Image], treesmap: Union[str, Image], mask
for x in range(0, distance[0]): for x in range(0, distance[0]):
for z in range(0, distance[1]): for z in range(0, distance[1]):
print("removing tree in ", start[0] + x, start[1] + z)
if removed_treesmap.getpixel((x, z)) != 0: if removed_treesmap.getpixel((x, z)) != 0:
y = heightmap.getpixel((x, z)) y = heightmap.getpixel((x, z))
y_top = removed_treesmap.getpixel((x, z)) y_top = removed_treesmap.getpixel((x, z))
@@ -52,12 +51,12 @@ def remove_trees(heightmap: Union[str, Image], treesmap: Union[str, Image], mask
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.")
def smooth_terrain(heightmap: Union[str, Image], heightmap_smooth: Union[str, Image], mask: Union[str, Image]): def smooth_terrain(heightmap: Union[str, Image], heightmap_smooth: Union[str, Image], mask: Union[str, Image]):
print(["Smooth terrain"] Starting...) print("[Smooth terrain] Starting...")
editor = Editor() editor = Editor()
build_area = editor.getBuildArea() build_area = editor.getBuildArea()
build_rectangle = build_area.toRect() build_rectangle = build_area.toRect()
@@ -99,4 +98,4 @@ def smooth_terrain(heightmap: Union[str, Image], heightmap_smooth: Union[str, Im
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(["Smoothing terrain"] Done.) print("[Smooth terrain] Done.")

View File

@@ -1,7 +1,7 @@
from world_maker.World import World from world_maker.World import World
from PIL import Image from PIL import Image
from world_maker.data_analysis import (get_data, filter_negative, rectangle_2D_to_3D, skeleton_mountain_map, highway_map, filter_sobel, skeleton_highway_map, from world_maker.data_analysis import (get_data, filter_negative, rectangle_2D_to_3D, skeleton_mountain_map, highway_map, filter_sobel, skeleton_highway_map,
smooth_sobel_water, subtract_map, detect_mountain, filter_smooth) smooth_sobel_water, subtract_map, detect_mountain, filter_smooth, overide_map)
from world_maker.City import City from world_maker.City import City
from world_maker.Position import Position from world_maker.Position import Position
from random import randint from random import randint
@@ -34,7 +34,9 @@ def world_maker():
'./world_maker/data/skeleton_highway_area.png').save('./world_maker/data/city_map.png') './world_maker/data/skeleton_highway_area.png').save('./world_maker/data/city_map.png')
subtract_map('./world_maker/data/city_map.png', subtract_map('./world_maker/data/city_map.png',
'./world_maker/data/mountain_map.png').save('./world_maker/data/city_map.png') './world_maker/data/mountain_map.png').save('./world_maker/data/city_map.png')
rectangle_building = generate_building('./world_maker/data/city_map.png')
rectangle_building = generate_building(
'./world_maker/data/city_map.png', './world_maker/data/heightmap.png', output='./world_maker/data/building.png')
rectangle_building = rectangle_2D_to_3D(rectangle_building) rectangle_building = rectangle_2D_to_3D(rectangle_building)
skeleton_mountain = skeleton_mountain_map(image_mountain_map) skeleton_mountain = skeleton_mountain_map(image_mountain_map)
@@ -43,6 +45,12 @@ def world_maker():
subtract_map(smooth_sobel_water_map, filter_negative( subtract_map(smooth_sobel_water_map, filter_negative(
'./world_maker/data/mountain_map.png')).save('./world_maker/data/mountain_map.png') './world_maker/data/mountain_map.png')).save('./world_maker/data/mountain_map.png')
rectangle_mountain = generate_building( rectangle_mountain = generate_building(
'./world_maker/data/mountain_map.png') './world_maker/data/mountain_map.png', './world_maker/data/heightmap.png', output='./world_maker/data/building_moutain.png')
rectangle_mountain = rectangle_2D_to_3D(rectangle_mountain) rectangle_mountain = rectangle_2D_to_3D(rectangle_mountain)
# Terraforming
overide_map('./world_maker/data/heightmap.png',
'./world_maker/data/building_moutain.png').save('./world_maker/data/heightmap_with_building.png')
overide_map('./world_maker/data/heightmap_with_building.png',
'./world_maker/data/building.png').save('./world_maker/data/heightmap_with_building.png')
return rectangle_mountain, rectangle_building, skeleton_highway, skeleton_mountain, road_grid return rectangle_mountain, rectangle_building, skeleton_highway, skeleton_mountain, road_grid