From 60353ac9dde8ec3178ef926afc9889551e77cc62 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Tue, 24 May 2022 22:28:23 -0700 Subject: modules/shapes: add spin setting for star+pinwheel Introduces spin={-1,0,1} with a few intermediate fractions on both sides of 0. Controls rate and direction. As-is these multiple choice style options don't let you explicitly set a value in rototiller on the commandline that isn't in the set. There should probably be a flag in the desc we can set when bypassing the available options is tolerable, probably when regex's start getting enforced. That way rototiller's commandline setting parsing can just lean on the regex, and if the desc says anything can come in that passes the regex even if it's not in the values set, this can all still work and have something resembling input validation. At the end of the day, the multiple choice value sets are supposed to be a convenience/guide to a sane variety of values and of particular utility to randomizers like used by rtv/montage/compose, but also GUI setting selectors like in glimmer. They're not intended to get in the way preventing development from accessing explicit values of arbitrary precision which can be really necessary especially when trying to determine what's best for going in the values set. --- src/modules/shapes/shapes.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/modules/shapes/shapes.c b/src/modules/shapes/shapes.c index f084a01..68d194e 100644 --- a/src/modules/shapes/shapes.c +++ b/src/modules/shapes/shapes.c @@ -66,6 +66,7 @@ #define SHAPES_DEFAULT_TYPE SHAPES_TYPE_PINWHEEL #define SHAPES_DEFAULT_POINTS 5 +#define SHAPES_DEFAULT_SPIN .1 typedef enum shapes_type_t { SHAPES_TYPE_CIRCLE, @@ -78,6 +79,7 @@ typedef struct shapes_setup_t { til_setup_t til_setup; shapes_type_t type; unsigned n_points; + float spin; } shapes_setup_t; typedef struct shapes_context_t { @@ -173,7 +175,7 @@ static void shapes_render_fragment(void *context, unsigned ticks, unsigned cpu, for (unsigned y = yoff; y < yoff + size; y++, Y += s) { X = -1.f; for (unsigned x = xoff; x < xoff + size; x++, X += s) { - float rad = atan2f(Y, X) + (float)ticks * .001f; + float rad = atan2f(Y, X) + (float)ticks * ctxt->setup.spin * .01f; float r = cosf((float)ctxt->setup.n_points * rad) * .5f + .5f; if (X * X + Y * Y < r * r) @@ -212,7 +214,7 @@ static void shapes_render_fragment(void *context, unsigned ticks, unsigned cpu, for (unsigned y = yoff; y < yoff + size; y++, Y += s) { X = -1.f; for (unsigned x = xoff; x < xoff + size; x++, X += s) { - float rad = atan2f(Y, X) + (float)ticks * .001f; + float rad = atan2f(Y, X) + (float)ticks * ctxt->setup.spin * .01f; float r = (M_2_PI * asinf(sinf((float)ctxt->setup.n_points * rad) * .5f + .5f)) * .5f + .5f; /* ^^^^^^^^^^^^^^^^^^^ approximates a triangle wave */ @@ -232,6 +234,7 @@ static int shapes_setup(const til_settings_t *settings, til_setting_t **res_sett { const char *type; const char *points; + const char *spin; const char *type_values[] = { "circle", "pinwheel", @@ -260,6 +263,24 @@ static int shapes_setup(const til_settings_t *settings, til_setting_t **res_sett "20", NULL }; + const char *spin_values[] = { + "-1", + "-.9", + "-.75", + "-.5", + "-.25", + "-.1", + "-.01", + "0", + ".01", + ".1", + ".25", + ".5", + ".75", + ".9", + "1", + NULL + }; int r; r = til_settings_get_and_describe_value(settings, @@ -293,6 +314,20 @@ static int shapes_setup(const til_settings_t *settings, til_setting_t **res_sett if (r) return r; + r = til_settings_get_and_describe_value(settings, + &(til_setting_desc_t){ + .name = "Spin factor", + .key = "spin", + .regex = "-?(0|1|0\\.[0-9]{1,2})", /* Derived from pixbounce, I'm sure when regexes start getting actually applied we're going to have to revisit all of these and fix them with plenty of lols. */ + .preferred = TIL_SETTINGS_STR(SHAPES_DEFAULT_SPIN), + .values = spin_values, + .annotations = NULL + }, + &spin, + res_setting, + res_desc); + if (r) + return r; } if (res_setup) { @@ -316,8 +351,10 @@ static int shapes_setup(const til_settings_t *settings, til_setting_t **res_sett return -EINVAL; } - if (setup->type == SHAPES_TYPE_STAR || setup->type == SHAPES_TYPE_PINWHEEL) + if (setup->type == SHAPES_TYPE_STAR || setup->type == SHAPES_TYPE_PINWHEEL) { sscanf(points, "%u", &setup->n_points); /* TODO: -EINVAL parse errors */ + sscanf(spin, "%f", &setup->spin); /* TODO: -EINVAL parse errors */ + } *res_setup = &setup->til_setup; } -- cgit v1.2.3