initial stab at lighting support
This commit is contained in:
44
chunk.py
44
chunk.py
@@ -54,11 +54,26 @@ def get_blockarray_fromfile(filename):
|
|||||||
return get_blockarray(level)
|
return get_blockarray(level)
|
||||||
|
|
||||||
def get_skylight_array(level):
|
def get_skylight_array(level):
|
||||||
"""Returns the skylight array. Remember this is 4 bits per block, so divide
|
"""Returns the skylight array. This is 4 bits per block, but it is
|
||||||
the z component by 2 when accessing the array. and mask off the top or
|
expanded for you so you may index it normally."""
|
||||||
bottom 4 bits if it's odd or even respectively
|
skylight = numpy.frombuffer(level['SkyLight'], dtype=numpy.uint8).reshape((16,16,64))
|
||||||
"""
|
# this array is 2 blocks per byte, so expand it
|
||||||
return numpy.frombuffer(level['SkyLight'], dtype=numpy.uint8).reshape((16,16,64))
|
skylight_expanded = numpy.empty((16,16,128), dtype=numpy.uint8)
|
||||||
|
# Even elements get the lower 4 bits
|
||||||
|
skylight_expanded[:,:,::2] = skylight & 0x0F
|
||||||
|
# Odd elements get the upper 4 bits
|
||||||
|
skylight_expanded[:,:,1::2] = (skylight & 0xF0) >> 4
|
||||||
|
return skylight_expanded
|
||||||
|
|
||||||
|
def get_blocklight_array(level):
|
||||||
|
"""Returns the blocklight array. This is 4 bits per block, but it
|
||||||
|
is expanded for you so you may index it normally."""
|
||||||
|
# expand just like get_skylight_array()
|
||||||
|
blocklight = numpy.frombuffer(level['BlockLight'], dtype=numpy.uint8).reshape((16,16,64))
|
||||||
|
blocklight_expanded = numpy.empty((16,16,128), dtype=numpy.uint8)
|
||||||
|
blocklight_expanded[:,:,::2] = blocklight & 0x0F
|
||||||
|
blocklight_expanded[:,:,1::2] = (blocklight & 0xF0) >> 4
|
||||||
|
return blocklight_expanded
|
||||||
|
|
||||||
# This set holds blocks ids that can be seen through, for occlusion calculations
|
# This set holds blocks ids that can be seen through, for occlusion calculations
|
||||||
transparent_blocks = set([0, 6, 8, 9, 18, 20, 37, 38, 39, 40, 50, 51, 52, 53,
|
transparent_blocks = set([0, 6, 8, 9, 18, 20, 37, 38, 39, 40, 50, 51, 52, 53,
|
||||||
@@ -219,24 +234,18 @@ class ChunkRenderer(object):
|
|||||||
rendered, and blocks are drawn with a color tint depending on their
|
rendered, and blocks are drawn with a color tint depending on their
|
||||||
depth."""
|
depth."""
|
||||||
blocks = self.blocks
|
blocks = self.blocks
|
||||||
if cave:
|
|
||||||
skylight = get_skylight_array(self.level)
|
skylight = get_skylight_array(self.level)
|
||||||
|
blocklight = get_blocklight_array(self.level)
|
||||||
|
|
||||||
|
if cave:
|
||||||
# Cave mode. Actually go through and 0 out all blocks that are not in a
|
# Cave mode. Actually go through and 0 out all blocks that are not in a
|
||||||
# cave, so that it only renders caves.
|
# cave, so that it only renders caves.
|
||||||
|
|
||||||
# 1st task: this array is 2 blocks per byte, expand it so we can just
|
|
||||||
# do a bitwise and on the arrays
|
|
||||||
skylight_expanded = numpy.empty((16,16,128), dtype=numpy.uint8)
|
|
||||||
# Even elements get the lower 4 bits
|
|
||||||
skylight_expanded[:,:,::2] = skylight & 0x0F
|
|
||||||
# Odd elements get the upper 4 bits
|
|
||||||
skylight_expanded[:,:,1::2] = skylight >> 4
|
|
||||||
|
|
||||||
# Places where the skylight is not 0 (there's some amount of skylight
|
# Places where the skylight is not 0 (there's some amount of skylight
|
||||||
# touching it) change it to something that won't get rendered, AND
|
# touching it) change it to something that won't get rendered, AND
|
||||||
# won't get counted as "transparent".
|
# won't get counted as "transparent".
|
||||||
blocks = blocks.copy()
|
blocks = blocks.copy()
|
||||||
blocks[skylight_expanded != 0] = 21
|
blocks[skylight != 0] = 21
|
||||||
|
|
||||||
|
|
||||||
# Each block is 24x24
|
# Each block is 24x24
|
||||||
@@ -310,7 +319,9 @@ class ChunkRenderer(object):
|
|||||||
if cave:
|
if cave:
|
||||||
img.paste(Image.blend(t[0],depth_colors[z],0.3), (imgx, imgy), t[1])
|
img.paste(Image.blend(t[0],depth_colors[z],0.3), (imgx, imgy), t[1])
|
||||||
else:
|
else:
|
||||||
img.paste(t[0], (imgx, imgy), t[1])
|
light_coeff = pow(0.95, 15 - max(blocklight[x,y,z], skylight[x,y,z]))
|
||||||
|
img.paste(Image.blend(t[0], black_color, 1.0 - light_coeff), (imgx, imgy), t[1])
|
||||||
|
#img.paste(t[0], (imgx, imgy), t[1])
|
||||||
|
|
||||||
# Draw edge lines
|
# Draw edge lines
|
||||||
if blockid not in transparent_blocks:
|
if blockid not in transparent_blocks:
|
||||||
@@ -347,4 +358,5 @@ def generate_depthcolors():
|
|||||||
g -= 7
|
g -= 7
|
||||||
|
|
||||||
return depth_colors
|
return depth_colors
|
||||||
|
black_color = Image.new("RGB", (24,24), (0,0,0))
|
||||||
depth_colors = generate_depthcolors()
|
depth_colors = generate_depthcolors()
|
||||||
|
|||||||
Reference in New Issue
Block a user