summaryrefslogtreecommitdiff
path: root/src/modules/asc
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2023-10-03 14:29:01 -0700
committerVito Caputo <vcaputo@pengaru.com>2023-10-03 14:29:01 -0700
commitf97c10d4fa915a7730a814b8de05cafb3750fdae (patch)
treeb8359d1f081a89580e0483d40229e7ddc69f5073 /src/modules/asc
parent8519a14787f061188e0075d04727aaa32d280670 (diff)
modules/asc: tap x/y coordinates
Nothing terribly exciting, the string can now be moved dynamically via taps in the usual manner. When nobody's driving the taps they just use the setting, still defaulting to 0,0 (centered).
Diffstat (limited to 'src/modules/asc')
-rw-r--r--src/modules/asc/asc.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/modules/asc/asc.c b/src/modules/asc/asc.c
index 2d50021..bdb482e 100644
--- a/src/modules/asc/asc.c
+++ b/src/modules/asc/asc.c
@@ -7,6 +7,8 @@
#include "til.h"
#include "til_fb.h"
#include "til_module_context.h"
+#include "til_stream.h"
+#include "til_tap.h"
#include "txt/txt.h"
@@ -16,8 +18,6 @@
* replace with something a more visually interesting font/style.
*
* TODO:
- * - Wire up taps for the x/y coordinates, making this a handy taps diagnostic
- *
* - Maybe add a dynamic justification mode where the h/v alignment offsets are
* just the inverse of the normalized x/y coordinates. This requires extending
* libs/txt to support precise offsetting when rendering as an alternative to the
@@ -45,10 +45,38 @@ typedef struct asc_setup_t {
typedef struct asc_context_t {
til_module_context_t til_module_context;
+ struct {
+ til_tap_t x, y;
+ } taps;
+
+ struct {
+ float x, y;
+ } vars;
+
+ float *x, *y;
+
txt_t *txt;
} asc_context_t;
+static void asc_update_taps(asc_context_t *ctxt, til_stream_t *stream)
+{
+ if (!til_stream_tap_context(stream, &ctxt->til_module_context, NULL, &ctxt->taps.x))
+ *ctxt->x = ((asc_setup_t *)ctxt->til_module_context.setup)->x;
+ else
+ ctxt->vars.x = *ctxt->x;
+
+ if (!til_stream_tap_context(stream, &ctxt->til_module_context, NULL, &ctxt->taps.y))
+ *ctxt->y = ((asc_setup_t *)ctxt->til_module_context.setup)->y;
+ else
+ ctxt->vars.y = *ctxt->y;
+
+ /* XXX: maybe clamp to -1.0..+1.0 ? It's not a crash risk since txt_render_fragment()
+ * clips to the fragment by using ...put_pixel_checked() *shrug*
+ */
+}
+
+
static til_module_context_t * asc_create_context(const til_module_t *module, til_stream_t *stream, unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
asc_context_t *ctxt;
@@ -61,6 +89,11 @@ static til_module_context_t * asc_create_context(const til_module_t *module, til
if (!ctxt->txt)
return til_module_context_free(&ctxt->til_module_context);
+ ctxt->taps.x = til_tap_init_float(ctxt, &ctxt->x, 1, &ctxt->vars.x, "x");
+ ctxt->taps.y = til_tap_init_float(ctxt, &ctxt->y, 1, &ctxt->vars.y, "y");
+
+ asc_update_taps(ctxt, stream);
+
return &ctxt->til_module_context;
}
@@ -71,11 +104,13 @@ static void asc_render_fragment(til_module_context_t *context, til_stream_t *str
asc_setup_t *s = (asc_setup_t *)context->setup;
til_fb_fragment_t *fragment = *fragment_ptr;
+ asc_update_taps(ctxt, stream);
+
til_fb_fragment_clear(fragment);
txt_render_fragment(ctxt->txt, fragment, 0xffffffff,
- s->x * ((float)fragment->frame_width) * .5f + .5f * ((float)fragment->frame_width),
- s->y * ((float)fragment->frame_height) * .5f + .5f * ((float)fragment->frame_height),
+ ctxt->vars.x * ((float)fragment->frame_width) * .5f + .5f * ((float)fragment->frame_width),
+ ctxt->vars.y * ((float)fragment->frame_height) * .5f + .5f * ((float)fragment->frame_height),
(txt_align_t){
.horiz = s->halign,
.vert = s->valign
© All Rights Reserved