]> marstr Code Repo - marstr/orthographic.git/commitdiff
Color averaging for trees being generated in final step, to make them blend better...
authorMarcus Str. <marcus@marstr.online>
Fri, 20 Dec 2024 18:30:02 +0000 (19:30 +0100)
committerMarcus Str. <marcus@marstr.online>
Fri, 20 Dec 2024 18:30:02 +0000 (19:30 +0100)
photogen.py

index a4e46728f35b73d725a3647c76197697c75a91a0..e98b5bc6dd3d6a12af7dafee58d79815d1cf7abe 100644 (file)
@@ -252,7 +252,7 @@ class mstr_photogen:
     # 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
@@ -270,34 +270,38 @@ class mstr_photogen:
         # 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
@@ -347,6 +351,37 @@ class mstr_photogen:
         # 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
@@ -363,11 +398,9 @@ class mstr_photogen:
                     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