0

Merge remote-tracking branch 'origin/rewrite' into anvil

This commit is contained in:
Andrew Brown
2012-02-26 21:10:23 -05:00
6 changed files with 69 additions and 2 deletions

View File

@@ -334,6 +334,21 @@ values. The valid configuration keys are listed below.
This is a where a specific texture pack can be found to be used during this render.
It can be either a folder or a directory. Its value should be a string.
``crop``
You can use this to render a small subset of your map, instead of the entire
thing. The format is (min x, min z, max x, max z).
(The coordinates are block coordinates. The same you get with the debug menu
in-game)
Example that only renders a 1000 by 1000 square of land about the origin::
renders['myrender'] = {
'world': 'myworld',
'title': "Cropped Example",
'crop': (-500, -500, 500, 500),
}
.. _customrendermodes:
Custom Rendermodes and Rendermode Primitives

View File

@@ -365,6 +365,10 @@ dir but you forgot to put quotes around the directory, since it contains spaces.
if rset == None: # indicates no such dimension was found:
logging.error("Sorry, you requested dimension '%s' for %s, but I couldn't find it", render['dimension'], render_name)
return 1
# If a crop is requested, wrap the regionset here
if "crop" in render:
rset = world.CroppedRegionSet(rset, *render['crop'])
# If this is to be a rotated regionset, wrap it in a RotatedRegionSet
# object

View File

@@ -73,6 +73,7 @@ renders = Setting(required=True, default={},
"texturepath": Setting(required=False, validator=validateTexturePath, default=None),
"renderchecks": Setting(required=False, validator=validateInt, default=None),
"rerenderprob": Setting(required=True, validator=validateFloat, default=0),
"crop": Setting(required=False, validator=validateCrop, default=None),
# Remove this eventually (once people update their configs)
"worldname": Setting(required=False, default=None,

View File

@@ -166,6 +166,16 @@ def validateOutputDir(d):
raise ValidationException("You must specify a valid output directory")
return os.path.abspath(d)
def validateCrop(value):
if len(value) != 4:
raise ValidationException("The value for the 'crop' setting must be a tuple of length 4")
value = tuple(int(x) for x in value)
if value[0] >= value[2]:
raise ValidationException("About your crop numbers, the xmax value must be greater than the xmin value")
if value[1] >= value[3]:
raise ValidationException("About your crop numbers, the zmax value must be greater than the zmin value")
return value
def make_dictValidator(keyvalidator, valuevalidator):
"""Compose and return a dict validator -- a validator that validates each
key and value in a dictionary.

View File

@@ -490,7 +490,7 @@ class TileSet(object):
bounds = self._find_chunk_range()
# Calculate the depth of the tree
for p in xrange(1,33): # max 32
for p in xrange(2,33): # max 32
# Will 2^p tiles wide and high suffice?
# X has twice as many chunks as tiles, then halved since this is a
@@ -499,8 +499,11 @@ class TileSet(object):
# Y has 4 times as many chunks as tiles, then halved since this is
# a radius
yradius = 2*2**p
# The +32 on the y bounds is because chunks are very tall, and in
# rare cases when the bottom of the map is close to a border, it
# could get cut off
if xradius >= bounds.maxcol and -xradius <= bounds.mincol and \
yradius >= bounds.maxrow and -yradius <= bounds.minrow:
yradius >= bounds.maxrow + 32 and -yradius <= bounds.minrow:
break
self.treedepth = p
self.xradius = xradius

View File

@@ -512,6 +512,40 @@ class RotatedRegionSet(RegionSetWrapper):
x,z = self.rotate(x,z)
yield x,z,mtime
class CroppedRegionSet(RegionSetWrapper):
def __init__(self, rsetobj, xmin, zmin, xmax, zmax):
super(CroppedRegionSet, self).__init__(rsetobj)
self.xmin = xmin//16
self.xmax = xmax//16
self.zmin = zmin//16
self.zmax = zmax//16
def get_chunk(self,x,z):
if (
self.xmin <= x <= self.xmax and
self.zmin <= z <= self.zmax
):
return super(CroppedRegionSet, self).get_chunk(x,z)
else:
raise ChunkDoesntExist("This chunk is out of the requested bounds")
def iterate_chunks(self):
return ((x,z,mtime) for (x,z,mtime) in super(CroppedRegionSet,self).iterate_chunks()
if
self.xmin <= x <= self.xmax and
self.zmin <= z <= self.zmax
)
def get_chunk_mtime(self,x,z):
if (
self.xmin <= x <= self.xmax and
self.zmin <= z <= self.zmax
):
return super(CroppedRegionSet, self).get_chunk_mtime(x,z)
else:
return None
def get_save_dir():
"""Returns the path to the local saves directory
* On Windows, at %APPDATA%/.minecraft/saves/