Memory optimizations

This commit is contained in:
cschwinne 2019-12-31 19:01:37 +01:00
parent 446e2c123f
commit 21b498fece

View File

@ -2444,9 +2444,9 @@ uint16_t WS2812FX::mode_candle()
/ based on the video: https://www.reddit.com/r/arduino/comments/c3sd46/i_made_this_fireworks_effect_for_my_led_strips/ / based on the video: https://www.reddit.com/r/arduino/comments/c3sd46/i_made_this_fireworks_effect_for_my_led_strips/
/ Speed sets frequency of new starbursts, intensity is the intensity of the burst / Speed sets frequency of new starbursts, intensity is the intensity of the burst
*/ */
#define STARBURST_MAX_FRAG 20 #define STARBURST_MAX_FRAG 12
typedef struct Particle { typedef struct particle {
CRGB color; CRGB color;
uint32_t birth =0; uint32_t birth =0;
uint32_t last =0; uint32_t last =0;
@ -2458,11 +2458,11 @@ typedef struct Particle {
uint16_t WS2812FX::mode_starburst(void) { uint16_t WS2812FX::mode_starburst(void) {
uint32_t it = millis(); uint32_t it = millis();
const uint8_t numStars = 4; const uint8_t numStars = 15;
static star stars[numStars]; static star stars[numStars];
float maxSpeed = 375.0f; // Max velocity float maxSpeed = 375.0f; // Max velocity
float ParticleIgnition = 250.0f; // How long to "flash" float particleIgnition = 250.0f; // How long to "flash"
float ParticleFadeTime = 1500.0f; // Fade out time float particleFadeTime = 1500.0f; // Fade out time
for (int j = 0; j < numStars; j++) for (int j = 0; j < numStars; j++)
{ {
@ -2471,7 +2471,7 @@ uint16_t WS2812FX::mode_starburst(void) {
{ {
// Pick a random color and location. // Pick a random color and location.
uint16_t startPos = random16(SEGLEN-1); uint16_t startPos = random16(SEGLEN-1);
double multiplier = (float)(random8())/255.0 * 1.0; float multiplier = (float)(random8())/255.0 * 1.0;
stars[j].color = col_to_crgb(color_wheel(random8())); stars[j].color = col_to_crgb(color_wheel(random8()));
stars[j].pos = startPos; stars[j].pos = startPos;
@ -2479,7 +2479,7 @@ uint16_t WS2812FX::mode_starburst(void) {
stars[j].birth = it; stars[j].birth = it;
stars[j].last = it; stars[j].last = it;
// more fragments means larger burst effect // more fragments means larger burst effect
int num = random8(5,10 + (SEGMENT.intensity * STARBURST_MAX_FRAG/255)); int num = random8(3,6 + (SEGMENT.intensity >> 5));
for (int i=0; i < STARBURST_MAX_FRAG; i++) { for (int i=0; i < STARBURST_MAX_FRAG; i++) {
if (i < num) stars[j].fragment[i] = startPos; if (i < num) stars[j].fragment[i] = startPos;
@ -2499,12 +2499,8 @@ uint16_t WS2812FX::mode_starburst(void) {
int var = i >> 1; int var = i >> 1;
if (stars[j].fragment[i] > 0) { if (stars[j].fragment[i] > 0) {
// spplit fragments half to each side with some travelling further //all fragments travel right, will be mirrored on other side
if (i % 2) { stars[j].fragment[i] += stars[j].vel * dt * (float)var/3.0;
stars[j].fragment[i] -= stars[j].vel * dt * (float)var/6.0;
} else {
stars[j].fragment[i] += stars[j].vel * dt * (float)var/6.0;
}
} }
} }
stars[j].last = it; stars[j].last = it;
@ -2518,30 +2514,34 @@ uint16_t WS2812FX::mode_starburst(void) {
float fade = 0.0f; float fade = 0.0f;
float age = it-stars[j].birth; float age = it-stars[j].birth;
if (age < ParticleIgnition) { if (age < particleIgnition) {
c = col_to_crgb(color_blend(ULTRAWHITE, crgb_to_col(c), 254.5f*((age / ParticleIgnition)))); c = col_to_crgb(color_blend(WHITE, crgb_to_col(c), 254.5f*((age / particleIgnition))));
} else { } else {
// Figure out how much to fade and shrink the star based on // Figure out how much to fade and shrink the star based on
// its age relative to its lifetime // its age relative to its lifetime
if (age > ParticleIgnition + ParticleFadeTime) { if (age > particleIgnition + particleFadeTime) {
fade = 1.0f; // Black hole, all faded out fade = 1.0f; // Black hole, all faded out
stars[j].birth = 0; stars[j].birth = 0;
c = col_to_crgb(SEGCOLOR(1)); c = col_to_crgb(SEGCOLOR(1));
} else { } else {
age -= ParticleIgnition; age -= particleIgnition;
fade = (age / ParticleFadeTime); // Fading star fade = (age / particleFadeTime); // Fading star
byte f = 254.5f*fade; byte f = 254.5f*fade;
c = col_to_crgb(color_blend(crgb_to_col(c), SEGCOLOR(1), f)); c = col_to_crgb(color_blend(crgb_to_col(c), SEGCOLOR(1), f));
} }
} }
float ParticleSize = (1.0 - fade) * 2; float particleSize = (1.0 - fade) * 2;
for (int i=0; i < STARBURST_MAX_FRAG; i++) { for (uint8_t index=0; index < STARBURST_MAX_FRAG*2; index++) {
bool mirrored = index & 0x1;
uint8_t i = index >> 1;
if (stars[j].fragment[i] > 0) { if (stars[j].fragment[i] > 0) {
int start = int(stars[j].fragment[i]) - int(ParticleSize); float loc = stars[j].fragment[i];
if (mirrored) loc -= (loc-stars[j].pos)*2;
int start = loc - particleSize;
int end = loc + particleSize;
if (start < 0) start = 0; if (start < 0) start = 0;
int end = int(stars[j].fragment[i]) + int(ParticleSize);
if (start == end) end++; if (start == end) end++;
if (end > SEGLEN) end = SEGLEN; if (end > SEGLEN) end = SEGLEN;
for (int p = start; p < end; p++) { for (int p = start; p < end; p++) {