From a37d0ce9bc508e0b27c341dcd2128d80651f78ce Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Fri, 10 Jun 2011 22:27:46 -0400 Subject: [PATCH] added options metadata (and python accessor) --- src/main.c | 2 ++ src/rendermode-cave.c | 1 + src/rendermode-lighting.c | 1 + src/rendermode-night.c | 1 + src/rendermode-normal.c | 7 ++++++ src/rendermode-overlay.c | 1 + src/rendermode-spawn.c | 1 + src/rendermodes.c | 45 +++++++++++++++++++++++++++++++++++++++ src/rendermodes.h | 13 +++++++++-- 9 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index a001be1..6345d8c 100644 --- a/src/main.c +++ b/src/main.c @@ -41,6 +41,8 @@ static PyMethodDef COverviewerMethods[] = { "returns inheritance chain for a particular render mode"}, {"get_render_mode_children", get_render_mode_children, METH_VARARGS, "returns (direct) children for a particular render mode"}, + {"get_render_mode_options", get_render_mode_options, METH_VARARGS, + "returns a list of options for this render mode"}, {"set_render_mode_options", set_render_mode_options, METH_VARARGS, "sets the default options for a given render mode"}, diff --git a/src/rendermode-cave.c b/src/rendermode-cave.c index 88ee1e7..e4275e5 100644 --- a/src/rendermode-cave.c +++ b/src/rendermode-cave.c @@ -225,6 +225,7 @@ rendermode_cave_draw(void *data, RenderState *state, PyObject *src, PyObject *ma RenderModeInterface rendermode_cave = { "cave", "render only caves in normal mode", + NULL, &rendermode_normal, sizeof(RenderModeCave), rendermode_cave_start, diff --git a/src/rendermode-lighting.c b/src/rendermode-lighting.c index f1dc6c7..f3e529b 100644 --- a/src/rendermode-lighting.c +++ b/src/rendermode-lighting.c @@ -246,6 +246,7 @@ rendermode_lighting_draw(void *data, RenderState *state, PyObject *src, PyObject RenderModeInterface rendermode_lighting = { "lighting", "draw shadows from the lighting data", + NULL, &rendermode_normal, sizeof(RenderModeLighting), rendermode_lighting_start, diff --git a/src/rendermode-night.c b/src/rendermode-night.c index 35c4476..f3edc68 100644 --- a/src/rendermode-night.c +++ b/src/rendermode-night.c @@ -61,6 +61,7 @@ rendermode_night_draw(void *data, RenderState *state, PyObject *src, PyObject *m RenderModeInterface rendermode_night = { "night", "like \"lighting\", except at night", + NULL, &rendermode_lighting, sizeof(RenderModeNight), rendermode_night_start, diff --git a/src/rendermode-normal.c b/src/rendermode-normal.c index f5fb124..fb7eb0e 100644 --- a/src/rendermode-normal.c +++ b/src/rendermode-normal.c @@ -244,8 +244,15 @@ rendermode_normal_draw(void *data, RenderState *state, PyObject *src, PyObject * } } +static RenderModeOption rendermode_normal_options[] = { + {"edge_opacity", "darkness of the edge lines, from 0.0 to 1.0"}, + {"min_depth", "lowest level of blocks to render, default: 0"}, + {"max_depth", "highest level of blocks to render, default: 127"}, +}; + RenderModeInterface rendermode_normal = { "normal", "nothing special, just render the blocks", + rendermode_normal_options, NULL, sizeof(RenderModeNormal), rendermode_normal_start, diff --git a/src/rendermode-overlay.c b/src/rendermode-overlay.c index 7807f66..342a6f9 100644 --- a/src/rendermode-overlay.c +++ b/src/rendermode-overlay.c @@ -129,6 +129,7 @@ rendermode_overlay_draw(void *data, RenderState *state, PyObject *src, PyObject RenderModeInterface rendermode_overlay = { "overlay", "base rendermode for informational overlays", NULL, + NULL, sizeof(RenderModeOverlay), rendermode_overlay_start, rendermode_overlay_finish, diff --git a/src/rendermode-spawn.c b/src/rendermode-spawn.c index 20f81dd..4fff748 100644 --- a/src/rendermode-spawn.c +++ b/src/rendermode-spawn.c @@ -109,6 +109,7 @@ rendermode_spawn_draw(void *data, RenderState *state, PyObject *src, PyObject *m RenderModeInterface rendermode_spawn = { "spawn", "draws a red overlay where monsters can spawn at night", + NULL, &rendermode_overlay, sizeof(RenderModeSpawn), rendermode_spawn_start, diff --git a/src/rendermodes.c b/src/rendermodes.c index 8c11c83..9cac54c 100644 --- a/src/rendermodes.c +++ b/src/rendermodes.c @@ -256,6 +256,51 @@ PyObject *get_render_mode_children(PyObject *self, PyObject *args) { return children; } +/* bindings -- get list of options */ +PyObject *get_render_mode_options(PyObject *self, PyObject *args) +{ + const char *rendermode; + PyObject *options; + unsigned int i, j; + if (!PyArg_ParseTuple(args, "s", &rendermode)) + return NULL; + + options = PyList_New(0); + if (!options) + return NULL; + + for (i = 0; render_modes[i] != NULL; i++) { + if (strcmp(render_modes[i]->name, rendermode) == 0) { + if (render_modes[i]->options == NULL) + break; + + for (j = 0; render_modes[i]->options[j].name != NULL; j++) { + RenderModeOption opt = render_modes[i]->options[j]; + PyObject *name = PyString_FromString(opt.name); + PyObject *description = PyString_FromString(opt.description); + PyObject *option = PyDict_New(); + if (!name || !description || !option) { + Py_XDECREF(name); + Py_XDECREF(description); + Py_XDECREF(option); + Py_DECREF(options); + return NULL; + } + + PyDict_SetItemString(option, "name", name); + PyDict_SetItemString(option, "description", description); + PyList_Append(options, option); + Py_DECREF(name); + Py_DECREF(description); + Py_DECREF(option); + } + break; + } + } + + return options; +} + /* python rendermode options bindings */ PyObject *set_render_mode_options(PyObject *self, PyObject *args) { const char *rendermode; diff --git a/src/rendermodes.h b/src/rendermodes.h index a369d77..9aec63f 100644 --- a/src/rendermodes.h +++ b/src/rendermodes.h @@ -37,13 +37,21 @@ #include +typedef struct { + const char *name; + const char *description; +} RenderModeOption; + /* rendermode interface */ typedef struct _RenderModeInterface RenderModeInterface; struct _RenderModeInterface { /* the name of this mode */ - const char* name; + const char *name; /* the short description of this render mode */ - const char* description; + const char *description; + + /* a NULL-terminated list of render mode options, or NULL */ + RenderModeOption *options; /* the rendermode this is derived from, or NULL */ RenderModeInterface *parent; @@ -78,6 +86,7 @@ PyObject *get_render_mode_info(PyObject *self, PyObject *args); PyObject *get_render_mode_parent(PyObject *self, PyObject *args); PyObject *get_render_mode_inheritance(PyObject *self, PyObject *args); PyObject *get_render_mode_children(PyObject *self, PyObject *args); +PyObject *get_render_mode_options(PyObject *self, PyObject *args); /* python rendermode options bindings */ PyObject *set_render_mode_options(PyObject *self, PyObject *args);