Some new 2D animation scripts; Changed config to 60 FPS

This commit is contained in:
Thomas Kolb 2020-05-16 21:51:35 +02:00
parent 4041923cc7
commit e587ac073a
5 changed files with 649 additions and 2 deletions

View file

@ -28,8 +28,11 @@
// Number of parts in the sample buffer // Number of parts in the sample buffer
#define BUFFER_PARTS 2 #define BUFFER_PARTS 2
// update rate for the led strip (in seconds) // Update rate for the led strip (in seconds)
#define LED_INTERVAL 0.01 // Must be a little faster than the hardware update rate to ensure theres
// always a packet in the queue
//#define LED_INTERVAL 0.01
#define LED_INTERVAL (1.0/61.0)
// frequency ranges for the base colors // frequency ranges for the base colors
#define RED_MIN_FREQ 0 #define RED_MIN_FREQ 0

144
fire.lua Normal file
View file

@ -0,0 +1,144 @@
COOLDOWN_FACTOR = 0.9998
MAX_ENERGY_PROPAGATION = 0.4
RM_ENERGY=0.0100
EXPONENT=1.5
W_EXPONENT=2.2
OVERDRIVE=1.5
num_modules = 1
num_strips = 1
-- maximum energy values for each band
maxRedEnergy = 1
maxGreenEnergy = 1
maxBlueEnergy = 1
maxWhiteEnergy = 1
-- array storing the flames 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 updateFire(newEnergy, energyArray)
avgEnergyPerStrip = newEnergy
for s = 1,num_strips do
-- Add new energy in the bottom row
i = idx(s, 1)
energyArray[i] = energyArray[i] + math.random() * avgEnergyPerStrip
-- remove energy at the top
i = idx(s, num_modules)
energyArray[i] = energyArray[i] * (1.0 - math.random() * MAX_ENERGY_PROPAGATION)
-- move energy upwards
for m_out = num_modules,2,-1 do
i_out = idx(s, m_out)
i_in = idx(s, m_out - 1)
energyMoved = energyArray[i_in] * math.random() * MAX_ENERGY_PROPAGATION
energyArray[i_in] = energyArray[i_in] - energyMoved
energyArray[i_out] = energyArray[i_out] + energyMoved
end
-- globally remove energy
for m = 1,num_modules do
i = idx(s, m)
if energyArray[i] > RM_ENERGY then
energyArray[i] = energyArray[i] - RM_ENERGY
else
energyArray[i] = 0
end
end
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
updateFire((redEnergy / maxRedEnergy)^EXPONENT, fireRedEnergy)
updateFire((greenEnergy / maxGreenEnergy)^EXPONENT, fireGreenEnergy)
updateFire((blueEnergy / maxBlueEnergy)^EXPONENT, fireBlueEnergy)
updateFire((whiteEnergy / maxWhiteEnergy)^W_EXPONENT, fireWhiteEnergy)
-- make colors more exciting + remove the first (flickering) mass
for m = 1,num_modules do
for s = 1,num_strips do
i = idx(s, m)
rval = limit(OVERDRIVE * fireRedEnergy[i])--^EXPONENT)
gval = limit(OVERDRIVE * fireGreenEnergy[i])--^EXPONENT)
bval = limit(OVERDRIVE * fireBlueEnergy[i])--^EXPONENT)
wval = limit(OVERDRIVE * fireWhiteEnergy[i])--^W_EXPONENT)
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

134
pixelation.lua Normal file
View file

@ -0,0 +1,134 @@
COOLDOWN_FACTOR = 0.9998
MAX_ENERGY_PROPAGATION = 0.5
EXPONENT=1.0
W_EXPONENT=1.0
OVERDRIVE=1
num_modules = 1
num_strips = 1
-- maximum energy values for each band
maxRedEnergy = 1
maxGreenEnergy = 1
maxBlueEnergy = 1
maxWhiteEnergy = 1
-- array storing the flames 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 updateFire(newEnergy, energyArray)
avgEnergyPerStrip = newEnergy * 2 / num_strips
for s = 1,num_strips do
-- Add new energy in the bottom row
i = idx(s, 1)
energyArray[i] = energyArray[i] + math.random() * avgEnergyPerStrip
-- remove energy at the top
i = idx(s, num_modules)
energyArray[i] = energyArray[i] * (1.0 - math.random() * MAX_ENERGY_PROPAGATION)
-- move energy upwards
for m_out = num_modules,2,-1 do
i_out = idx(s, m_out)
i_in = idx(s, m_out - 1)
energyMoved = energyArray[i_in] * math.random() * MAX_ENERGY_PROPAGATION
energyArray[i_in] = energyArray[i_in] - energyMoved
energyArray[i_out] = energyArray[i_out] + energyMoved
end
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
updateFire(redEnergy / maxRedEnergy, fireRedEnergy)
updateFire(greenEnergy / maxGreenEnergy, fireGreenEnergy)
updateFire(blueEnergy / maxBlueEnergy, fireBlueEnergy)
updateFire(whiteEnergy / maxWhiteEnergy, fireWhiteEnergy)
-- make colors more exciting + remove the first (flickering) mass
-- TODO: update
for m = 1,num_modules do
for s = 1,num_strips do
i = idx(s, m)
rval = limit(OVERDRIVE * fireRedEnergy[i]^EXPONENT)
gval = limit(OVERDRIVE * fireGreenEnergy[i]^EXPONENT)
bval = limit(OVERDRIVE * fireBlueEnergy[i]^EXPONENT)
wval = limit(OVERDRIVE * fireWhiteEnergy[i]^W_EXPONENT)
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

159
sparkler.lua Normal file
View file

@ -0,0 +1,159 @@
COOLDOWN_FACTOR = 0.9998
MAX_ENERGY_PROPAGATION = 0.3
RM_ENERGY=0.0200
EXPONENT=1.5
W_EXPONENT=2.2
OVERDRIVE=1.5
num_modules = 1
num_strips = 1
-- maximum energy values for each band
maxRedEnergy = 1
maxGreenEnergy = 1
maxBlueEnergy = 1
maxWhiteEnergy = 1
-- array storing the flames 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 updateFire(newEnergy, energyArray)
avgEnergyPerStrip = newEnergy
for s = 1,num_strips do
-- Add new energy in the center rows
i = idx(s, num_modules/2)
energyArray[i] = energyArray[i] + math.random() * avgEnergyPerStrip
i = idx(s, num_modules/2+1)
energyArray[i] = energyArray[i] + math.random() * avgEnergyPerStrip
-- remove energy at the top and the bottom
i = idx(s, num_modules)
energyArray[i] = energyArray[i] * (1.0 - math.random() * MAX_ENERGY_PROPAGATION)
i = idx(s, 1)
energyArray[i] = energyArray[i] * (1.0 - math.random() * MAX_ENERGY_PROPAGATION)
-- move energy upwards
for m_out = num_modules,num_modules/2+2,-1 do
i_out = idx(s, m_out)
i_in = idx(s, m_out - 1)
energyMoved = energyArray[i_in] * math.random() * MAX_ENERGY_PROPAGATION
energyArray[i_in] = energyArray[i_in] - energyMoved
energyArray[i_out] = energyArray[i_out] + energyMoved
end
-- move energy downwards
for m_out = 1,num_modules/2-1,1 do
i_out = idx(s, m_out)
i_in = idx(s, m_out + 1)
energyMoved = energyArray[i_in] * math.random() * MAX_ENERGY_PROPAGATION
energyArray[i_in] = energyArray[i_in] - energyMoved
energyArray[i_out] = energyArray[i_out] + energyMoved
end
-- globally remove energy
for m = 1,num_modules do
i = idx(s, m)
if energyArray[i] > RM_ENERGY then
energyArray[i] = energyArray[i] - RM_ENERGY
else
energyArray[i] = 0
end
end
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
updateFire((redEnergy / maxRedEnergy)^EXPONENT, fireRedEnergy)
updateFire((greenEnergy / maxGreenEnergy)^EXPONENT, fireGreenEnergy)
updateFire((blueEnergy / maxBlueEnergy)^EXPONENT, fireBlueEnergy)
updateFire((whiteEnergy / maxWhiteEnergy)^W_EXPONENT, fireWhiteEnergy)
-- make colors more exciting + remove the first (flickering) mass
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]))
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

View file

@ -0,0 +1,207 @@
COOLDOWN_FACTOR = 0.9998
MAX_ENERGY_PROPAGATION = 0.3
RM_ENERGY=0.0100
EXPONENT=1.5
W_EXPONENT=2.2
OVERDRIVE=1.5
num_modules = 1
num_strips = 1
max_new_energy_per_strip = 2*RM_ENERGY * num_modules
-- warning: these must also be updated in init()
max_target_energy = num_strips * num_modules
-- maximum energy values for each band
maxRedEnergy = 1
maxGreenEnergy = 1
maxBlueEnergy = 1
maxWhiteEnergy = 1
redMomentum = 0
greenMomentum = 0
blueMomentum = 0
whiteMomentum = 0
-- array storing the flames 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 updateFire(targetEnergy, energyArray, momentum)
local totalEnergy = 0
local avgEnergyPerStrip
for s = 1,num_strips do
for m = 1,num_modules do
totalEnergy = totalEnergy + energyArray[idx(s,m)]
end
end
if targetEnergy > totalEnergy then
avgEnergyPerStrip = (targetEnergy - totalEnergy) / num_strips
avgEnergyPerStrip = base_new_energy_per_strip * momentum
if avgEnergyPerStrip > max_new_energy_per_strip then
avgEnergyPerStrip = max_new_energy_per_strip
end
momentum = momentum + 1
else
avgEnergyPerStrip = 0
momentum = momentum - 2
if momentum < 0 then
momentum = 0
end
end
for s = 1,num_strips do
-- Add new energy in the center rows
i = idx(s, num_modules/2)
energyArray[i] = energyArray[i] + math.random() * avgEnergyPerStrip
i = idx(s, num_modules/2+1)
energyArray[i] = energyArray[i] + math.random() * avgEnergyPerStrip
-- remove energy at the top and the bottom
i = idx(s, num_modules)
energyArray[i] = energyArray[i] * (1.0 - math.random() * MAX_ENERGY_PROPAGATION)
i = idx(s, 1)
energyArray[i] = energyArray[i] * (1.0 - math.random() * MAX_ENERGY_PROPAGATION)
-- move energy upwards
for m_out = num_modules,num_modules/2+2,-1 do
i_out = idx(s, m_out)
i_in = idx(s, m_out - 1)
energyMoved = energyArray[i_in] * math.random() * MAX_ENERGY_PROPAGATION
energyArray[i_in] = energyArray[i_in] - energyMoved
energyArray[i_out] = energyArray[i_out] + energyMoved
end
-- move energy downwards
for m_out = 1,num_modules/2-1,1 do
i_out = idx(s, m_out)
i_in = idx(s, m_out + 1)
energyMoved = energyArray[i_in] * math.random() * MAX_ENERGY_PROPAGATION
energyArray[i_in] = energyArray[i_in] - energyMoved
energyArray[i_out] = energyArray[i_out] + energyMoved
end
-- globally remove energy
for m = 1,num_modules do
i = idx(s, m)
if energyArray[i] > RM_ENERGY then
energyArray[i] = energyArray[i] - RM_ENERGY
else
energyArray[i] = 0
end
end
end
return momentum
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
redMomentum = updateFire((redEnergy / maxRedEnergy)^EXPONENT * max_target_energy, fireRedEnergy, redMomentum)
greenMomentum = updateFire((greenEnergy / maxGreenEnergy)^EXPONENT * max_target_energy, fireGreenEnergy, greenMomentum)
blueMomentum = updateFire((blueEnergy / maxBlueEnergy)^EXPONENT * max_target_energy, fireBlueEnergy, blueMomentum)
whiteMomentum = updateFire((whiteEnergy / maxWhiteEnergy)^W_EXPONENT * max_target_energy, fireWhiteEnergy, whiteMomentum)
--updateFire(2 * max_target_energy, fireRedEnergy)
--updateFire(0 * max_target_energy, fireGreenEnergy)
--updateFire(0 * max_target_energy, fireBlueEnergy)
--updateFire(0 * max_target_energy, fireWhiteEnergy)
-- make colors more exciting + remove the first (flickering) mass
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]))
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
max_new_energy_per_strip = num_modules * RM_ENERGY * 2
base_new_energy_per_strip = num_modules * RM_ENERGY * 0.1
max_target_energy = num_strips * num_modules
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