diff --git a/src/iterate.c b/src/iterate.c index e829373..d86ecbf 100644 --- a/src/iterate.c +++ b/src/iterate.c @@ -293,7 +293,6 @@ PyObject* chunk_render(PyObject *self, PyObject *args) { RenderState state; - PyObject *blockdata_expanded; int xoff, yoff; PyObject *imgsize, *imgsize0_py, *imgsize1_py; @@ -311,7 +310,7 @@ chunk_render(PyObject *self, PyObject *args) { PyObject *t = NULL; - if (!PyArg_ParseTuple(args, "OOiiO", &state.self, &state.img, &xoff, &yoff, &blockdata_expanded)) + if (!PyArg_ParseTuple(args, "OOiiO", &state.self, &state.img, &xoff, &yoff, &state.blockdata_expanded)) return NULL; /* fill in important modules */ @@ -402,7 +401,7 @@ chunk_render(PyObject *self, PyObject *args) { } else { PyObject *tmp; - unsigned char ancilData = getArrayByte3D(blockdata_expanded, state.x, state.y, state.z); + unsigned char ancilData = getArrayByte3D(state.blockdata_expanded, state.x, state.y, state.z); if ((state.block == 85) || (state.block == 9) || (state.block == 55) || (state.block == 54) || (state.block == 2) || (state.block == 90)) { ancilData = generate_pseudo_data(&state, ancilData); } diff --git a/src/overviewer.h b/src/overviewer.h index 5ee89dc..184cd4e 100644 --- a/src/overviewer.h +++ b/src/overviewer.h @@ -70,6 +70,7 @@ typedef struct { /* the block position and type, and the block array */ int x, y, z; unsigned char block; + PyObject *blockdata_expanded; PyObject *blocks; PyObject *up_left_blocks; PyObject *up_right_blocks; diff --git a/src/rendermode-normal.c b/src/rendermode-normal.c index 0e06e0e..e4247fa 100644 --- a/src/rendermode-normal.c +++ b/src/rendermode-normal.c @@ -56,6 +56,7 @@ rendermode_normal_start(void *data, RenderState *state) { self->leaf_texture = NULL; self->grass_texture = NULL; + self->tall_grass_texture = NULL; self->facemask_top = NULL; } else { @@ -64,6 +65,7 @@ rendermode_normal_start(void *data, RenderState *state) { self->leaf_texture = PyObject_GetAttrString(state->textures, "biome_leaf_texture"); self->grass_texture = PyObject_GetAttrString(state->textures, "biome_grass_texture"); + self->tall_grass_texture = PyObject_GetAttrString(state->textures, "biome_tall_grass_texture"); facemasks_py = PyObject_GetAttrString(state->chunk, "facemasks"); /* borrowed reference, needs to be incref'd if we keep it */ @@ -78,6 +80,7 @@ rendermode_normal_start(void *data, RenderState *state) { self->leaf_texture = NULL; self->grass_texture = NULL; + self->tall_grass_texture = NULL; self->facemask_top = NULL; } @@ -98,6 +101,7 @@ rendermode_normal_finish(void *data, RenderState *state) { Py_XDECREF(self->grasscolor); Py_XDECREF(self->leaf_texture); Py_XDECREF(self->grass_texture); + Py_XDECREF(self->tall_grass_texture); Py_XDECREF(self->facemask_top); } @@ -120,8 +124,17 @@ rendermode_normal_draw(void *data, RenderState *state, PyObject *src, PyObject * RenderModeNormal *self = (RenderModeNormal *)data; /* first, check to see if we should use biome-compatible src, mask */ - if (self->biome_data && state->block == 18) { - src = mask = self->leaf_texture; + if (self->biome_data) { + if (state->block == 18) { + src = mask = self->leaf_texture; + } else if (state->block == 31) { + unsigned char data = getArrayByte3D(state->blockdata_expanded, state->x, state->y, state->z); + if (data == 1) { + src = mask = self->tall_grass_texture; + } else if (data == 2) { + src = mask = self->tall_fern_texture; + } + } } /* draw the block! */ @@ -150,6 +163,15 @@ rendermode_normal_draw(void *data, RenderState *state, PyObject *src, PyObject * color = PySequence_GetItem(self->foliagecolor, index); facemask = mask; break; + case 31: + /* tall grass */ + if ( getArrayByte3D(state->blockdata_expanded, state->x, state->y, state->z) != 0 ) + { /* do not tint dead shrubs */ + color = PySequence_GetItem(self->grasscolor, index); + facemask = mask; + break; + } + break; default: break; }; diff --git a/src/rendermodes.h b/src/rendermodes.h index d6de559..80126a4 100644 --- a/src/rendermodes.h +++ b/src/rendermodes.h @@ -79,7 +79,7 @@ typedef struct { /* grasscolor and foliagecolor lookup tables */ PyObject *grasscolor, *foliagecolor; /* biome-compatible grass/leaf textures */ - PyObject *grass_texture, *leaf_texture; + PyObject *grass_texture, *leaf_texture, *tall_grass_texture, *tall_fern_texture; /* top facemask for grass biome tinting */ PyObject *facemask_top; } RenderModeNormal; diff --git a/textures.py b/textures.py index 17bce0e..02c26c3 100644 --- a/textures.py +++ b/textures.py @@ -1659,6 +1659,8 @@ special_map[31] = range(3) # tall grass, dead shrub, fern and tall grass itself terrain_images = None blockmap = None biome_grass_texture = None +biome_tall_grass_texture = None +biome_tall_fern_texture = None biome_leaf_texture = None specialblockmap = None @@ -1676,9 +1678,11 @@ def generate(path=None): load_water() # generate biome (still grayscale) leaf, grass textures - global biome_grass_texture, biome_leaf_texture + global biome_grass_texture, biome_leaf_texture, biome_tall_grass_texture biome_grass_texture = _build_block(terrain_images[0], terrain_images[38], 2) biome_leaf_texture = _build_block(terrain_images[52], terrain_images[52], 18) + biome_tall_grass_texture = _build_block(terrain_images[39], terrain_images[39], 31) + biome_tall_fern_texture = _build_block(terrain_images[56], terrain_images[56], 31) # generate the special blocks global specialblockmap, special_blocks