diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/roto/roto.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/src/modules/roto/roto.c b/src/modules/roto/roto.c index 389aa5d..1831d2b 100644 --- a/src/modules/roto/roto.c +++ b/src/modules/roto/roto.c @@ -27,11 +27,11 @@ typedef struct color_t { typedef struct roto_context_t { til_module_context_t til_module_context; unsigned r, rr; + color_t palette[2]; } roto_context_t; static int32_t costab[FIXED_TRIG_LUT_SIZE], sintab[FIXED_TRIG_LUT_SIZE]; static uint8_t texture[256][256]; -static color_t palette[2]; static til_module_context_t * roto_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup) { @@ -125,9 +125,9 @@ static uint32_t bilerp_color(uint8_t texture[256][256], color_t *palette, int tx /* Skip interpolation of same colors, a substantial optimization with plain textures like the checker pattern */ if (nw == ne) { - if (ne == sw && sw == se) { + if (ne == sw && sw == se) return (FIXED_TO_INT(palette[sw].r) << 16) | (FIXED_TO_INT(palette[sw].g) << 8) | FIXED_TO_INT(palette[sw].b); - } + n_color = palette[nw]; } else { n_color = lerp_color(&palette[nw], &palette[ne], x_alpha); @@ -188,8 +188,21 @@ static void roto_prepare_frame(til_module_context_t *context, unsigned ticks, ti *res_fragmenter = til_fragmenter_slice_per_cpu; // This governs the rotation and color cycle. - ctxt->r += FIXED_TO_INT(FIXED_MULT(FIXED_SIN(ctxt->rr), FIXED_NEW(16))); - ctxt->rr += 2; + if (ticks != context->ticks) { + ctxt->r += FIXED_TO_INT(FIXED_MULT(FIXED_SIN(ctxt->rr), FIXED_NEW(16))); + ctxt->rr += (ticks - context->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)); + ctxt->palette[0].g = (FIXED_MULT(FIXED_SIN(ctxt->rr / 2), FIXED_NEW(127)) + FIXED_NEW(128)); + ctxt->palette[0].b = (FIXED_MULT(FIXED_COS(ctxt->rr / 3), FIXED_NEW(127)) + FIXED_NEW(128)); + + 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; + } } @@ -197,8 +210,8 @@ static void roto_prepare_frame(til_module_context_t *context, unsigned ticks, ti static void roto_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment) { roto_context_t *ctxt = (roto_context_t *)context; - int y_cos_r, y_sin_r, x_cos_r, x_sin_r, x_cos_r_init, x_sin_r_init, cos_r, sin_r; int x, y, frame_width = fragment->frame_width, frame_height = fragment->frame_height; + int y_cos_r, y_sin_r, x_cos_r, x_sin_r, x_cos_r_init, x_sin_r_init, cos_r, sin_r; uint32_t *buf = fragment->buf; /* This is all done using fixed-point in the hopes of being faster, and yes assumptions @@ -206,15 +219,6 @@ static void roto_render_fragment(til_module_context_t *context, unsigned ticks, cos_r = FIXED_COS(ctxt->r); sin_r = FIXED_SIN(ctxt->r); - /* Vary the colors, this is just a mashup of sinusoidal rgb values. */ - palette[0].r = (FIXED_MULT(FIXED_COS(ctxt->rr), FIXED_NEW(127)) + FIXED_NEW(128)); - palette[0].g = (FIXED_MULT(FIXED_SIN(ctxt->rr / 2), FIXED_NEW(127)) + FIXED_NEW(128)); - palette[0].b = (FIXED_MULT(FIXED_COS(ctxt->rr / 3), FIXED_NEW(127)) + FIXED_NEW(128)); - - palette[1].r = (FIXED_MULT(FIXED_SIN(ctxt->rr / 2), FIXED_NEW(127)) + FIXED_NEW(128)); - palette[1].g = (FIXED_MULT(FIXED_COS(ctxt->rr / 2), FIXED_NEW(127)) + FIXED_NEW(128)); - palette[1].b = (FIXED_MULT(FIXED_SIN(ctxt->rr), FIXED_NEW(127)) + FIXED_NEW(128)); - /* The dimensions are cut in half and negated to center the rotation. */ /* The [xy]_{sin,cos}_r variables are accumulators to replace multiplication with addition. */ x_cos_r_init = FIXED_MULT(-FIXED_NEW(frame_width / 2) + FIXED_NEW(fragment->x), cos_r); @@ -229,7 +233,7 @@ static void roto_render_fragment(til_module_context_t *context, unsigned ticks, x_sin_r = x_sin_r_init; for (x = fragment->x; x < fragment->x + fragment->width; x++, buf++) { - *buf = bilerp_color(texture, palette, x_sin_r - y_cos_r, y_sin_r + x_cos_r); + *buf = bilerp_color(texture, ctxt->palette, x_sin_r - y_cos_r, y_sin_r + x_cos_r); x_cos_r += cos_r; x_sin_r += sin_r; |