int MaxHeight; int ScreenSize; color[] paletteFire; int[] offscreen; int xEll = -100; int yEll = -100; void setup() { size(160,120); paletteFire = new color[256]; offscreen = new int[width*height]; ScreenSize = width * (height-2); MaxHeight = (int)(height/100); createColorForPaletteFire(); ellipseMode(CENTER); framerate(60); } void draw() { background(0); ellipse(xEll, yEll, 10,10); drawScreenToOffscreen(); createFire(); updateFire(); drawOffscreenToScreen(); } void mouseDragged() { xEll = mouseX; yEll = mouseY; } void mouseReleased() { xEll = -100; yEll = -100; } void createColorForPaletteFire() { for (int n = 0; n < 128; n++) paletteFire[n] = color(n*2,0,0); for (int n = 128; n < 192; n++) paletteFire[n] = color(255,(n-128)*4,0); for (int n = 192; n < 256; n++) paletteFire[n] = color(255,255,(n-192)*4); } void drawOffscreenToScreen() { loadPixels(); for (int x = 0; x < ScreenSize; x++) pixels[x] = paletteFire[offscreen[x]]; updatePixels(); } void drawScreenToOffscreen() { // copy ALL non-black pixels into Offscreen array with 255 value loadPixels(); for (int xy = 0; xy < ScreenSize; xy++) if (pixels[xy] != color(0,0,0)) offscreen[xy] = 255; // no updatePixels because I don't want to show the screen content // I want to show the OFFSCREEN content ^_^ } void updateFire() { for (int x = 0; x < ScreenSize; x++) { offscreen[x] = (offscreen[x + 1] + offscreen[x + width - 1] + offscreen[x + width] + offscreen[x + width + 1]) >> 2; if (offscreen[x] > MaxHeight) offscreen[x] -= 1; else if (offscreen[x] > 1) offscreen[x] = 0; } } void createFire() { for (int x = 0; x < width; x++) { offscreen[x + width*(height-2)] = (int)random(256); offscreen[x + width*(height-1)] = (int)random(256); } }