diff --git a/overviewer.py b/overviewer.py index 0be6fa2..3ea418f 100755 --- a/overviewer.py +++ b/overviewer.py @@ -247,15 +247,6 @@ dir but you forgot to put quotes around the directory, since it contains spaces. logging.debug("Current log level: {0}".format(logging.getLogger().level)) - # make sure that the textures can be found - try: - #textures.generate(path=options.textures_path) - tex = textures.Textures() - tex.generate() - except IOError, e: - logging.error(str(e)) - return 1 - # look at our settings.py file mw_parser = configParser.MultiWorldParser("settings.py") mw_parser.parse() @@ -279,17 +270,29 @@ dir but you forgot to put quotes around the directory, since it contains spaces. # saves us from creating the same World object over and over again worldcache = {} + # same for textures + texcache = {} for render_name in render_things: render = render_things[render_name] logging.debug("Found the following render thing: %r", render) + # find or create the world object if (render['worldname'] not in worldcache): w = world.World(render['worldname']) worldcache[render['worldname']] = w else: w = worldcache[render['worldname']] - + + # find or create the textures object + texopts = util.dict_subset(render, ["texturepath", "bgcolor", "northdirection"]) + texopts_key = tuple(texopts.items()) + if texopts_key not in texcache: + tex = textures.Textures(**texopts) + tex.generate() + texcache[texopts_key] = tex + else: + tex = texcache[texopts_key] rset = w.get_regionset(render['dimension']) if rset == None: # indicates no such dimension was found: diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 4f628e2..f6ae8c7 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -37,10 +37,10 @@ class Textures(object): rendering. It accepts a background color, north direction, and local textures path. """ - def __init__(self, local_path=None, bgcolor=(26, 26, 26, 0), north_direction='lower-left'): + def __init__(self, texturepath=None, bgcolor=(26, 26, 26, 0), northdirection=0): self.bgcolor = bgcolor - self.north = north_direction - self.find_file_local_path = local_path + self.rotation = northdirection + self.find_file_local_path = texturepath # not yet configurable self.texture_size = 24 @@ -629,16 +629,16 @@ def getBiomeData(worlddir, chunkX, chunkY): biomeX = chunkX // 32 biomeY = chunkY // 32 rots = 0 - if _north == 'upper-left': + if _north == 1: temp = biomeX biomeX = biomeY biomeY = -temp-1 rots = 3 - elif _north == 'upper-right': + elif _north == 2: biomeX = -biomeX-1 biomeY = -biomeY-1 rots = 2 - elif _north == 'lower-right': + elif _north == 3: temp = biomeX biomeX = -biomeY-1 biomeY = temp @@ -904,18 +904,18 @@ block(blockid=22, top_index=144) # dispensers, furnaces, and burning furnaces @material(blockid=[23, 61, 62], data=range(6), solid=True) def furnaces(self, blockid, data): - # first, do the north rotation if needed - if self.north == 'upper-left': + # first, do the rotation if needed + if self.rotation == 1: if data == 2: data = 5 elif data == 3: data = 4 elif data == 4: data = 2 elif data == 5: data = 3 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 2: data = 3 elif data == 3: data = 2 elif data == 4: data = 5 elif data == 5: data = 4 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 2: data = 4 elif data == 3: data = 5 elif data == 4: data = 3 @@ -945,19 +945,19 @@ block(blockid=25, top_index=74) @material(blockid=26, data=range(12), transparent=True, nospawn=True) def bed(self, blockid, data): - # first get north rotation done + # first get rotation done # Masked to not clobber block head/foot info - if self.north == 'upper-left': + if self.rotation == 1: if (data & 0b0011) == 0: data = data & 0b1100 | 1 elif (data & 0b0011) == 1: data = data & 0b1100 | 2 elif (data & 0b0011) == 2: data = data & 0b1100 | 3 elif (data & 0b0011) == 3: data = data & 0b1100 | 0 - elif self.north == 'upper-right': + elif self.rotation == 2: if (data & 0b0011) == 0: data = data & 0b1100 | 2 elif (data & 0b0011) == 1: data = data & 0b1100 | 3 elif (data & 0b0011) == 2: data = data & 0b1100 | 0 elif (data & 0b0011) == 3: data = data & 0b1100 | 1 - elif self.north == 'lower-right': + elif self.rotation == 3: if (data & 0b0011) == 0: data = data & 0b1100 | 3 elif (data & 0b0011) == 1: data = data & 0b1100 | 0 elif (data & 0b0011) == 2: data = data & 0b1100 | 1 @@ -1008,22 +1008,22 @@ def bed(self, blockid, data): # powered, detector, and normal rails @material(blockid=[27, 28, 66], data=range(14), transparent=True) def rails(self, blockid, data): - # first, do north rotation + # first, do rotation # Masked to not clobber powered rail on/off info # Ascending and flat straight - if self.north == 'upper-left': + if self.rotation == 1: if (data & 0b0111) == 0: data = data & 0b1000 | 1 elif (data & 0b0111) == 1: data = data & 0b1000 | 0 elif (data & 0b0111) == 2: data = data & 0b1000 | 5 elif (data & 0b0111) == 3: data = data & 0b1000 | 4 elif (data & 0b0111) == 4: data = data & 0b1000 | 2 elif (data & 0b0111) == 5: data = data & 0b1000 | 3 - elif self.north == 'upper-right': + elif self.rotation == 2: if (data & 0b0111) == 2: data = data & 0b1000 | 3 elif (data & 0b0111) == 3: data = data & 0b1000 | 2 elif (data & 0b0111) == 4: data = data & 0b1000 | 5 elif (data & 0b0111) == 5: data = data & 0b1000 | 4 - elif self.north == 'lower-right': + elif self.rotation == 3: if (data & 0b0111) == 0: data = data & 0b1000 | 1 elif (data & 0b0111) == 1: data = data & 0b1000 | 0 elif (data & 0b0111) == 2: data = data & 0b1000 | 4 @@ -1032,17 +1032,17 @@ def rails(self, blockid, data): elif (data & 0b0111) == 5: data = data & 0b1000 | 2 if blockid == 66: # normal minetrack only #Corners - if self.north == 'upper-left': + if self.rotation == 1: if data == 6: data = 7 elif data == 7: data = 8 elif data == 8: data = 6 elif data == 9: data = 9 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 6: data = 8 elif data == 7: data = 9 elif data == 8: data = 6 elif data == 9: data = 7 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 6: data = 9 elif data == 7: data = 6 elif data == 8: data = 8 @@ -1115,19 +1115,19 @@ def rails(self, blockid, data): # sticky and normal piston body @material(blockid=[29, 33], data=[0,1,2,3,4,5,8,9,10,11,12,13], transparent=True, solid=True, nospawn=True) def piston(self, blockid, data): - # first, north rotation + # first, rotation # Masked to not clobber block head/foot info - if self.north == 'upper-left': + if self.rotation == 1: if (data & 0b0111) == 2: data = data & 0b1000 | 5 elif (data & 0b0111) == 3: data = data & 0b1000 | 4 elif (data & 0b0111) == 4: data = data & 0b1000 | 2 elif (data & 0b0111) == 5: data = data & 0b1000 | 3 - elif self.north == 'upper-right': + elif self.rotation == 2: if (data & 0b0111) == 2: data = data & 0b1000 | 3 elif (data & 0b0111) == 3: data = data & 0b1000 | 2 elif (data & 0b0111) == 4: data = data & 0b1000 | 5 elif (data & 0b0111) == 5: data = data & 0b1000 | 4 - elif self.north == 'lower-right': + elif self.rotation == 3: if (data & 0b0111) == 2: data = data & 0b1000 | 4 elif (data & 0b0111) == 3: data = data & 0b1000 | 5 elif (data & 0b0111) == 4: data = data & 0b1000 | 3 @@ -1191,19 +1191,19 @@ def piston(self, blockid, data): # sticky and normal piston shaft @material(blockid=34, data=[0,1,2,3,4,5,8,9,10,11,12,13], transparent=True, nospawn=True) def piston_extension(self, blockid, data): - # first, north rotation + # first, rotation # Masked to not clobber block head/foot info - if self.north == 'upper-left': + if self.rotation == 1: if (data & 0b0111) == 2: data = data & 0b1000 | 5 elif (data & 0b0111) == 3: data = data & 0b1000 | 4 elif (data & 0b0111) == 4: data = data & 0b1000 | 2 elif (data & 0b0111) == 5: data = data & 0b1000 | 3 - elif self.north == 'upper-right': + elif self.rotation == 2: if (data & 0b0111) == 2: data = data & 0b1000 | 3 elif (data & 0b0111) == 3: data = data & 0b1000 | 2 elif (data & 0b0111) == 4: data = data & 0b1000 | 5 elif (data & 0b0111) == 5: data = data & 0b1000 | 4 - elif self.north == 'lower-right': + elif self.rotation == 3: if (data & 0b0111) == 2: data = data & 0b1000 | 4 elif (data & 0b0111) == 3: data = data & 0b1000 | 5 elif (data & 0b0111) == 4: data = data & 0b1000 | 3 @@ -1401,18 +1401,18 @@ block(blockid=49, top_index=37) # torch, redstone torch (off), redstone torch(on) @material(blockid=[50, 75, 76], data=[1, 2, 3, 4, 5], transparent=True) def torches(self, blockid, data): - # first, north rotations - if self.north == 'upper-left': + # first, rotations + if self.rotation == 1: if data == 1: data = 3 elif data == 2: data = 4 elif data == 3: data = 2 elif data == 4: data = 1 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 1: data = 2 elif data == 2: data = 1 elif data == 3: data = 4 elif data == 4: data = 3 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 1: data = 4 elif data == 2: data = 3 elif data == 3: data = 1 @@ -1492,18 +1492,18 @@ block(blockid=52, top_index=34, transparent=True) @material(blockid=[53,67,108,109,114], data=range(4), transparent=True, solid=True, nospawn=True) def stairs(self, blockid, data): - # first, north rotations - if self.north == 'upper-left': + # first, rotations + if self.rotation == 1: if data == 0: data = 2 elif data == 1: data = 3 elif data == 2: data = 1 elif data == 3: data = 0 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 0: data = 1 elif data == 1: data = 0 elif data == 2: data = 3 elif data == 3: data = 2 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 0: data = 3 elif data == 1: data = 2 elif data == 2: data = 0 @@ -1590,7 +1590,7 @@ def chests(self, blockid, data): # or it's a double chest, first half or second half (left to right). # The last two bits store the orientation. - # No need for north stuff, uses pseudo data and rotates with the map + # No need for rotation stuff, uses pseudo data and rotates with the map top = self.terrain_images[25] side = self.terrain_images[26] @@ -1751,12 +1751,12 @@ def farmland(self, blockid, data): @material(blockid=63, data=range(16), transparent=True) def signpost(self, blockid, data): - # first north rotations - if self.north == 'upper-left': + # first rotations + if self.rotation == 1: data = (data + 4) % 16 - elif self.north == 'upper-right': + elif self.rotation == 2: data = (data + 8) % 16 - elif self.north == 'lower-right': + elif self.rotation == 3: data = (data + 12) % 16 texture = self.terrain_images[4].copy() @@ -1804,17 +1804,17 @@ def signpost(self, blockid, data): @material(blockid=[64,71], data=range(16), transparent=True) def door(self, blockid, data): #Masked to not clobber block top/bottom & swung info - if self.north == 'upper-left': + if self.rotation == 1: if (data & 0b0011) == 0: data = data & 0b1100 | 1 elif (data & 0b0011) == 1: data = data & 0b1100 | 2 elif (data & 0b0011) == 2: data = data & 0b1100 | 3 elif (data & 0b0011) == 3: data = data & 0b1100 | 0 - elif self.north == 'upper-right': + elif self.rotation == 2: if (data & 0b0011) == 0: data = data & 0b1100 | 2 elif (data & 0b0011) == 1: data = data & 0b1100 | 3 elif (data & 0b0011) == 2: data = data & 0b1100 | 0 elif (data & 0b0011) == 3: data = data & 0b1100 | 1 - elif self.north == 'lower-right': + elif self.rotation == 3: if (data & 0b0011) == 0: data = data & 0b1100 | 3 elif (data & 0b0011) == 1: data = data & 0b1100 | 0 elif (data & 0b0011) == 2: data = data & 0b1100 | 1 @@ -1872,20 +1872,20 @@ def door(self, blockid, data): # ladder @material(blockd=65, data=[2, 3, 4, 5], transparent=True) -def ladder(blockid, data, north): +def ladder(self, blockid, data): - # first north rotations - if north == 'upper-left': + # first rotations + if self.rotation == 1: if data == 2: data = 5 elif data == 3: data = 4 elif data == 4: data = 2 elif data == 5: data = 3 - elif north == 'upper-right': + elif self.rotation == 2: if data == 2: data = 3 elif data == 3: data = 2 elif data == 4: data = 5 elif data == 5: data = 4 - elif north == 'lower-right': + elif self.rotation == 3: if data == 2: data = 4 elif data == 3: data = 5 elif data == 4: data = 3 @@ -1919,18 +1919,18 @@ def ladder(blockid, data, north): @material(blockid=68, data=[2, 3, 4, 5], transparent=True) def wall_sign(self, blockid, data): # wall sign - # first north rotations - if self.north == 'upper-left': + # first rotations + if self.rotation == 1: if data == 2: data = 5 elif data == 3: data = 4 elif data == 4: data = 2 elif data == 5: data = 3 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 2: data = 3 elif data == 3: data = 2 elif data == 4: data = 5 elif data == 5: data = 4 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 2: data = 4 elif data == 3: data = 5 elif data == 4: data = 3 @@ -1975,13 +1975,13 @@ def wall_sign(self, blockid, data): # wall sign # levers @material(blockid=69, data=range(16), transparent=True) def levers(self, blockid, data): - # first north rotations if data & 8 == 8: powered = True else: powered = False data = data & 7 - if self.north == 'upper-left': + # first rotations + if self.rotation == 1: # on wall levers if data == 1: data = 3 elif data == 2: data = 4 @@ -1990,14 +1990,14 @@ def levers(self, blockid, data): # on floor levers elif data == 5: data = 6 elif data == 6: data = 5 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 1: data = 2 elif data == 2: data = 1 elif data == 3: data = 4 elif data == 4: data = 3 elif data == 5: data = 5 elif data == 6: data = 6 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 1: data = 4 elif data == 2: data = 3 elif data == 3: data = 1 @@ -2156,17 +2156,17 @@ def buttons(self, blockid, data): # it as unpressed data = data & 0x7 - if self.north == 'upper-left': + if self.rotation == 1: if data == 1: data = 3 elif data == 2: data = 4 elif data == 3: data = 2 elif data == 4: data = 1 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 1: data = 2 elif data == 2: data = 1 elif data == 3: data = 4 elif data == 4: data = 3 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 1: data = 4 elif data == 2: data = 3 elif data == 3: data = 1 @@ -2287,7 +2287,7 @@ def jukebox(self, blockid, data): # uses pseudo-ancildata found in iterate.c @material(blockid=[85, 113], data=range(16), transparent=True, nospawn=True) def fence(self, blockid, data): - # no need for north rotations, it uses pseudo data. + # no need for rotations, it uses pseudo data. # create needed images for Big stick fence if blockid == 85: # normal fence fence_top = self.terrain_images[4].copy() @@ -2383,18 +2383,18 @@ def fence(self, blockid, data): # pumpkin @material(blockid=[86, 91], data=range(4), solid=True) def pumpkin(self, blockid, data): # pumpkins, jack-o-lantern - # north rotation - if self.north == 'upper-left': + # rotation + if self.rotation == 1: if data == 0: data = 1 elif data == 1: data = 2 elif data == 2: data = 3 elif data == 3: data = 0 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 0: data = 2 elif data == 1: data = 3 elif data == 2: data = 0 elif data == 3: data = 1 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 0: data = 3 elif data == 1: data = 0 elif data == 2: data = 1 @@ -2429,7 +2429,7 @@ block(blockid=89, top_index=105) # portal @material(blockid=90, data=[1, 2, 4, 8], transparent=True) def portal(self, blockid, data): - # no north orientation uses pseudo data + # no rotations, uses pseudo data portaltexture = self.load_image("portal.png") img = Image.new("RGBA", (24,24), self.bgcolor) @@ -2477,19 +2477,19 @@ def cake(self, blockid, data): # redstone repeaters ON and OFF @material(blockid=[93,94], data=range(16), transparent=True, nospawn=True) def repeater(self, blockid, data): - # north rotation + # rotation # Masked to not clobber delay info - if self.north == 'upper-left': + if self.rotation == 1: if (data & 0b0011) == 0: data = data & 0b1100 | 1 elif (data & 0b0011) == 1: data = data & 0b1100 | 2 elif (data & 0b0011) == 2: data = data & 0b1100 | 3 elif (data & 0b0011) == 3: data = data & 0b1100 | 0 - elif self.north == 'upper-right': + elif self.rotation == 2: if (data & 0b0011) == 0: data = data & 0b1100 | 2 elif (data & 0b0011) == 1: data = data & 0b1100 | 3 elif (data & 0b0011) == 2: data = data & 0b1100 | 0 elif (data & 0b0011) == 3: data = data & 0b1100 | 1 - elif self.north == 'lower-right': + elif self.rotation == 3: if (data & 0b0011) == 0: data = data & 0b1100 | 3 elif (data & 0b0011) == 1: data = data & 0b1100 | 0 elif (data & 0b0011) == 2: data = data & 0b1100 | 1 @@ -2624,19 +2624,19 @@ def repeater(self, blockid, data): @material(blockid=96, data=range(8), transparent=True, nospawn=True) def trapdoor(self, blockid, data): - # north rotation + # rotation # Masked to not clobber opened/closed info - if self.north == 'upper-left': + if self.rotation == 1: if (data & 0b0011) == 0: data = data & 0b1100 | 3 elif (data & 0b0011) == 1: data = data & 0b1100 | 2 elif (data & 0b0011) == 2: data = data & 0b1100 | 0 elif (data & 0b0011) == 3: data = data & 0b1100 | 1 - elif self.north == 'upper-right': + elif self.rotation == 2: if (data & 0b0011) == 0: data = data & 0b1100 | 1 elif (data & 0b0011) == 1: data = data & 0b1100 | 0 elif (data & 0b0011) == 2: data = data & 0b1100 | 3 elif (data & 0b0011) == 3: data = data & 0b1100 | 2 - elif self.north == 'lower-right': + elif self.rotation == 3: if (data & 0b0011) == 0: data = data & 0b1100 | 2 elif (data & 0b0011) == 1: data = data & 0b1100 | 3 elif (data & 0b0011) == 2: data = data & 0b1100 | 1 @@ -2690,8 +2690,8 @@ def stone_brick(self, blockid, data): # huge brown and red mushroom @material(blockid=[99,100], data=range(11), solid=True) def huge_mushroom(self, blockid, data): - # north rotation - if self.north == 'upper-left': + # rotation + if self.rotation == 1: if data == 1: data = 3 elif data == 2: data = 6 elif data == 3: data = 9 @@ -2700,7 +2700,7 @@ def huge_mushroom(self, blockid, data): elif data == 7: data = 1 elif data == 8: data = 4 elif data == 9: data = 7 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 1: data = 9 elif data == 2: data = 8 elif data == 3: data = 7 @@ -2709,7 +2709,7 @@ def huge_mushroom(self, blockid, data): elif data == 7: data = 3 elif data == 8: data = 2 elif data == 9: data = 1 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 1: data = 7 elif data == 2: data = 4 elif data == 3: data = 1 @@ -2768,7 +2768,7 @@ def huge_mushroom(self, blockid, data): # at the moment is not used @material(blockid=[101,102], data=range(16), transparent=True, nospawn=True) def panes(self, blockid, data): - # no north rotation, uses pseudo data + # no rotation, uses pseudo data if blockid == 101: # iron bars t = self.terrain_images[85] @@ -2835,7 +2835,7 @@ def stem(self, blockid, data): # vines @material(blockid=106, data=range(16), transparent=True) def vines(self, blockid, data): - # north rotation + # rotation # vines data is bit coded. decode it first. # NOTE: the directions used in this function are the new ones used # in minecraft 1.0.0, no the ones used by overviewer @@ -2843,11 +2843,11 @@ def vines(self, blockid, data): # rotate the data by bitwise shift shifts = 0 - if self.north == 'upper-left': + if self.rotation == 1: shifts = 1 - elif self.north == 'upper-right': + elif self.rotation == 2: shifts = 2 - elif self.north == 'lower-right': + elif self.rotation == 3: shifts = 3 for i in range(shifts): @@ -2877,22 +2877,22 @@ def vines(self, blockid, data): @material(blockid=107, data=range(8), transparent=True, nospawn=True) def fence_gate(self, blockid, data): - # north rotation + # rotation opened = False if data & 0x4: data = data & 0x3 opened = True - if self.north == 'upper-left': + if self.rotation == 1: if data == 0: data = 1 elif data == 1: data = 2 elif data == 2: data = 3 elif data == 3: data = 0 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 0: data = 2 elif data == 1: data = 3 elif data == 2: data = 0 elif data == 3: data = 1 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 0: data = 3 elif data == 1: data = 0 elif data == 2: data = 1 @@ -2964,17 +2964,17 @@ block(blockid=110, top_index=78, side_index=77) # TODO the data-block orientation relation is not clear @material(blockid=111, data=range(4), transparent=True) def lilypad(self, blockid, data): - if self.north == 'upper-left': + if self.rotation == 1: if data == 0: data = 2 elif data == 1: data = 3 elif data == 2: data = 1 elif data == 3: data = 0 - elif self.north == 'upper-right': + elif self.rotation == 2: if data == 0: data = 1 elif data == 1: data = 0 elif data == 2: data = 3 elif data == 3: data = 2 - elif self.north == 'lower-right': + elif self.rotation == 3: if data == 0: data = 3 elif data == 1: data = 2 elif data == 2: data = 0