X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fkaka%2Fcakelight%2Fmode%2FFireMode.java;fp=src%2Fkaka%2Fcakelight%2Fmode%2FFireMode.java;h=02db5b43be9c5e14802f5d826e8a017ea7534c1a;hb=e147b561b263ad878201f68ba0f76b9a1d76c59c;hp=0000000000000000000000000000000000000000;hpb=6a3d0edaa676312429f2f2bd6ed44e59ed07cc70;p=kaka%2Fcakelight.git diff --git a/src/kaka/cakelight/mode/FireMode.java b/src/kaka/cakelight/mode/FireMode.java new file mode 100644 index 0000000..02db5b4 --- /dev/null +++ b/src/kaka/cakelight/mode/FireMode.java @@ -0,0 +1,42 @@ +package kaka.cakelight.mode; + +import kaka.cakelight.Color; +import kaka.cakelight.LedFrame; +import kaka.cakelight.util.SimplexNoise3D; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class FireMode extends AmbientMode { + private final Color[] colors; + private SimplexNoise3D noise = new SimplexNoise3D(0); + + public FireMode(Color... colors) { + assert colors.length > 1; + List list = Arrays.asList(colors); + Collections.reverse(list); + this.colors = list.toArray(new Color[colors.length]); + } + + @Override + protected void updateFrame(LedFrame frame, long time, int count) { + for (int i = 0; i < config.leds.getCount(); i++) { + double x = frame.xOf(i); + double y = frame.yOf(i); + double v = Math.pow(Math.min(1, Math.max(0, noise.getr(0.0, 1.0, 1, x, y - (time / 7000.0), time / 3500.0))), 1.5); + frame.setLedColor(i, getColorAt(v * y)); + } + } + + private Color getColorAt(double value) { // 0.0 to 1.0 + double localRange = 1.0 / (colors.length - 1); + int index = (int)(value / localRange); + double localValue = (value / localRange) - index; + if (index == colors.length - 1) { + return colors[colors.length - 1]; + } else { + return colors[index].interpolate(colors[index + 1], localValue); + } + } +}