Merge branch 'master' into py-package
This commit is contained in:
@@ -160,13 +160,17 @@ generate_pseudo_data(RenderState *state, unsigned char ancilData) {
|
||||
return ancilData;
|
||||
} else if (state->block == 9) { /* water */
|
||||
/* an aditional bit for top is added to the 4 bits of check_adjacent_blocks */
|
||||
if ((ancilData == 0) || (ancilData >= 10)) { /* static water, only top, and unkown ancildata values */
|
||||
data = 16;
|
||||
if (ancilData == 0) { /* static water */
|
||||
if ((z != 127) && (getArrayByte3D(state->blocks, x, y, z+1) == 9)) {
|
||||
data = 0;
|
||||
} else {
|
||||
data = 16;
|
||||
}
|
||||
return data; /* = 0b10000 */
|
||||
} else if ((ancilData > 0) && (ancilData < 8)) { /* flowing water */
|
||||
data = (check_adjacent_blocks(state, x, y, z, state->block) ^ 0x0f) | 0x10;
|
||||
return data;
|
||||
} else if ((ancilData == 8) || (ancilData == 9)) { /* falling water */
|
||||
} else if (ancilData >= 8) { /* falling water */
|
||||
data = (check_adjacent_blocks(state, x, y, z, state->block) ^ 0x0f);
|
||||
return data;
|
||||
}
|
||||
@@ -289,7 +293,6 @@ PyObject*
|
||||
chunk_render(PyObject *self, PyObject *args) {
|
||||
RenderState state;
|
||||
|
||||
PyObject *blockdata_expanded;
|
||||
int xoff, yoff;
|
||||
|
||||
PyObject *imgsize, *imgsize0_py, *imgsize1_py;
|
||||
@@ -307,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 */
|
||||
@@ -398,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);
|
||||
}
|
||||
@@ -417,14 +420,15 @@ chunk_render(PyObject *self, PyObject *args) {
|
||||
/* if we found a proper texture, render it! */
|
||||
if (t != NULL && t != Py_None)
|
||||
{
|
||||
PyObject *src, *mask;
|
||||
PyObject *src, *mask, *mask_light;
|
||||
src = PyTuple_GetItem(t, 0);
|
||||
mask = PyTuple_GetItem(t, 1);
|
||||
|
||||
mask_light = PyTuple_GetItem(t, 2);
|
||||
|
||||
if (mask == Py_None)
|
||||
mask = src;
|
||||
|
||||
rendermode->draw(rm_data, &state, src, mask);
|
||||
rendermode->draw(rm_data, &state, src, mask, mask_light);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 6
|
||||
#define OVERVIEWER_EXTENSION_VERSION 7
|
||||
|
||||
/* Python PIL, and numpy headers */
|
||||
#include <Python.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;
|
||||
|
||||
@@ -202,7 +202,7 @@ rendermode_cave_finish(void *data, RenderState *state) {
|
||||
}
|
||||
|
||||
static void
|
||||
rendermode_cave_draw(void *data, RenderState *state, PyObject *src, PyObject *mask) {
|
||||
rendermode_cave_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObject *mask_light) {
|
||||
RenderModeCave* self;
|
||||
int z, r, g, b;
|
||||
self = (RenderModeCave *)data;
|
||||
@@ -211,7 +211,7 @@ rendermode_cave_draw(void *data, RenderState *state, PyObject *src, PyObject *ma
|
||||
r = 0, g = 0, b = 0;
|
||||
|
||||
/* draw the normal block */
|
||||
rendermode_normal.draw(data, state, src, mask);
|
||||
rendermode_normal.draw(data, state, src, mask, mask_light);
|
||||
|
||||
/* get the colors and tint and tint */
|
||||
/* TODO TODO for a nether mode there isn't tinting! */
|
||||
|
||||
@@ -91,7 +91,7 @@ get_lighting_coefficient(RenderModeLighting *self, RenderState *state,
|
||||
|
||||
/* only do special half-step handling if no authoratative pointer was
|
||||
passed in, which is a sign that we're recursing */
|
||||
if (block == 44 && authoratative == NULL) {
|
||||
if ((block == 44 || block == 53 || block == 67) && authoratative == NULL) {
|
||||
float average_gather = 0.0f;
|
||||
unsigned int average_count = 0;
|
||||
int auth;
|
||||
@@ -206,19 +206,19 @@ rendermode_lighting_occluded(void *data, RenderState *state) {
|
||||
}
|
||||
|
||||
static void
|
||||
rendermode_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject *mask) {
|
||||
rendermode_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObject *mask_light) {
|
||||
RenderModeLighting* self;
|
||||
int x, y, z;
|
||||
|
||||
/* first, chain up */
|
||||
rendermode_normal.draw(data, state, src, mask);
|
||||
rendermode_normal.draw(data, state, src, mask, mask_light);
|
||||
|
||||
self = (RenderModeLighting *)data;
|
||||
x = state->x, y = state->y, z = state->z;
|
||||
|
||||
if (is_transparent(state->block)) {
|
||||
/* transparent: do shading on whole block */
|
||||
do_shading_with_mask(self, state, x, y, z, mask);
|
||||
do_shading_with_mask(self, state, x, y, z, mask_light);
|
||||
} else {
|
||||
/* opaque: do per-face shading */
|
||||
do_shading_with_mask(self, state, x, y, z+1, self->facemasks[0]);
|
||||
|
||||
@@ -54,9 +54,9 @@ rendermode_night_occluded(void *data, RenderState *state) {
|
||||
}
|
||||
|
||||
static void
|
||||
rendermode_night_draw(void *data, RenderState *state, PyObject *src, PyObject *mask) {
|
||||
rendermode_night_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObject *mask_light) {
|
||||
/* nothing special to do */
|
||||
rendermode_lighting.draw(data, state, src, mask);
|
||||
rendermode_lighting.draw(data, state, src, mask, mask_light);
|
||||
}
|
||||
|
||||
RenderModeInterface rendermode_night = {
|
||||
|
||||
@@ -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,8 @@ 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");
|
||||
self->tall_fern_texture = PyObject_GetAttrString(state->textures, "biome_tall_fern_texture");
|
||||
|
||||
facemasks_py = PyObject_GetAttrString(state->chunk, "facemasks");
|
||||
/* borrowed reference, needs to be incref'd if we keep it */
|
||||
@@ -78,6 +81,8 @@ rendermode_normal_start(void *data, RenderState *state) {
|
||||
|
||||
self->leaf_texture = NULL;
|
||||
self->grass_texture = NULL;
|
||||
self->tall_grass_texture = NULL;
|
||||
self->tall_fern_texture = NULL;
|
||||
self->facemask_top = NULL;
|
||||
}
|
||||
|
||||
@@ -98,6 +103,8 @@ 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->tall_fern_texture);
|
||||
Py_XDECREF(self->facemask_top);
|
||||
}
|
||||
|
||||
@@ -116,12 +123,21 @@ rendermode_normal_occluded(void *data, RenderState *state) {
|
||||
}
|
||||
|
||||
static void
|
||||
rendermode_normal_draw(void *data, RenderState *state, PyObject *src, PyObject *mask) {
|
||||
rendermode_normal_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObject *mask_light) {
|
||||
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 +166,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;
|
||||
};
|
||||
|
||||
@@ -71,7 +71,7 @@ rendermode_overlay_occluded(void *data, RenderState *state) {
|
||||
}
|
||||
|
||||
static void
|
||||
rendermode_overlay_draw(void *data, RenderState *state, PyObject *src, PyObject *mask) {
|
||||
rendermode_overlay_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObject *mask_light) {
|
||||
RenderModeOverlay *self = (RenderModeOverlay *)data;
|
||||
unsigned char r, g, b, a;
|
||||
PyObject *top_block_py, *block_py;
|
||||
|
||||
@@ -102,9 +102,9 @@ rendermode_spawn_occluded(void *data, RenderState *state) {
|
||||
}
|
||||
|
||||
static void
|
||||
rendermode_spawn_draw(void *data, RenderState *state, PyObject *src, PyObject *mask) {
|
||||
rendermode_spawn_draw(void *data, RenderState *state, PyObject *src, PyObject *mask, PyObject *mask_light) {
|
||||
/* draw normally */
|
||||
rendermode_overlay.draw(data, state, src, mask);
|
||||
rendermode_overlay.draw(data, state, src, mask, mask_light);
|
||||
}
|
||||
|
||||
RenderModeInterface rendermode_spawn = {
|
||||
|
||||
@@ -56,7 +56,7 @@ struct _RenderModeInterface {
|
||||
/* returns non-zero to skip rendering this block */
|
||||
int (*occluded)(void *, RenderState *);
|
||||
/* last two arguments are img and mask, from texture lookup */
|
||||
void (*draw)(void *, RenderState *, PyObject *, PyObject *);
|
||||
void (*draw)(void *, RenderState *, PyObject *, PyObject *, PyObject *);
|
||||
};
|
||||
|
||||
/* figures out the render mode to use from the given ChunkRenderer */
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user