0

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().
This commit is contained in:
Alejandro Aguilera
2011-08-03 10:43:31 +02:00
parent 4070a79409
commit f7e1867588
3 changed files with 20 additions and 1 deletions

View File

@@ -412,11 +412,15 @@ chunk_render(PyObject *self, PyObject *args) {
PyObject *tmp; PyObject *tmp;
unsigned char ancilData = getArrayByte3D(state.blockdata_expanded, state.x, state.y, state.z); unsigned char ancilData = getArrayByte3D(state.blockdata_expanded, state.x, state.y, state.z);
state.block_data = ancilData;
if ((state.block == 2) || (state.block == 9) || if ((state.block == 2) || (state.block == 9) ||
(state.block == 20) || (state.block == 54) || (state.block == 20) || (state.block == 54) ||
(state.block == 55) || (state.block == 85) || (state.block == 55) || (state.block == 85) ||
(state.block == 90)) { (state.block == 90)) {
ancilData = generate_pseudo_data(&state, ancilData); ancilData = generate_pseudo_data(&state, ancilData);
state.block_pdata = ancilData;
} else {
state.block_pdata = 0;
} }
tmp = PyTuple_New(2); tmp = PyTuple_New(2);

View File

@@ -70,6 +70,8 @@ typedef struct {
/* the block position and type, and the block array */ /* the block position and type, and the block array */
int x, y, z; int x, y, z;
unsigned char block; unsigned char block;
unsigned char block_data;
unsigned char block_pdata;
PyObject *blockdata_expanded; PyObject *blockdata_expanded;
PyObject *blocks; PyObject *blocks;
PyObject *up_left_blocks; PyObject *up_left_blocks;

View File

@@ -293,7 +293,20 @@ rendermode_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject
self = (RenderModeLighting *)data; self = (RenderModeLighting *)data;
x = state->x, y = state->y, z = state->z; 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 */ /* transparent: do shading on whole block */
do_shading_with_mask(self, state, x, y, z, mask_light); do_shading_with_mask(self, state, x, y, z, mask_light);
} else { } else {