There’s a fundamental design tension between aiming high (declarative sprite definitions, render windows, inversion of control – no explicit ‘loop’, abstract timebases), and aiming low (an ever-growing library of helper functions and sample code for specific effects).
Dan and I both want both of these things, and we also both have day jobs. Dan’s done more work abstracting his own animations ‘up’, and we both talk about what the future APIs might be like.
One basic thing is that each animation and effect should be separated apart, and that the main Arduino loop function should mostly not contain animation code itself.
One idea is for each animation function to take a pointer to the CRGB buffer to draw into, a length for that buffer, a void* context, and a “time” parameter maybe in milliseconds, describing what slice of the animation to draw. (For two dimensional patterns, it might be a pointer to the CRGB matrix, X and Y dimensions, a void* context, and a time.)
Each animation could then render into it’s own buffer (potentially), and you could have compositing functions to distill those outputs down into the final leds[] array(s).
But this is all still pretty wide open speculation. Often we’ll have an idea, and play with it for a few weeks, just to see how it works in practice. So far, no one overarching master API has emerged. I suspect that in the end there will be a couple of different ones, at different ‘levels’ of abstraction.
And yes, some of it does seems kind of 80’s … but then again, back in the 80’s I was doing pixelated 8-bit video graphics on low-MHz CPUs, and having a blast doing it, so this is all good!