diff options
| author | David Moc <personal@cdatgoose.org> | 2026-06-02 13:50:21 +0200 |
|---|---|---|
| committer | David Moc <personal@cdatgoose.org> | 2026-06-02 13:50:21 +0200 |
| commit | a15cb041654ae307add0b998b526c87c3f42bf5f (patch) | |
| tree | 225bb4b70e9fa05aa5f4d2722a1a9cf5fc6fca7f /config/render_demo.c | |
| parent | 6aeaa171dc1ca43392f53cbd02097f76e1b1c5a0 (diff) | |
Add plugin hooks and mode plugins
Diffstat (limited to 'config/render_demo.c')
| -rw-r--r-- | config/render_demo.c | 118 |
1 files changed, 59 insertions, 59 deletions
diff --git a/config/render_demo.c b/config/render_demo.c index 761b552..a0fb124 100644 --- a/config/render_demo.c +++ b/config/render_demo.c @@ -22,34 +22,33 @@ #define RENDER_DEMO_LABEL_CLICK 25 typedef struct render_demo_state { - ecex_t *ed; + ecex_plugin_t *plugin; int log_draw_count; } render_demo_state_t; -static int render_demo_get(ecex_t *ed, render_demo_state_t *s, const char *name, int fallback) { - if (!ed || !s || !name) return fallback; - return ecex_var_i32(ed, s, name, fallback); +static int render_demo_get(render_demo_state_t *s, const char *name, int fallback) { + if (!s || !name) return fallback; + return ecex_plugin_slot_i32_get_scalar(s->plugin, name, fallback); } -static void render_demo_set(ecex_t *ed, render_demo_state_t *s, const char *name, int value) { - if (!ed || !s || !name) return; - ecex_var_i32_set_scalar(ed, s, name, value); +static void render_demo_set(render_demo_state_t *s, const char *name, int value) { + if (!s || !name) return; + ecex_plugin_slot_i32_set_scalar(s->plugin, name, value); } -static void render_demo_reset(ecex_t *ed, render_demo_state_t *s) { +static void render_demo_reset(render_demo_state_t *s) { ecex_log_ptr("render_demo_reset: state=", s); - if (!ed || !s) return; + if (!s) return; - /* Store mutable demo state in the host variable registry. This mirrors the - * Tetris plugin flow and avoids relying on CCDJIT struct-field writes for - * values that must survive renderer, animation, and mouse callbacks. + /* Store mutable demo state in plugin slots. This avoids relying on CCDJIT + * struct-field writes for values shared by renderer, animation, and mouse callbacks. * Values are fixed-point integers: 0..1000 represents the available travel * range inside the demo frame. */ - render_demo_set(ed, s, RENDER_DEMO_VAR_X, 0); - render_demo_set(ed, s, RENDER_DEMO_VAR_Y, 500); - render_demo_set(ed, s, RENDER_DEMO_VAR_TARGET_X, 0); - render_demo_set(ed, s, RENDER_DEMO_VAR_TARGET_Y, 500); - render_demo_set(ed, s, RENDER_DEMO_VAR_MOVING, 0); + render_demo_set(s, RENDER_DEMO_VAR_X, 0); + render_demo_set(s, RENDER_DEMO_VAR_Y, 500); + render_demo_set(s, RENDER_DEMO_VAR_TARGET_X, 0); + render_demo_set(s, RENDER_DEMO_VAR_TARGET_Y, 500); + render_demo_set(s, RENDER_DEMO_VAR_MOVING, 0); s->log_draw_count = 0; } @@ -93,27 +92,27 @@ static int render_demo_draw(ecex_t *ed, buffer_t *buffer, ecex_draw_context_t *c if (cw < 1) cw = 1; if (ch < 1) ch = 1; - ecex_draw_color_rgba8(ctx, 26, 28, 36, 255); + ecex_draw_color_rgba8_i(ctx, 26, 28, 36, 255); ecex_draw_rect_i(ctx, 0, 0, w, h); - ecex_draw_color_rgba8(ctx, 48, 96, 180, 255); + ecex_draw_color_rgba8_i(ctx, 48, 96, 180, 255); ecex_draw_rect_i(ctx, cx, cy, (cw * 55) / 100, line_h * 2); - ecex_draw_color_rgba8(ctx, 242, 230, 191, 255); + ecex_draw_color_rgba8_i(ctx, 242, 230, 191, 255); ecex_draw_rect_outline_i(ctx, cx, cy, cw, ch, 2); ecex_draw_label_i(ctx, cx + 12, cy + 10, RENDER_DEMO_LABEL_TITLE); - ecex_draw_color_rgba8(ctx, 229, 89, 64, 255); + ecex_draw_color_rgba8_i(ctx, 229, 89, 64, 255); ecex_draw_line_i(ctx, cx, cy + ch, cx + cw, cy, 3); - ecex_draw_color_rgba8(ctx, 160, 230, 180, 255); + ecex_draw_color_rgba8_i(ctx, 160, 230, 180, 255); ecex_draw_label_i(ctx, cx + 12, cy + line_h * 3, RENDER_DEMO_LABEL_SUBTITLE); ecex_draw_label_i(ctx, cx + 12, cy + line_h * 4, RENDER_DEMO_LABEL_SAFE_DRAW); ecex_draw_label_i(ctx, cx + 12, cy + line_h * 5, RENDER_DEMO_LABEL_ANIM); ecex_draw_label_i(ctx, cx + 12, cy + line_h * 6, RENDER_DEMO_LABEL_CLICK); - x_milli = render_demo_get(ed, s, RENDER_DEMO_VAR_X, 0); - y_milli = render_demo_get(ed, s, RENDER_DEMO_VAR_Y, 500); + x_milli = render_demo_get(s, RENDER_DEMO_VAR_X, 0); + y_milli = render_demo_get(s, RENDER_DEMO_VAR_Y, 500); ecex_draw_stat_i(ctx, cx + 12, cy + line_h * 8, RENDER_DEMO_LABEL_POSITION, x_milli); box = line_h * 2; @@ -132,20 +131,20 @@ static int render_demo_draw(ecex_t *ed, buffer_t *buffer, ecex_draw_context_t *c box_x = area_x + (travel * x_milli) / 1000; box_y = area_y + (travel_y * y_milli) / 1000; - render_demo_set(ed, s, RENDER_DEMO_VAR_BOX_X, box_x); - render_demo_set(ed, s, RENDER_DEMO_VAR_BOX_Y, box_y); - render_demo_set(ed, s, RENDER_DEMO_VAR_BOX_SIZE, box); - render_demo_set(ed, s, RENDER_DEMO_VAR_TRAVEL_X, travel); - render_demo_set(ed, s, RENDER_DEMO_VAR_TRAVEL_Y, travel_y); - render_demo_set(ed, s, RENDER_DEMO_VAR_AREA_X, area_x); - render_demo_set(ed, s, RENDER_DEMO_VAR_AREA_Y, area_y); + render_demo_set(s, RENDER_DEMO_VAR_BOX_X, box_x); + render_demo_set(s, RENDER_DEMO_VAR_BOX_Y, box_y); + render_demo_set(s, RENDER_DEMO_VAR_BOX_SIZE, box); + render_demo_set(s, RENDER_DEMO_VAR_TRAVEL_X, travel); + render_demo_set(s, RENDER_DEMO_VAR_TRAVEL_Y, travel_y); + render_demo_set(s, RENDER_DEMO_VAR_AREA_X, area_x); + render_demo_set(s, RENDER_DEMO_VAR_AREA_Y, area_y); - ecex_draw_color_rgba8(ctx, 70, 76, 90, 255); + ecex_draw_color_rgba8_i(ctx, 70, 76, 90, 255); ecex_draw_rect_outline_i(ctx, area_x, area_y, travel + box, travel_y + box, 1); - ecex_draw_color_rgba8(ctx, 89, 242, 140, 255); + ecex_draw_color_rgba8_i(ctx, 89, 242, 140, 255); ecex_draw_rect_i(ctx, box_x, box_y, box, box); - ecex_draw_color_rgba8(ctx, 20, 24, 30, 255); + ecex_draw_color_rgba8_i(ctx, 20, 24, 30, 255); ecex_draw_rect_outline_i(ctx, box_x, box_y, box, box, 2); return 0; @@ -185,20 +184,20 @@ static int render_demo_tick(ecex_t *ed, buffer_t *buffer, int now_ms, void *user (void)buffer; (void)now_ms; if (!ed || !s) return 0; - if (!render_demo_get(ed, s, RENDER_DEMO_VAR_MOVING, 0)) return 0; + if (!render_demo_get(s, RENDER_DEMO_VAR_MOVING, 0)) return 0; - x = render_demo_get(ed, s, RENDER_DEMO_VAR_X, 0); - y = render_demo_get(ed, s, RENDER_DEMO_VAR_Y, 500); - target_x = render_demo_get(ed, s, RENDER_DEMO_VAR_TARGET_X, x); - target_y = render_demo_get(ed, s, RENDER_DEMO_VAR_TARGET_Y, y); + x = render_demo_get(s, RENDER_DEMO_VAR_X, 0); + y = render_demo_get(s, RENDER_DEMO_VAR_Y, 500); + target_x = render_demo_get(s, RENDER_DEMO_VAR_TARGET_X, x); + target_y = render_demo_get(s, RENDER_DEMO_VAR_TARGET_Y, y); next_x = render_demo_delta_step(x, target_x); next_y = render_demo_delta_step(y, target_y); - render_demo_set(ed, s, RENDER_DEMO_VAR_X, render_demo_clamp_milli(next_x)); - render_demo_set(ed, s, RENDER_DEMO_VAR_Y, render_demo_clamp_milli(next_y)); + render_demo_set(s, RENDER_DEMO_VAR_X, render_demo_clamp_milli(next_x)); + render_demo_set(s, RENDER_DEMO_VAR_Y, render_demo_clamp_milli(next_y)); if (next_x == target_x && next_y == target_y) { - render_demo_set(ed, s, RENDER_DEMO_VAR_MOVING, 0); + render_demo_set(s, RENDER_DEMO_VAR_MOVING, 0); ecex_log("render_demo_tick: target reached"); } return 1; @@ -218,11 +217,11 @@ static int render_demo_mouse(ecex_t *ed, buffer_t *buffer, int event, int x, int if (!ed || !s || button != ECEX_MOUSE_BUTTON_LEFT) return 0; if (event != ECEX_MOUSE_PRESS) return 0; - box = render_demo_get(ed, s, RENDER_DEMO_VAR_BOX_SIZE, 0); - area_x = render_demo_get(ed, s, RENDER_DEMO_VAR_AREA_X, 0); - area_y = render_demo_get(ed, s, RENDER_DEMO_VAR_AREA_Y, 0); - travel_x = render_demo_get(ed, s, RENDER_DEMO_VAR_TRAVEL_X, 0); - travel_y = render_demo_get(ed, s, RENDER_DEMO_VAR_TRAVEL_Y, 0); + box = render_demo_get(s, RENDER_DEMO_VAR_BOX_SIZE, 0); + area_x = render_demo_get(s, RENDER_DEMO_VAR_AREA_X, 0); + area_y = render_demo_get(s, RENDER_DEMO_VAR_AREA_Y, 0); + travel_x = render_demo_get(s, RENDER_DEMO_VAR_TRAVEL_X, 0); + travel_y = render_demo_get(s, RENDER_DEMO_VAR_TRAVEL_Y, 0); if (box <= 0) return 0; if (x < area_x || x >= area_x + travel_x + box || @@ -232,12 +231,12 @@ static int render_demo_mouse(ecex_t *ed, buffer_t *buffer, int event, int x, int nx = x - area_x - box / 2; ny = y - area_y - box / 2; - if (travel_x <= 0) render_demo_set(ed, s, RENDER_DEMO_VAR_TARGET_X, 0); - else render_demo_set(ed, s, RENDER_DEMO_VAR_TARGET_X, render_demo_clamp_milli((nx * 1000) / travel_x)); - if (travel_y <= 0) render_demo_set(ed, s, RENDER_DEMO_VAR_TARGET_Y, 0); - else render_demo_set(ed, s, RENDER_DEMO_VAR_TARGET_Y, render_demo_clamp_milli((ny * 1000) / travel_y)); + if (travel_x <= 0) render_demo_set(s, RENDER_DEMO_VAR_TARGET_X, 0); + else render_demo_set(s, RENDER_DEMO_VAR_TARGET_X, render_demo_clamp_milli((nx * 1000) / travel_x)); + if (travel_y <= 0) render_demo_set(s, RENDER_DEMO_VAR_TARGET_Y, 0); + else render_demo_set(s, RENDER_DEMO_VAR_TARGET_Y, render_demo_clamp_milli((ny * 1000) / travel_y)); - render_demo_set(ed, s, RENDER_DEMO_VAR_MOVING, 1); + render_demo_set(s, RENDER_DEMO_VAR_MOVING, 1); ecex_log("render_demo_mouse: target set"); return 1; } @@ -245,8 +244,7 @@ static int render_demo_mouse(ecex_t *ed, buffer_t *buffer, int event, int x, int static void render_demo_free_state(void *userdata) { render_demo_state_t *s = (render_demo_state_t *)userdata; if (!s) return; - ecex_var_free_owner(s->ed, s); - ecex_config_free(s); + ecex_plugin_object_free(s->plugin, s); } static int cmd_render_demo(ecex_t *ed) { @@ -262,10 +260,11 @@ static int cmd_render_demo(ecex_t *ed) { s = (render_demo_state_t *)ecex_buffer_renderer_userdata(buffer); if (!s) { - s = (render_demo_state_t *)ecex_config_calloc(1, sizeof(*s)); + ecex_plugin_t *plugin = ecex_plugin_find(ed, "render-demo"); + s = (render_demo_state_t *)ecex_plugin_object_calloc(plugin, "state", 1, sizeof(*s)); if (!s) return -1; - s->ed = ed; - render_demo_reset(ed, s); + s->plugin = plugin; + render_demo_reset(s); if (ecex_buffer_set_renderer(buffer, render_demo_draw, s, render_demo_free_state, ECEX_RENDER_REPLACE_CONTENT) != 0) { render_demo_free_state(s); @@ -290,10 +289,11 @@ static int cmd_render_demo(ecex_t *ed) { return ecex_switch_buffer(ed, RENDER_DEMO_BUF); } -int ecex_render_demo_plugin(ecex_t *ed) { +ECEX_PLUGIN_BEGIN(ecex_render_demo_plugin, "render-demo") + (void)plugin; ECEX_CONFIG_COMMAND("render-demo", cmd_render_demo); return 0; -} +ECEX_PLUGIN_END #ifndef ECEX_NO_STANDALONE_CONFIG ECEX_CONFIG_BEGIN |
