From 4ab426308b71588e839ced553a65ae731ded03a4 Mon Sep 17 00:00:00 2001 From: "Marcus Str." Date: Sat, 28 Dec 2024 19:59:26 +0100 Subject: [PATCH] Issue of incorrectly assigned resources appears to be fixed. Complete tile to be tested. --- orthographic.py | 8 ++- tileprep.py | 185 +++++++++++++++++++++--------------------------- 2 files changed, 87 insertions(+), 106 deletions(-) diff --git a/orthographic.py b/orthographic.py index e2b309e..daf59e1 100644 --- a/orthographic.py +++ b/orthographic.py @@ -295,6 +295,11 @@ class mstr_orthographic: def _prepareTile(self): mstr_msg("orthographic", "Beginning construction of tile") + # Clear cache + tmp = glob.glob(mstr_datafolder + "_cache/*.*") + for t in range(0, len(tmp)): + os.remove(tmp[t]) + # We need to know which platform we are on os_platform = os.name @@ -435,6 +440,7 @@ class mstr_orthographic: # We now need to "raytrace" the resources for correct placement mstr_msg("orthographic", "Performing resource plamement tracing for tile") + for lat_grid in range(1, maxlatlng[0]+1): for lng_grid in range(1, maxlatlng[1]+1): mstr_msg("orthographic", "Placement tracing for " + str(lat_grid) + ":" + str(lng_grid)) @@ -447,7 +453,7 @@ class mstr_orthographic: lyr = fnlines[l].split(" ") tp = mstr_tileprep(self._lat, self._long, lat_grid, lng_grid, lyr[0], lyr[1], None, False) tp._setLatLngFold(self._latlngfld) - tp._placeTileSources(lat_grid, lng_grid) + tp._placeTileSources(mlat, mlng) # Generates X-Plane 11/12 scenery with diff --git a/tileprep.py b/tileprep.py index ef5f37a..46a003e 100644 --- a/tileprep.py +++ b/tileprep.py @@ -144,6 +144,7 @@ class mstr_tileprep: for ln in fnlines: l = ln.split(" ") if l[0] == self._tag and l[1] == self._value: + l[3] = l[3].replace("\n", "") touch = l[3] return touch @@ -234,143 +235,117 @@ class mstr_tileprep: return [ (tv+1, th), (tv, th+1), (tv-1, th), (tv, th-1) ] - # Walk through the now existing data files and make sure we always pick the correct - # sources for every tile, thus evading previous edge detection errors - def _placeTileSources(self, mlat, mlng): + # Scan connections of a specific tile + def _scanConnections(self, tile): + # The array of visited tiles + visited = [] # None of the edges have reached their end yet edge_end = [0,0,0,0] # top, right, bottom, left - - # Array with info we need - resinfo = ["", ""] # Touch, Resource numbers - - # Go through everything until the end is reached (no more options left) end_reached = False while end_reached == False: - # Go north - tv = self._tile_v - th = self._tile_h + tv = tile[0] + th = tile[1] while edge_end[0] == 0: - resinfo[0] = self._getResourceTouch(tv, th) - resinfo[1] = self._getResourceInfo(tv, th) - - # Only do the following steps if we have nothing stored - if resinfo[1] == "0": - neighbors = self._findNeighbors(tv, th) - neighborinfo = ["",""] - for n in range(0, len(neighbors)): - neighborinfo[0] = self._getResourceTouch(neighbors[n][0], neighbors[n][1]) - neighborinfo[1] = self._getResourceInfo(neighbors[n][0], neighbors[n][1]) - if "b" in neighborinfo[0] and neighborinfo[1] != "0": - resinfo[1] = neighborinfo[1] - break - - # Store info. At this point we either have neighboring data, or - # we need to select something - if resinfo[1] == "0": resinfo[1] = self._selectResources() - self._storeResourceInfo(tv, th, resinfo[1]) - - # Move forward - if "t" in resinfo[0]: + owntouch = self._getResourceTouch(tv, th) + if "t" in owntouch: + if self._checkVisited(visited, (tv, th)) == False: visited.append((tv, th)) + if self._checkVisited(visited, (tv+1, th)) == False: visited.append((tv+1, th)) tv=tv+1 else: edge_end[0] = 1 - # Go east - tv = self._tile_v - th = self._tile_h + tv = tile[0] + th = tile[1] while edge_end[1] == 0: - resinfo[0] = self._getResourceTouch(tv, th) - resinfo[1] = self._getResourceInfo(tv, th) - - # Only do the following steps if we have nothing stored - if resinfo[1] == "0": - neighbors = self._findNeighbors(tv, th) - neighborinfo = ["",""] - for n in range(0, len(neighbors)): - neighborinfo[0] = self._getResourceTouch(neighbors[n][0], neighbors[n][1]) - neighborinfo[1] = self._getResourceInfo(neighbors[n][0], neighbors[n][1]) - if "l" in neighborinfo[0] and neighborinfo[1] != "0": - resinfo[1] = neighborinfo[1] - break - - # Store info. At this point we either have neighboring data, or - # we need to select something - if resinfo[1] == "0": resinfo[1] = self._selectResources() - self._storeResourceInfo(tv, th, resinfo[1]) - - # Move forward - if "r" in resinfo[0]: + owntouch = self._getResourceTouch(tv, th) + if "r" in owntouch: + if self._checkVisited(visited, (tv, th)) == False: visited.append((tv, th)) + if self._checkVisited(visited, (tv, th+1)) == False: visited.append((tv, th+1)) th=th+1 else: edge_end[1] = 1 - # Go south - tv = self._tile_v - th = self._tile_h + tv = tile[0] + th = tile[1] while edge_end[2] == 0: - resinfo[0] = self._getResourceTouch(tv, th) - resinfo[1] = self._getResourceInfo(tv, th) - - # Only do the following steps if we have nothing stored - if resinfo[1] == "0": - neighbors = self._findNeighbors(tv, th) - neighborinfo = ["",""] - for n in range(0, len(neighbors)): - neighborinfo[0] = self._getResourceTouch(neighbors[n][0], neighbors[n][1]) - neighborinfo[1] = self._getResourceInfo(neighbors[n][0], neighbors[n][1]) - if "t" in neighborinfo[0] and neighborinfo[1] != "0": - resinfo[1] = neighborinfo[1] - break - - # Store info. At this point we either have neighboring data, or - # we need to select something - if resinfo[1] == "0": resinfo[1] = self._selectResources() - self._storeResourceInfo(tv, th, resinfo[1]) - - # Move forward - if "b" in resinfo[0]: + owntouch = self._getResourceTouch(tv, th) + if "b" in owntouch: + if self._checkVisited(visited, (tv, th)) == False: visited.append((tv, th)) + if self._checkVisited(visited, (tv-1, th)) == False: visited.append((tv-1, th)) tv=tv-1 else: edge_end[2] = 1 - # Go west - tv = self._tile_v - th = self._tile_h + tv = tile[0] + th = tile[1] while edge_end[3] == 0: - resinfo[0] = self._getResourceTouch(tv, th) - resinfo[1] = self._getResourceInfo(tv, th) - - # Only do the following steps if we have nothing stored - if resinfo[1] == "0": - neighbors = self._findNeighbors(tv, th) - neighborinfo = ["",""] - for n in range(0, len(neighbors)): - neighborinfo[0] = self._getResourceTouch(neighbors[n][0], neighbors[n][1]) - neighborinfo[1] = self._getResourceInfo(neighbors[n][0], neighbors[n][1]) - if "r" in neighborinfo[0] and neighborinfo[1] != "0": - resinfo[1] = neighborinfo[1] - break - - # Store info. At this point we either have neighboring data, or - # we need to select something - if resinfo[1] == "0": resinfo[1] = self._selectResources() - self._storeResourceInfo(tv, th, resinfo[1]) - - # Move forward - if "l" in resinfo[0]: + owntouch = self._getResourceTouch(tv, th) + if "b" in owntouch: + if self._checkVisited(visited, (tv, th)) == False: visited.append((tv, th)) + if self._checkVisited(visited, (tv, th-1)) == False: visited.append((tv, th-1)) th=th-1 else: edge_end[3] = 1 if edge_end[0] == 1 and edge_end[1] == 1 and edge_end[2] == 1 and edge_end[3] == 1: - end_reached = True # <- Break loop \ No newline at end of file + end_reached = True # <- Break loop + + return visited + + + # Walk through the now existing data files and make sure we always pick the correct + # sources for every tile, thus evading previous edge detection errors + def _placeTileSources(self, mlat, mlng): + + # Initial scan "cross" + visited = self._scanConnections((self._tile_v, self._tile_h)) + + # Recursive scan of initial cross + for v in range(len(visited)): + vst = self._scanConnections((visited[v][0], visited[v][1])) + for l in range(len(vst)): + if self._checkVisited(visited, (vst[l][0], vst[l][1])) == False: visited.append((vst[l][0], vst[l][1])) + + # We will take the resource of the original tile we have started + # our scan from. If there is nothing, we can choose. + # This is then used for all visited tiles. + tv = self._tile_v + th = self._tile_h + resstring = self._getResourceInfo(tv, th) + if resstring == "0" or resstring == "": resstring = self._selectResources() + for v in range(0, len(visited)): + self._storeResourceInfo(visited[v][0], visited[v][1], resstring) + + + + # Check if a tile was visited + def _checkVisited(self, visited, tile): + v = False + for t in range(0, len(visited)): + if visited[t][0] == tile[0] and visited[t][1] == tile[1]: + v = True + break + return v + + + # Show result of path tracing - DEBUG ONLY + def _debugRender(self, visited, mlat, mlng): + rmap = Image.new("RGBA", (mlng*10, mlat*10), color="#FFFFFF") + draw = ImageDraw.Draw(rmap) + for v in range(len(visited)): + sx, sy = (visited[v][1]-1)*10, (rmap.height-(visited[v][0]-1)*10)-10 + dx, dy = ((visited[v][1]-1)*10)+10, (rmap.height-(visited[v][0]-1)*10)+10 + shape = [ (sx, sy), (dx, dy) ] + fill = (0,0,0,255) + draw.rectangle(shape, fill=fill) + rmap.show()