COOLDOWN_FACTOR = 0.9998 MAX_ENERGY_PROPAGATION = 0.5 EXPONENT=1.8 W_EXPONENT=2.2 OVERDRIVE=1 FADE_FACTOR = 0.96 AVG_LEDS_ACTIVATED = 0.05 WHITE_EXTRA_SCALE = 0.5 num_modules = 1 num_strips = 1 -- maximum energy values for each band maxRedEnergy = 1 maxGreenEnergy = 1 maxBlueEnergy = 1 maxWhiteEnergy = 1 -- array storing the energy for each pixel fireRedEnergy = {} fireGreenEnergy = {} fireBlueEnergy = {} fireWhiteEnergy = {} -- output color buffers red = {} green = {} blue = {} white = {} function limit(val) if val > 1 then return 1 elseif val < 0 then return 0 else return val end end function fade2black(energyArray) for s = 1,num_strips do for m = 1,num_modules do i = idx(s, m) energyArray[i] = energyArray[i] * FADE_FACTOR end end end function distributeEnergy(newEnergy, energyArray) remainingEnergy = AVG_LEDS_ACTIVATED * newEnergy * num_modules * num_strips while remainingEnergy > 0 do rndEnergy = math.random() * newEnergy * 5 rndStrip = math.floor(math.random() * num_strips) rndModule = math.floor(math.random() * num_modules) if rndEnergy > remainingEnergy then rndEnergy = remainingEnergy remainingEnergy = 0 else remainingEnergy = remainingEnergy - rndEnergy end i = idx(rndStrip+1, rndModule+1) energyArray[i] = energyArray[i] + rndEnergy end end function periodic() local redEnergy = get_energy_in_band(0, 400); local greenEnergy = get_energy_in_band(400, 4000); local blueEnergy = get_energy_in_band(4000, 12000); local whiteEnergy = get_energy_in_band(12000, 22000); maxRedEnergy = maxRedEnergy * COOLDOWN_FACTOR if redEnergy > maxRedEnergy then maxRedEnergy = redEnergy end maxGreenEnergy = maxGreenEnergy * COOLDOWN_FACTOR if greenEnergy > maxGreenEnergy then maxGreenEnergy = greenEnergy end maxBlueEnergy = maxBlueEnergy * COOLDOWN_FACTOR if blueEnergy > maxBlueEnergy then maxBlueEnergy = blueEnergy end maxWhiteEnergy = maxWhiteEnergy * COOLDOWN_FACTOR if whiteEnergy > maxWhiteEnergy then maxWhiteEnergy = whiteEnergy end fade2black(fireRedEnergy) fade2black(fireGreenEnergy) fade2black(fireBlueEnergy) fade2black(fireWhiteEnergy) distributeEnergy((redEnergy / maxRedEnergy)^EXPONENT, fireRedEnergy) distributeEnergy((greenEnergy / maxGreenEnergy)^EXPONENT, fireGreenEnergy) distributeEnergy((blueEnergy / maxBlueEnergy)^EXPONENT, fireBlueEnergy) distributeEnergy((whiteEnergy / maxWhiteEnergy)^W_EXPONENT, fireWhiteEnergy) -- Color post-processing for m = 1,num_modules do for s = 1,num_strips do i = idx(s, m) rval = limit(OVERDRIVE * fireRedEnergy[i]) gval = limit(OVERDRIVE * fireGreenEnergy[i]) bval = limit(OVERDRIVE * fireBlueEnergy[i]) wval = limit(OVERDRIVE * fireWhiteEnergy[i] * WHITE_EXTRA_SCALE) red[i] = rval green[i] = gval blue[i] = bval white[i] = wval end end -- return the 4 color arrays return red, green, blue, white end function init(nstrip, nmod, cmod) num_strips = nstrip num_modules = nmod for i = 1,(nmod*nstrip) do red[i] = 0 green[i] = 0 blue[i] = 0 white[i] = 0 fireRedEnergy[i] = 0 fireGreenEnergy[i] = 0 fireBlueEnergy[i] = 0 fireWhiteEnergy[i] = 0 end -- don't use fading return 0 end