]> marstr Code Repo - marstr/orthographic.git/commitdiff
Added textures. Changes to shadow generation. Refinements to layers and blurs. Made...
authorMarcus Str. <marcus@marstr.online>
Tue, 8 Oct 2024 19:20:51 +0000 (21:20 +0200)
committerMarcus Str. <marcus@marstr.online>
Tue, 8 Oct 2024 19:20:51 +0000 (21:20 +0200)
60 files changed:
defines.py
functions.py
layergen.py
maskgen.py
orthographic.py
osmxml.py
photogen.py
textures/amenities/parking/brd/b1.png [deleted file]
textures/amenities/parking/ptc/b1_p1.png [deleted file]
textures/boundary/administrative/brd/b1.png
textures/boundary/administrative/brd/b2.png
textures/boundary/administrative/brd/b3.png
textures/boundary/administrative/brd/b4.png [new file with mode: 0644]
textures/boundary/administrative/ptc/b1_p1.png
textures/boundary/administrative/ptc/b1_p2.png
textures/boundary/administrative/ptc/b2_p1.png
textures/boundary/administrative/ptc/b2_p2.png
textures/boundary/administrative/ptc/b3_p1.png
textures/boundary/administrative/ptc/b3_p2.png
textures/boundary/administrative/ptc/b4_p1.png [new file with mode: 0644]
textures/boundary/administrative/ptc/b4_p2.png [new file with mode: 0644]
textures/building/area/p1.png
textures/building/area/p10.png
textures/building/area/p11.png [new file with mode: 0644]
textures/building/area/p12.png [new file with mode: 0644]
textures/building/area/p13.png [new file with mode: 0644]
textures/building/area/p14.png [new file with mode: 0644]
textures/building/area/p15.png [new file with mode: 0644]
textures/building/area/p2.png
textures/building/area/p3.png
textures/building/area/p4.png
textures/building/area/p5.png
textures/building/area/p6.png
textures/building/area/p7.png
textures/building/area/p8.png
textures/building/area/p9.png
textures/landuse/residential-boundary/brd/b1.png
textures/landuse/residential-boundary/brd/b2.png
textures/landuse/residential-boundary/brd/b3.png
textures/landuse/residential-boundary/brd/b4.png [new file with mode: 0644]
textures/landuse/residential-boundary/ptc/b1_p1.png
textures/landuse/residential-boundary/ptc/b1_p2.png
textures/landuse/residential-boundary/ptc/b2_p1.png
textures/landuse/residential-boundary/ptc/b2_p2.png
textures/landuse/residential-boundary/ptc/b3_p1.png
textures/landuse/residential-boundary/ptc/b3_p2.png
textures/landuse/residential-boundary/ptc/b4_p1.png [new file with mode: 0644]
textures/landuse/residential-boundary/ptc/b4_p2.png [new file with mode: 0644]
textures/landuse/residential/brd/b1.png
textures/landuse/residential/brd/b2.png
textures/landuse/residential/brd/b3.png
textures/landuse/residential/brd/b4.png [new file with mode: 0644]
textures/landuse/residential/ptc/b1_p1.png
textures/landuse/residential/ptc/b1_p2.png
textures/landuse/residential/ptc/b2_p1.png
textures/landuse/residential/ptc/b2_p2.png
textures/landuse/residential/ptc/b3_p1.png
textures/landuse/residential/ptc/b3_p2.png
textures/landuse/residential/ptc/b4_p1.png [new file with mode: 0644]
textures/landuse/residential/ptc/b4_p2.png [new file with mode: 0644]

index b1629371afcb70809310238254a25556d1dd1bf8..033d61bb7c74d4d4fd1361d757d6aaa652e1e200 100644 (file)
@@ -22,7 +22,7 @@ mstr_datafolder = "/home/marcus/Data/Developer/Projects/orthographic/"
 mstr_osm_endpoint = "https://marstr.online/osm/v1/"\r
 \r
 # Define the texture resolution you want to have your photos at.\r
-mstr_photores = 2048 # <- Change this to 4096 for 16k resolution\r
+mstr_photores = 2048\r
 \r
 # Radius of zoom level 18 aerials around airports with ICAO code\r
 # Value is in tiles - not in km\r
@@ -54,20 +54,13 @@ mstr_show_log = True
 # You can, however, disable the shadow rendering layer here.\r
 mstr_shadow_enabled  = True\r
 mstr_shadow_strength = 0.65\r
-mstr_shadow_shift    = 15\r
+mstr_shadow_shift    = 16\r
+mstr_shadow_floor_h  = 2.8 # 2.5m ceiling height + 30cm concrete per floor\r
 # The tags that cast shadows\r
 mstr_shadow_casters = [\r
     ("landuse", "forest"),\r
     ("leisure", "nature_reserve"),\r
-    ("natural", "wood"),\r
-    ("natural", "tree_row"),\r
-    ("building", "semidetached_house"),\r
-    ("building", "apartments"),\r
-    ("building", "garage"),\r
-    ("building", "office"),\r
-    ("building", "retail"),\r
-    ("building", "industrial"),\r
-    ("building", "yes")\r
+    ("natural", "wood")\r
 ]\r
 \r
 \r
@@ -248,19 +241,19 @@ mstr_mask_blur = [
     ("water", "river", 10),\r
     ("leisure", "swimming_pool", 10),\r
     ("waterway", "river", 10),\r
-    ("waterway", "stream", 2),\r
+    ("waterway", "stream", 4),\r
     ("amenity", "parking", 1),\r
     ("amenity", "school", 1),\r
     ("highway", "pedestrian", 12),\r
     # Z-Order 4\r
-    ("highway", "motorway", 2),\r
-    ("highway", "primary", 2),\r
-    ("highway", "secondary", 2),\r
-    ("highway", "tertiary", 2),\r
-    ("highway", "unclassified", 2),\r
-    ("highway", "living_street", 2),\r
-    ("highway", "residential", 2),\r
-    ("highway", "service", 2),\r
+    ("highway", "motorway", 1),\r
+    ("highway", "primary", 1),\r
+    ("highway", "secondary", 1),\r
+    ("highway", "tertiary", 1),\r
+    ("highway", "unclassified", 1),\r
+    ("highway", "living_street", 1),\r
+    ("highway", "residential", 1),\r
+    ("highway", "service", 1),\r
     ("highway", "footway", 2),\r
     ("highway", "track", 2),\r
     ("highway", "path", 2),\r
@@ -395,8 +388,6 @@ mstr_building_base_colors = [
         ]\r
     ),\r
     ("yes", [\r
-        "#693333", "#592b2b", "#513434", "#4a1e1e", "#362626",\r
-        "#534136", "#4d3424", "#534b45", "#553724", "#574c45",\r
         "#373942", "#40424a", "#363b4f", "#2c2d32", "#444651",\r
         "#454545", "#39393b", "#4b4b4c", "#363638", "#525252"\r
         ]\r
index 664a875ff39fbee15a4e70356a107dc95c05b4ae..b424fe2057eb9dfd6dd61952867f09bf77d29ff1 100644 (file)
@@ -86,3 +86,8 @@ def in_circle(center_x, center_y, radius, x, y):
     return square_dist <= radius ** 2\r
 \r
 \r
+# Find meters per pixel. Requires width of tile in meters\r
+# Needed for proper approximation of shadow length per building level\r
+def meters_per_pixel(lngwidth):\r
+    mpx = lngwidth / mstr_photores\r
+    return mpx\r
index 75f1e3a0964ef372ae3208d861fdce73022e73b6..a2ae1525e6082491f4ca35f5715e9e048cedd7b6 100644 (file)
@@ -87,11 +87,13 @@ class mstr_layergen:
         brd_src = Image.open(root_folder + "/brd/b" + str(src) + ".png")\r
         ptc_src = []\r
         for p in ptc:\r
-            ptc_src.append(Image.open(p))\r
+            pimg = Image.open(p)\r
+            pimg = pimg.rotate(randrange(0, 360), expand=True)\r
+            ptc_src.append(pimg)\r
         mstr_msg("layergen", "Border sources selected")\r
 \r
         # Begin producing a largely random image\r
-        samples =  250   # <- We need this in a moment\r
+        samples = 250   # <- We need this in a moment\r
         for i in range(samples):\r
             imgid = 0\r
             if len(ptc_src) == 1: imgid = 0\r
@@ -455,13 +457,28 @@ class mstr_layergen:
 \r
             # Add trees only in some features\r
             if (self._tag == "landuse" and self._value == "cemetery") or (self._tag == "landuse" and self._value == "residential") or (self._tag == "leisure" and self._value == "park"):\r
+                trees = Image.new("RGBA", (self._imgsize, self._imgsize))\r
                 amt = 3500\r
                 for i in range(1, amt+1):\r
-                    p = randrange(1, 11)\r
+                    p = randrange(1, 16)\r
                     tree = Image.open(mstr_datafolder + "textures/building/area/p" + str(p) + ".png")\r
                     lx = randrange( self._imgsize - tree.width ) \r
                     ly = randrange( self._imgsize - tree.height )\r
-                    layer.alpha_composite(tree, (lx, ly))\r
+                    trees.alpha_composite(tree, (lx, ly))\r
+                    \r
+                tree_shadow = Image.new("RGBA", (self._imgsize, self._imgsize))\r
+                tree_pix = trees.load()\r
+                shadow_pix = tree_shadow.load()\r
+                for y in range(self._imgsize):\r
+                    for x in range(self._imgsize):\r
+                        tp = tree_pix[x,y]\r
+                        if tp[3] > 0:\r
+                            sc = (0,0,0,180)\r
+                            if x+8 < self._imgsize and y+5 < self._imgsize:\r
+                                shadow_pix[x+8,y+5] = sc\r
+                tree_shadow = tree_shadow.filter(ImageFilter.GaussianBlur(radius=2))\r
+                tree_shadow.alpha_composite(trees)\r
+                layer.alpha_composite(tree_shadow)\r
 \r
             mstr_msg("layergen", "Layer image completed")\r
 \r
@@ -527,9 +544,21 @@ class mstr_layergen:
             if self._tag == "landuse" and self._value == "forest":\r
                 # The residential layer MUST exist before we reach the forest part.\r
                 fn = mstr_datafolder + "_cache/" + str(self._latitude) + "-" + str(self._lat_number) + "_" + str(self._longitude) + "-" + str(self._lng_number) + "_landuse-residential_layer.png"\r
-                if os.path.isfile(fn) == True:\r
+                if os.path.isfile(fn):\r
                     rsd = Image.open(fn)\r
-                    layer_comp.alpha_composite(rsd)\r
+                    rsd_pix = rsd.load()\r
+                    forest_layer = Image.new("RGBA", (self._imgsize, self._imgsize))\r
+                    for_pix = forest_layer.load()\r
+                    for y in range(self._imgsize):\r
+                        for x in range(self._imgsize):\r
+                            rpix = rsd_pix[x,y]\r
+                            lpix = layer_comp_pix[x,y]\r
+                            if rpix[3] > 0 and lpix[3] > 0:\r
+                                for_pix[x,y] = (rpix[0], rpix[1], rpix[2], rpix[3])\r
+                    layer_comp.alpha_composite(forest_layer)\r
+                #if os.path.isfile(fn) == True:\r
+                #    rsd = Image.open(fn)\r
+                #    layer_comp.alpha_composite(rsd)\r
 \r
             # Store layer\r
             if self._is_completion == False:\r
@@ -563,18 +592,40 @@ class mstr_layergen:
                             mstr_msg("layergen", "Generating shadow for layer")\r
                             shadow_pix = shadow.load()\r
                             mask_pix = osm_mask.load()\r
+                            shf = 1\r
+                            while shf < mstr_shadow_shift:\r
+                                for y in range(self._imgsize):\r
+                                    for x in range(self._imgsize):\r
+                                        mp = layer_comp_pix[x,y]\r
+                                        if mp[3] == 255:\r
+                                            if x+(shf*2) < self._imgsize and y+shf < self._imgsize:\r
+                                                rndshd = randrange(5, 210)\r
+                                                shadow_pix[x+(shf*2), y+shf] = (0,0,0,rndshd)\r
+                                shf = shf+1\r
+                            \r
+                            # Tree removal\r
+                            for y in range(self._imgsize):\r
+                                for x in range(self._imgsize):\r
+                                    lp = layer_comp_pix[x,y]\r
+                                    if lp[3] >= 250:\r
+                                        shadow_pix[x,y] = (0,0,0,0)\r
+\r
+                            shadow = shadow.filter(ImageFilter.GaussianBlur(radius=2))\r
+\r
+                            """\r
                             for y in range(self._imgsize-1):\r
                                 for x in range(self._imgsize-1):\r
                                     m = mask_pix[x,y]\r
                                     shf_x = 0\r
                                     shf_x = x + mstr_shadow_shift\r
-                                    if shf_x <= self._imgsize-1:\r
+                                    if shf_x < self._imgsize:\r
                                         a = mask_pix[x,y][3]\r
                                         st = 0\r
                                         st = random.uniform(0.45, mstr_shadow_strength)\r
                                         ca = a * st\r
                                         aa = int(ca)\r
                                         shadow_pix[shf_x, y] = (0,0,0,aa)\r
+                            """\r
                             shadow.save(mstr_datafolder + "_cache/" + str(self._latitude) + "-" + str(self._lat_number) + "_" + str(self._longitude) + "-" + str(self._lng_number) + "_" + self._tag + "-" + self._value + "_layer_shadow.png")\r
                             mstr_msg("layergen", "Shadow layer completed")\r
 \r
@@ -643,7 +694,7 @@ class mstr_layergen:
                 #self._tiledb.close_db()\r
 \r
             # Create a water mask we need to remove from the DDS later\r
-            if (self._tag == "natural" and self._value == "water") or (self._tag == "water" and self._value == "lake") or (self._tag == "water" and self._value == "pond") or (self._tag == "water" and self._value == "river") or (self._tag == "leisure" and self._value == "swimming_pool") or (self._tag == "waterway" and self._value == "stream"):\r
+            if (self._tag == "natural" and self._value == "water") or (self._tag == "water" and self._value == "lake") or (self._tag == "water" and self._value == "pond") or (self._tag == "water" and self._value == "river") or (self._tag == "leisure" and self._value == "swimming_pool"):\r
                 mstr_msg("layergen", "Generating inland water mask")\r
                 inl_mask = Image.new("RGBA", (self._imgsize, self._imgsize), (0,0,0,0))\r
                 lyr_pix = layer_comp.load()\r
@@ -681,7 +732,6 @@ class mstr_layergen:
                     if i[0] == self._tag and i[1] == self._value:\r
                         osm_mask = osm_mask.filter(ImageFilter.BoxBlur(radius=i[2]))\r
                         break\r
-            osm_edge = osm_edge.filter(ImageFilter.BoxBlur(radius=1))\r
             \r
             \r
             # And now for the Big Mac.\r
@@ -712,14 +762,15 @@ class mstr_layergen:
                             d = randrange(41, 61)\r
                             layer_comp_pix[x, y] = ( d,d,d,a[3] )\r
                         if self._tag == "highway" and self._value != "motorway":\r
-                            d = randrange(85, 101)\r
-                            layer_comp_pix[x, y] = ( d,d,d,a[3] )\r
+                            dr = randrange(110,121)\r
+                            dg = randrange(110,121)\r
+                            db = randrange(115,130)\r
+                            layer_comp_pix[x, y] = ( dr,dg,db,a[3] )\r
                         if self._tag == "highway" and self._value == "motorway":\r
-                            d = randrange(1,20)\r
-                            r = 86-d\r
-                            g = 97-d\r
-                            b = 106-d\r
-                            layer_comp_pix[x, y] = ( r,g,b,a[3] )\r
+                            dr = randrange(77,89)\r
+                            dg = randrange(88,96)\r
+                            db = randrange(90,101)\r
+                            layer_comp_pix[x, y] = ( dr,dg,db,a[3] )\r
                         if self._tag == "waterway" and (self._value == "stream" or self._value == "river"):\r
                             d = randrange(1, 15)\r
                             # Rock, grass, water\r
@@ -730,7 +781,7 @@ class mstr_layergen:
                             t = a[3]-d\r
                             if t < 0: t = 0\r
                             if e[3] > 0:\r
-                                layer_comp_pix[x, y] = ( mats[pick-1][0], mats[pick-1][1], mats[pick-1][2], t )\r
+                                layer_comp_pix[x, y] = ( mats[pick-1][0], mats[pick-1][1], mats[pick-1][2], 35 )\r
                         \r
                         # A bit special here\r
                         if self._tag == "building":\r
@@ -757,15 +808,31 @@ class mstr_layergen:
 \r
             # A bit different for tree rows\r
             if self._tag == "natural" and self._value == "tree_row":\r
+                trees = Image.new("RGBA", (self._imgsize, self._imgsize))\r
                 for t in range(20001):\r
                     lx = randrange(self._imgsize)\r
                     ly = randrange(self._imgsize)\r
                     a = mask_pix[lx,ly]\r
                     if a[3] > 0:\r
                         if lx < self._imgsize and ly < self._imgsize:\r
-                            p = randrange(1,11)\r
+                            p = randrange(1,16)\r
                             tree = Image.open(mstr_datafolder + "textures/building/area/p" + str(p) + ".png")\r
-                            layer_comp.alpha_composite(tree, (lx, ly))\r
+                            trees.alpha_composite(tree, (lx, ly))\r
+                if mstr_shadow_enabled == True:\r
+                    tree_shadow = Image.new("RGBA", (self._imgsize, self._imgsize))\r
+                    tree_pix = trees.load()\r
+                    shadow_pix = tree_shadow.load()\r
+                    for y in range(self._imgsize):\r
+                        for x in range(self._imgsize):\r
+                            tp = tree_pix[x,y]\r
+                            if tp[3] > 0:\r
+                                rndshd = randrange(5, 210)\r
+                                sc = (0,0,0,rndshd)\r
+                                if x+8 < self._imgsize and y+5 < self._imgsize:\r
+                                    shadow_pix[x+8,y+5] = sc\r
+                    tree_shadow = tree_shadow.filter(ImageFilter.GaussianBlur(radius=2))\r
+                    tree_shadow.alpha_composite(trees)\r
+                    layer_comp.alpha_composite(tree_shadow)\r
 \r
             # We will do some super magic here to let houses look more realistic\r
             if self._tag == "building":\r
@@ -815,7 +882,7 @@ class mstr_layergen:
                                             numtrees = randrange(1, 16)\r
                                             for i in range(1, numtrees+1):\r
                                                 # Pick some file\r
-                                                pick = str(randrange(1, 11))\r
+                                                pick = str(randrange(1, 16))\r
                                                 tree = Image.open(mstr_datafolder + "textures/building/area/p" + pick + ".png")\r
                                                 # Do a correction for the location if needed\r
                                                 if shf_x < 1: shf_x = 1\r
@@ -823,33 +890,39 @@ class mstr_layergen:
                                                 if shf_x > self._imgsize - tree.width: shf_x = self._imgsize - tree.width - 1\r
                                                 if shf_y > self._imgsize - tree.height: shf_y = self._imgsize - tree.height - 1\r
                                                 trees.alpha_composite(tree, (shf_x, shf_y))\r
-                    trees.alpha_composite(layer_comp)\r
-                    layer_comp = trees\r
 \r
-            \r
+                    if mstr_shadow_enabled == True:\r
+                        tree_shadow = Image.new("RGBA", (self._imgsize, self._imgsize))\r
+                        tree_pix = trees.load()\r
+                        shadow_pix = tree_shadow.load()\r
+                        for y in range(self._imgsize):\r
+                            for x in range(self._imgsize):\r
+                                tp = tree_pix[x,y]\r
+                                if tp[3] > 0:\r
+                                    sc = (0,0,0,180)\r
+                                    if x+8 < self._imgsize and y+5 < self._imgsize:\r
+                                        shadow_pix[x+8,y+5] = sc\r
+                        tree_shadow = tree_shadow.filter(ImageFilter.GaussianBlur(radius=2))\r
+                        tree_shadow.alpha_composite(trees)\r
+\r
+                        # Save this separately, so that we can blur buildings, but not the trees\r
+                        fn = mstr_datafolder + "_cache/" + str(self._latitude) + "-" + str(self._lat_number) + "_" + str(self._longitude) + "-" + str(self._lng_number) + "_" + self._tag + "-" + self._value + "_layer_building_trees.png"\r
+\r
+                        if os.path.isfile(fn) == True:\r
+                            extrees = Image.open(fn)\r
+                            extrees.alpha_composite(tree_shadow)\r
+                            extrees.save(fn)\r
+                        else:\r
+                            tree_shadow.save(fn)\r
+\r
+                        #layer_comp.alpha_composite(tree_shadow)\r
+                        #tree_shadow.alpha_composite(layer_comp)\r
+                        #layer_comp = tree_shadow\r
+\r
             mstr_msg("layergen", "Layer image generated")\r
 \r
             # Building shadow\r
             if mstr_shadow_enabled == True:\r
-                if self._tag == "building":\r
-                    mstr_msg("layergen", "Generating shadow for layer")\r
-                    shadow = Image.new("RGBA", (self._imgsize, self._imgsize))\r
-                    shadow_pix = shadow.load()\r
-                    mask_pix = osm_mask.load()\r
-                    for y in range(self._imgsize-1):\r
-                        for x in range(self._imgsize-1):\r
-                            m = mask_pix[x,y]\r
-                            shf_x = x + mstr_shadow_shift\r
-                            shf_y = y + (mstr_shadow_shift/2)\r
-                            if shf_x < self._imgsize and shf_y < self._imgsize:\r
-                                a = mask_pix[x,y][3]\r
-                                st = random.uniform(0.3, mstr_shadow_strength)\r
-                                ca = a * st\r
-                                aa = int(ca)\r
-                                shadow_pix[shf_x, shf_y] = (0,0,0,aa)\r
-                    shadow = shadow.filter(ImageFilter.GaussianBlur(radius=2))\r
-                    shadow.save(mstr_datafolder + "_cache/" + str(self._latitude) + "-" + str(self._lat_number) + "_" + str(self._longitude) + "-" + str(self._lng_number) + "_" + self._tag + "-" + self._value + "_layer_shadow.png")\r
-                    mstr_msg("layergen", "Shadow layer completed")\r
                     \r
                 # Some funnies with shadows\r
                 if self._tag == "building" and (self._value == "detached" or self._value == "semidetached_house" or self._value == "apartments" or self._value == "civic" or self._value == "house" or self._value == "terrace"):\r
@@ -890,6 +963,7 @@ class mstr_layergen:
             # Highways and runways of any kind get some special treatment\r
             if (self._tag == "highway" and self._value == "motorway") or (self._tag == "highway" and self._value == "primary") or (self._tag == "highway" and self._value == "secondary") or (self._tag == "highway" and self._value == "tertiary") or (self._tag == "aeroway" and self._value == "runway"):\r
                 # We will now add some white lines for coolness\r
+                osm_edge = osm_mask.filter(ImageFilter.FIND_EDGES)\r
                 mask_pix = osm_edge.load()\r
                 layer_comp_pix = layer_comp.load()\r
                 for y in range(self._imgsize):\r
@@ -901,13 +975,14 @@ class mstr_layergen:
                             layer_comp_pix[x, y] = ( w,w,w,a[3] )\r
 \r
             if self._tag == "highway" and self._value == "residential":\r
+                osm_edge = osm_mask.filter(ImageFilter.FIND_EDGES)\r
                 mask_pix = osm_edge.load()\r
                 layer_comp_pix = layer_comp.load()\r
                 for y in range(self._imgsize):\r
                     for x in range(self._imgsize):\r
                         if mask_pix[x, y][3] > 0:\r
                             # Find a suitable color\r
-                            w = randrange(60, 96)\r
+                            w = randrange(150,181)\r
                             a=mask_pix[x,y]\r
                             layer_comp_pix[x, y] = ( w,w,w,a[3] )\r
                 mstr_msg("layergen", "Street lines added")\r
index 04181d1e37a885369ae10459cfb84fb7e44ac08b..732d08c99b4301dae757825bd9336ae9cafe45d6 100644 (file)
@@ -27,6 +27,7 @@ from defines import *
 from log import *\r
 from PIL import Image, ImageFilter, ImageDraw, ImagePath\r
 from random import randrange\r
+from functions import *\r
 import random\r
 \r
 class mstr_maskgen:\r
@@ -65,11 +66,18 @@ class mstr_maskgen:
                 latlng.append(float(i[2]))\r
                 break\r
         return latlng\r
-    \r
 \r
-    # Only needed if X-Plane scenery is built\r
-    def _set_xpscenery_datagroup(self, dg):\r
-        self._xpdg = dg\r
+\r
+    # Set width of tile - for buildings\r
+    def set_tile_width(self, tile_width):\r
+        self._tile_width = tile_width\r
+\r
+    # Numbers needed for the possible building shadow layer\r
+    def set_latlng_numbers(self, lat, tv, lng, th):\r
+        self._latitude = lat\r
+        self._lat_number = tv\r
+        self._longitude = lng\r
+        self._lng_number = th\r
 \r
 \r
     # Builds the required mask\r
@@ -99,6 +107,9 @@ class mstr_maskgen:
         # Longitude\r
         bbox.append(self._box[2] + ((self._box[3]-1) * mstr_zl_18))\r
         bbox.append(self._box[2] + ((self._box[3]-1) * mstr_zl_18) + mstr_zl_18)\r
+\r
+        # Building levels, if this is a building\r
+        bld_levels = 0\r
         \r
         # Generate mask for ONE tag only\r
         if self._subtag == None:\r
@@ -107,6 +118,8 @@ class mstr_maskgen:
                     nd = []\r
                     for d in way:\r
                         if d[0] == w[0]:\r
+                            if self._tag == "building" and bld_levels == 0:\r
+                                bld_levels = xml.find_building_levels(tilexml, w[0])\r
                             nd.append(d[1])\r
                     frs.append(nd)\r
             # Scout through relations as these also make up map data\r
@@ -203,5 +216,58 @@ class mstr_maskgen:
         \r
         # Save image\r
         mask_img.save(mstr_datafolder + "_cache/" + fstr + "_" + self._tag + "-" + self._value + ".png")\r
+\r
+        # If this is a building, we need to render the shadow here, as we only know the height\r
+        # of the building in this loop.\r
+        if mstr_shadow_enabled == True:\r
+            if self._tag == "building":\r
+                mpp = meters_per_pixel(self._tile_width) * mstr_zl_18\r
+                pix_per_floor = mstr_shadow_floor_h / mpp\r
+                total_pix = pix_per_floor * bld_levels\r
+                shift = int(total_pix)\r
+\r
+                fn = mstr_datafolder + "_cache/" + fstr + "_" + self._tag + "-" + self._value + "_layer_shadow.png"\r
+\r
+                mask_pix = mask_img.load()\r
+\r
+                bld_shadow = Image.new("RGBA", (mstr_photores, mstr_photores))\r
+                bld_shadow_pix = bld_shadow.load()\r
+\r
+                # Shadow sweep\r
+                shf = 1\r
+                while shf <= shift:\r
+                    for y in range(mstr_photores):\r
+                        for x in range(mstr_photores):\r
+                            mp = mask_pix[x,y]\r
+                            if mp[3] != 0:\r
+                                if x+(shf*2) < mstr_photores and y+shf < mstr_photores:\r
+                                    bld_shadow_pix[x+(shf*2), y+shf] = (0,0,0,255)\r
+                    shf = shf+1\r
+\r
+                # Building removal sweep\r
+                for y in range(mstr_photores):\r
+                    for x in range(mstr_photores):\r
+                        mp = mask_pix[x,y]\r
+                        if mp[3] != 0:\r
+                            bld_shadow_pix[x,y] = (0,0,0,0)\r
+\r
+\r
+                # Correct alpha\r
+                bld_shadow_pix = bld_shadow.load()\r
+                for y in range(mstr_photores):\r
+                    for x in range(mstr_photores):\r
+                        sp = bld_shadow_pix[x,y]\r
+                        if sp[3] != 0:\r
+                            bld_shadow_pix[x,y] = (0,0,0,120)\r
+\r
+                # Store\r
+                if os.path.isfile(fn) == True:\r
+                    lyr = Image.open(fn)\r
+                    lyr.alpha_composite(bld_shadow)\r
+                    lyr.save(fn)\r
+                else:\r
+                    bld_shadow.save(fn)\r
+\r
+\r
         # Inform\r
         mstr_msg("maskgen", "Mask built.")\r
index 04353f2435896a9c6cad5822c001b43438efd695..a279c4cfcdb500e958a3165bc7890585a7c2cc25 100644 (file)
@@ -201,8 +201,9 @@ class mstr_orthographic:
 \r
                         # Generate the mask\r
                         mg = mstr_maskgen( [self._lat, cur_tile_y, self._long, cur_tile_x], self._vstep, layer[0], layer[1], layer[2])\r
-                        if mstr_xp_genscenery == True:\r
-                            mg._set_xpscenery_datagroup(xp_datagroup)\r
+                        if layer[0] == "building":\r
+                            mg.set_tile_width(self._findWidthOfLongitude(bb_lat))\r
+                            mg.set_latlng_numbers(self._lat, lat_grid, self._long, lng_grid)\r
                         mg._build_mask()\r
                         \r
                         # Generate the layer\r
index abd8ed5ecd6b9b3ad18baa3480b31729ef8185e4..3f4c93182f84ea2a6f08acc10c8bf51717bbf165 100644 (file)
--- a/osmxml.py
+++ b/osmxml.py
@@ -149,6 +149,23 @@ class mstr_osmxml:
 \r
         # Return the found surface type\r
         return surface\r
+\r
+\r
+    # Find the levels of a building (for shadow rendering)\r
+    def find_building_levels(self, xmlfile, way_id):\r
+        lvl = 3 # Standard if we don't find anything else\r
+        xml_doc = xml.dom.minidom.parse(xmlfile)\r
+        wpdata = xml_doc.getElementsByTagName("way")\r
+        for wp in wpdata:\r
+            if wp.getAttribute("id") == way_id:\r
+                tags = wp.getElementsByTagName("tag")\r
+                for tag in tags:\r
+                    a = tag.getAttribute("k")\r
+                    v = tag.getAttribute("v")\r
+                    if a == "building:levels":\r
+                        lvl = int(v)\r
+                        break\r
+        return lvl\r
     \r
 \r
     # It turns out that some features hide themselves in the relations section.\r
index df73ee8ba982653ef8fab1606b71cce9df28ecbc..d5a581fc198c55628f3f56c41ed63ce695b207a9 100644 (file)
@@ -52,6 +52,7 @@ class mstr_photogen:
                 if l[0] == "building":\r
                     if os.path.isfile(root_filename + l[0] + "-" + l[1] + "_layer_shadow.png"):\r
                         shd = Image.open(root_filename + l[0] + "-" + l[1] + "_layer_shadow.png")\r
+                        shd = shd.filter(ImageFilter.GaussianBlur(radius=2))\r
                         bldg_shadow.alpha_composite(shd)\r
         # Details merging\r
         bldg_details = Image.new("RGBA", (self._imgsize, self._imgsize))\r
@@ -69,10 +70,18 @@ class mstr_photogen:
                     bld = Image.open(root_filename + l[0] + "-" + l[1] + "_layer.png")\r
                     bld = bld.filter(ImageFilter.GaussianBlur(radius=1))\r
                     bldg_main.alpha_composite(bld)\r
+        # Trees merging\r
+        tree_main = Image.new("RGBA", (self._imgsize, self._imgsize))\r
+        for l in mstr_ortho_layers:\r
+            if l[0] == "building":\r
+                if os.path.isfile(root_filename + l[0] + "-" + l[1] + "_layer_building_trees.png"):\r
+                    trs= Image.open(root_filename + l[0] + "-" + l[1] + "_layer_building_trees.png")\r
+                    tree_main.alpha_composite(trs)\r
         # Merge the building layers\r
         bldg_final = Image.new("RGBA", (self._imgsize, self._imgsize))\r
         bldg_final.alpha_composite(bldg_details)\r
         bldg_final.alpha_composite(bldg_shadow)\r
+        bldg_final.alpha_composite(tree_main)\r
         bldg_final.alpha_composite(bldg_main)\r
 \r
         for l in mstr_ortho_layers:\r
@@ -153,8 +162,7 @@ class mstr_photogen:
             ["water", "lake"],\r
             ["water", "pond"],\r
             ["water", "river"],\r
-            ["leisure", "swimming_pool"],\r
-            ["waterway", "stream"]\r
+            ["leisure", "swimming_pool"]\r
         )\r
         for l in water_layers:\r
             fn = mstr_datafolder + "_cache/" + str(self._lat) + "-" + str(self._ty) + "_" + str(self._lng) + "-" + str(self._tx) + "_" + l[0] + "-" + l[1] + "_layer_mask.png"\r
diff --git a/textures/amenities/parking/brd/b1.png b/textures/amenities/parking/brd/b1.png
deleted file mode 100644 (file)
index e9b3ec6..0000000
Binary files a/textures/amenities/parking/brd/b1.png and /dev/null differ
diff --git a/textures/amenities/parking/ptc/b1_p1.png b/textures/amenities/parking/ptc/b1_p1.png
deleted file mode 100644 (file)
index c8b87c6..0000000
Binary files a/textures/amenities/parking/ptc/b1_p1.png and /dev/null differ
index 921b50317c006f38b72a0ef1befd1d7932be99ae..6be9ba8b1e7888fea7324d4fbbb62da5184b599c 100644 (file)
Binary files a/textures/boundary/administrative/brd/b1.png and b/textures/boundary/administrative/brd/b1.png differ
index 13f583af9ae505d0413dc4125f25c1233aa7fbba..268b38b8ffb7ac704c012ab2173efe6448feac0f 100644 (file)
Binary files a/textures/boundary/administrative/brd/b2.png and b/textures/boundary/administrative/brd/b2.png differ
index 099ecfdfde5d8347a5328722760b04fa72411b7b..cd73d2e0a2f2733c557c3e2726dd239ea78bbeae 100644 (file)
Binary files a/textures/boundary/administrative/brd/b3.png and b/textures/boundary/administrative/brd/b3.png differ
diff --git a/textures/boundary/administrative/brd/b4.png b/textures/boundary/administrative/brd/b4.png
new file mode 100644 (file)
index 0000000..6e53e94
Binary files /dev/null and b/textures/boundary/administrative/brd/b4.png differ
index 954bdf923c56dab14096e27800a17c512342665e..c1d1a3ad71cd0a9da628452aaed349c9bc61dd79 100644 (file)
Binary files a/textures/boundary/administrative/ptc/b1_p1.png and b/textures/boundary/administrative/ptc/b1_p1.png differ
index 61e1afaca40834d6769122605f53c32b29c6bbbe..708dc342d2d02029d2683ec2078ac40a9eb1b922 100644 (file)
Binary files a/textures/boundary/administrative/ptc/b1_p2.png and b/textures/boundary/administrative/ptc/b1_p2.png differ
index 347a7ea40580d205948f345550276796d9fd752c..057d7960650a2ebddf5d334542645f06f7e2912b 100644 (file)
Binary files a/textures/boundary/administrative/ptc/b2_p1.png and b/textures/boundary/administrative/ptc/b2_p1.png differ
index ec82ffaa12c1bf795a7852254e668402808ca6e9..c9631c3aa371a00aedb98c4a209a8626d9dc0eaf 100644 (file)
Binary files a/textures/boundary/administrative/ptc/b2_p2.png and b/textures/boundary/administrative/ptc/b2_p2.png differ
index 86d472c93f69302130c025e418bef82dd58b17aa..916014b8d33731b85a60bcec326fcbed7553b556 100644 (file)
Binary files a/textures/boundary/administrative/ptc/b3_p1.png and b/textures/boundary/administrative/ptc/b3_p1.png differ
index c513faa086cafafdcc25c291dd286e899f162b56..872f736748f6a8a56f28ec10a51b5cc5714363e8 100644 (file)
Binary files a/textures/boundary/administrative/ptc/b3_p2.png and b/textures/boundary/administrative/ptc/b3_p2.png differ
diff --git a/textures/boundary/administrative/ptc/b4_p1.png b/textures/boundary/administrative/ptc/b4_p1.png
new file mode 100644 (file)
index 0000000..cee27fe
Binary files /dev/null and b/textures/boundary/administrative/ptc/b4_p1.png differ
diff --git a/textures/boundary/administrative/ptc/b4_p2.png b/textures/boundary/administrative/ptc/b4_p2.png
new file mode 100644 (file)
index 0000000..547a0fe
Binary files /dev/null and b/textures/boundary/administrative/ptc/b4_p2.png differ
index 7e7424e1fdb66e4e4b9ba1d0d46c2865981f17dd..0791426dcfb653a94a3457c1bfc368537f2ab7a2 100644 (file)
Binary files a/textures/building/area/p1.png and b/textures/building/area/p1.png differ
index cb3f640ce557e3418aef0e42754d7127f0db140e..94c7db12efed8bf3b66f4debfc96c1fb947e6ac2 100644 (file)
Binary files a/textures/building/area/p10.png and b/textures/building/area/p10.png differ
diff --git a/textures/building/area/p11.png b/textures/building/area/p11.png
new file mode 100644 (file)
index 0000000..5fdda5a
Binary files /dev/null and b/textures/building/area/p11.png differ
diff --git a/textures/building/area/p12.png b/textures/building/area/p12.png
new file mode 100644 (file)
index 0000000..fbaff7f
Binary files /dev/null and b/textures/building/area/p12.png differ
diff --git a/textures/building/area/p13.png b/textures/building/area/p13.png
new file mode 100644 (file)
index 0000000..13becc6
Binary files /dev/null and b/textures/building/area/p13.png differ
diff --git a/textures/building/area/p14.png b/textures/building/area/p14.png
new file mode 100644 (file)
index 0000000..7d0b7f7
Binary files /dev/null and b/textures/building/area/p14.png differ
diff --git a/textures/building/area/p15.png b/textures/building/area/p15.png
new file mode 100644 (file)
index 0000000..9c19a39
Binary files /dev/null and b/textures/building/area/p15.png differ
index b06670a24ef412e15f98b4ba072c3a218b333824..c4bc6426bbc9a5096d7417bc0f06c2f4648096ed 100644 (file)
Binary files a/textures/building/area/p2.png and b/textures/building/area/p2.png differ
index dbdfb3ce32943ec1fafdb665ec915014038b9244..c88a171c468d260a18820afdcd67c32f57c9ed15 100644 (file)
Binary files a/textures/building/area/p3.png and b/textures/building/area/p3.png differ
index df6254d47b51bfd6f8018865ec404e430a840c50..cb1962aa0135ff0a9f75b94beb7a9e3797409acd 100644 (file)
Binary files a/textures/building/area/p4.png and b/textures/building/area/p4.png differ
index b51df3bc942b257292a2d2e10b4bd14f77bc015d..c6d2fa8aab616eda0b6f1e8cedca5f45a1e51f8b 100644 (file)
Binary files a/textures/building/area/p5.png and b/textures/building/area/p5.png differ
index 09e9a1194d5eaa42eab635f710b9dd3519ae976d..942bc9ef55d64baa5929d252ef26fea9b6bbd730 100644 (file)
Binary files a/textures/building/area/p6.png and b/textures/building/area/p6.png differ
index 500f61cd92bbfeb5079173f18c2e07e69e307151..f79a29e5ac402651e4dc23e23181bc9a4766025a 100644 (file)
Binary files a/textures/building/area/p7.png and b/textures/building/area/p7.png differ
index fdd908697532d65625b9ff115c5b4211793fbc68..4e21e300140730f85cf9545d6300b46d0707eb70 100644 (file)
Binary files a/textures/building/area/p8.png and b/textures/building/area/p8.png differ
index 821881292071191f30c5077ab1626d9b756cc9cc..a8680da488dd1592cc9ba6fe0606c89ea606c1ef 100644 (file)
Binary files a/textures/building/area/p9.png and b/textures/building/area/p9.png differ
index 921b50317c006f38b72a0ef1befd1d7932be99ae..6be9ba8b1e7888fea7324d4fbbb62da5184b599c 100644 (file)
Binary files a/textures/landuse/residential-boundary/brd/b1.png and b/textures/landuse/residential-boundary/brd/b1.png differ
index 13f583af9ae505d0413dc4125f25c1233aa7fbba..268b38b8ffb7ac704c012ab2173efe6448feac0f 100644 (file)
Binary files a/textures/landuse/residential-boundary/brd/b2.png and b/textures/landuse/residential-boundary/brd/b2.png differ
index 099ecfdfde5d8347a5328722760b04fa72411b7b..cd73d2e0a2f2733c557c3e2726dd239ea78bbeae 100644 (file)
Binary files a/textures/landuse/residential-boundary/brd/b3.png and b/textures/landuse/residential-boundary/brd/b3.png differ
diff --git a/textures/landuse/residential-boundary/brd/b4.png b/textures/landuse/residential-boundary/brd/b4.png
new file mode 100644 (file)
index 0000000..6e53e94
Binary files /dev/null and b/textures/landuse/residential-boundary/brd/b4.png differ
index 954bdf923c56dab14096e27800a17c512342665e..c1d1a3ad71cd0a9da628452aaed349c9bc61dd79 100644 (file)
Binary files a/textures/landuse/residential-boundary/ptc/b1_p1.png and b/textures/landuse/residential-boundary/ptc/b1_p1.png differ
index 61e1afaca40834d6769122605f53c32b29c6bbbe..708dc342d2d02029d2683ec2078ac40a9eb1b922 100644 (file)
Binary files a/textures/landuse/residential-boundary/ptc/b1_p2.png and b/textures/landuse/residential-boundary/ptc/b1_p2.png differ
index 347a7ea40580d205948f345550276796d9fd752c..057d7960650a2ebddf5d334542645f06f7e2912b 100644 (file)
Binary files a/textures/landuse/residential-boundary/ptc/b2_p1.png and b/textures/landuse/residential-boundary/ptc/b2_p1.png differ
index ec82ffaa12c1bf795a7852254e668402808ca6e9..c9631c3aa371a00aedb98c4a209a8626d9dc0eaf 100644 (file)
Binary files a/textures/landuse/residential-boundary/ptc/b2_p2.png and b/textures/landuse/residential-boundary/ptc/b2_p2.png differ
index 86d472c93f69302130c025e418bef82dd58b17aa..916014b8d33731b85a60bcec326fcbed7553b556 100644 (file)
Binary files a/textures/landuse/residential-boundary/ptc/b3_p1.png and b/textures/landuse/residential-boundary/ptc/b3_p1.png differ
index c513faa086cafafdcc25c291dd286e899f162b56..872f736748f6a8a56f28ec10a51b5cc5714363e8 100644 (file)
Binary files a/textures/landuse/residential-boundary/ptc/b3_p2.png and b/textures/landuse/residential-boundary/ptc/b3_p2.png differ
diff --git a/textures/landuse/residential-boundary/ptc/b4_p1.png b/textures/landuse/residential-boundary/ptc/b4_p1.png
new file mode 100644 (file)
index 0000000..cee27fe
Binary files /dev/null and b/textures/landuse/residential-boundary/ptc/b4_p1.png differ
diff --git a/textures/landuse/residential-boundary/ptc/b4_p2.png b/textures/landuse/residential-boundary/ptc/b4_p2.png
new file mode 100644 (file)
index 0000000..547a0fe
Binary files /dev/null and b/textures/landuse/residential-boundary/ptc/b4_p2.png differ
index 921b50317c006f38b72a0ef1befd1d7932be99ae..6be9ba8b1e7888fea7324d4fbbb62da5184b599c 100644 (file)
Binary files a/textures/landuse/residential/brd/b1.png and b/textures/landuse/residential/brd/b1.png differ
index 13f583af9ae505d0413dc4125f25c1233aa7fbba..268b38b8ffb7ac704c012ab2173efe6448feac0f 100644 (file)
Binary files a/textures/landuse/residential/brd/b2.png and b/textures/landuse/residential/brd/b2.png differ
index 099ecfdfde5d8347a5328722760b04fa72411b7b..cd73d2e0a2f2733c557c3e2726dd239ea78bbeae 100644 (file)
Binary files a/textures/landuse/residential/brd/b3.png and b/textures/landuse/residential/brd/b3.png differ
diff --git a/textures/landuse/residential/brd/b4.png b/textures/landuse/residential/brd/b4.png
new file mode 100644 (file)
index 0000000..6e53e94
Binary files /dev/null and b/textures/landuse/residential/brd/b4.png differ
index 954bdf923c56dab14096e27800a17c512342665e..c1d1a3ad71cd0a9da628452aaed349c9bc61dd79 100644 (file)
Binary files a/textures/landuse/residential/ptc/b1_p1.png and b/textures/landuse/residential/ptc/b1_p1.png differ
index 61e1afaca40834d6769122605f53c32b29c6bbbe..708dc342d2d02029d2683ec2078ac40a9eb1b922 100644 (file)
Binary files a/textures/landuse/residential/ptc/b1_p2.png and b/textures/landuse/residential/ptc/b1_p2.png differ
index 347a7ea40580d205948f345550276796d9fd752c..057d7960650a2ebddf5d334542645f06f7e2912b 100644 (file)
Binary files a/textures/landuse/residential/ptc/b2_p1.png and b/textures/landuse/residential/ptc/b2_p1.png differ
index ec82ffaa12c1bf795a7852254e668402808ca6e9..c9631c3aa371a00aedb98c4a209a8626d9dc0eaf 100644 (file)
Binary files a/textures/landuse/residential/ptc/b2_p2.png and b/textures/landuse/residential/ptc/b2_p2.png differ
index 86d472c93f69302130c025e418bef82dd58b17aa..916014b8d33731b85a60bcec326fcbed7553b556 100644 (file)
Binary files a/textures/landuse/residential/ptc/b3_p1.png and b/textures/landuse/residential/ptc/b3_p1.png differ
index c513faa086cafafdcc25c291dd286e899f162b56..872f736748f6a8a56f28ec10a51b5cc5714363e8 100644 (file)
Binary files a/textures/landuse/residential/ptc/b3_p2.png and b/textures/landuse/residential/ptc/b3_p2.png differ
diff --git a/textures/landuse/residential/ptc/b4_p1.png b/textures/landuse/residential/ptc/b4_p1.png
new file mode 100644 (file)
index 0000000..cee27fe
Binary files /dev/null and b/textures/landuse/residential/ptc/b4_p1.png differ
diff --git a/textures/landuse/residential/ptc/b4_p2.png b/textures/landuse/residential/ptc/b4_p2.png
new file mode 100644 (file)
index 0000000..547a0fe
Binary files /dev/null and b/textures/landuse/residential/ptc/b4_p2.png differ