diff --git a/overviewer_core/rendermodes.py b/overviewer_core/rendermodes.py index d854d0f..9359556 100644 --- a/overviewer_core/rendermodes.py +++ b/overviewer_core/rendermodes.py @@ -168,6 +168,10 @@ class ClearBase(RenderPrimitive): class Overlay(RenderPrimitive): name = "overlay" + options = { + 'overlay_color' : ('a tuple of (r, g, b, a) for coloring the overlay', None), + } + @property def whitecolor(self): whitecolor = getattr(self, "_whitecolor", None) diff --git a/overviewer_core/src/overviewer.h b/overviewer_core/src/overviewer.h index 97a5a2e..c2d1a26 100644 --- a/overviewer_core/src/overviewer.h +++ b/overviewer_core/src/overviewer.h @@ -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 37 +#define OVERVIEWER_EXTENSION_VERSION 38 /* Python PIL, and numpy headers */ #include diff --git a/overviewer_core/src/primitives/overlay-slime.c b/overviewer_core/src/primitives/overlay-slime.c index f4abfe8..c3a05a4 100644 --- a/overviewer_core/src/primitives/overlay-slime.c +++ b/overviewer_core/src/primitives/overlay-slime.c @@ -71,16 +71,16 @@ static void get_color(void *data, RenderState *state, RenderPrimitiveSlime *self = (RenderPrimitiveSlime *)data; /* set a nice, pretty green color */ - *r = 40; - *g = 230; - *b = 40; - + *r = self->parent.color->r; + *g = self->parent.color->g; + *b = self->parent.color->b; + /* default to no overlay, until told otherwise */ *a = 0; if (is_slime(self->seed, state->chunkx, state->chunkz)) { /* slimes can spawn! */ - *a = 240; + *a = self->parent.color->a; } } @@ -98,6 +98,11 @@ overlay_slime_start(void *data, RenderState *state, PyObject *support) { self = (RenderPrimitiveSlime *)data; self->parent.get_color = get_color; + self->parent.default_color.r = 40; + self->parent.default_color.g = 230; + self->parent.default_color.b = 40; + self->parent.default_color.a = 240; + pyseed = PyObject_GetAttrString(state->world, "seed"); if (!pyseed) return 1; diff --git a/overviewer_core/src/primitives/overlay-spawn.c b/overviewer_core/src/primitives/overlay-spawn.c index 137fd48..ffd9ab9 100644 --- a/overviewer_core/src/primitives/overlay-spawn.c +++ b/overviewer_core/src/primitives/overlay-spawn.c @@ -25,15 +25,15 @@ typedef struct { static void get_color(void *data, RenderState *state, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a) { - + RenderPrimitiveSpawn* self = (RenderPrimitiveSpawn *)data; int x = state->x, y = state->y, z = state->z; int y_light = y + 1; unsigned char blocklight, skylight; /* set a nice, pretty red color */ - *r = 229; - *g = 36; - *b = 38; + *r = self->parent.color->r; + *g = self->parent.color->g; + *b = self->parent.color->b; /* default to no overlay, until told otherwise */ *a = 0; @@ -68,6 +68,11 @@ overlay_spawn_start(void *data, RenderState *state, PyObject *support) { self = (RenderPrimitiveSpawn *)data; self->parent.get_color = get_color; + self->parent.default_color.r = 229; + self->parent.default_color.g = 36; + self->parent.default_color.b = 38; + self->parent.default_color.a = 0; + return 0; } diff --git a/overviewer_core/src/primitives/overlay.c b/overviewer_core/src/primitives/overlay.c index 1e02489..ff7ce75 100644 --- a/overviewer_core/src/primitives/overlay.c +++ b/overviewer_core/src/primitives/overlay.c @@ -19,26 +19,59 @@ static void get_color(void *data, RenderState *state, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a) { - *r = 200; - *g = 200; - *b = 255; - *a = 155; + RenderPrimitiveOverlay* self = (RenderPrimitiveOverlay *)data; + + *r = self->color->r; + *g = self->color->g; + *b = self->color->b; + *a = self->color->a; } static int overlay_start(void *data, RenderState *state, PyObject *support) { + PyObject *opt = NULL; + OverlayColor *color = NULL; RenderPrimitiveOverlay *self = (RenderPrimitiveOverlay *)data; self->facemask_top = PyObject_GetAttrString(support, "facemask_top"); self->white_color = PyObject_GetAttrString(support, "whitecolor"); self->get_color = get_color; + color = self->color = calloc(1, sizeof(OverlayColor)); + + if (color == NULL) { + return 1; + } + + self->default_color.r = 200; + self->default_color.g = 200; + self->default_color.b = 255; + self->default_color.a = 155; + + if(!render_mode_parse_option(support, "overlay_color", "bbbb", &(color->r), &(color->g), &(color->b), &(color->a))) { + if(PyErr_Occurred()) + PyErr_Clear(); + free(color); + self->color = &self->default_color; + // Check if it is None, if it is, continue and use the default, if it isn't, return an error + if(render_mode_parse_option(support, "overlay_color", "O", &(opt))) { + // If it is an object, check to see if it is None, if it is, use the default. + if(opt && opt != Py_None) { + return 1; + } + } + } + return 0; } static void overlay_finish(void *data, RenderState *state) { RenderPrimitiveOverlay *self = (RenderPrimitiveOverlay *)data; + + if (self->color && self->color != &self->default_color) { + free(self->color); + } Py_DECREF(self->facemask_top); Py_DECREF(self->white_color); diff --git a/overviewer_core/src/primitives/overlay.h b/overviewer_core/src/primitives/overlay.h index cc028bb..6871e75 100644 --- a/overviewer_core/src/primitives/overlay.h +++ b/overviewer_core/src/primitives/overlay.h @@ -17,9 +17,18 @@ #include "../overviewer.h" +typedef struct { + unsigned char r, g, b, a; +} OverlayColor; + typedef struct { /* top facemask and white color image, for drawing overlays */ PyObject *facemask_top, *white_color; + /* color will be a pointer to either the default_color object below or + to a specially allocated color object that is instantiated from the + settings file */ + OverlayColor *color; + OverlayColor default_color; /* can be overridden in derived classes to control overlay alpha and color last four vars are r, g, b, a out */