From 7e5f5189587b285d035c015cb3cc088344b21495 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Sun, 19 Jun 2011 13:34:16 -0400 Subject: [PATCH] normal mode height fading (a la Fenixin's formula, Issue #147) --- src/rendermode-normal.c | 28 +++++++++++++++++++++++++++- src/rendermodes.h | 4 ++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/rendermode-normal.c b/src/rendermode-normal.c index bf72fc7..9d79f68 100644 --- a/src/rendermode-normal.c +++ b/src/rendermode-normal.c @@ -36,6 +36,15 @@ rendermode_normal_start(void *data, RenderState *state, PyObject *options) { if (!render_mode_parse_option(options, "max_depth", "I", &(self->max_depth))) return 1; + self->height_fading = 0; + if (!render_mode_parse_option(options, "height_fading", "i", &(self->height_fading))) + return 1; + + if (self->height_fading) { + self->black_color = PyObject_GetAttrString(state->chunk, "black_color"); + self->white_color = PyObject_GetAttrString(state->chunk, "white_color"); + } + chunk_x_py = PyObject_GetAttrString(state->self, "chunkX"); chunk_y_py = PyObject_GetAttrString(state->self, "chunkY"); @@ -120,6 +129,8 @@ rendermode_normal_finish(void *data, RenderState *state) { Py_XDECREF(self->tall_grass_texture); Py_XDECREF(self->tall_fern_texture); Py_XDECREF(self->facemask_top); + Py_XDECREF(self->black_color); + Py_XDECREF(self->white_color); } static int @@ -216,7 +227,21 @@ rendermode_normal_draw(void *data, RenderState *state, PyObject *src, PyObject * tint_with_mask(state->img, r, g, b, 255, facemask, state->imgx, state->imgy, 0, 0); } } - + + if (self->height_fading) { + /* do some height fading */ + PyObject *height_color = self->white_color; + /* negative alpha => darkness, positive => light */ + float alpha = (1.0 / (1 + expf((70 - state->z) / 11.0))) * 0.6 - 0.55; + + if (alpha < 0.0) { + alpha *= -1; + height_color = self->black_color; + } + + alpha_over_full(state->img, height_color, mask_light, alpha, state->imgx, state->imgy, 0, 0); + } + /* Draw some edge lines! */ // draw.line(((imgx+12,imgy+increment), (imgx+22,imgy+5+increment)), fill=(0,0,0), width=1) @@ -267,6 +292,7 @@ const RenderModeOption rendermode_normal_options[] = { {"edge_opacity", "darkness of the edge lines, from 0.0 to 1.0 (default: 0.15)"}, {"min_depth", "lowest level of blocks to render (default: 0)"}, {"max_depth", "highest level of blocks to render (default: 127)"}, + {"height_fading", "darken or lighten blocks based on height (default: False)"}, {NULL, NULL} }; diff --git a/src/rendermodes.h b/src/rendermodes.h index e27cb15..52473f3 100644 --- a/src/rendermodes.h +++ b/src/rendermodes.h @@ -110,9 +110,13 @@ typedef struct { /* top facemask for grass biome tinting */ PyObject *facemask_top; + /* black and white colors for height fading */ + PyObject *black_color, *white_color; + float edge_opacity; unsigned int min_depth; unsigned int max_depth; + int height_fading; } RenderModeNormal; extern RenderModeInterface rendermode_normal;