From 64a5b1747b41f8dcb1d8cf6e6108c386e2904585 Mon Sep 17 00:00:00 2001
From: Vito Caputo <vcaputo@pengaru.com>
Date: Thu, 15 Jun 2023 18:19:50 -0700
Subject: til_module_context: s/ticks/last_ticks/ in context

And just maintain it as the last ticks value after rendering with
the context...

A couple modules were already doing this manually in an ad-hoc
fashion, just make it a general thing.

Updated those modules to reflect the new situation

Especially in a rkt world with modules::mixer doing fades, it
becomes common to render the same context twice in the same frame
for the blending.  We need to prevent accelerated animations in
such situations.  For now let's just rely on ticks in a delta-T
fashion to prevent animating the context when ticks is the same.

modules::stars in particular needs this fixed up, upcoming commit
---
 src/modules/plato/plato.c | 5 ++---
 src/modules/roto/roto.c   | 6 ++----
 2 files changed, 4 insertions(+), 7 deletions(-)

(limited to 'src/modules')

diff --git a/src/modules/plato/plato.c b/src/modules/plato/plato.c
index f43eda3..a20137e 100644
--- a/src/modules/plato/plato.c
+++ b/src/modules/plato/plato.c
@@ -658,9 +658,8 @@ static void plato_render_fragment(til_module_context_t *context, til_stream_t *s
 	(void) til_stream_tap_context(stream, context, NULL, &ctxt->taps.orbit_rate);
 	(void) til_stream_tap_context(stream, context, NULL, &ctxt->taps.spin_rate);
 
-	ctxt->r += (float)(ticks - context->ticks) * (*ctxt->orbit_rate * .001f);
-	ctxt->rr += (float)(ticks - context->ticks) * (*ctxt->spin_rate * .001f);
-	context->ticks = ticks;
+	ctxt->r += (float)(ticks - context->last_ticks) * (*ctxt->orbit_rate * .001f);
+	ctxt->rr += (float)(ticks - context->last_ticks) * (*ctxt->spin_rate * .001f);
 	til_fb_fragment_clear(fragment);
 
 	for (int i = 0; i < sizeof(polyhedra) / sizeof(*polyhedra); i++) {
diff --git a/src/modules/roto/roto.c b/src/modules/roto/roto.c
index 8564870..28e27e1 100644
--- a/src/modules/roto/roto.c
+++ b/src/modules/roto/roto.c
@@ -189,9 +189,9 @@ static void roto_prepare_frame(til_module_context_t *context, til_stream_t *stre
 	*res_frame_plan = (til_frame_plan_t){ .fragmenter = til_fragmenter_slice_per_cpu };
 
 	// This governs the rotation and color cycle.
-	if (ticks != context->ticks) {
+	if (ticks != context->last_ticks) {
 		ctxt->r += FIXED_TO_INT(FIXED_MULT(FIXED_SIN(ctxt->rr), FIXED_NEW(16)));
-		ctxt->rr += (ticks - context->ticks) >> 2;
+		ctxt->rr += (ticks - context->last_ticks) >> 2;
 
 		/* Vary the colors, this is just a mashup of sinusoidal rgb values. */
 		ctxt->palette[0].r = (FIXED_MULT(FIXED_COS(ctxt->rr), FIXED_NEW(127)) + FIXED_NEW(128));
@@ -201,8 +201,6 @@ static void roto_prepare_frame(til_module_context_t *context, til_stream_t *stre
 		ctxt->palette[1].r = (FIXED_MULT(FIXED_SIN(ctxt->rr / 2), FIXED_NEW(127)) + FIXED_NEW(128));
 		ctxt->palette[1].g = (FIXED_MULT(FIXED_COS(ctxt->rr / 2), FIXED_NEW(127)) + FIXED_NEW(128));
 		ctxt->palette[1].b = (FIXED_MULT(FIXED_SIN(ctxt->rr), FIXED_NEW(127)) + FIXED_NEW(128));
-
-		context->ticks = ticks;
 	}
 }
 
-- 
cgit v1.2.3