From f48f0445d1edfdec4c601170f705605056990173 Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Sat, 25 Feb 2012 19:33:35 -0500 Subject: [PATCH] Dump assets and "initial" data before rendering starts Now does preprocessing off of main() instead of in the dispatcher initializer. --- overviewer.py | 6 ++++++ overviewer_core/assetmanager.py | 22 +++++++++++++++++++--- overviewer_core/dispatcher.py | 5 ----- overviewer_core/tileset.py | 14 ++++++++++++++ 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/overviewer.py b/overviewer.py index 9ab4019..0821a7b 100755 --- a/overviewer.py +++ b/overviewer.py @@ -380,6 +380,12 @@ dir but you forgot to put quotes around the directory, since it contains spaces. tset = tileset.TileSet(rset, assetMrg, tex, tileSetOpts, tileset_dir) tilesets.append(tset) + # Do tileset preprocessing here, before we start dispatching jobs + for ts in tilesets: + ts.do_preprocessing() + + # Output initial static data and configuration + assetMrg.initialize(tilesets) # multiprocessing dispatcher if config['processes'] == 1: diff --git a/overviewer_core/assetmanager.py b/overviewer_core/assetmanager.py index 705be77..97d9ab0 100644 --- a/overviewer_core/assetmanager.py +++ b/overviewer_core/assetmanager.py @@ -72,7 +72,23 @@ directory. # TODO based on the type, so something POI[regionset.name].append - def finalize(self, tilesets): + def initialize(self, tilesets): + """Similar to finalize() but calls the tilesets' get_initial_data() + instead of get_persistent_data() to compile the generated javascript + config. + + """ + return self.finalize(tilesets, True) + + def finalize(self, tilesets, initial=False): + """Called to output the generated javascript and all static files to + the output directory + + """ + if not initial: + get_data = lambda tileset: tileset.get_persistent_data() + else: + get_data = lambda tileset: tileset.get_initial_data() # dictionary to hold the overviewerConfig.js settings that we will dumps dump = dict() @@ -94,7 +110,7 @@ directory. # based on the tilesets we have, group them by worlds worlds = [] for tileset in tilesets: - full_name = tileset.get_persistent_data()['world'] + full_name = get_data(tileset)['world'] if full_name not in worlds: worlds.append(full_name) @@ -120,7 +136,7 @@ directory. for tileset in tilesets: - dump['tilesets'].append(tileset.get_persistent_data()) + dump['tilesets'].append(get_data(tileset)) # write a blank image blank = Image.new("RGBA", (1,1), tileset.options.get('bgcolor')) diff --git a/overviewer_core/dispatcher.py b/overviewer_core/dispatcher.py index 2e8e353..9823eef 100644 --- a/overviewer_core/dispatcher.py +++ b/overviewer_core/dispatcher.py @@ -49,14 +49,9 @@ class Dispatcher(object): """ # TODO use status callback - # preprocessing - for tileset in tilesetlist: - tileset.do_preprocessing() - # setup tilesetlist self.setup_tilesets(tilesetlist) - # iterate through all possible phases num_phases = [tileset.get_num_phases() for tileset in tilesetlist] for phase in xrange(max(num_phases)): diff --git a/overviewer_core/tileset.py b/overviewer_core/tileset.py index a20a3c9..3698454 100644 --- a/overviewer_core/tileset.py +++ b/overviewer_core/tileset.py @@ -382,6 +382,20 @@ class TileSet(object): name = str(tilepath[-1]) self._render_compositetile(dest, name) + def get_initial_data(self): + """This is called similarly to get_persistent_data, but is called after + do_preprocessing but before any work is acutally done. + + """ + d = self.get_persistent_data() + # This is basically the same as get_persistent_data() with the + # following exceptions: + # * last_rendertime is not changed + # * A key "render_in_progress" is set to True + d['last_rendertime'] = self.last_rendertime + d['render_in_progress'] = True + return d + def get_persistent_data(self): """Returns a dictionary representing the persistent data of this TileSet. Typically this is called by AssetManager