Added an option to enter your own zoom level. Use -z to set the map at a particular zoom level. Zoom levels define the width and height in tiles of the highest zoom level, each new zoom level is twice as wide and tall. (z=6 -> 2^6 tiles wide and tall) Implemented tile re-arrangement on map expansion. Now most tiles will get re-used if your map needs another zoom level! No longer does it need to re-generate everything. No longer creates empty directories for tiles, only creates directories if needed. Fixed some minor off-by-one logic (and the code that canceled it out to make it work)
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 multiprocessing
|
|
|
|
import world
|
|
import quadtree
|
|
|
|
helptext = """
|
|
%prog [-p PROCS] [-d] <Path to World> <tiles dest dir>
|
|
"""
|
|
|
|
def main():
|
|
try:
|
|
cpus = multiprocessing.cpu_count()
|
|
except NotImplementedError:
|
|
cpus = 1
|
|
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 the number of cores in your computer. Default %s" % cpus, default=cpus, action="store", type="int")
|
|
parser.add_option("-z", "--zoom", dest="zoom", help="Sets the zoom level manually instead of calculating it. This can be useful if you have outlier chunks that make your world too big. This value will make the highest zoom level contain (2**ZOOM)^2 tiles", action="store", type="int")
|
|
parser.add_option("-d", "--delete", dest="delete", help="Clear all caches. Next time you render your world, it will have to start completely over again. This is probably not a good idea for large worlds. Use this if you change texture packs and want to re-render everything.", action="store_true")
|
|
|
|
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]
|
|
|
|
if options.delete:
|
|
return delete_all(worlddir, destdir)
|
|
|
|
# First generate the world's chunk images
|
|
w = world.WorldRenderer(worlddir)
|
|
w.go(options.procs)
|
|
|
|
# Now generate the tiles
|
|
q = quadtree.QuadtreeGen(w, destdir, depth=options.zoom)
|
|
q.go(options.procs)
|
|
|
|
def delete_all(worlddir, tiledir):
|
|
# First delete all images in the world dir
|
|
imgre = r"img\.[^.]+\.[^.]+\.nocave\.\w+\.png$"
|
|
matcher = re.compile(imgre)
|
|
|
|
for dirpath, dirnames, filenames in os.walk(worlddir):
|
|
for f in filenames:
|
|
if matcher.match(f):
|
|
filepath = os.path.join(dirpath, f)
|
|
print "Deleting {0}".format(filepath)
|
|
os.unlink(filepath)
|
|
|
|
# Now delete all /hash/ files in the tile dir.
|
|
for dirpath, dirnames, filenames in os.walk(tiledir):
|
|
for f in filenames:
|
|
if f.endswith(".hash"):
|
|
filepath = os.path.join(dirpath, f)
|
|
print "Deleting {0}".format(filepath)
|
|
os.unlink(filepath)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|