X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fkaka%2Fcakelight%2Fmode%2FTwoColorNoiseMode.java;h=6e8de55480e07d4b40cf93b88756a1b2f697cd2e;hb=8d0b33bf3dbf21aab3f94ac48db8da4fcee5d0cc;hp=6d2dabe8246572483cd8d1aee7e09ec04213bcc3;hpb=eca6fd31ebbf5cc015c0a4acd4f1509de061e3df;p=kaka%2Fcakelight.git diff --git a/src/kaka/cakelight/mode/TwoColorNoiseMode.java b/src/kaka/cakelight/mode/TwoColorNoiseMode.java index 6d2dabe..6e8de55 100644 --- a/src/kaka/cakelight/mode/TwoColorNoiseMode.java +++ b/src/kaka/cakelight/mode/TwoColorNoiseMode.java @@ -1,55 +1,23 @@ package kaka.cakelight.mode; -import kaka.cakelight.*; +import kaka.cakelight.Color; +import kaka.cakelight.LedFrame; import kaka.cakelight.util.SimplexNoise3D; public class TwoColorNoiseMode extends AmbientMode { - private final Color primary, secondary; + // private final Color primary, secondary; + private final Color[] colors; private SimplexNoise3D noise = new SimplexNoise3D(0); - public static Console.Command getCommand() { - return new Console.Command() { - public String[] getNames() { - return new String[] {"n", "noise"}; - } - - public void activate(CakeLight cakelight, Configuration config, String[] args) { - if (args.length == 3) { // cmd + col1 + col2 - cakelight.setMode(new TwoColorNoiseMode( - parseColor(args[1]), - parseColor(args[2]) - )); - } - } - - private Color parseColor(String s) { - switch (s.toLowerCase()) { - case "r": return Color.rgb(255, 0, 0); - case "g": return Color.rgb(0, 255, 0); - case "b": return Color.rgb(0, 0, 255); - default: // assume hexadecimal - if (s.length() == 3) { - return Color.rgb( - Integer.parseInt(s.substring(0, 1), 16) * 16 + Integer.parseInt(s.substring(0, 1), 16), - Integer.parseInt(s.substring(1, 2), 16) * 16 + Integer.parseInt(s.substring(1, 2), 16), - Integer.parseInt(s.substring(2, 3), 16) * 16 + Integer.parseInt(s.substring(2, 3), 16) - ); - } else if (s.length() == 6) { - return Color.rgb( - Integer.parseInt(s.substring(0, 2), 16), - Integer.parseInt(s.substring(2, 4), 16), - Integer.parseInt(s.substring(4, 6), 16) - ); - } - } - return Color.BLACK; - } - }; + public TwoColorNoiseMode(Color... colors) { + assert colors.length > 1; + this.colors = colors; } public TwoColorNoiseMode(Color primary, Color secondary) { - this.primary = primary; - this.secondary = secondary; + this(new Color[] {primary, secondary}); +// this.primary = primary; +// this.secondary = secondary; } @Override @@ -58,7 +26,19 @@ public class TwoColorNoiseMode extends AmbientMode { 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))), 1.5); - frame.setLedColor(i, primary.interpolate(secondary, v)); + // frame.setLedColor(i, primary.interpolate(secondary, v)); + frame.setLedColor(i, getColorAt(v)); } } + + 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); + } + } }