diff --git a/lights.js b/lights.js index 923c8ab..4b3b078 100644 --- a/lights.js +++ b/lights.js @@ -9,6 +9,16 @@ var pixel_cache = new Uint32Array(cfg.leds); var next_pattern = new Uint32Array(cfg.leds); var pattern = {} +function rgb_to_int(r, g, b) { + return ((r << 8) + g) << 8 + b; +} +function int_to_rgb(int) { + var r = int >> 16 & 0xFF; + var g = int >> 8 & 0xFF; + var b = int & 0xFF; + return { r: r, g: g, b: b }; +} + ws281x.configure({ leds: cfg.leds || 300, brightness: cfg.brightness || 200, @@ -47,16 +57,26 @@ export function tick() { } function fade(index) { - var original = pixel_cache[index]; - var final = next_pattern[index]; - var diff = final - original; - var interval = diff / fade_ticks; + var original = int_to_rgb(pixel_cache[index]); + var current = int_to_rgb(pixels[index]); + var final = int_to_rgb(next_pattern[index]); + var diff_r = final.r - original.r; + var diff_g = final.g - original.g; + var diff_b = final.b - original.b; + var interval_r = diff_r / fade_ticks; + var interval_g = diff_g / fade_ticks; + var interval_b = diff_b / fade_ticks; - if (Math.abs(final - pixels[index]) < interval) { - pixels[index] = final; - pixel_cache[index] = final; + if (Math.abs(final.r - current.r) < interval_r && + Math.abs(final.g - current.g) < interval_g && + Math.abs(final.b - current.b) < interval_b + ) { + pixels[index] = next_pattern[index]; + pixel_cache[index] = next_pattern[index]; } else { - pixels[index] += interval; + pixels[index] = rgb_to_int(current.r + interval_r, + current.g + interval_g, + current.b + interval_b); } } \ No newline at end of file