0

Improvements for generate_pseudo_andcildata in chunk.py, and necessary changes to fences case in textures.py

This changes will help to properly render redstonewire.
This commit is contained in:
Alejandro Aguilera
2011-01-13 17:46:13 +01:00
parent 5bf705dfe9
commit 448733dd44
2 changed files with 43 additions and 137 deletions

View File

@@ -365,7 +365,7 @@ 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, north_position = ll ):
def generate_pseudo_ancildata(self,x,y,z,blockid, north_position = 0 ):
""" Generates a pseudo ancillary data for blocks that depend of
what are surrounded and don't have ancillary data
@@ -374,12 +374,22 @@ class ChunkRenderer(object):
Bit: 1 2 3 4
Side: x y -x -y
Values: bit = 0 -> The corresponding side block is not blockid
bit = 1 -> The corresponding side block is not blockid
Values: bit = 0 -> The corresponding side block has different blockid
bit = 1 -> The corresponding side block has same blockid
Example: if the bit1 is 1 that means that there is a block with
blockid in the side of the +x direction.
Once generate the pseudo_ancildata
You can rotate the pseudo data multiplying by 2 and
if it is > 15 subtracting 15 and adding 1. (moving bits
in the left direction is like rotate 90 degree in anticlockwise
direction). In this way can be used for maps with other
north orientation.
North position can have the values 0, 1, 2, 3, corresponding to
north in bottom-left, bottom-right, top-right and top-left of
the screen.
The rotation feature is not used anywhere yet.
"""
blocks = self.blocks
@@ -389,50 +399,40 @@ class ChunkRenderer(object):
right_blocks = self.right_blocks
pseudo_data = 0
# ll, ul, ur, lr stands for lower-left, upper-left, upper-right
# and lower-right
# check if we are in the border of a chunk and the chunk
# is in the border of the map
if up_right_blocks[0,0,0] == None and x == 15 or
right_blocks[0,0,0] == None and y == 15 or
left_blocks[0,0,0] == None and x == 0 or
up_left_blocks[0,0,0] == None and y == 0:
if ((up_right_blocks[0,0,0] == None and x == 15) or
(right_blocks[0,0,0] == None and y == 15) or
(left_blocks[0,0,0] == None and x == 0) or
(up_left_blocks[0,0,0] == None and y == 0)):
return None
if up_right_blocks[0,y,z] == blockid if x == 15 else blocks[x+1,y,z] == blockid:
pseudo_data |= 0b1000
pseudo_data = pseudo_data | 0b1000
if right_blocks[x,0,z] == blockid if y == 15 else blocks[x,y + 1,z] == blockid:
pseudo_data |= 0b0100
pseudo_data = pseudo_data | 0b0100
if left_blocks[15,y,z] == blockid if x == 0 else blocks[x - 1,y,z] == blockid:
pseudo_data |= 0b0010
pseudo_data = pseudo_data | 0b0010
if up_left_blocks[x,15,z] == blockid if y == 0 else blocks[x,y - 1,z] == blockid:
pseudo_data |= 0b0001
if north_position == ll:
return pseudo_data
pseudo_data = pseudo_data | 0b0001
while north_position > 0:
pseudo_data *= 2
if pseudo_data > 15:
pseudo_data -= 16
pseudo_data +=1
north_position -= 1
elif north_position == ul:
pseudo_data *= 2
if pseudo_data > 15:
pseudo_data -= 15
pseudo_data +=1
return pseudo_data
elif north_position == ul:
pseudo_data *= 2
if pseudo_data > 15:
pseudo_data -= 15
pseudo_data +=1
elif north_position == ul:
pseudo_data *= 2
if pseudo_data > 15:
pseudo_data -= 15
pseudo_data +=1
return pseudo_data
def _hash_blockarray(self):
"""Finds a hash of the block array"""
if hasattr(self, "_digest"):

View File

@@ -761,115 +761,21 @@ def generate_special_texture(blockID, data):
# +y axis points bottom right direction
# First compose small sticks in the back of the image,
# then big stick and thecn small sticks in the front.
if data == 1:
img = fence_big
return (img.convert("RGB"),img.split()[3])
elif data == 2: #fence in line with x axis
if (data & 0b0001) == 1:
composite.alpha_over(img,fence_small_side, pos_top_left,fence_small_side) # top left
if (data & 0b1000) == 8:
composite.alpha_over(img,fence_small_other_side, pos_top_right,fence_small_other_side) # top right
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_other_side, pos_bottom_left,fence_small_other_side) # bottom left
return (img.convert("RGB"),img.split()[3])
elif data == 3: #fence in line with y axis
composite.alpha_over(img,fence_small_side, pos_top_left,fence_small_side) # top left
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_side, pos_bottom_right,fence_small_side) # bottom right
return (img.convert("RGB"),img.split()[3])
elif data == 4: #fence corner +x, -y
composite.alpha_over(img,fence_small_other_side, pos_top_right,fence_small_other_side) # top right
composite.alpha_over(img,fence_small_side, pos_top_left,fence_small_side) # top left
composite.alpha_over(img,fence_big,(0,0),fence_big)
return (img.convert("RGB"),img.split()[3])
elif data == 5: #fence corner -x, -y
composite.alpha_over(img,fence_small_side, pos_top_left,fence_small_side) # top left
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_other_side, pos_bottom_left,fence_small_other_side) # bottom left
return (img.convert("RGB"),img.split()[3])
elif data == 6: #fence corner -x, +y
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_side, pos_bottom_right,fence_small_side) # bottom right
composite.alpha_over(img,fence_small_other_side, pos_bottom_left,fence_small_other_side) # bottom left
return (img.convert("RGB"),img.split()[3])
composite.alpha_over(img,fence_big,(0,0),fence_big)
elif data == 7: #fence corner +x, +y
composite.alpha_over(img,fence_small_other_side, pos_top_right,fence_small_other_side) # top right
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_side, pos_bottom_right,fence_small_side) # bottom right
return (img.convert("RGB"),img.split()[3])
elif data == 8: #fence dead end +x
composite.alpha_over(img,fence_small_other_side, pos_top_right,fence_small_other_side) # top right
composite.alpha_over(img,fence_big,(0,0),fence_big)
return (img.convert("RGB"),img.split()[3])
elif data == 9: #fence dead end -y
composite.alpha_over(img,fence_small_side, pos_top_left,fence_small_side) # top left
composite.alpha_over(img,fence_big,(0,0),fence_big)
return (img.convert("RGB"),img.split()[3])
elif data == 10: #fence dead end -x
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_other_side, pos_bottom_left,fence_small_other_side) # bottom left
return (img.convert("RGB"),img.split()[3])
elif data == 11: #fence dead end +y
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_side, pos_bottom_right,fence_small_side) # bottom right
return (img.convert("RGB"),img.split()[3])
elif data == 12: #fence cross with +y missing
composite.alpha_over(img,fence_small_side, pos_top_left,fence_small_side) # top left
composite.alpha_over(img,fence_small_other_side, pos_top_right,fence_small_other_side) # top right
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_other_side, pos_bottom_left,fence_small_other_side) # bottom left
return (img.convert("RGB"),img.split()[3])
elif data == 13: #fence cross with +x missing
composite.alpha_over(img,fence_small_side, pos_top_left,fence_small_side) # top left
composite.alpha_over(img,fence_big,(0,0),fence_big)
if (data & 0b0010) == 2:
composite.alpha_over(img,fence_small_other_side, pos_bottom_left,fence_small_other_side) # bottom left
if (data & 0b0100) == 4:
composite.alpha_over(img,fence_small_side, pos_bottom_right,fence_small_side) # bottom right
return (img.convert("RGB"),img.split()[3])
elif data == 14: #fence cross with -y missing
composite.alpha_over(img,fence_small_other_side, pos_top_right,fence_small_other_side) # top right
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_other_side, pos_bottom_left,fence_small_other_side) # bottom left
composite.alpha_over(img,fence_small_side, pos_bottom_right,fence_small_side) # bottom right
return (img.convert("RGB"),img.split()[3])
elif data == 15: #fence cross with -x missing
composite.alpha_over(img,fence_small_side, pos_top_left,fence_small_side) # top left
composite.alpha_over(img,fence_small_other_side, pos_top_right,fence_small_other_side) # top right
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_side, pos_bottom_right,fence_small_side) # bottom right
return (img.convert("RGB"),img.split()[3])
elif data == 16: #fence cross
composite.alpha_over(img,fence_small_side, pos_top_left,fence_small_side) # top left
composite.alpha_over(img,fence_small_other_side, pos_top_right,fence_small_other_side) # top right
composite.alpha_over(img,fence_big,(0,0),fence_big)
composite.alpha_over(img,fence_small_other_side, pos_bottom_left,fence_small_other_side) # bottom left
composite.alpha_over(img,fence_small_side, pos_bottom_right,fence_small_side) # bottom right
return (img.convert("RGB"),img.split()[3])
elif data == None: # This can happend if a fence is in the border
# of a chunk and the chunk is in the border of the map.
composite.alpha_over(img,fence_big,(0,0),)
return (img.convert("RGB"), img.split()[3])
else: # just in case
composite.alpha_over(img,fence_big,(0,0),)
return (img.convert("RGB"), img.split()[3])
return (img.convert("RGB"),img.split()[3])
return None