aboutsummaryrefslogtreecommitdiff
path: root/config/render_demo.c
diff options
context:
space:
mode:
authorDavid Moc <personal@cdatgoose.org>2026-06-02 13:50:21 +0200
committerDavid Moc <personal@cdatgoose.org>2026-06-02 13:50:21 +0200
commita15cb041654ae307add0b998b526c87c3f42bf5f (patch)
tree225bb4b70e9fa05aa5f4d2722a1a9cf5fc6fca7f /config/render_demo.c
parent6aeaa171dc1ca43392f53cbd02097f76e1b1c5a0 (diff)
Add plugin hooks and mode plugins
Diffstat (limited to 'config/render_demo.c')
-rw-r--r--config/render_demo.c118
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