The initial recursive call for tile generation will spawn up to 3 extra processes to work on each quadrant. It's not perfect yet since some quadrants may have more or less work to do, and only 4 total workers are supported. Also, it waits for all chunks are finished before it dives into the tiles, to prevent it from using more resources than requested.
72 lines
2.5 KiB
Python
Executable File
72 lines
2.5 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import os
|
|
import sys
|
|
import os.path
|
|
from optparse import OptionParser
|
|
import re
|
|
|
|
import world
|
|
|
|
helptext = """
|
|
%prog [-p PROCS] <Path to World> <tiles dest dir>
|
|
"""
|
|
|
|
def main():
|
|
parser = OptionParser(usage=helptext)
|
|
parser.add_option("-p", "--processes", dest="procs", help="How many chunks to render in parallel. A good number for this is 1 more than the number of cores in your computer. Default 2", default=2, action="store", type="int")
|
|
parser.add_option("-c", "--cachelife", dest="cachelife", help="How many minutes a tile will be considered valid by the web browser before it fetches a new copy. Used if you have a crontab or similar running this every once in a while. Default is 24 hours.", default=0, action="store", type="int")
|
|
|
|
options, args = parser.parse_args()
|
|
|
|
if len(args) < 1:
|
|
print "You need to give me your world directory"
|
|
parser.print_help()
|
|
sys.exit(1)
|
|
worlddir = args[0]
|
|
|
|
if len(args) != 2:
|
|
parser.error("Where do you want to save the tiles?")
|
|
destdir = args[1]
|
|
|
|
print "Scanning chunks"
|
|
all_chunks = world.find_chunkfiles(worlddir)
|
|
|
|
# Translate chunks from diagonal coordinate system
|
|
mincol, maxcol, minrow, maxrow, chunks = world.convert_coords(all_chunks)
|
|
|
|
print "Rendering chunks"
|
|
results = world.render_chunks_async(chunks, False, options.procs)
|
|
for i, (col, row, filename) in enumerate(chunks):
|
|
results[col, row].wait()
|
|
print "{0}/{1} chunks rendered".format(i, len(chunks))
|
|
|
|
print "Writing out html file"
|
|
if not os.path.exists(destdir):
|
|
os.mkdir(destdir)
|
|
zoom = world.get_quadtree_depth(mincol, maxcol, minrow, maxrow)
|
|
write_html(destdir, zoom+1, options.cachelife)
|
|
print "Your map will have {0} zoom levels".format(zoom+1)
|
|
|
|
print "Generating quad tree. This may take a while and has no progress bar right now, so sit tight."
|
|
tiledir = os.path.join(destdir, "tiles")
|
|
if not os.path.exists(tiledir):
|
|
os.mkdir(tiledir)
|
|
world.generate_quadtree(results, mincol, maxcol, minrow, maxrow, tiledir, options.procs)
|
|
|
|
print "DONE"
|
|
|
|
def write_html(path, zoomlevel, cachelife):
|
|
templatepath = os.path.join(os.path.split(__file__)[0], "template.html")
|
|
html = open(templatepath, 'r').read()
|
|
html = html.replace(
|
|
"{maxzoom}", str(zoomlevel))
|
|
html = html.replace(
|
|
"{cachelife}", str(cachelife))
|
|
|
|
with open(os.path.join(path, "index.html"), 'w') as output:
|
|
output.write(html)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|