# Generates some random tree.\r
# We will now move away from using pre-made trees...\r
# they didn't look so great\r
- def generate_tree(self):\r
+ def generate_tree(self, bccolor=[(0,0,0)]):\r
sx = randrange(18, 31)\r
sy = randrange(18, 31)\r
\r
# How many of those have been drawn?\r
ptsdrawn = 0\r
\r
- bc = [\r
- (36, 50, 52),\r
- (30, 41, 39),\r
- (32, 45, 37),\r
- (32, 39, 49),\r
- (33, 34, 40),\r
- (44, 50, 53),\r
- (40, 46, 48),\r
- (14, 31, 38),\r
- (17, 41, 33),\r
- (39, 56, 35),\r
- (51, 51, 42),\r
- (12, 27, 31),\r
- (45, 59, 48),\r
- (37, 54, 29),\r
- (59, 50, 34),\r
- (59, 59, 35),\r
- (59, 51, 35),\r
- (70, 72, 45),\r
- (48, 59, 44),\r
- (29, 47, 23),\r
- (47, 61, 43),\r
- (29, 68, 15),\r
- (53, 77, 63),\r
- (20, 68, 40)\r
- ]\r
-\r
- bcp = randrange(0, len(bc))\r
+ bc = []\r
+ bcp = 0\r
+ if bccolor[0] == 0:\r
+ bc = [\r
+ (36, 50, 52),\r
+ (30, 41, 39),\r
+ (32, 45, 37),\r
+ (32, 39, 49),\r
+ (33, 34, 40),\r
+ (44, 50, 53),\r
+ (40, 46, 48),\r
+ (14, 31, 38),\r
+ (17, 41, 33),\r
+ (39, 56, 35),\r
+ (51, 51, 42),\r
+ (12, 27, 31),\r
+ (45, 59, 48),\r
+ (37, 54, 29),\r
+ (59, 50, 34),\r
+ (59, 59, 35),\r
+ (59, 51, 35),\r
+ (70, 72, 45),\r
+ (48, 59, 44),\r
+ (29, 47, 23),\r
+ (47, 61, 43),\r
+ (29, 68, 15),\r
+ (53, 77, 63),\r
+ (20, 68, 40)\r
+ ]\r
+ bcp = randrange(0, len(bc))\r
+ else:\r
+ bc = bccolor\r
\r
treedraw = ImageDraw.Draw(tree)\r
while ptsdrawn < treepts + 1:\r
# Preload the water layer for comparison\r
wtrpix = wtrlyr.load()\r
\r
+ # To make trees blend better with the environment, we can determine\r
+ # an average color from the forest layer. The pass this color as\r
+ # base instead.\r
+ forest = -1\r
+ curlyr = 0\r
+ for lyr in self._lyrnames:\r
+ if lyr[0] == "landuse" and lyr[1] == "forest":\r
+ forest = curlyr\r
+\r
+ # Find the average color of the forest layer\r
+ frstavg = [0,0,0]\r
+ frstpix = None\r
+ if forest != -1:\r
+ numusedpix = 0\r
+ frstpix = layers[forest].load()\r
+ avg=[0,0,0]\r
+ for y in range(0, self._imgsize):\r
+ for x in range(0, self._imgsize):\r
+ frs = frstpix[x,y]\r
+ if frs[3] > 0:\r
+ avg[0] = avg[0] + frs[0]\r
+ avg[1] = avg[1] + frs[1]\r
+ avg[2] = avg[2] + frs[2]\r
+ numusedpix = numusedpix + 1\r
+\r
+ # Calculate and set average\r
+ frstavg[0] = int(avg[0] / numusedpix)\r
+ frstavg[1] = int(avg[1] / numusedpix)\r
+ frstavg[2] = int(avg[2] / numusedpix)\r
+\r
+\r
# Walk through list of layers to decide where to add the trees\r
curlyr = 0\r
for lyr in self._lyrnames:\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()\r
+ tree = self.generate_tree(bccolor=[(frstavg[0], frstavg[1], frstavg[2])])\r
trees.alpha_composite(tree, (lx, ly))\r
\r
- trees = ImageEnhance.Contrast(trees).enhance(0.8)\r
-\r
tree_shadow = Image.new("RGBA", (self._imgsize, self._imgsize))\r
tree_pix = trees.load()\r
shadow_pix = tree_shadow.load()\r