diff options
-rw-r--r-- | src/stage.c | 28 | ||||
-rw-r--r-- | src/stage.h | 8 |
2 files changed, 28 insertions, 8 deletions
diff --git a/src/stage.c b/src/stage.c index a714f1f..63afbcb 100644 --- a/src/stage.c +++ b/src/stage.c @@ -302,19 +302,33 @@ static void _prepare_stage(stage_t *stage, float alpha, void *render_ctxt) } -static void _render_stage(const stage_t *stage, float alpha, void *render_ctxt) +static void _render_stage(stage_t *stage, float alpha, void *render_ctxt) { - float a = alpha * stage->alpha; + stage_render_func_ret_t r = STAGE_RENDER_FUNC_RET_CONTINUE; + float a; assert(stage); + a = alpha * stage->alpha; + if (stage->ops->render_func) - stage->ops->render_func(stage, stage->object, a, render_ctxt); + r = stage->ops->render_func(stage, stage->object, a, render_ctxt); + + switch (r) { + case STAGE_RENDER_FUNC_RET_FREE: + stage_free(stage); + case STAGE_RENDER_FUNC_RET_SKIP: + return; + case STAGE_RENDER_FUNC_RET_CONTINUE: + break; + default: + assert(0); + } for (int i = 0; i < STAGE_LAYERS_MAX; i++) { - stage_t *s; + stage_t *s, *_s; - DLL_FOR_EACH_ENTRY(&stage->layers[i], s, stage_t, layer) { + DLL_FOR_EACH_ENTRY_SAFE(&stage->layers[i], s, _s, stage_t, layer) { if (!s->active) continue; @@ -342,11 +356,11 @@ int stage_render(stage_t *stage, void *render_ctxt) _prepare_stage(stage, 1.f, render_ctxt); if (stage->dirty) { + stage->dirty = 0; + if (stage->active) _render_stage(stage, 1.f, render_ctxt); - stage->dirty = 0; - return 1; } diff --git a/src/stage.h b/src/stage.h index 40f2057..b64e095 100644 --- a/src/stage.h +++ b/src/stage.h @@ -22,8 +22,14 @@ typedef struct stage_t stage_t; +typedef enum stage_render_func_ret_t { + STAGE_RENDER_FUNC_RET_CONTINUE, + STAGE_RENDER_FUNC_RET_SKIP, + STAGE_RENDER_FUNC_RET_FREE +} stage_render_func_ret_t; + typedef void (stage_prepare_func_t)(stage_t *stage, void *object, float alpha, void *render_ctxt); -typedef void (stage_render_func_t)(const stage_t *stage, void *object, float alpha, void *render_ctxt); +typedef stage_render_func_ret_t (stage_render_func_t)(const stage_t *stage, void *object, float alpha, void *render_ctxt); typedef void (stage_free_func_t)(const stage_t *stage, void *object); typedef struct stage_ops_t { |