self._tag == "natural" and self._value == "heath") or (\r
self._tag == "landuse" and self._value == "cemetery") or (\r
self._tag == "landuse" and self._value == "residential"):\r
- amt = randrange(2, 9)\r
+ amt = randrange(5, 21)\r
masks = glob.glob(mstr_datafolder + "textures/tile/completion/*.png")\r
patchtags = [\r
["landuse", "meadow"],\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
+ treespx = trees.load()\r
+ for t in range(80001):\r
lx = randrange(self._imgsize)\r
ly = randrange(self._imgsize)\r
a = mask_pix[lx,ly]\r
+ # Just mark the hit with a black pixel.\r
+ # This will be used as "target" by photogen\r
if a[3] > 0:\r
if lx < self._imgsize and ly < self._imgsize:\r
- tree = self.generate_tree()\r
- trees.alpha_composite(tree, (lx, ly))\r
- trees = ImageEnhance.Contrast(trees).enhance(0.8)\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
+ c = (0,0,0,1)\r
+ treespx[lx,ly] = c\r
+ layer_comp.alpha_composite(trees)\r
\r
mstr_msg("layergen", "Layer image generated")\r
\r
# One more thing...\r
mstr_msg("photogen", "Adding features to layers")\r
self.addTreesToFeatures(layers, waterlayers)\r
+ # One final thing...\r
+ mstr_msg("photogen", "Adding details to buildings")\r
+ self.addDetailsToBuildings()\r
\r
# Throw missing buildings on top\r
lyr = 0\r
for x in range(0, self._imgsize):\r
frs = frstpix[x,y]\r
if frs[3] > 0:\r
- c = ( frs[0]-30, frs[1]-30, frs[2]-30 )\r
+ c = ( frs[0]-40, frs[1]-40, frs[2]-40 )\r
frstclr.append(c)\r
\r
\r
lyr[0] == "leisure" and lyr[1] == "park"):\r
trees = Image.new("RGBA", (self._imgsize, self._imgsize))\r
amt = 4000\r
+ if lyr[1] == "cemetery": amt = 20000\r
lyrmask = layers[curlyr].load() # We can use the layer image as alpha mask\r
for i in range(1, amt + 1):\r
lx = randrange(0, self._imgsize)\r
lp = lyrmask[lx,ly]\r
wp = wtrpix[lx,ly]\r
if lp[3] == 255 and wp[3] == 0: # Exclude water bodies from tree placement\r
- tree = self.generate_tree(frstclr)\r
+ tree = None\r
+ if len(frstclr) != 0: tree = self.generate_tree(bccolor=frstclr)\r
+ else: tree = self.generate_tree()\r
trees.alpha_composite(tree, (lx, ly))\r
\r
tree_shadow = Image.new("RGBA", (self._imgsize, self._imgsize))\r
self._tile.alpha_composite(tree_shadow)\r
curlyr = curlyr + 1\r
\r
+ # Reset for tree rows\r
+ curlyr = 0\r
+ treerow = -1\r
+ for lyr in self._lyrnames:\r
+ if lyr[0] == "natural" and lyr[1] == "tree_row":\r
+ treerow = curlyr\r
+ break\r
+ curlyr = curlyr + 1\r
+ \r
+ if treerow != -1:\r
+ rowpx = layers[curlyr].load()\r
+ for y in range(0, self._tile.height):\r
+ for x in range(0, self._tile.width):\r
+ tpx = rowpx[x,y]\r
+ if tpx[3] == 1:\r
+ tree = None\r
+ if len(frstclr) == 0: tree = self.generate_tree()\r
+ else: tree = self.generate_tree(bccolor=frstclr)\r
+ self._tile.alpha_composite(tree, dest=(x, y))\r
+\r
# Reset\r
curlyr = 0\r
bldg = []\r
spix = shdw_pix[x,y]\r
if bpix[3] > 0 and spix[0] == 255:\r
tilepix[x,y] = ( bpix[0], bpix[1], bpix[2], bpix[3] )\r
+ \r
+\r
+ # Adds some intricate details to buildings\r
+ def addDetailsToBuildings(self):\r
+ curlyr = 0\r
+ bldg = []\r
+ for lyr in self._lyrnames:\r
+ if lyr[0] == "building":\r
+ bldg.append(curlyr)\r
+ curlyr = curlyr + 1\r
+\r
+ for b in range(0, len(bldg)):\r
+ shdw = Image.open(mstr_datafolder + "_cache/" + str(self._lat) + "-" + str(self._ty) + "_" + str(self._lng) + "-" + str(self._tx) + "_" + self._lyrnames[bldg[b]][0] + "-" + self._lyrnames[bldg[b]][1] + "_layer_shadow.png")\r
+ shdw_pix = shdw.load()\r
+\r
+ det_image = Image.open(mstr_datafolder + "textures/building/details/"+str(randrange(1, 16))+".png")\r
+\r
+ detpx = det_image.load()\r
+\r
+ for y in range(0, shdw.height):\r
+ for x in range(0, shdw.width):\r
+ spx = shdw_pix[x,y]\r
+ if spx[0] != 255:\r
+ c = (0,0,0,0)\r
+ detpx[x,y] = c\r
+\r
+ self._tile.alpha_composite(det_image)\r
\r
\r
\r