From 656faadad2869d31c925e2495cac5833b2c11142 Mon Sep 17 00:00:00 2001 From: Xeon0X Date: Sat, 22 Jun 2024 17:46:34 +0200 Subject: [PATCH] Clean main --- main.py | 209 +++++---------------- world_maker/data/heightmap.png | Bin 3320 -> 3351 bytes world_maker/data/highwaymap.png | Bin 194 -> 231 bytes world_maker/data/smooth_sobel_watermap.png | Bin 627 -> 547 bytes world_maker/data/sobelmap.png | Bin 3843 -> 4202 bytes world_maker/data/treemap.png | Bin 569 -> 442 bytes world_maker/data/watermap.png | Bin 208 -> 91 bytes 7 files changed, 52 insertions(+), 157 deletions(-) diff --git a/main.py b/main.py index b6a3570..4ae2e10 100644 --- a/main.py +++ b/main.py @@ -1,175 +1,70 @@ import random -import gdpc.exceptions +from gdpc import Editor -from world_maker.world_maker import * +from House import * +from networks.geometry.Point3D import Point3D +from networks.roads_2.Road import Road from world_maker.data_analysis import transpose_form_heightmap +from world_maker.District import Road as Road_grid from world_maker.Skeleton import Skeleton, simplify_coordinates from world_maker.terraforming import remove_trees, smooth_terrain -from networks.geometry.Point3D import Point3D -from networks.geometry.Point2D import Point2D -from networks.geometry.Segment2D import Segment2D -from networks.roads_2.Road import Road -from networks.legacy_roads import roads -from world_maker.District import Road as Road_grid -from networks.geometry.Circle import Circle -from House import * -from gdpc import Editor, Block -from utils.Enums import LINE_THICKNESS_MODE +from world_maker.world_maker import world_maker def main(): - editor = Editor(buffering=False) - # c = Circle(Point2D(400, -75)).circle_thick_by_line(5, 32) - # for i in range(len(c[0])): - # for j in range(len(c[0][i])): - # if i % 2 == 0: - # editor.placeBlock( - # (c[0][i][j].x, 110, c[0][i][j].y), Block("white_concrete")) - # else: - # editor.placeBlock( - # (c[0][i][j].x, 110, c[0][i][j].y), Block("black_concrete")) - # print(c[1]) - # for i in range(len(c[1])): - # for j in range(len(c[1][i])): - # editor.placeBlock( - # (c[1][i][j].x, 110, c[1][i][j].y), Block("red_concrete")) + rectangle_house_mountain, rectangle_building, skeleton_highway, skeleton_mountain, road_grid = world_maker() - # def place_segment(segment): - # segment.segment_thick(30, LINE_THICKNESS_MODE.MIDDLE) - # for i in range(len(segment.points_thick_by_line)): - # kk = i % 7 - # match kk: - # case 0: - # blob = 'pink_concrete' - # case 1: - # blob = 'red_concrete' - # case 2: - # blob = 'orange_concrete' - # case 3: - # blob = 'yellow_concrete' - # case 4: - # blob = 'green_concrete' - # case 5: - # blob = 'blue_concrete' - # case 6: - # blob = 'purple_concrete' - # for j in range(len(segment.points_thick_by_line[i])): - # editor.placeBlock(Point3D.insert_3d( - # [segment.points_thick_by_line[i][j]], 'y', [134])[0].coordinates, Block(blob)) - # for i in range(len(segment.gaps)): - # kk = i % 7 - # match kk: - # case 0: - # blob = 'pink_concrete' - # case 1: - # blob = 'red_concrete' - # case 2: - # blob = 'orange_concrete' - # case 3: - # blob = 'yellow_concrete' - # case 4: - # blob = 'green_concrete' - # case 5: - # blob = 'blue_concrete' - # case 6: - # blob = 'purple_concrete' - # for j in range(len(segment.gaps[i])): - # editor.placeBlock(Point3D.insert_3d( - # [segment.gaps[i][j]], 'y', [135])[0].coordinates, Block(blob)) + editor = Editor(buffering=True) + buildArea = editor.getBuildArea() + origin = ((buildArea.begin).x, (buildArea.begin).z) - # place_segment(Segment2D(Point2D(147, -616), Point2D(132, -554))) - # # place_segment(Segment2D(Point2D(147, -616), Point2D(117, -563))) - # # place_segment(Segment2D(Point2D(147, -616), Point2D(97, -576))) - # # place_segment(Segment2D(Point2D(147, -616), Point2D(71, -625))) - # # place_segment(Segment2D(Point2D(147, -616), Point2D(115, -655))) - # # place_segment(Segment2D(Point2D(147, -616), Point2D(162, -682))) - # # place_segment(Segment2D(Point2D(147, -616), Point2D(195, -665))) - # # place_segment(Segment2D(Point2D(147, -616), Point2D(204, -622))) - # # place_segment(Segment2D(Point2D(147, -616), Point2D(178, -575))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(50+x, 0))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(50+x, 25))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(50+x, 50))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(25+x, 50))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(0+x, 50))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-25+x, 50))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, 50))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, 25))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, 0))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, -25))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, -50))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-25+x, -50))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(0+x, -50))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(25+x, -50))) - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(50+x, -50))) + remove_trees('./world_maker/data/heightmap.png', './world_maker/data/treemap.png', + './world_maker/data/smooth_sobel_watermap.png') + smooth_terrain('./world_maker/data/heightmap.png', + './world_maker/data/heightmap_smooth.png', './world_maker/data/smooth_sobel_watermap.png') - # place_segment(Segment2D(Point2D(147, -616), Point2D(201, -595))) - # place_segment(Segment2D(Point2D(147, -616), Point2D(233, -605))) + set_roads(skeleton_mountain, origin) + set_roads(skeleton_highway, origin) + # set_roads_grids(road_grid, origin) + # roads.setRoads(skeleton_mountain) + # roads.setRoads(skeleton_highway) - # y = 120 + blocks = { + "wall": "blackstone", + "roof": "blackstone", + "roof_slab": "blackstone_slab", + "door": "oak_door", + "window": "glass_pane", + "entrance": "oak_door", + "stairs": "quartz_stairs", + "stairs_slab": "quartz_slab", + "celling": "quartz_block", + "floor": "quartz_block", + "celling_slab": "quartz_slab", + "garden_outline": "oak_leaves", + "garden_floor": "grass_block" + } - # Road([Point3D(-46, 64, -12), Point3D(-86, 65, 13), Point3D(-47, 66, 82), - # Point3D(-117, 69, 150), Point3D(-149, 68, 148), Point3D(-185, 70, 78)], 9) + entranceDirection = ["N", "S", "E", "W"] - Road([Point3D(-130, 70, 7), Point3D(-170, 67, -9), Point3D(-189, 79, 3), Point3D(-194, - 82, 25), Point3D(-217, 88, 30), Point3D(-248, 89, 20), Point3D(-212, 98, 12)], 9) + for houses in rectangle_building: + start = (houses[0][0]+buildArea.begin[0], houses[0] + [1], houses[0][2]+buildArea.begin[2]) + end = (houses[1][0]+buildArea.begin[0], houses[1] + [1], houses[1][2]+buildArea.begin[2]) + house = House(editor, start, end, + entranceDirection[random.randint(0, 3)], blocks) + house.build() - # Road([Point3D(464, 85+10, -225), Point3D(408, 105+10, -224), - # Point3D(368, 104+10, -249), Point3D(368, 85+10, -296), Point3D(457, 79+10, -292)], 15) - # Road([Point3D(526, 70, -415), Point3D(497, 76, -420), Point3D(483, 70, -381), Point3D(460, 71, -360), Point3D(430, 78, -383), Point3D(410, 71, -364), Point3D(381, - # 71, -383), Point3D(350, 76, -375), Point3D(332, 79, -409), Point3D(432, 71, -460), Point3D(450, 70, -508), Point3D(502, 81, -493), Point3D(575, 85, -427)], 15) - # rectangle_house_mountain, rectangle_building, ske,leton_highway, skeleton_mountain, road_grid = world_maker() - - # editor = Editor(buffering=True) - # buildArea = editor.getBuildArea() - # origin = ((buildArea.begin).x, (buildArea.begin).z) - - # remove_trees('./world_maker/data/heightmap.png', './world_maker/data/treemap.png', - # './world_maker/data/smooth_sobel_watermap.png') - # smooth_terrain('./world_maker/data/heightmap.png', - # './world_maker/data/heightmap_smooth.png', './world_maker/data/smooth_sobel_watermap.png') - - # # set_roads(skeleton_mountain, origin) - # # set_roads(skeleton_highway, origin) - # # set_roads_grids(road_grid, origin) - # # roads.setRoads(skeleton_mountain) - # # roads.setRoads(skeleton_highway) - - # blocks = { - # "wall": "blackstone", - # "roof": "blackstone", - # "roof_slab": "blackstone_slab", - # "door": "oak_door", - # "window": "glass_pane", - # "entrance": "oak_door", - # "stairs": "quartz_stairs", - # "stairs_slab": "quartz_slab", - # "celling": "quartz_block", - # "floor": "quartz_block", - # "celling_slab": "quartz_slab", - # "garden_outline": "oak_leaves", - # "garden_floor": "grass_block" - # } - - # entranceDirection = ["N", "S", "E", "W"] - - # for houses in rectangle_building: - # start = (houses[0][0]+buildArea.begin[0], houses[0] - # [1], houses[0][2]+buildArea.begin[2]) - # end = (houses[1][0]+buildArea.begin[0], houses[1] - # [1], houses[1][2]+buildArea.begin[2]) - # house = House(editor, start, end, - # entranceDirection[random.randint(0, 3)], blocks) - # house.build() - - # for houses in rectangle_house_mountain: - # start = (houses[0][0]+buildArea.begin[0], houses[0] - # [1], houses[0][2]+buildArea.begin[2]) - # end = (houses[1][0]+buildArea.begin[0], houses[1] - # [1], houses[1][2]+buildArea.begin[2]) - # house = House(editor, start, end, - # entranceDirection[random.randint(0, 3)], blocks) - # house.build() + for houses in rectangle_house_mountain: + start = (houses[0][0]+buildArea.begin[0], houses[0] + [1], houses[0][2]+buildArea.begin[2]) + end = (houses[1][0]+buildArea.begin[0], houses[1] + [1], houses[1][2]+buildArea.begin[2]) + house = House(editor, start, end, + entranceDirection[random.randint(0, 3)], blocks) + house.build() def set_roads_grids(road_grid: Road_grid, origin): @@ -206,7 +101,7 @@ def set_roads(skeleton: Skeleton, origin): for i in range(len(skeleton.lines)): print(f"[Roads] Generating roads {i+1}/{len(skeleton.lines)}.") if len(skeleton.lines[i]) >= 4: - Road(Point3D.from_arrays(skeleton.lines[i]), 25) + Road(Point3D.from_arrays(skeleton.lines[i]), 9) else: print( f"[Roads] Ignore roads {i+1} with {len(skeleton.lines[i])} coordinates between {skeleton.lines[i][1]} and {skeleton.lines[i][-1]}.") diff --git a/world_maker/data/heightmap.png b/world_maker/data/heightmap.png index 887b02fa4bd83423f50b79d9711b18f952a1252c..257bcc147b64e03babb7b0fa7cf075f19795fc95 100644 GIT binary patch literal 3351 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 diff --git a/world_maker/data/smooth_sobel_watermap.png b/world_maker/data/smooth_sobel_watermap.png index e64228fe7686e62145095d4d64e845f1e9889924..6db72aac8b1c03e30b572fee35386014315aaad8 100644 GIT binary patch delta 535 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 AUjP6A literal 3843 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 K=d#Wzp$P!Xrp#CX delta 557 zcmV+|0@D4u1Gxl{7k_041^@s6RD3PZ00062Nkl_J>#Ez<>Z8Ye(SVz6odPpVSdEFzBZ*v=3U000000000000000000000DzC7xi8?a zS+Ca~e&1|1gWg|DcR2`wsA}~3S%i{U2qYYbAe6-1Jvt6SO@B!&MNI(!0092G#bPmh zm4laHMPDF7DUeoGQ?D}CDv#W`;OhhCEgEE-NxNT;nXYMZH2W2o3 z>Pcx#M5M0k+}D8?3xP0v0RR91000000N`WHW;5F=*_JC{eKiy6;%~8qZcfr-td*;F%}r77Ycn~`F-8`BOQ~O@tw!=sK|BJ)&0lm zbfTza($o}YUFC>EX&;eKQ|R4YR5dE{RaHfcNq3k1eotyI7KPHC28YF@sxn1>qc4%i zMZG<&5zKr1x*?h3nTUAK&BbFtAOOnM6!^(x(z};(xqn=k{$|j;>C@@dMXrwoxm82X z=Q9DlNi_TFK0JqQmpr0S+V@g;x=}v8DREub&34PZq3oXJav7bx+wDknfF_i7Q4bAz z&)kI!ftVRL$ws=lcpO^P!;nWX<0S3-3PBLaILVvw2xPoL!&J9v&)x6tG_O{x-nrZD vmI=TEgC;&H?WVo(`q8-}KWiSQ*uVP*Osls1z7tIv00000NkvXXu0mjfFV6(` diff --git a/world_maker/data/watermap.png b/world_maker/data/watermap.png index acaf2c4a6fcb6813f1753501b04e8beed50ad160..b79335c0acc1a524bbcda008707fdfeef817a265 100644 GIT binary patch delta 74 zcmcb>7(GGUrG$e42zJh0tP7-+JY5_^D(1XB$jA%i9a`|+KbN0f1f&28&a>%RFfiJB RS-67)JYD@<);T3K0RXt?5kUX| delta 192 zcma#Pz&Js?K9z$32nxlEgn`s_PZ!6KiaBquJ90G`@UUKV+4FzuV<(sLWyfk(or%_V zzNK`P2c(>VVTR9)nYvvamGy^zr{4^2>dMsm=%o7S-^8y$H6J;UrURFV~RrgMA^?K5O`b+$b#>w`7bwc(