From 1ad82cf4b1e34bd744c141cd0605bccbc6b5d147 Mon Sep 17 00:00:00 2001 From: Alejandro Aguilera Date: Fri, 17 Dec 2010 12:52:47 +0100 Subject: [PATCH] New function in chunk.py that generates false ancillary data for fence like blocks. --- chunk.py | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/chunk.py b/chunk.py index 8f9731f..2ddab5d 100644 --- a/chunk.py +++ b/chunk.py @@ -324,6 +324,138 @@ class ChunkRenderer(object): return self._up_left_blocks up_left_blocks = property(_load_up_left_blocks) + def generate_pseudo_ancildata(self,x,y,z,blockid): + """ Generates a pseudo ancillary data for blocks that depend of + what are surrounded and don't have ancillary data""" + + blocks = self.blocks + up_left_blocks = self.up_left_blocks + up_right_blocks = self.up_right_blocks + left_blocks = self.left_blocks + right_blocks = self.right_blocks + + if ( # The block is surrounded by 0 blocks with same blockid + (up_right_blocks[0,y,z] != blockid if x == 15 else blocks[x+1,y,z] != blockid) and + (left_blocks[15,y,z] != blockid if x == 0 else blocks[x - 1,y,z] != blockid) and + (right_blocks[x,0,z] != blockid if y == 15 else blocks[x,y + 1,z] != blockid) and + (up_left_blocks[x,15,z] != blockid if y == 0 else blocks[x,y - 1,z] != blockid) + ): return 1 + + # Now 3 in line, they should be more common: + + elif ( # The block is surrounded by 2 blocks with same blockid, along x axis + (up_right_blocks[0,y,z] == blockid if x == 15 else blocks[x+1,y,z] == blockid) and + (left_blocks[15,y,z] == blockid if x == 0 else blocks[x - 1,y,z] == blockid) and + (right_blocks[x,0,z] != blockid if y == 15 else blocks[x,y + 1,z] != blockid) and + (up_left_blocks[x,15,z] != blockid if y == 0 else blocks[x,y - 1,z] != blockid) + ): return 2 + + elif ( # The block is surrounded by 2 blocks with same blockid, along y axis + (up_right_blocks[0,y,z] != blockid if x == 15 else blocks[x+1,y,z] != blockid) and + (left_blocks[15,y,z] != blockid if x == 0 else blocks[x - 1,y,z] != blockid) and + (right_blocks[x,0,z] == blockid if y == 15 else blocks[x,y + 1,z] == blockid) and + (up_left_blocks[x,15,z] == blockid if y == 0 else blocks[x,y - 1,z] == blockid) + ): return 3 + + # Now 3 in corner: + + elif ( # The block is surrounded by 2 blocks with same blockid, in a -y to x corner + (up_right_blocks[0,y,z] == blockid if x == 15 else blocks[x+1,y,z] == blockid) and + (left_blocks[15,y,z] != blockid if x == 0 else blocks[x - 1,y,z] != blockid) and + (right_blocks[x,0,z] != blockid if y == 15 else blocks[x,y + 1,z] != blockid) and + (up_left_blocks[x,15,z] == blockid if y == 0 else blocks[x,y - 1,z] == blockid) + ): return 4 + + elif ( # The block is surrounded by 2 blocks with same blockid, in a -y to -x corner + (up_right_blocks[0,y,z] != blockid if x == 15 else blocks[x+1,y,z] != blockid) and + (left_blocks[15,y,z] == blockid if x == 0 else blocks[x - 1,y,z] == blockid) and + (right_blocks[x,0,z] != blockid if y == 15 else blocks[x,y + 1,z] != blockid) and + (up_left_blocks[x,15,z] == blockid if y == 0 else blocks[x,y - 1,z] == blockid) + ): return 5 + + elif ( # The block is surrounded by 2 blocks with same blockid, in a y to -x corner + (up_right_blocks[0,y,z] != blockid if x == 15 else blocks[x+1,y,z] != blockid) and + (left_blocks[15,y,z] == blockid if x == 0 else blocks[x - 1,y,z] == blockid) and + (right_blocks[x,0,z] == blockid if y == 15 else blocks[x,y + 1,z] == blockid) and + (up_left_blocks[x,15,z] != blockid if y == 0 else blocks[x,y - 1,z] != blockid) + ): return 6 + + elif ( # The block is surrounded by 2 blocks with same blockid, in a y to x corner + (up_right_blocks[0,y,z] == blockid if x == 15 else blocks[x+1,y,z] == blockid) and + (left_blocks[15,y,z] != blockid if x == 0 else blocks[x - 1,y,z] != blockid) and + (right_blocks[x,0,z] == blockid if y == 15 else blocks[x,y + 1,z] == blockid) and + (up_left_blocks[x,15,z] != blockid if y == 0 else blocks[x,y - 1,z] != blockid) + ): return 7 + + # Now 1 in dead end: + + elif ( # The block is surrounded by 1 blocks with same blockid, in +x + (up_right_blocks[0,y,z] == blockid if x == 15 else blocks[x+1,y,z] == blockid) and + (left_blocks[15,y,z] != blockid if x == 0 else blocks[x - 1,y,z] != blockid) and + (right_blocks[x,0,z] != blockid if y == 15 else blocks[x,y + 1,z] != blockid) and + (up_left_blocks[x,15,z] != blockid if y == 0 else blocks[x,y - 1,z] != blockid) + ): return 8 + + elif ( # The block is surrounded by 1 blocks with same blockid, in -y + (up_right_blocks[0,y,z] != blockid if x == 15 else blocks[x+1,y,z] != blockid) and + (left_blocks[15,y,z] != blockid if x == 0 else blocks[x - 1,y,z] != blockid) and + (right_blocks[x,0,z] != blockid if y == 15 else blocks[x,y + 1,z] != blockid) and + (up_left_blocks[x,15,z] == blockid if y == 0 else blocks[x,y - 1,z] == blockid) + ): return 9 + + elif ( # The block is surrounded by 1 blocks with same blockid, in -x + (up_right_blocks[0,y,z] != blockid if x == 15 else blocks[x+1,y,z] != blockid) and + (left_blocks[15,y,z] == blockid if x == 0 else blocks[x - 1,y,z] == blockid) and + (right_blocks[x,0,z] != blockid if y == 15 else blocks[x,y + 1,z] != blockid) and + (up_left_blocks[x,15,z] != blockid if y == 0 else blocks[x,y - 1,z] != blockid) + ): return 10 + + elif ( # The block is surrounded by 1 blocks with same blockid, in +y + (up_right_blocks[0,y,z] != blockid if x == 15 else blocks[x+1,y,z] != blockid) and + (left_blocks[15,y,z] != blockid if x == 0 else blocks[x - 1,y,z] != blockid) and + (right_blocks[x,0,z] == blockid if y == 15 else blocks[x,y + 1,z] == blockid) and + (up_left_blocks[x,15,z] != blockid if y == 0 else blocks[x,y - 1,z] != blockid) + ): return 11 + + # Now surrounded by 3 identical blocks: + + elif ( # The block is surrounded by 3 blocks with same blockid, in postiions -x, -y, +x + (up_right_blocks[0,y,z] == blockid if x == 15 else blocks[x+1,y,z] == blockid) and + (left_blocks[15,y,z] == blockid if x == 0 else blocks[x - 1,y,z] == blockid) and + (right_blocks[x,0,z] != blockid if y == 15 else blocks[x,y + 1,z] != blockid) and + (up_left_blocks[x,15,z] == blockid if y == 0 else blocks[x,y - 1,z] == blockid) + ): return 12 + + elif ( # The block is surrounded by 3 blocks with same blockid, in postiions +y, -y, -x + (up_right_blocks[0,y,z] != blockid if x == 15 else blocks[x+1,y,z] != blockid) and + (left_blocks[15,y,z] == blockid if x == 0 else blocks[x - 1,y,z] == blockid) and + (right_blocks[x,0,z] == blockid if y == 15 else blocks[x,y + 1,z] == blockid) and + (up_left_blocks[x,15,z] == blockid if y == 0 else blocks[x,y - 1,z] == blockid) + ): return 13 + + elif ( # The block is surrounded by 3 blocks with same blockid, in postiions -x, +y, +x + (up_right_blocks[0,y,z] == blockid if x == 15 else blocks[x+1,y,z] == blockid) and + (left_blocks[15,y,z] == blockid if x == 0 else blocks[x - 1,y,z] == blockid) and + (right_blocks[x,0,z] == blockid if y == 15 else blocks[x,y + 1,z] == blockid) and + (up_left_blocks[x,15,z] != blockid if y == 0 else blocks[x,y - 1,z] != blockid) + ): return 14 + + elif ( # The block is surrounded by 3 blocks with same blockid, in postiions +y, -y, +x + (up_right_blocks[0,y,z] == blockid if x == 15 else blocks[x+1,y,z] == blockid) and + (left_blocks[15,y,z] != blockid if x == 0 else blocks[x - 1,y,z] != blockid) and + (right_blocks[x,0,z] == blockid if y == 15 else blocks[x,y + 1,z] == blockid) and + (up_left_blocks[x,15,z] == blockid if y == 0 else blocks[x,y - 1,z] == blockid) + ): return 15 + + # Block completely sourrounded by 4 blocks: + + elif ( # The block is surrounded completely + (up_right_blocks[0,y,z] == blockid if x == 15 else blocks[x+1,y,z] == blockid) and + (left_blocks[15,y,z] == blockid if x == 0 else blocks[x - 1,y,z] == blockid) and + (right_blocks[x,0,z] == blockid if y == 15 else blocks[x,y + 1,z] == blockid) and + (up_left_blocks[x,15,z] == blockid if y == 0 else blocks[x,y - 1,z] == blockid) + ): return 16 + def _hash_blockarray(self): """Finds a hash of the block array""" if hasattr(self, "_digest"):