0

cleaned up rendermode interface

This commit is contained in:
Aaron Griffith
2011-06-09 21:00:24 -04:00
parent 5b25b3c597
commit b654f3169f
3 changed files with 62 additions and 24 deletions

View File

@@ -292,6 +292,7 @@ generate_pseudo_data(RenderState *state, unsigned char ancilData) {
PyObject* PyObject*
chunk_render(PyObject *self, PyObject *args) { chunk_render(PyObject *self, PyObject *args) {
RenderState state; RenderState state;
PyObject *rendermode_py;
int xoff, yoff; int xoff, yoff;
@@ -304,9 +305,7 @@ chunk_render(PyObject *self, PyObject *args) {
PyObject *up_left_blocks_py; PyObject *up_left_blocks_py;
PyObject *up_right_blocks_py; PyObject *up_right_blocks_py;
RenderModeInterface *rendermode; RenderMode *rendermode;
void *rm_data;
PyObject *t = NULL; PyObject *t = NULL;
@@ -318,10 +317,10 @@ chunk_render(PyObject *self, PyObject *args) {
state.chunk = chunk_mod; state.chunk = chunk_mod;
/* set up the render mode */ /* set up the render mode */
rendermode = get_render_mode(&state); rendermode_py = PyObject_GetAttrString(state.self, "rendermode");
rm_data = calloc(1, rendermode->data_size); rendermode = render_mode_create(PyString_AsString(rendermode_py), &state);
if (rendermode->start(rm_data, &state)) { Py_DECREF(rendermode_py);
free(rm_data); if (rendermode == NULL) {
return Py_BuildValue("i", "-1"); return Py_BuildValue("i", "-1");
} }
@@ -388,7 +387,7 @@ chunk_render(PyObject *self, PyObject *args) {
blockid = PyInt_FromLong(state.block); blockid = PyInt_FromLong(state.block);
// check for occlusion // check for occlusion
if (rendermode->occluded(rm_data, &state)) { if (render_mode_occluded(rendermode)) {
continue; continue;
} }
@@ -428,7 +427,7 @@ chunk_render(PyObject *self, PyObject *args) {
if (mask == Py_None) if (mask == Py_None)
mask = src; mask = src;
rendermode->draw(rm_data, &state, src, mask, mask_light); render_mode_draw(rendermode, src, mask, mask_light);
} }
} }
@@ -440,8 +439,7 @@ chunk_render(PyObject *self, PyObject *args) {
} }
/* free up the rendermode info */ /* free up the rendermode info */
rendermode->finish(rm_data, &state); render_mode_destroy(rendermode);
free(rm_data);
Py_DECREF(blocks_py); Py_DECREF(blocks_py);
Py_XDECREF(left_blocks_py); Py_XDECREF(left_blocks_py);

View File

@@ -30,23 +30,54 @@ static RenderModeInterface *render_modes[] = {
NULL NULL
}; };
/* decides which render mode to use */ RenderMode *render_mode_create(const char *mode, RenderState *state) {
RenderModeInterface *get_render_mode(RenderState *state) {
unsigned int i; unsigned int i;
/* default: NULL --> an error */ RenderMode *ret = NULL;
RenderModeInterface *iface = NULL; RenderModeInterface *iface = NULL;
PyObject *rendermode_py = PyObject_GetAttrString(state->self, "rendermode");
const char *rendermode = PyString_AsString(rendermode_py);
for (i = 0; render_modes[i] != NULL; i++) { for (i = 0; render_modes[i] != NULL; i++) {
if (strcmp(render_modes[i]->name, rendermode) == 0) { if (strcmp(render_modes[i]->name, mode) == 0) {
iface = render_modes[i]; iface = render_modes[i];
break; break;
} }
} }
Py_DECREF(rendermode_py); if (iface == NULL)
return iface; return NULL;
ret = malloc(sizeof(RenderMode));
if (ret == NULL)
return NULL;
ret->mode = malloc(iface->data_size);
if (ret->mode == NULL) {
free(ret);
return NULL;
}
ret->iface = iface;
ret->state = state;
if (iface->start(ret->mode, state)) {
free(ret->mode);
free(ret);
return NULL;
}
return ret;
}
void render_mode_destroy(RenderMode *self) {
self->iface->finish(self->mode, self->state);
free(self->mode);
free(self);
}
int render_mode_occluded(RenderMode *self) {
return self->iface->occluded(self->mode, self->state);
}
void render_mode_draw(RenderMode *self, PyObject *img, PyObject *mask, PyObject *mask_light) {
self->iface->draw(self->mode, self->state, img, mask, mask_light);
} }
/* bindings for python -- get all the rendermode names */ /* bindings for python -- get all the rendermode names */

View File

@@ -59,8 +59,19 @@ struct _RenderModeInterface {
void (*draw)(void *, RenderState *, PyObject *, PyObject *, PyObject *); void (*draw)(void *, RenderState *, PyObject *, PyObject *, PyObject *);
}; };
/* figures out the render mode to use from the given ChunkRenderer */ /* wrapper for passing around rendermodes */
RenderModeInterface *get_render_mode(RenderState *state); typedef struct {
void *mode;
RenderModeInterface *iface;
RenderState *state;
} RenderMode;
/* functions for creating / using rendermodes */
RenderMode *render_mode_create(const char *mode, RenderState *state);
void render_mode_destroy(RenderMode *self);
int render_mode_occluded(RenderMode *self);
void render_mode_draw(RenderMode *self, PyObject *img, PyObject *mask, PyObject *mask_light);
/* python bindings */ /* python bindings */
PyObject *get_render_modes(PyObject *self, PyObject *args); PyObject *get_render_modes(PyObject *self, PyObject *args);
PyObject *get_render_mode_info(PyObject *self, PyObject *args); PyObject *get_render_mode_info(PyObject *self, PyObject *args);
@@ -117,8 +128,6 @@ typedef struct {
float (*calculate_darkness)(unsigned char, unsigned char); float (*calculate_darkness)(unsigned char, unsigned char);
} RenderModeLighting; } RenderModeLighting;
extern RenderModeInterface rendermode_lighting; extern RenderModeInterface rendermode_lighting;
inline float get_lighting_coefficient(RenderModeLighting *self, RenderState *state,
int x, int y, int z, int *authoratative);
/* NIGHT */ /* NIGHT */
typedef struct { typedef struct {