0

Merge branch 'master' into rewrite

This commit is contained in:
Aaron Griffith
2012-02-06 21:41:11 -05:00
51 changed files with 114 additions and 46 deletions

View File

@@ -92,6 +92,7 @@ directory.
dump['worlds'] = worlds
dump['map'] = dict()
dump['map']['debug'] = True
dump['map']['cacheTag'] = str(int(time()))
dump['map']['north_direction'] = 'lower-left' # only temporary
dump['map']['center'] = [-314, 67, 94]
dump['map']['controls'] = {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 103 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 78 B

View File

@@ -1431,10 +1431,8 @@ var overviewer = {
}
}
url = url + '.' + pathExt;
if(overviewerConfig.map.cacheMinutes > 0) {
var d = new Date();
url += '?c=' + Math.floor(d.getTime() /
(1000 * 60 * overviewerConfig.map.cacheMinutes));
if(typeof overviewerConfig.map.cacheTag !== 'undefined') {
url += '?c=' + overviewerConfig.map.cacheTag;
}
return(urlBase + url);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 368 B

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 708 B

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 B

After

Width:  |  Height:  |  Size: 171 B

View File

@@ -17,7 +17,7 @@ import os
import os.path
import stat
import cPickle
import Image
from PIL import Image
import shutil
from time import strftime, localtime
import json

View File

@@ -28,6 +28,7 @@ static PyObject *transparent_blocks = NULL;
static PyObject *solid_blocks = NULL;
static PyObject *fluid_blocks = NULL;
static PyObject *nospawn_blocks = NULL;
static PyObject *nodata_blocks = NULL;
PyObject *init_chunk_render(void) {
@@ -74,6 +75,9 @@ PyObject *init_chunk_render(void) {
nospawn_blocks = PyObject_GetAttrString(textures, "nospawn_blocks");
if (!nospawn_blocks)
return NULL;
nodata_blocks = PyObject_GetAttrString(textures, "nodata_blocks");
if (!nodata_blocks)
return NULL;
block_properties = calloc(max_blockid, sizeof(unsigned char));
for (i = 0; i < max_blockid; i++) {
@@ -89,6 +93,8 @@ PyObject *init_chunk_render(void) {
block_properties[i] |= 1 << FLUID;
if (PySequence_Contains(nospawn_blocks, block))
block_properties[i] |= 1 << NOSPAWN;
if (PySequence_Contains(nodata_blocks, block))
block_properties[i] |= 1 << NODATA;
Py_DECREF(block);
}
@@ -502,22 +508,30 @@ chunk_render(PyObject *self, PyObject *args) {
}
/* everything stored here will be a borrowed ref */
ancilData = getArrayByte3D(state.blockdatas, state.x, state.y, state.z);
state.block_data = ancilData;
/* block that need pseudo ancildata:
* grass, water, glass, chest, restone wire,
* ice, fence, portal, iron bars, glass panes */
if ((state.block == 2) || (state.block == 9) ||
(state.block == 20) || (state.block == 54) ||
(state.block == 55) || (state.block == 79) ||
(state.block == 85) || (state.block == 90) ||
(state.block == 101) || (state.block == 102) ||
(state.block == 113)) {
ancilData = generate_pseudo_data(&state, ancilData);
state.block_pdata = ancilData;
} else {
if (block_has_property(state.block, NODATA)) {
/* block shouldn't have data associated with it, set it to 0 */
ancilData = 0;
state.block_data = 0;
state.block_pdata = 0;
} else {
/* block has associated data, use it */
ancilData = getArrayByte3D(state.blockdatas, state.x, state.y, state.z);
state.block_data = ancilData;
/* block that need pseudo ancildata:
* grass, water, glass, chest, restone wire,
* ice, fence, portal, iron bars, glass panes */
if ((state.block == 2) || (state.block == 9) ||
(state.block == 20) || (state.block == 54) ||
(state.block == 55) || (state.block == 79) ||
(state.block == 85) || (state.block == 90) ||
(state.block == 101) || (state.block == 102) ||
(state.block == 113)) {
ancilData = generate_pseudo_data(&state, ancilData);
state.block_pdata = ancilData;
} else {
state.block_pdata = 0;
}
}
/* make sure our block info is in-bounds */
@@ -526,6 +540,9 @@ chunk_render(PyObject *self, PyObject *args) {
/* get the texture */
t = PyList_GET_ITEM(blockmap, max_data * state.block + ancilData);
/* if we don't get a texture, try it again with 0 data */
if ((t == NULL || t == Py_None) && ancilData != 0)
t = PyList_GET_ITEM(blockmap, max_data * state.block);
/* if we found a proper texture, render it! */
if (t != NULL && t != Py_None)

View File

@@ -26,7 +26,7 @@
// increment this value if you've made a change to the c extesion
// and want to force users to rebuild
#define OVERVIEWER_EXTENSION_VERSION 16
#define OVERVIEWER_EXTENSION_VERSION 18
/* Python PIL, and numpy headers */
#include <Python.h>
@@ -102,6 +102,7 @@ typedef enum
SOLID,
FLUID,
NOSPAWN,
NODATA,
} BlockProperty;
/* globals set in init_chunk_render, here because they're used
in block_has_property */

View File

@@ -246,8 +246,8 @@ get_lighting_color(RenderPrimitiveLighting *self, RenderState *state,
skylevel = getArrayByte3D(skylight, local_x, local_y, local_z);
blocklevel = getArrayByte3D(blocklight, local_x, local_y, local_z);
/* special half-step handling */
if (block == 44 || block == 53 || block == 67 || block == 108 || block == 109) {
/* special half-step handling, stairs handling */
if (block == 44 || block == 53 || block == 67 || block == 108 || block == 109 || block == 114) {
unsigned int upper_block;
/* stairs and half-blocks take the skylevel from the upper block if it's transparent */

View File

@@ -56,7 +56,7 @@ class Textures(object):
def __getstate__(self):
# we must get rid of the huge image lists, and other images
attributes = self.__dict__.copy()
for attr in ['terrain_images', 'blockmap', 'biome_grass_texture', 'watertexture', 'lavatexture', 'lightcolor']:
for attr in ['terrain_images', 'blockmap', 'biome_grass_texture', 'watertexture', 'lavatexture', 'firetexture', 'portaltexture', 'lightcolor']:
try:
del attributes[attr]
except KeyError:
@@ -249,6 +249,40 @@ class Textures(object):
self.lavatexture = lavatexture
return lavatexture
def load_fire(self):
"""Special-case function for loading fire, handles
MCPatcher-compliant custom animated fire."""
firetexture = getattr(self, "firetexture", None)
if firetexture:
return firetexture
try:
# try the MCPatcher case first
firetextureNS = self.load_image("custom_fire_n_s.png")
firetextureNS = firetextureNS.crop((0, 0, firetextureNS.size[0], firetextureNS.size[0]))
firetextureEW = self.load_image("custom_fire_e_w.png")
firetextureEW = firetextureEW.crop((0, 0, firetextureEW.size[0], firetextureEW.size[0]))
firetexture = (firetextureNS,firetextureEW)
except IOError:
fire = self.load_image("fire.png")
firetexture = (fire, fire)
self.firetexture = firetexture
return firetexture
def load_portal(self):
"""Special-case function for loading portal, handles
MCPatcher-compliant custom animated portal."""
portaltexture = getattr(self, "portaltexture", None)
if portaltexture:
return portaltexture
try:
# try the MCPatcher case first
portaltexture = self.load_image("custom_portal.png")
portaltexture = portaltexture.crop((0, 0, portaltexture.size[0], portaltexture.size[1]))
except IOError:
portaltexture = self.load_image("portal.png")
self.portaltexture = portaltexture
return portaltexture
def load_light_color(self):
"""Helper function to load the light color texture."""
if hasattr(self, "lightcolor"):
@@ -681,11 +715,12 @@ transparent_blocks = set()
solid_blocks = set()
fluid_blocks = set()
nospawn_blocks = set()
nodata_blocks = set()
# the material registration decorator
def material(blockid=[], data=[0], **kwargs):
# mapping from property name to the set to store them in
properties = {"transparent" : transparent_blocks, "solid" : solid_blocks, "fluid" : fluid_blocks, "nospawn" : nospawn_blocks}
properties = {"transparent" : transparent_blocks, "solid" : solid_blocks, "fluid" : fluid_blocks, "nospawn" : nospawn_blocks, "nodata" : nodata_blocks}
# make sure blockid and data are iterable
try:
@@ -730,9 +765,9 @@ def material(blockid=[], data=[0], **kwargs):
return func_wrapper
return inner_material
# shortcut function for pure blocks, default to solid
# shortcut function for pure blocks, default to solid, nodata
def block(blockid=[], top_index=None, side_index=None, **kwargs):
new_kwargs = {'solid' : True}
new_kwargs = {'solid' : True, 'nodata' : True}
new_kwargs.update(kwargs)
if top_index is None:
@@ -746,9 +781,9 @@ def block(blockid=[], top_index=None, side_index=None, **kwargs):
return self.build_block(self.terrain_images[top_index], self.terrain_images[side_index])
return inner_block
# shortcut function for sprite blocks, defaults to transparent
# shortcut function for sprite blocks, defaults to transparent, nodata
def sprite(blockid=[], index=None, **kwargs):
new_kwargs = {'transparent' : True}
new_kwargs = {'transparent' : True, 'nodata' : True}
new_kwargs.update(kwargs)
if index is None:
@@ -759,9 +794,9 @@ def sprite(blockid=[], index=None, **kwargs):
return self.build_sprite(self.terrain_images[index])
return inner_sprite
# shortcut function for billboard blocks, defaults to transparent
# shortcut function for billboard blocks, defaults to transparent, nodata
def billboard(blockid=[], index=None, **kwargs):
new_kwargs = {'transparent' : True}
new_kwargs = {'transparent' : True, 'nodata' : True}
new_kwargs.update(kwargs)
if index is None:
@@ -1471,9 +1506,9 @@ def torches(self, blockid, data):
# fire
@material(blockid=51, data=range(16), transparent=True)
def fire(self, blockid, data):
firetexture = self.load_image("fire.png")
side1 = self.transform_image_side(firetexture)
side2 = self.transform_image_side(firetexture).transpose(Image.FLIP_LEFT_RIGHT)
firetextures = self.load_fire()
side1 = self.transform_image_side(firetextures[0])
side2 = self.transform_image_side(firetextures[1]).transpose(Image.FLIP_LEFT_RIGHT)
img = Image.new("RGBA", (24,24), self.bgcolor)
@@ -1716,7 +1751,7 @@ block(blockid=57, top_index=24)
# crafting table
# needs two different sides
@material(blockid=58, solid=True)
@material(blockid=58, solid=True, nodata=True)
def crafting_table(self, blockid, data):
top = self.terrain_images[43]
side3 = self.terrain_images[43+16]
@@ -2218,7 +2253,7 @@ def buttons(self, blockid, data):
return img
# snow
@material(blockid=78, data=range(8), transparent=True, solid=True)
@material(blockid=78, data=range(16), transparent=True, solid=True)
def snow(self, blockid, data):
# still not rendered correctly: data other than 0
@@ -2350,7 +2385,7 @@ def fence(self, blockid, data):
fence_small_side = ImageEnhance.Brightness(fence_small_side).enhance(0.9)
fence_small_side.putalpha(sidealpha)
# Create img to compose the fence
# Create img to compose the fence
img = Image.new("RGBA", (24,24), self.bgcolor)
# Position of fence small sticks in img.
@@ -2430,7 +2465,7 @@ block(blockid=89, top_index=105)
@material(blockid=90, data=[1, 2, 4, 8], transparent=True)
def portal(self, blockid, data):
# no rotations, uses pseudo data
portaltexture = self.load_image("portal.png")
portaltexture = self.load_portal()
img = Image.new("RGBA", (24,24), self.bgcolor)
side = self.transform_image_side(portaltexture)
@@ -3013,7 +3048,7 @@ def nether_wart(self, blockid, data):
# enchantment table
# TODO there's no book at the moment
@material(blockid=116, transparent=True)
@material(blockid=116, transparent=True, nodata=True)
def enchantment_table(self, blockid, data):
# no book at the moment
top = self.terrain_images[166]
@@ -3058,7 +3093,7 @@ def cauldron(self, blockid, data):
return img
# end portal
@material(blockid=119, transparent=True)
@material(blockid=119, transparent=True, nodata=True)
def end_portal(self, blockid, data):
img = Image.new("RGBA", (24,24), self.bgcolor)
# generate a black texure with white, blue and grey dots resembling stars