From 7c23d6e86ac85f7e1bec66aab71a541347a979b4 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Thu, 1 May 2014 16:48:28 -0400 Subject: [PATCH] added rendercheck mode 3, the identity function of rendercheck modes! --- docs/config.rst | 8 ++++++++ overviewer.py | 17 +++++++++++------ overviewer_core/tileset.py | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/docs/config.rst b/docs/config.rst index 24067fe..2b6cfe2 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -704,6 +704,14 @@ values. The valid configuration keys are listed below. 'forcerender': True, } +``renderchecks`` + This is an integer, and functions as a more complex form of + ``forcerender``. Setting it to 1 enables :option:`--check-tiles` + mode, setting it to 2 enables :option:`--forcerender`, and 3 tells + Overviewer to keep this particular render in the output, but + otherwise don't update it. It defaults to 0, which is the usual + update checking mode. + ``changelist`` This is a string. It names a file where it will write out, one per line, the path to tiles that have been updated. You can specify the same file for diff --git a/overviewer.py b/overviewer.py index f5b8969..71e1c09 100755 --- a/overviewer.py +++ b/overviewer.py @@ -318,19 +318,24 @@ dir but you forgot to put quotes around the directory, since it contains spaces. "--check-tiles, and --no-tile-checks. These options conflict.") parser.print_help() return 1 + + def set_renderchecks(checkname, num): + for name, render in config['renders'].iteritems(): + if render.get('renderchecks', 0) == 3: + logging.warning(checkname + " ignoring render " + repr(name) + " since it's marked as \"don't render\".") + else: + render['renderchecks'] = num + if options.forcerender: logging.info("Forcerender mode activated. ALL tiles will be rendered") - for render in config['renders'].itervalues(): - render['renderchecks'] = 2 + set_renderchecks("forcerender", 2) elif options.checktiles: logging.info("Checking all tiles for updates manually.") - for render in config['renders'].itervalues(): - render['renderchecks'] = 1 + set_renderchecks("checktiles", 1) elif options.notilechecks: logging.info("Disabling all tile mtime checks. Only rendering tiles "+ "that need updating since last render") - for render in config['renders'].itervalues(): - render['renderchecks'] = 0 + set_renderchecks("notilechecks", 0) if not config['renders']: logging.error("You must specify at least one render in your config file. See the docs if you're having trouble") diff --git a/overviewer_core/tileset.py b/overviewer_core/tileset.py index 032dcdb..8d3e8d6 100644 --- a/overviewer_core/tileset.py +++ b/overviewer_core/tileset.py @@ -130,6 +130,14 @@ Bounds = namedtuple("Bounds", ("mincol", "maxcol", "minrow", "maxrow")) # slowest, but SHOULD be specified if this is the first render because # the scan will forgo tile stat calls. It's also useful for changing # texture packs or other options that effect the output. + +# 3 +# A very special mode. Using this will not actually render +# anything, but will leave this tileset in the resulting +# map. Useful for renders that you want to keep, but not +# update. Since this mode is so simple, it's left out of the +# rest of this discussion. + # # For 0 our caller has explicitly requested not to check mtimes on disk to # speed things up. So the mode 0 chunk scan only looks at chunk mtimes and the @@ -238,6 +246,13 @@ class TileSet(object): useful for changing texture packs or other options that effect the output. + 3 + A very special mode. Using this will not actually render + anything, but will leave this tileset in the resulting + map. Useful for renders that you want to keep, but not + update. Since this mode is so simple, it's left out of the + rest of this discussion. + imgformat A string indicating the output format. Must be one of 'png' or 'jpeg' @@ -390,6 +405,11 @@ class TileSet(object): attribute for later use in iterate_work_items() """ + + # skip if we're told to + if self.options['renderchecks'] == 3: + return + # REMEMBER THAT ATTRIBUTES ASSIGNED IN THIS METHOD ARE NOT AVAILABLE IN # THE do_work() METHOD (because this is only called in the main process # not the workers) @@ -416,15 +436,16 @@ class TileSet(object): return 1 def get_phase_length(self, phase): - """Returns the number of work items in a given phase, or None if there - is no good estimate. + """Returns the number of work items in a given phase. """ # Yeah functional programming! + # and by functional we mean a bastardized python switch statement return { 0: lambda: self.dirtytree.count_all(), #there is no good way to guess this so just give total count 1: lambda: (4**(self.treedepth+1)-1)/3, 2: lambda: self.dirtytree.count_all(), + 3: lambda: 0, }[self.options['renderchecks']]() def iterate_work_items(self, phase): @@ -434,6 +455,10 @@ class TileSet(object): This method returns an iterator over (obj, [dependencies, ...]) """ + # skip if asked to + if self.options['renderchecks'] == 3: + return + # The following block of code implementes the changelist functionality. fd = self.options.get("changelist", None) if fd: @@ -536,6 +561,11 @@ class TileSet(object): def bgcolorformat(color): return "#%02x%02x%02x" % color[0:3] isOverlay = self.options.get("overlay") or (not any(isinstance(x, rendermodes.Base) for x in self.options.get("rendermode"))) + + # don't update last render time if we're leaving this alone + last_rendertime = self.last_rendertime + if self.options['renderchecks'] != 3: + last_rendertime = self.max_chunk_mtime d = dict(name = self.options.get('title'), zoomLevels = self.treedepth, @@ -546,7 +576,7 @@ class TileSet(object): bgcolor = bgcolorformat(self.options.get('bgcolor')), world = self.options.get('worldname_orig') + (" - " + self.options.get('dimension')[0] if self.options.get('dimension')[1] != 0 else ''), - last_rendertime = self.max_chunk_mtime, + last_rendertime = last_rendertime, imgextension = self.imgextension, isOverlay = isOverlay, poititle = self.options.get("poititle"),