From e096eb45ff0fba8cf8d1dac4b4282ac4b3472717 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Sat, 19 Mar 2011 22:55:59 -0400 Subject: [PATCH] Initial version of C lighting code Needs *lots* of performance work --- chunk.py | 5 +- gmap.py | 2 +- src/.composite.c.swp | Bin 0 -> 24576 bytes src/.iterate.c.swp | Bin 0 -> 32768 bytes src/composite.c | 30 ++++++ src/iterate.c | 243 +++++++++++++++++++++++++++++++++++++++++++ src/main.c | 2 + src/overviewer.h | 2 + world.py | 3 +- 9 files changed, 284 insertions(+), 3 deletions(-) create mode 100644 src/.composite.c.swp create mode 100644 src/.iterate.c.swp diff --git a/chunk.py b/chunk.py index ab5d41f..2086485 100644 --- a/chunk.py +++ b/chunk.py @@ -545,7 +545,10 @@ class ChunkRenderer(object): if not img: img = Image.new("RGBA", (384, 1728), (38,92,255,0)) - c_overviewer.render_loop(self, img, xoff, yoff, blockData_expanded) + if self.world.lighting: + c_overviewer.render_loop_lighting(self, img, xoff, yoff, blockData_expanded) + else: + c_overviewer.render_loop(self, img, xoff, yoff, blockData_expanded) for entity in tileEntities: if entity['id'] == 'Sign': diff --git a/gmap.py b/gmap.py index 57edb0c..92bff15 100755 --- a/gmap.py +++ b/gmap.py @@ -140,7 +140,7 @@ def main(): logging.info("Notice: Not using biome data for tinting") # First do world-level preprocessing - w = world.World(worlddir, useBiomeData=useBiomeData) + w = world.World(worlddir, useBiomeData=useBiomeData, lighting=options.lighting) w.go(options.procs) # Now generate the tiles diff --git a/src/.composite.c.swp b/src/.composite.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..a7256a664bf54db729c9af0a7a72cf37da4bd72d GIT binary patch literal 24576 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 + int ysize = imDest->ysize; + + for (y = 0; y < ysize; y++) { + UINT8 *out = (UINT8 *)imDest->image[y]; + //UINT8 *outmask = (UINT8 *)imDest->image[y] + 3; + + for (x = 0; x < xsize; x++) { + //printf("old out: %d\n", *out); + *out *= factor; + //printf("new out: %d\n", *out); + out++; + } + } + return NULL; + +} + /* the alpha_over function, in a form that can be called from C */ /* if xsize, ysize are negative, they are instead set to the size of the image in src */ /* returns NULL on error, dest on success. You do NOT need to decref the return! */ diff --git a/src/iterate.c b/src/iterate.c index 031864c..61e2ff1 100644 --- a/src/iterate.c +++ b/src/iterate.c @@ -45,6 +45,249 @@ texture_alpha_over(PyObject *dest, PyObject *t, int imgx, int imgy) return alpha_over(dest, src, mask, imgx, imgy, 0, 0); } +PyObject* +chunk_render_lighting(PyObject *self, PyObject *args) { + + PyObject *chunk; + PyObject *blockdata_expanded; + int xoff, yoff; + PyObject *img; + + PyObject *imgsize, *imgsize0_py, *imgsize1_py; + int imgsize0, imgsize1; + + PyObject *blocks_py; + + PyObject *textures, *blockmap, *special_blocks, *specialblockmap, *chunk_mod, *transparent_blocks; + + int imgx, imgy; + int x, y, z; + + if (!PyArg_ParseTuple(args, "OOiiO", &chunk, &img, &xoff, &yoff, &blockdata_expanded)) + return Py_BuildValue("i", "-1"); + + /* tuple */ + imgsize = PyObject_GetAttrString(img, "size"); + + imgsize0_py = PySequence_GetItem(imgsize, 0); + imgsize1_py = PySequence_GetItem(imgsize, 1); + Py_DECREF(imgsize); + + imgsize0 = PyInt_AsLong(imgsize0_py); + imgsize1 = PyInt_AsLong(imgsize1_py); + Py_DECREF(imgsize0_py); + Py_DECREF(imgsize1_py); + + + /* get the block data directly from numpy: */ + blocks_py = PyObject_GetAttrString(chunk, "blocks"); + + /* + PyObject *left_blocks = PyObject_GetAttrString(chunk, "left_blocks"); + PyObject *right_blocks = PyObject_GetAttrString(chunk, "right_blocks"); + */ + + textures = PyImport_ImportModule("textures"); + chunk_mod = PyImport_ImportModule("chunk"); + + /* TODO can these be global static? these don't change during program execution */ + blockmap = PyObject_GetAttrString(textures, "blockmap"); + special_blocks = PyObject_GetAttrString(textures, "special_blocks"); + specialblockmap = PyObject_GetAttrString(textures, "specialblockmap"); + transparent_blocks = PyObject_GetAttrString(chunk_mod, "transparent_blocks"); + if (transparent_blocks == NULL) { + PyErr_SetString(PyExc_ValueError, + "transparent_blocks is NULL"); + return NULL; + } + PyObject *black_color = PyObject_GetAttrString(chunk_mod, "black_color"); + PyObject *facemasks_py = PyObject_GetAttrString(chunk_mod, "facemasks"); + PyObject *facemasks[3]; + //assert(PyTuple_Check(facemasks_py)); + facemasks[0] = PyTuple_GetItem(facemasks_py, 0); + facemasks[1] = PyTuple_GetItem(facemasks_py, 1); + facemasks[2] = PyTuple_GetItem(facemasks_py, 2); + + + Py_DECREF(textures); + Py_DECREF(chunk_mod); + + + + for (x = 15; x > -1; x--) { + for (y = 0; y < 16; y++) { + imgx = xoff + x*12 + y*12; + /* 128*12 -- offset for z direction, 15*6 -- offset for x */ + imgy = yoff - x*6 + y*6 + 128*12 + 15*6; + for (z = 0; z < 128; z++) { + unsigned char block; + PyObject *blockid; + + imgy -= 12; + + if ((imgx >= imgsize0 + 24) || (imgx <= -24)) { + continue; + } + if ((imgy >= imgsize1 + 24) || (imgy <= -24)) { + continue; + } + + /* get blockid + note the order: x, z, y */ + block = getBlock(blocks_py, x, y, z); + if (block == 0) { + continue; + } + + /* TODO figure out how to DECREF this easily, instead of at + every continue */ + blockid = PyInt_FromLong(block); + + + if ( (x != 0) && (y != 15) && (z != 127) && + !isTransparent(transparent_blocks, getBlock(blocks_py, x-1, y, z)) && + !isTransparent(transparent_blocks, getBlock(blocks_py, x, y, z+1)) && + !isTransparent(transparent_blocks, getBlock(blocks_py, x, y+1, z))) { + continue; + } + + //# top face + //black_coeff, face_occlude = self.get_lighting_coefficient(x, y, z + 1) + + + PyObject *t = NULL; + if (!PySequence_Contains(special_blocks, blockid)) { + /* t = textures.blockmap[blockid] */ + PyObject *t = PyList_GetItem(blockmap, block); + /* PyList_GetItem returns borrowed ref */ + + /* note that this version of alpha_over has a different signature than the + version in _composite.c */ + texture_alpha_over(img, t, imgx, imgy ); + } else { + PyObject *tmp; + + /* this should be a pointer to a unsigned char */ + void* ancilData_p = PyArray_GETPTR3(blockdata_expanded, x, y, z); + unsigned char ancilData = *((unsigned char*)ancilData_p); + if (block == 85) { + /* fence. skip the generate_pseudo_ancildata for now */ + continue; + } + + tmp = PyTuple_New(2); + + Py_INCREF(blockid); /* because SetItem steals */ + PyTuple_SetItem(tmp, 0, blockid); + PyTuple_SetItem(tmp, 1, PyInt_FromLong(ancilData)); + + /* this is a borrowed reference. no need to decref */ + t = PyDict_GetItem(specialblockmap, tmp); + Py_DECREF(tmp); + + } + if ((t != NULL) && (t != Py_None)) + texture_alpha_over(img, t, imgx, imgy ); + + { + // returns new references + PyObject* light_tup = PyObject_CallMethod(chunk, "get_lighting_coefficient", "iii", x, y, z+1); + PyObject *black_coeff_py = PySequence_GetItem(light_tup, 0); + double black_coeff = PyFloat_AsDouble(black_coeff_py); + Py_DECREF(black_coeff_py); + + PyObject *face_occlude_py = PySequence_GetItem(light_tup, 1); + int face_occlude = PyInt_AsLong(face_occlude_py); + Py_DECREF(face_occlude_py); + + + if (!face_occlude) { + //#composite.alpha_over(img, over_color, (imgx, imgy), ImageEnhance.Brightness(facemasks[0]).enhance(black_coeff)) + + PyObject *mask = PyObject_CallMethod(facemasks[0], "copy", NULL); // new ref + //printf("black_coeff: %f\n", black_coeff); + brightness(mask, black_coeff); + //printf("done with brightness\n"); + alpha_over(img, black_color, mask, imgx, imgy, 0, 0); + //printf("done with alpha_over\n"); + Py_DECREF(mask); + + } + } + + + { + // returns new references + PyObject* light_tup = PyObject_CallMethod(chunk, "get_lighting_coefficient", "iii", x-1, y, z); + PyObject *black_coeff_py = PySequence_GetItem(light_tup, 0); + double black_coeff = PyFloat_AsDouble(black_coeff_py); + Py_DECREF(black_coeff_py); + + PyObject *face_occlude_py = PySequence_GetItem(light_tup, 1); + int face_occlude = PyInt_AsLong(face_occlude_py); + Py_DECREF(face_occlude_py); + + + if (!face_occlude) { + //#composite.alpha_over(img, over_color, (imgx, imgy), ImageEnhance.Brightness(facemasks[0]).enhance(black_coeff)) + /* for now, we are lazy and call Image.blend to change the brightness of facemask + * TODO find some faster way? + */ + + PyObject *mask = PyObject_CallMethod(facemasks[1], "copy", NULL); // new ref + //printf("black_coeff: %f\n", black_coeff); + brightness(mask, black_coeff); + //printf("done with brightness\n"); + alpha_over(img, black_color, mask, imgx, imgy, 0, 0); + //printf("done with alpha_over\n"); + Py_DECREF(mask); + + } + } + + + { + // returns new references + PyObject* light_tup = PyObject_CallMethod(chunk, "get_lighting_coefficient", "iii", x, y+1, z); + PyObject *black_coeff_py = PySequence_GetItem(light_tup, 0); + double black_coeff = PyFloat_AsDouble(black_coeff_py); + Py_DECREF(black_coeff_py); + + PyObject *face_occlude_py = PySequence_GetItem(light_tup, 1); + int face_occlude = PyInt_AsLong(face_occlude_py); + Py_DECREF(face_occlude_py); + + + if (!face_occlude) { + //#composite.alpha_over(img, over_color, (imgx, imgy), ImageEnhance.Brightness(facemasks[0]).enhance(black_coeff)) + + PyObject *mask = PyObject_CallMethod(facemasks[2], "copy", NULL); // new ref + //printf("black_coeff: %f\n", black_coeff); + brightness(mask, black_coeff); + //printf("done with brightness\n"); + alpha_over(img, black_color, mask, imgx, imgy, 0, 0); + //printf("done with alpha_over\n"); + Py_DECREF(mask); + + } + } + + + + } + } + } + + Py_DECREF(facemasks_py); + Py_DECREF(blocks_py); + Py_DECREF(blockmap); + Py_DECREF(special_blocks); + Py_DECREF(specialblockmap); + + return Py_BuildValue("i",2); + +} + /* TODO triple check this to make sure reference counting is correct */ PyObject* chunk_render(PyObject *self, PyObject *args) { diff --git a/src/main.c b/src/main.c index f56fb41..48968dd 100644 --- a/src/main.c +++ b/src/main.c @@ -24,6 +24,8 @@ static PyMethodDef COverviewerMethods[] = { "alpha over composite function"}, {"render_loop", chunk_render, METH_VARARGS, "Renders stuffs"}, + {"render_loop_lighting", chunk_render_lighting, METH_VARARGS, + "Renders stuffs, lighting"}, {NULL, NULL, 0, NULL} /* Sentinel */ }; diff --git a/src/overviewer.h b/src/overviewer.h index 5746b53..bfd9bb9 100644 --- a/src/overviewer.h +++ b/src/overviewer.h @@ -33,8 +33,10 @@ Imaging imaging_python_to_c(PyObject *obj); PyObject *alpha_over(PyObject *dest, PyObject *src, PyObject *mask, int dx, int dy, int xsize, int ysize); PyObject *alpha_over_wrap(PyObject *self, PyObject *args); +PyObject *brightness(PyObject *img, double factor); /* in iterate.c */ PyObject *chunk_render(PyObject *self, PyObject *args); +PyObject *chunk_render_lighting(PyObject *self, PyObject *args); #endif /* __OVERVIEWER_H_INCLUDED__ */ diff --git a/world.py b/world.py index 7ed790c..8099e94 100644 --- a/world.py +++ b/world.py @@ -67,9 +67,10 @@ class World(object): mincol = maxcol = minrow = maxrow = 0 - def __init__(self, worlddir, useBiomeData=False,regionlist=None): + def __init__(self, worlddir, useBiomeData=False,regionlist=None, lighting=False): self.worlddir = worlddir self.useBiomeData = useBiomeData + self.lighting = lighting #find region files, or load the region list #this also caches all the region file header info