kopia lustrzana https://github.com/Aircoookie/WLED
				
				
				
			
						commit
						4282053f68
					
				
							
								
								
									
										122
									
								
								wled00/FX.cpp
								
								
								
								
							
							
						
						
									
										122
									
								
								wled00/FX.cpp
								
								
								
								
							|  | @ -2599,3 +2599,125 @@ uint16_t WS2812FX::mode_starburst(void) { | |||
|   } | ||||
|   return FRAMETIME; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Exploding fireworks effect | ||||
|  * adapted from: http://www.anirama.com/1000leds/1d-fireworks/
 | ||||
|  */ | ||||
| 
 | ||||
| //each needs 12 byte
 | ||||
| typedef struct Spark { | ||||
|   float pos; | ||||
|   float vel; | ||||
|   uint16_t col; | ||||
|   uint8_t colIndex; | ||||
| } spark; | ||||
| 
 | ||||
| uint16_t WS2812FX::mode_exploding_fireworks(void) | ||||
| { | ||||
|   //allocate segment data
 | ||||
|   uint16_t numSparks = 2 + (SEGLEN >> 1);  | ||||
|   if (numSparks > 80) numSparks = 80; | ||||
|   uint16_t dataSize = sizeof(spark) * numSparks; | ||||
|   if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
 | ||||
| 
 | ||||
|   fill(BLACK); | ||||
|    | ||||
|   bool actuallyReverse = SEGMENT.getOption(1); | ||||
|   //have fireworks start in either direction based on intensity
 | ||||
|   SEGMENT.setOption(1, SEGENV.step); | ||||
|    | ||||
|   Spark* sparks = reinterpret_cast<Spark*>(SEGENV.data); | ||||
|   Spark* flare = sparks; //first spark is flare data
 | ||||
| 
 | ||||
|   float gravity = -0.0004 - (SEGMENT.speed/800000.0); // m/s/s
 | ||||
|   gravity *= SEGLEN; | ||||
|    | ||||
|   if (SEGENV.aux0 < 2) { //FLARE
 | ||||
|     if (SEGENV.aux0 == 0) { //init flare
 | ||||
|       flare->pos = 0; | ||||
|       uint16_t peakHeight = 75 + random8(180); //0-255
 | ||||
|       peakHeight = (peakHeight * (SEGLEN -1)) >> 8; | ||||
|       flare->vel = sqrt(-2.0 * gravity * peakHeight); | ||||
|       flare->col = 255; //brightness
 | ||||
| 
 | ||||
|       SEGENV.aux0 = 1;  | ||||
|     } | ||||
|      | ||||
|     // launch 
 | ||||
|     if (flare->vel > 12 * gravity) { | ||||
|       // flare
 | ||||
|       setPixelColor(SEGMENT.start + int(flare->pos),flare->col,flare->col,flare->col); | ||||
|    | ||||
|       flare->pos += flare->vel; | ||||
|       flare->pos = constrain(flare->pos, 0, SEGLEN-1); | ||||
|       flare->vel += gravity; | ||||
|       flare->col -= 2; | ||||
|     } else { | ||||
|       SEGENV.aux0 = 2;  // ready to explode
 | ||||
|     } | ||||
|   } else if (SEGENV.aux0 < 4) { | ||||
|     /*
 | ||||
|      * Explode! | ||||
|      *  | ||||
|      * Explosion happens where the flare ended. | ||||
|      * Size is proportional to the height. | ||||
|      */ | ||||
|     int nSparks = flare->pos; | ||||
|     nSparks = constrain(nSparks, 0, numSparks); | ||||
|     static float dying_gravity; | ||||
|    | ||||
|     // initialize sparks
 | ||||
|     if (SEGENV.aux0 == 2) { | ||||
|       for (int i = 1; i < nSparks; i++) {  | ||||
|         sparks[i].pos = flare->pos;  | ||||
|         sparks[i].vel = (float(random16(0, 20000)) / 10000.0) - 0.9; // from -0.9 to 1.1
 | ||||
|         sparks[i].col = 345;//abs(sparks[i].vel * 750.0); // set colors before scaling velocity to keep them bright 
 | ||||
|         //sparks[i].col = constrain(sparks[i].col, 0, 345); 
 | ||||
|         sparks[i].colIndex = random8(); | ||||
|         sparks[i].vel *= flare->pos/SEGLEN; // proportional to height 
 | ||||
|         sparks[i].vel *= -gravity *50; | ||||
|       }  | ||||
|       //sparks[1].col = 345; // this will be our known spark 
 | ||||
|       dying_gravity = gravity/2;  | ||||
|       SEGENV.aux0 = 3; | ||||
|     } | ||||
|    | ||||
|     if (sparks[1].col > 4) {//&& sparks[1].pos > 0) { // as long as our known spark is lit, work with all the sparks
 | ||||
|       for (int i = 1; i < nSparks; i++) {  | ||||
|         sparks[i].pos += sparks[i].vel;  | ||||
|         sparks[i].vel += dying_gravity;  | ||||
|         if (sparks[i].col > 3) sparks[i].col -= 4;  | ||||
| 
 | ||||
|         if (sparks[i].pos > 0 && sparks[i].pos < SEGLEN) { | ||||
|           uint16_t prog = sparks[i].col; | ||||
|           uint32_t spColor = (SEGMENT.palette) ? color_wheel(sparks[i].colIndex) : SEGCOLOR(0); | ||||
|           CRGB c = CRGB::Black; //HeatColor(sparks[i].col);
 | ||||
|           if (prog > 300) { //fade from white to spark color
 | ||||
|             c = col_to_crgb(color_blend(spColor, WHITE, (prog - 300)*5)); | ||||
|           } else if (prog > 45) { //fade from spark color to black
 | ||||
|             c = col_to_crgb(color_blend(BLACK, spColor, prog - 45)); | ||||
|             uint8_t cooling = (300 - prog) >> 5; | ||||
|             c.g = qsub8(c.g, cooling); | ||||
|             c.b = qsub8(c.b, cooling * 2); | ||||
|           } | ||||
|           setPixelColor(SEGMENT.start + int(sparks[i].pos), c.red, c.green, c.blue); | ||||
|         } | ||||
|       } | ||||
|       dying_gravity *= .99; // as sparks burn out they fall slower
 | ||||
|     } else { | ||||
|       SEGENV.aux0 = 6 + random8(10); //wait for this many frames
 | ||||
|     } | ||||
|   } else { | ||||
|     SEGENV.aux0--; | ||||
|     if (SEGENV.aux0 < 4) { | ||||
|       SEGENV.aux0 = 0; //back to flare
 | ||||
|       SEGENV.step = (SEGMENT.intensity > random8()); //decide firing side
 | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   SEGMENT.setOption(1, actuallyReverse); | ||||
|    | ||||
|   return FRAMETIME;   | ||||
| } | ||||
|  |  | |||
							
								
								
									
										10
									
								
								wled00/FX.h
								
								
								
								
							
							
						
						
									
										10
									
								
								wled00/FX.h
								
								
								
								
							|  | @ -91,7 +91,7 @@ | |||
| #define IS_REVERSE      ((SEGMENT.options & REVERSE )     == REVERSE     ) | ||||
| #define IS_SELECTED     ((SEGMENT.options & SELECTED)     == SELECTED    ) | ||||
| 
 | ||||
| #define MODE_COUNT  90 | ||||
| #define MODE_COUNT  91 | ||||
| 
 | ||||
| #define FX_MODE_STATIC                   0 | ||||
| #define FX_MODE_BLINK                    1 | ||||
|  | @ -183,6 +183,7 @@ | |||
| #define FX_MODE_GLITTER                 87 | ||||
| #define FX_MODE_CANDLE                  88 | ||||
| #define FX_MODE_STARBURST               89 | ||||
| #define FX_MODE_EXPLODING_FIREWORKS     90 | ||||
| 
 | ||||
| 
 | ||||
| class WS2812FX { | ||||
|  | @ -353,6 +354,7 @@ class WS2812FX { | |||
|       _mode[FX_MODE_GLITTER]                 = &WS2812FX::mode_glitter; | ||||
|       _mode[FX_MODE_CANDLE]                  = &WS2812FX::mode_candle; | ||||
|       _mode[FX_MODE_STARBURST]               = &WS2812FX::mode_starburst; | ||||
|       _mode[FX_MODE_EXPLODING_FIREWORKS]     = &WS2812FX::mode_exploding_fireworks; | ||||
| 
 | ||||
|       _brightness = DEFAULT_BRIGHTNESS; | ||||
|       currentPalette = CRGBPalette16(CRGB::Black); | ||||
|  | @ -529,7 +531,8 @@ class WS2812FX { | |||
|       mode_spots_fade(void), | ||||
|       mode_glitter(void), | ||||
|       mode_candle(void), | ||||
|       mode_starburst(void); | ||||
|       mode_starburst(void), | ||||
|       mode_exploding_fireworks(void); | ||||
|        | ||||
| 
 | ||||
|   private: | ||||
|  | @ -605,7 +608,8 @@ const char JSON_mode_names[] PROGMEM = R"=====([ | |||
| "Two Dots","Two Areas","Circus","Halloween","Tri Chase","Tri Wipe","Tri Fade","Lightning","ICU","Multi Comet", | ||||
| "Scanner Dual","Stream 2","Oscillate","Pride 2015","Juggle","Palette","Fire 2012","Colorwaves","Bpm","Fill Noise", | ||||
| "Noise 1","Noise 2","Noise 3","Noise 4","Colortwinkles","Lake","Meteor","Meteor Smooth","Railway","Ripple", | ||||
| "Twinklefox","Twinklecat","Halloween Eyes","Solid Pattern","Solid Pattern Tri","Spots","Spots Fade","Glitter","Candle","Fireworks Starburst" | ||||
| "Twinklefox","Twinklecat","Halloween Eyes","Solid Pattern","Solid Pattern Tri","Spots","Spots Fade","Glitter","Candle","Fireworks Starburst", | ||||
| "Fireworks 1D" | ||||
| ])====="; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -98,7 +98,7 @@ | |||
| 
 | ||||
| 
 | ||||
| //version code in format yymmddb (b = daily build)
 | ||||
| #define VERSION 2001022 | ||||
| #define VERSION 2001031 | ||||
| char versionString[] = "0.9.0-b2"; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Aircoookie
						Aircoookie