From 8138ec29c08c5e3095004099188fd254382c26b0 Mon Sep 17 00:00:00 2001 From: Alejandro Aguilera Date: Mon, 1 Aug 2011 14:19:22 +0200 Subject: [PATCH 1/9] Torches are now in the center of the block. Redstone dionde function generates its own torches now (it was using before the generated by the torch function). --- overviewer_core/textures.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index f7d4dfb..e11380f 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -892,10 +892,10 @@ def generate_special_texture(blockID, data): ImageDraw.Draw(slice).rectangle((6,0,12,12),outline=(0,0,0,0),fill=(0,0,0,0)) ImageDraw.Draw(slice).rectangle((0,0,4,12),outline=(0,0,0,0),fill=(0,0,0,0)) - composite.alpha_over(img, slice, (6,4)) - composite.alpha_over(img, small_crop, (5,5)) - composite.alpha_over(img, small_crop, (6,5)) - composite.alpha_over(img, slice, (6,6)) + composite.alpha_over(img, slice, (7,5)) + composite.alpha_over(img, small_crop, (6,6)) + composite.alpha_over(img, small_crop, (7,6)) + composite.alpha_over(img, slice, (7,7)) return generate_texture_tuple(img, blockID) @@ -1390,7 +1390,6 @@ def generate_special_texture(blockID, data): ImageDraw.Draw(fence_top).rectangle((0,0,15,5),outline=(0,0,0,0),fill=(0,0,0,0)) ImageDraw.Draw(fence_top).rectangle((0,10,15,15),outline=(0,0,0,0),fill=(0,0,0,0)) - ImageDraw.Draw(fence_side).rectangle((0,0,15,0),outline=(0,0,0,0),fill=(0,0,0,0)) ImageDraw.Draw(fence_side).rectangle((0,0,5,15),outline=(0,0,0,0),fill=(0,0,0,0)) ImageDraw.Draw(fence_side).rectangle((10,0,15,15),outline=(0,0,0,0),fill=(0,0,0,0)) @@ -1413,7 +1412,7 @@ def generate_special_texture(blockID, data): fence_big = Image.new("RGBA", (24,24), (38,92,255,0)) composite.alpha_over(fence_big,fence_side, (5,4),fence_side) composite.alpha_over(fence_big,fence_other_side, (7,4),fence_other_side) - composite.alpha_over(fence_big,fence_top, (0,1),fence_top) + composite.alpha_over(fence_big,fence_top, (0,0),fence_top) # Now render the small sticks. # Create needed images @@ -1531,9 +1530,7 @@ def generate_special_texture(blockID, data): if blockID in (93, 94): # redstone repeaters (diodes), ON and OFF - # NOTE: this function uses the redstone torches generated above, - # this must run after the function of the torches. - + # generate the diode top = terrain_images[131] if blockID == 93 else terrain_images[147] side = terrain_images[5] increment = 13 @@ -1551,12 +1548,22 @@ def generate_special_texture(blockID, data): top = top.rotate(90) img = _build_full_block( (top, increment), None, None, side, side) + + # compose a "3d" redstone torch + t = terrain_images[115].copy() if blockID == 93 else terrain_images[99].copy() + torch = Image.new("RGBA", (24,24), (38,92,255,0)) + + t_crop = t.crop((2,2,14,14)) + slice = t_crop.copy() + ImageDraw.Draw(slice).rectangle((6,0,12,12),outline=(0,0,0,0),fill=(0,0,0,0)) + ImageDraw.Draw(slice).rectangle((0,0,4,12),outline=(0,0,0,0),fill=(0,0,0,0)) + + composite.alpha_over(torch, slice, (6,4)) + composite.alpha_over(torch, t_crop, (5,5)) + composite.alpha_over(torch, t_crop, (6,5)) + composite.alpha_over(torch, slice, (6,6)) # paste redstone torches everywhere! - t = specialblockmap[(75,5)] if blockID == 93 else specialblockmap[(76,5)] - torch = t[0].copy() # textures are stored as tuples (RGB,A) - torch.putalpha(t[1]) - # the torch is too tall for the repeater, crop the bottom. ImageDraw.Draw(torch).rectangle((0,16,24,24),outline=(0,0,0,0),fill=(0,0,0,0)) From 04e7c20398b34fee28c0db406af8fdff120657fa Mon Sep 17 00:00:00 2001 From: Alejandro Aguilera Date: Tue, 2 Aug 2011 01:35:54 +0200 Subject: [PATCH 2/9] If nothing shown return None. In iterate.c this will skip the draw. --- overviewer_core/textures.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index e11380f..40a45bd 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -581,6 +581,10 @@ def generate_special_texture(blockID, data): side4 = texture # bottom right else: side4 = None + # if nothing shown do not draw at all + if top == side3 == side4 == None: + return None + img = _build_full_block(top,None,None,side3,side4) return generate_texture_tuple(img, blockID) From 4e659aee555ca85ed4f8635ed0ac53a615442fcc Mon Sep 17 00:00:00 2001 From: Alejandro Aguilera Date: Tue, 2 Aug 2011 01:48:25 +0200 Subject: [PATCH 3/9] Add global bgcolor variable in textures.py, and an option in generate(). --- overviewer_core/textures.py | 57 +++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 40a45bd..fb7f6c4 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -162,13 +162,13 @@ def transform_image_side(img, blockID=None): # (don't just crop img, since we want the size of # img to be unchanged mask = img.crop((0,8,16,16)) - n = Image.new(img.mode, img.size, (38,92,255,0)) + n = Image.new(img.mode, img.size, bgcolor) composite.alpha_over(n, mask,(0,0,16,8), mask) img = n if blockID in (78,): # snow # make the top three quarters transparent mask = img.crop((0,12,16,16)) - n = Image.new(img.mode, img.size, (38,92,255,0)) + n = Image.new(img.mode, img.size, bgcolor) composite.alpha_over(n, mask,(0,12,16,16), mask) img = n @@ -246,7 +246,7 @@ def _build_block(top, side, blockID=None): top and side should be 16x16 image objects. Returns a 24x24 image """ - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) original_texture = top.copy() top = transform_image(top, blockID) @@ -355,7 +355,7 @@ def _build_full_block(top, side1, side2, side3, side4, bottom=None, blockID=None side4 = side4.copy() ImageDraw.Draw(side4).rectangle((0, 0,16,crop_height),outline=(0,0,0,0),fill=(0,0,0,0)) - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) # first back sides if side1 != None : @@ -741,7 +741,7 @@ def generate_special_texture(blockID, data): ImageDraw.Draw(side_t).rectangle((0, 4,16,16),outline=(0,0,0,0),fill=(0,0,0,0)) # generate the horizontal piston extension stick - h_stick = Image.new("RGBA", (24,24), (38,92,255,0)) + h_stick = Image.new("RGBA", (24,24), bgcolor) temp = transform_image_side(side_t, blockID) composite.alpha_over(h_stick, temp, (1,7), temp) temp = transform_image(side_t.rotate(90)) @@ -752,7 +752,7 @@ def generate_special_texture(blockID, data): h_stick.putalpha(sidealpha) # generate the vertical piston extension stick - v_stick = Image.new("RGBA", (24,24), (38,92,255,0)) + v_stick = Image.new("RGBA", (24,24), bgcolor) temp = transform_image_side(side_t.rotate(90), blockID) composite.alpha_over(v_stick, temp, (12,6), temp) temp = temp.transpose(Image.FLIP_LEFT_RIGHT) @@ -768,7 +768,7 @@ def generate_special_texture(blockID, data): img = _build_full_block((back_t, 12) ,None ,None ,side_t, side_t) composite.alpha_over(img, v_stick, (0,-3), v_stick) elif data & 0x07 == 0x1: # up - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) img2 = _build_full_block(piston_t ,None ,None ,side_t, side_t) composite.alpha_over(img, v_stick, (0,4), v_stick) composite.alpha_over(img, img2, (0,0), img2) @@ -778,7 +778,7 @@ def generate_special_texture(blockID, data): composite.alpha_over(img, temp, (2,2), temp) composite.alpha_over(img, h_stick, (6,3), h_stick) elif data & 0x07 == 0x3: # west - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) img2 = _build_full_block(side_t.rotate(180) ,None ,None ,side_t.rotate(270), piston_t) composite.alpha_over(img, h_stick, (0,0), h_stick) composite.alpha_over(img, img2, (0,0), img2) @@ -786,7 +786,7 @@ def generate_special_texture(blockID, data): img = _build_full_block(side_t.rotate(90) ,None ,None , piston_t, side_t.rotate(270)) composite.alpha_over(img, h_stick.transpose(Image.FLIP_LEFT_RIGHT), (0,0), h_stick.transpose(Image.FLIP_LEFT_RIGHT)) elif data & 0x07 == 0x5: # south - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) img2 = _build_full_block(side_t.rotate(270) ,None ,None ,None, side_t.rotate(90)) temp = transform_image_side(back_t, blockID) composite.alpha_over(img2, temp, (10,2), temp) @@ -863,7 +863,7 @@ def generate_special_texture(blockID, data): # compose a torch bigger than the normal # (better for doing transformations) - torch = Image.new("RGBA", (16,16), (38,92,255,0)) + torch = Image.new("RGBA", (16,16), bgcolor) composite.alpha_over(torch,small,(-4,-3)) composite.alpha_over(torch,small,(-5,-2)) composite.alpha_over(torch,small,(-3,-2)) @@ -889,7 +889,7 @@ def generate_special_texture(blockID, data): elif data == 5: # standing on the floor # compose a "3d torch". - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) small_crop = small.crop((2,2,14,14)) slice = small_crop.copy() @@ -909,7 +909,7 @@ def generate_special_texture(blockID, data): side1 = transform_image_side(firetexture) side2 = transform_image_side(firetexture).transpose(Image.FLIP_LEFT_RIGHT) - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) composite.alpha_over(img, side1, (12,0), side1) composite.alpha_over(img, side2, (0,0), side2) @@ -956,14 +956,14 @@ def generate_special_texture(blockID, data): composite.alpha_over(img, tmp2, (0,6)) elif data == 1: # ascending north - img = Image.new("RGBA", (24,24), (38,92,255,0)) # first paste the texture in the back + img = Image.new("RGBA", (24,24), bgcolor) # first paste the texture in the back tmp1 = transform_image(half_block_r) composite.alpha_over(img, tmp1, (0,6)) tmp2 = _build_full_block(half_block_l, None, None, texture, side) composite.alpha_over(img, tmp2) elif data == 2: # ascending west - img = Image.new("RGBA", (24,24), (38,92,255,0)) # first paste the texture in the back + img = Image.new("RGBA", (24,24), bgcolor) # first paste the texture in the back tmp1 = transform_image(half_block_u) composite.alpha_over(img, tmp1, (0,6)) tmp2 = _build_full_block(half_block_d, None, None, side, texture) @@ -1080,7 +1080,7 @@ def generate_special_texture(blockID, data): bottom = redstone_wire_t.copy().rotate(90) else: - bottom = Image.new("RGBA", (16,16), (38,92,255,0)) + bottom = Image.new("RGBA", (16,16), bgcolor) if (data & 0b0001) == 1: composite.alpha_over(bottom,branch_top_left) @@ -1124,7 +1124,7 @@ def generate_special_texture(blockID, data): crop2 = transform_image_side(raw_crop, blockID) crop3 = crop2.transpose(Image.FLIP_LEFT_RIGHT) - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) composite.alpha_over(img, crop1, (0,12), crop1) composite.alpha_over(img, crop2, (6,3), crop2) composite.alpha_over(img, crop3, (6,3), crop3) @@ -1175,7 +1175,7 @@ def generate_special_texture(blockID, data): texture_stick = texture_stick.resize((12,12), Image.ANTIALIAS) ImageDraw.Draw(texture_stick).rectangle((2,0,12,12),outline=(0,0,0,0),fill=(0,0,0,0)) - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) # W N ~90 E S ~270 angles = (330.,345.,0.,15.,30.,55.,95.,120.,150.,165.,180.,195.,210.,230.,265.,310.) @@ -1213,7 +1213,7 @@ def generate_special_texture(blockID, data): swung=False # mask out the high bits to figure out the orientation - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) if (data & 0x03) == 0: # northeast corner if not swung: tex = transform_image_side(raw_door) @@ -1252,7 +1252,7 @@ def generate_special_texture(blockID, data): if blockID == 65: # ladder - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) raw_texture = terrain_images[83] #print "ladder is facing: %d" % data if data == 5: @@ -1277,7 +1277,7 @@ def generate_special_texture(blockID, data): if blockID in (27, 28, 66): # minetrack: - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) if blockID == 27: # powered rail if data & 0x8 == 0: # unpowered @@ -1360,7 +1360,7 @@ def generate_special_texture(blockID, data): texture.putpixel((x,y),(0,0,0,255)) """ - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) incrementx = 0 if data == 2: # east @@ -1413,7 +1413,7 @@ def generate_special_texture(blockID, data): fence_other_side.putalpha(othersidealpha) # Compose the fence big stick - fence_big = Image.new("RGBA", (24,24), (38,92,255,0)) + fence_big = Image.new("RGBA", (24,24), bgcolor) composite.alpha_over(fence_big,fence_side, (5,4),fence_side) composite.alpha_over(fence_big,fence_other_side, (7,4),fence_other_side) composite.alpha_over(fence_big,fence_top, (0,0),fence_top) @@ -1444,7 +1444,7 @@ def generate_special_texture(blockID, data): fence_small_side.putalpha(sidealpha) # Create img to compose the fence - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) # Position of fence small sticks in img. # These postitions are strange because the small sticks of the @@ -1494,7 +1494,7 @@ def generate_special_texture(blockID, data): if blockID == 90: # portal portaltexture = _load_image("portal.png") - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) side = transform_image_side(portaltexture) otherside = side.transpose(Image.FLIP_TOP_BOTTOM) @@ -1523,7 +1523,7 @@ def generate_special_texture(blockID, data): otherside = ImageEnhance.Brightness(otherside).enhance(0.8) otherside.putalpha(othersidealpha) - img = Image.new("RGBA", (24,24), (38,92,255,0)) + img = Image.new("RGBA", (24,24), bgcolor) composite.alpha_over(img, side, (1,6), side) composite.alpha_over(img, otherside, (11,7), otherside) # workaround, fixes a hole @@ -1555,7 +1555,7 @@ def generate_special_texture(blockID, data): # compose a "3d" redstone torch t = terrain_images[115].copy() if blockID == 93 else terrain_images[99].copy() - torch = Image.new("RGBA", (24,24), (38,92,255,0)) + torch = Image.new("RGBA", (24,24), bgcolor) t_crop = t.crop((2,2,14,14)) slice = t_crop.copy() @@ -1812,6 +1812,7 @@ special_map[18] = range(16) # leaves, birch, normal or pine leaves (not implemen special_map[31] = range(3) # tall grass, dead shrub, fern and tall grass itself # placeholders that are generated in generate() +bgcolor = None terrain_images = None blockmap = None biome_grass_texture = None @@ -1820,7 +1821,9 @@ biome_tall_fern_texture = None biome_leaf_texture = None specialblockmap = None -def generate(path=None,texture_size=24): +def generate(path=None,texture_size=24,bgc = (26,26,26,0)): + global bgcolor + bgcolor = bgc global _find_file_local_path, texture_dimensions _find_file_local_path = path texture_dimensions = (texture_size, texture_size) From f6bbda674e94f4239b709946b251e2ecbd3b7180 Mon Sep 17 00:00:00 2001 From: Alejandro Aguilera Date: Tue, 2 Aug 2011 02:18:45 +0200 Subject: [PATCH 4/9] Update comments in textures.py. --- overviewer_core/textures.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index fb7f6c4..77901ef 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -513,9 +513,7 @@ def generate_texture_tuple(img, blockid): def generate_special_texture(blockID, data): """Generates a special texture, such as a correctly facing minecraft track""" - #print "%s has ancillary data: %X" %(blockID, data) - # TODO ladders, stairs, levers, buttons, and signs - # all need to behandled here (and in chunkpy) + # blocks need to be handled here (and in chunk.py) if blockID == 2: # grass # data & 0x10 means SNOW sides @@ -1778,7 +1776,7 @@ special_map[51] = range(16) # fire, position in the block (not implemented) special_map[53] = range(4) # wooden stairs, orientation special_map[54] = range(12) # chests, orientation and type (single or double), uses pseudo data special_map[55] = range(128) # redstone wire, all the possible combinations, uses pseudo data -special_map[58] = (0,) # crafting table +special_map[58] = (0,) # crafting table, it has 2 different sides special_map[59] = range(8) # crops, grow from 0 to 7 special_map[61] = range(6) # furnace, orientation special_map[62] = range(6) # burning furnace, orientation @@ -1795,9 +1793,9 @@ special_map[85] = range(17) # fences, all the possible combination, uses pseudo special_map[86] = range(5) # pumpkin, orientation special_map[90] = (1,2,4,8) # portal, in 2 orientations, 4 cases, uses pseudo data special_map[91] = range(5) # jack-o-lantern, orientation -special_map[92] = range(6) # cake! -special_map[93] = range(16) # OFF redstone repeater, orientation and delay (delay not implemented) -special_map[94] = range(16) # ON redstone repeater, orientation and delay (delay not implemented) +special_map[92] = range(6) # cake, eaten amount, (not implemented) +special_map[93] = range(16) # OFF redstone repeater, orientation and delay +special_map[94] = range(16) # ON redstone repeater, orientation and delay special_map[96] = range(8) # trapdoor, open, closed, orientation # grass and leaves are graysacle in terrain.png From 26acd21fbf8b3175594729ff6f56e9b3e9ed216c Mon Sep 17 00:00:00 2001 From: Thomas Lake Date: Tue, 2 Aug 2011 19:42:16 +0100 Subject: [PATCH 5/9] Add percentage to the "X/Y tiles complete for level" message --- overviewer_core/rendernode.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/overviewer_core/rendernode.py b/overviewer_core/rendernode.py index 6f6c76e..054e2ea 100644 --- a/overviewer_core/rendernode.py +++ b/overviewer_core/rendernode.py @@ -132,8 +132,8 @@ class RenderNode(object): else: if not complete % 1000 == 0: return - logging.info("{0}/{1} tiles complete on level {2}/{3}".format( - complete, total, level, self.max_p)) + logging.info("{0}/{1} ({4}%) tiles complete on level {2}/{3}".format( + complete, total, level, self.max_p, '%.1f' % ( (100.0 * complete) / total) )) def go(self, procs): """Renders all tiles""" From 4070a79409979950fba7022196aa3ac738dd6694 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 2 Aug 2011 21:12:04 -0400 Subject: [PATCH 6/9] fix permission bug in mirror_dir and ignore chmod errors --- overviewer_core/googlemap.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/overviewer_core/googlemap.py b/overviewer_core/googlemap.py index 3b2475e..a4fb156 100644 --- a/overviewer_core/googlemap.py +++ b/overviewer_core/googlemap.py @@ -53,10 +53,15 @@ def mirror_dir(src, dst, entities=None): elif os.path.isfile(os.path.join(src,entry)): try: shutil.copy(os.path.join(src, entry), os.path.join(dst, entry)) - except IOError: - # maybe permission problems? - os.chmod(os.path.join(src, entry), stat.S_IRUSR) - os.chmod(os.path.join(dst, entry), stat.S_IWUSR) + except IOError as outer: + try: + # maybe permission problems? + src_stat = os.stat(os.path.join(src, entry)) + os.chmod(os.path.join(src, entry), src_stat.st_mode | stat.S_IRUSR) + dst_stat = os.stat(os.path.join(dst, entry)) + os.chmod(os.path.join(dst, entry), dst_stat.st_mode | stat.S_IWUSR) + except OSError: # we don't care if this fails + pass shutil.copy(os.path.join(src, entry), os.path.join(dst, entry)) # if this stills throws an error, let it propagate up From f7e18675886d664d8ef8574387f3d9986babca07 Mon Sep 17 00:00:00 2001 From: Alejandro Aguilera Date: Wed, 3 Aug 2011 10:43:31 +0200 Subject: [PATCH 7/9] Fix one more time the how water is lit. Added ancildata and pseudo_ancildata to the renderstate. Added special case for water in rendermode_ligting_draw(). --- overviewer_core/src/iterate.c | 4 ++++ overviewer_core/src/overviewer.h | 2 ++ overviewer_core/src/rendermode-lighting.c | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/overviewer_core/src/iterate.c b/overviewer_core/src/iterate.c index 5639ae9..f28b41a 100644 --- a/overviewer_core/src/iterate.c +++ b/overviewer_core/src/iterate.c @@ -412,11 +412,15 @@ chunk_render(PyObject *self, PyObject *args) { PyObject *tmp; unsigned char ancilData = getArrayByte3D(state.blockdata_expanded, state.x, state.y, state.z); + state.block_data = ancilData; if ((state.block == 2) || (state.block == 9) || (state.block == 20) || (state.block == 54) || (state.block == 55) || (state.block == 85) || (state.block == 90)) { ancilData = generate_pseudo_data(&state, ancilData); + state.block_pdata = ancilData; + } else { + state.block_pdata = 0; } tmp = PyTuple_New(2); diff --git a/overviewer_core/src/overviewer.h b/overviewer_core/src/overviewer.h index a0c5316..e7057e7 100644 --- a/overviewer_core/src/overviewer.h +++ b/overviewer_core/src/overviewer.h @@ -70,6 +70,8 @@ typedef struct { /* the block position and type, and the block array */ int x, y, z; unsigned char block; + unsigned char block_data; + unsigned char block_pdata; PyObject *blockdata_expanded; PyObject *blocks; PyObject *up_left_blocks; diff --git a/overviewer_core/src/rendermode-lighting.c b/overviewer_core/src/rendermode-lighting.c index c515db5..8e073ec 100644 --- a/overviewer_core/src/rendermode-lighting.c +++ b/overviewer_core/src/rendermode-lighting.c @@ -293,7 +293,20 @@ rendermode_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject self = (RenderModeLighting *)data; x = state->x, y = state->y, z = state->z; - if (is_transparent(state->block)) { + if (state->block == 9) { /* special case for water */ + /* looks like we need a new case for lighting, there are + * blocks that are transparent and need per-face shading + * if the face is drawn. */ + if ((state->block_pdata & 16) == 16) { + do_shading_with_mask(self, state, x, y, z+1, self->facemasks[0]); + } + if ((state->block_pdata & 2) == 2) { /* bottom left */ + do_shading_with_mask(self, state, x-1, y, z, self->facemasks[1]); + } + if ((state->block_pdata & 4) == 4) { /* bottom right */ + do_shading_with_mask(self, state, x, y+1, z, self->facemasks[2]); + } + } else if (is_transparent(state->block)) { /* transparent: do shading on whole block */ do_shading_with_mask(self, state, x, y, z, mask_light); } else { From a2b156c85f305f4e99024e28f05ce76d6c1bc990 Mon Sep 17 00:00:00 2001 From: Alejandro Aguilera Date: Wed, 3 Aug 2011 11:04:03 +0200 Subject: [PATCH 8/9] Draw ice in the same way is done with water and glass and shade it like water. --- overviewer_core/src/iterate.c | 9 ++++++--- overviewer_core/src/rendermode-lighting.c | 2 +- overviewer_core/textures.py | 17 ++++++++++------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/overviewer_core/src/iterate.c b/overviewer_core/src/iterate.c index f28b41a..42fac6d 100644 --- a/overviewer_core/src/iterate.c +++ b/overviewer_core/src/iterate.c @@ -174,7 +174,7 @@ generate_pseudo_data(RenderState *state, unsigned char ancilData) { data = (check_adjacent_blocks(state, x, y, z, state->block) ^ 0x0f); return data; } - } else if (state->block == 20) { /* glass */ + } else if ((state->block == 20) || (state->block == 79)) { /* glass and ice */ /* an aditional bit for top is added to the 4 bits of check_adjacent_blocks */ if ((z != 127) && (getArrayByte3D(state->blocks, x, y, z+1) == 20)) { data = 0; @@ -413,10 +413,13 @@ chunk_render(PyObject *self, PyObject *args) { unsigned char ancilData = getArrayByte3D(state.blockdata_expanded, state.x, state.y, state.z); state.block_data = ancilData; + /* block that need pseudo ancildata: + * grass, water, glass, chest, restone wire, + * ice, fence and portal. */ if ((state.block == 2) || (state.block == 9) || (state.block == 20) || (state.block == 54) || - (state.block == 55) || (state.block == 85) || - (state.block == 90)) { + (state.block == 55) || (state.block == 79) || + (state.block == 85) || (state.block == 90)) { ancilData = generate_pseudo_data(&state, ancilData); state.block_pdata = ancilData; } else { diff --git a/overviewer_core/src/rendermode-lighting.c b/overviewer_core/src/rendermode-lighting.c index 8e073ec..37acf03 100644 --- a/overviewer_core/src/rendermode-lighting.c +++ b/overviewer_core/src/rendermode-lighting.c @@ -293,7 +293,7 @@ rendermode_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject self = (RenderModeLighting *)data; x = state->x, y = state->y, z = state->z; - if (state->block == 9) { /* special case for water */ + if ((state->block == 9) || (state->block == 79)) { /* special case for water and ice */ /* looks like we need a new case for lighting, there are * blocks that are transparent and need per-face shading * if the face is drawn. */ diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index 77901ef..c6ad4a1 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -431,7 +431,7 @@ def _build_blockimages(): # 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 36, 37, -1, -1, 65, -1, -1, -1, 50, 24, -1, -1, 86, -1, -1, -1, # 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 - -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, 51, -1, -1, -1, 66, 67, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, 51, -1, -1, -1, 66, -1, # 80 81 82 83 84 85 86 87 88 89 90 91 66, 69, 72, 73, 75, -1,102,103,104,105,-1, 102 # clay? ] @@ -448,7 +448,7 @@ def _build_blockimages(): # 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 36, 37, -1, -1, 65, -1, -1,101, 50, 24, -1, -1, 86, -1, -1, -1, # 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 - -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, 51, -1, -1, -1, 66, 67, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, 51, -1, -1, -1, 66, -1, # 80 81 82 83 84 85 86 87 88 89 90 91 66, 70, 72, 73, 74,-1 ,118,103,104,105, -1, 118 ] @@ -551,12 +551,14 @@ def generate_special_texture(blockID, data): return generate_texture_tuple(img, blockID) - if blockID == 9 or blockID == 20: # spring water, flowing water and waterfall water, AND glass - # water and glass share the way to be rendered + if blockID == 9 or blockID == 20 or blockID == 79: # spring water, flowing water and waterfall water, AND glass, AND ice + # water,glass and ice share the way to be rendered if blockID == 9: texture = _load_image("water.png") - else: + elif blockID == 20: texture = terrain_images[49] + else: + texture = terrain_images[67] if (data & 0b10000) == 16: top = texture @@ -1749,8 +1751,8 @@ def getBiomeData(worlddir, chunkX, chunkY): special_blocks = set([ 2, 6, 9, 17, 18, 20, 26, 23, 27, 28, 29, 31, 33, 34, 35, 43, 44, 50, 51, 53, 54, 55, 58, 59, 61, 62, - 63, 64, 65, 66, 67, 68, 71, 75, 76, 85, 86, 90, 91, - 92, 93, 94, 96]) + 63, 64, 65, 66, 67, 68, 71, 75, 76, 79, 85, 86, 90, + 91, 92, 93, 94, 96]) # this is a map of special blockIDs to a list of all # possible values for ancillary data that it might have. @@ -1789,6 +1791,7 @@ special_map[68] = (2,3,4,5) # wall sing, orientation special_map[71] = range(16) # iron door, open/close and orientation special_map[75] = (1,2,3,4,5) # off redstone torch, orientation special_map[76] = (1,2,3,4,5) # on redstone torch, orientation +special_map[79] = range(32) # ice, used to only render the exterior surface, uses pseudo data special_map[85] = range(17) # fences, all the possible combination, uses pseudo data special_map[86] = range(5) # pumpkin, orientation special_map[90] = (1,2,4,8) # portal, in 2 orientations, 4 cases, uses pseudo data From b86906b931d84cc1aadb1074b06765ab9e0169d6 Mon Sep 17 00:00:00 2001 From: Alejandro Aguilera Date: Wed, 3 Aug 2011 11:22:25 +0200 Subject: [PATCH 9/9] Use per-face shading for leave block. --- overviewer_core/src/rendermode-lighting.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/overviewer_core/src/rendermode-lighting.c b/overviewer_core/src/rendermode-lighting.c index 37acf03..057331a 100644 --- a/overviewer_core/src/rendermode-lighting.c +++ b/overviewer_core/src/rendermode-lighting.c @@ -295,8 +295,8 @@ rendermode_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject if ((state->block == 9) || (state->block == 79)) { /* special case for water and ice */ /* looks like we need a new case for lighting, there are - * blocks that are transparent and need per-face shading - * if the face is drawn. */ + * blocks that are transparent for occlusion calculations and + * need per-face shading if the face is drawn. */ if ((state->block_pdata & 16) == 16) { do_shading_with_mask(self, state, x, y, z+1, self->facemasks[0]); } @@ -306,7 +306,9 @@ rendermode_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject if ((state->block_pdata & 4) == 4) { /* bottom right */ do_shading_with_mask(self, state, x, y+1, z, self->facemasks[2]); } - } else if (is_transparent(state->block)) { + /* leaves are transparent for occlusion calculations but they + * per face-shading to look as in game */ + } else if (is_transparent(state->block) && (state->block != 18)) { /* transparent: do shading on whole block */ do_shading_with_mask(self, state, x, y, z, mask_light); } else {